// Down click handler static void prv_down_click_handler(ClickRecognizerRef recognizer, void *ctx) { // rewind timer if clicked while timer is going off if (main_timer_rewind() || main_data.control_mode == ControlModeCounting) { return; } // increment timer int64_t increment; if (main_data.control_mode == ControlModeEditHr) { increment = -MSEC_IN_HR; } else if (main_data.control_mode == ControlModeEditMin) { increment = -MSEC_IN_MIN; } else { increment = -MSEC_IN_SEC; } timer_increment(increment); // check if switched out of ControlModeEditHr if (timer_get_value_ms() / MSEC_IN_HR == 0 && main_data.control_mode == ControlModeEditHr) { main_data.control_mode = ControlModeEditMin; } // animate and refresh if (!click_recognizer_is_repeating(recognizer)) { drawing_start_bounce_animation(false); } drawing_update(); layer_mark_dirty(main_data.layer); }
// Select long click handler static void prv_select_long_click_handler(ClickRecognizerRef recognizer, void *ctx) { main_data.control_mode = ControlModeEditMin; timer_reset(); // animate and refresh drawing_update(); layer_mark_dirty(main_data.layer); }
// Select click handler static void prv_select_click_handler(ClickRecognizerRef recognizer, void *ctx) { // rewind timer if clicked while timer is going off if (main_timer_rewind()) { return; } // change timer mode switch (main_data.control_mode) { case ControlModeEditHr: main_data.control_mode = ControlModeEditMin; break; case ControlModeEditMin: main_data.control_mode = ControlModeEditSec; break; case ControlModeEditSec: main_data.control_mode = ControlModeCounting; timer_toggle_play_pause(); if (!main_data.app_timer) { prv_app_timer_callback(NULL); } break; case ControlModeCounting: main_data.control_mode = ControlModeEditSec; timer_toggle_play_pause(); break; } // refresh drawing_update(); layer_mark_dirty(main_data.layer); }
int main (int argc, char **argv) { cpSpace *space = cpSpaceNew(); cpSpaceSetGravity(space, cpv(0, GRAVITY)); cpEnableSegmentToSegmentCollisions(); cpShape *ground = cpSpaceAddShape(space, cpSegmentShapeNew(space->staticBody, cpv(0, 5), cpv(10, -5), 0)); cpShapeSetFriction(ground, 0.3); cpBody *drawing = drawing_new(2, 7, 0); drawing = drawing_update(space, drawing, 3, 8); drawing = drawing_update(space, drawing, 3, 9); drawing = drawing_update(space, drawing, 2, 9); //cpBody *drawing = drawing_new(0, 0, 0); //drawing = drawing_update(space, drawing, 2, 0); //drawing = drawing_update(space, drawing, 2, 2); //drawing = drawing_update(space, drawing, 0, 2); print_positions(drawing); //drawing_activate(drawing); //print_positions(drawing); cpVect vel, pos; int i = 0; for(cpFloat time = 0; time < 2; time += TIMESTEP){ pos = cpBodyGetPos(drawing); vel = cpBodyGetVel(drawing); printf( "Time = %2.2f Position = (%2.2f, %2.2f) Velocity = (%2.2f, %2.2f)\n", time, pos.x, pos.y, vel.x, vel.y); cpSpaceStep(space, TIMESTEP); i++; if (i == 20) { drawing_activate(space, drawing); print_positions(drawing); } } print_positions(drawing); free_body_full(drawing); cpShapeFree(ground); cpSpaceFree(space); return EXIT_SUCCESS; }
static gboolean motion_notify_event_cb(GtkWidget *widget, GdkEventMotion *event, Gui *gui){ //only add to the body if it is not NULL if ((event->state && GDK_BUTTON1_MASK) && (gui->current_body != NULL)){ float x = (float)event->x / (float)PIXELS_PER_METER; float y = (float)(-event->y + WINDOW_HEIGHT) / (float)PIXELS_PER_METER ; gui->current_body = drawing_update(gui->space, gui->current_body, x, y); } return TRUE; }
// Rewind timer if button is clicked to stop vibration static bool main_timer_rewind(void) { // check if timer is vibrating if (timer_is_vibrating()) { vibes_cancel(); main_data.control_mode = ControlModeEditSec; timer_rewind(); drawing_update(); return true; } return false; }
// AppTimer callback static void prv_app_timer_callback(void *data) { // check if timer is complete timer_check_elapsed(); // refresh drawing_update(); layer_mark_dirty(main_data.layer); // schedule next call main_data.app_timer = NULL; if (main_data.control_mode == ControlModeCounting) { uint32_t duration = timer_get_value_ms() % MSEC_IN_SEC; if (timer_is_chrono()) { duration = MSEC_IN_SEC - duration; } main_data.app_timer = app_timer_register(duration + 5, prv_app_timer_callback, NULL); } }
// Back click handler static void prv_back_click_handler(ClickRecognizerRef recognizer, void *ctx) { // cancel vibrations vibes_cancel(); // get time parts uint16_t hr, min, sec; timer_get_time_parts(&hr, &min, &sec); // change control mode if ((hr && main_data.control_mode == ControlModeEditMin) || main_data.control_mode == ControlModeEditSec) { main_data.control_mode--; } else { window_stack_pop(true); } // refresh drawing_update(); layer_mark_dirty(main_data.layer); }
// Up click handler static void prv_up_click_handler(ClickRecognizerRef recognizer, void *ctx) { // rewind timer if clicked while timer is going off if (main_timer_rewind() || main_data.control_mode == ControlModeCounting) { return; } // increment timer int64_t increment; if (main_data.control_mode == ControlModeEditHr) { increment = MSEC_IN_HR; } else if (main_data.control_mode == ControlModeEditMin) { increment = MSEC_IN_MIN; } else { increment = MSEC_IN_SEC; } // get starting time components uint16_t o_hr, o_min, o_sec; timer_get_time_parts(&o_hr, &o_min, &o_sec); // increment timer timer_increment(increment); // compare final time parts and switch into edit hr mode uint16_t n_hr, n_min, n_sec; timer_get_time_parts(&n_hr, &n_min, &n_sec); if (o_min > n_min && !o_hr) { timer_increment(MSEC_IN_HR); main_data.control_mode = ControlModeEditHr; } // check if switched out of ControlModeEditHr if (timer_get_value_ms() / MSEC_IN_HR == 0 && main_data.control_mode == ControlModeEditHr) { main_data.control_mode = ControlModeEditMin; } // animate and refresh if (!click_recognizer_is_repeating(recognizer)) { drawing_start_bounce_animation(true); } drawing_update(); layer_mark_dirty(main_data.layer); }