static void worker_message_handler(uint16_t type, AppWorkerMessage *data) { static AppWorkerMessage msg_data; switch(type) { case WORKER_MSG_ECHO: #if !ECHO_CMDS // Construct a data packet msg_data.data0 = data->data0; // Send the data to the foreground app app_worker_send_message(WORKER_MSG_ECHO, &msg_data); #endif break; case WORKER_MSG_ACCEL_START: accel_data_service_subscribe(data->data0, worker_accel_data_handler); accel_service_set_sampling_rate(data->data1); worker_accel_enabled = true; break; case WORKER_MSG_ACCEL_STOP: accel_data_service_unsubscribe(); worker_accel_enabled = false; break; case WORKER_MSG_ACCEL_MODIFY: accel_service_set_samples_per_update(data->data0); accel_service_set_sampling_rate(data->data1); break; case WORKER_MSG_TICK_START: if ( data->data0 != 0 ) tickRate = data->data0; // how often do we want updates. tick_timer_service_subscribe(SECOND_UNIT, worker_tick_handler); worker_tick_enabled = true; break; case WORKER_MSG_TICK_STOP: tick_timer_service_unsubscribe(); worker_tick_enabled = false; break; case WORKER_MSG_LOGGING_START: datalog_ref = data_logging_create(SLEEP_DATA_LOG_TAG, DATA_LOGGING_BYTE_ARRAY, sizeof(struct AccelData), true); worker_logging_enabled = true; break; case WORKER_MSG_LOGGING_STOP: data_logging_finish(datalog_ref); worker_logging_enabled = false; break; case WORKER_MSG_STATUS_RQST: worker_send_status_resp(); break; } #if ECHO_CMDS msg_data.data0 = type; app_worker_send_message(WORKER_MSG_ECHO,&msg_data); #endif }
// Handle the start-up of the app static void init(void) { // Create window window = window_create(); window_stack_push(window, true); // Load images bg_image = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BG); empty_image = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_EMPTY); full_image = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_FULL); // Create bg layer bg_layer = bitmap_layer_create(GRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); bitmap_layer_set_bitmap(bg_layer, bg_image); layer_add_child(window_get_root_layer(window), bitmap_layer_get_layer(bg_layer)); // Create status layers for (int i = 0; i < NUMBER_OF_STATUS_BARS; i++) { status_layer[i] = bitmap_layer_create(GRect(STATUS_BAR_X_ORIGIN + STATUS_BAR_X_OFFSET * i, STATUS_BAR_Y_ORIGIN, STATUS_BAR_WIDTH, STATUS_BAR_HEIGHT)); bitmap_layer_set_bitmap(status_layer[i], empty_image); layer_add_child(bitmap_layer_get_layer(bg_layer), bitmap_layer_get_layer(status_layer[i])); } // Subscribe minute handler //tick_timer_service_subscribe(SECOND_UNIT, &handle_tick); // Setup accelerator handling old_accel = (AccelData) { .x = 0, .y = 0, .z = 0 }; accel_service_set_sampling_rate(ACCEL_SAMPLING_10HZ); accel_service_set_samples_per_update(0); accel_data_service_subscribe(0, handle_accel); timer = app_timer_register(100 /* milliseconds */, handle_timer, NULL); } // Handle the shutdown of the app static void deinit(void) { // Disable accelerator handling accel_data_service_unsubscribe(); // Destroy status layers for (int i = 0; i < NUMBER_OF_STATUS_BARS; i++) { bitmap_layer_destroy(status_layer[i]); } // Destroy bg layer bitmap_layer_destroy(bg_layer); // Unload images gbitmap_destroy(bg_image); gbitmap_destroy(empty_image); gbitmap_destroy(full_image); // Destroy window window_destroy(window); }
void simply_accel_set_data_samples(SimplyAccel *self, uint32_t num_samples) { self->num_samples = num_samples; accel_service_set_samples_per_update(num_samples); if (!self->data_subscribed) { return; } simply_accel_set_data_subscribe(self, false); simply_accel_set_data_subscribe(self, true); }