static void battery_display_layer_update_callback(Layer *layer, GContext* ctx) { GPoint p0,p1; BatteryChargeState bat_stat = battery_state_service_peek(); p0.x=0; p0.y=167; p1.x= (int16_t) (1.4 * bat_stat.charge_percent); // 140 @ 100 percent p1.y=167; graphics_context_set_stroke_color(ctx, FOREGROUND_COLOR); graphics_draw_line(ctx, p0, p1); if (INVERT) { // if inverted, then the battery bar is too thin // make it a bit wider (2 pixels) p0.y = 166; p1.y = 166; graphics_draw_line(ctx, p0, p1); } }
static void main_window_load(Window *window) { s_time_layer = text_layer_create(GRect(0, 50, 144, 50)); text_layer_set_background_color(s_time_layer, GColorClear); text_layer_set_text_color(s_time_layer, GColorBlack); text_layer_set_font(s_time_layer, fonts_get_system_font(FONT_KEY_ROBOTO_BOLD_SUBSET_49)); text_layer_set_text_alignment(s_time_layer, GTextAlignmentCenter); layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_time_layer)); s_date_layer = text_layer_create(GRect(0, 100, 144, 50)); text_layer_set_background_color(s_date_layer, GColorClear); text_layer_set_text_color(s_date_layer, GColorBlack); text_layer_set_font(s_date_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14)); text_layer_set_text_alignment(s_date_layer, GTextAlignmentCenter); layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_date_layer)); s_battery_layer = text_layer_create(GRect(0, 0, 144, 25)); text_layer_set_background_color(s_battery_layer, GColorClear); text_layer_set_text_color(s_battery_layer, GColorBlack); text_layer_set_font(s_battery_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14)); text_layer_set_text_alignment(s_battery_layer, GTextAlignmentRight); layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_battery_layer)); battery_handler(battery_state_service_peek()); s_bt_layer = text_layer_create(GRect(0, 0, 144, 25)); text_layer_set_background_color(s_bt_layer, GColorClear); text_layer_set_text_color(s_bt_layer, GColorBlack); text_layer_set_font(s_bt_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14)); text_layer_set_text_alignment(s_bt_layer, GTextAlignmentLeft); layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_bt_layer)); bt_handler(bluetooth_connection_service_peek()); s_day_layer = text_layer_create(GRect(0, 150, 144, 50)); text_layer_set_background_color(s_day_layer, GColorClear); text_layer_set_text_color(s_day_layer, GColorBlack); text_layer_set_font(s_day_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14)); text_layer_set_text_alignment(s_day_layer, GTextAlignmentCenter); layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_day_layer)); }
static void main_window_load(Window *window) { Layer *window_layer = window_get_root_layer(window); GRect bounds = layer_get_bounds(window_layer); //Create GBitmap, then set to created BitmapLayer sushi_resource_id = RESOURCE_ID_SUSHI_S; s_background_bitmap = gbitmap_create_with_resource(sushi_resource_id); s_background_layer = bitmap_layer_create(GRect(0, 60, 720, 72)); bitmap_layer_set_bitmap(s_background_layer, s_background_bitmap); layer_add_child(window_get_root_layer(window), bitmap_layer_get_layer(s_background_layer)); //Create GFont s_time_font = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_VIGRO_26)); // Create time TextLayer s_time_layer = text_layer_create(GRect(0, 20, bounds.size.w, 52)); text_layer_set_background_color(s_time_layer, GColorClear); text_layer_set_text_color(s_time_layer, GColorDarkGreen); text_layer_set_text(s_time_layer, "00:00:00"); text_layer_set_font(s_time_layer, s_time_font); text_layer_set_text_alignment(s_time_layer, GTextAlignmentCenter); s_battery_layer = text_layer_create(GRect(0, 140, bounds.size.w, 34)); text_layer_set_text_color(s_battery_layer, GColorDarkGreen); text_layer_set_background_color(s_battery_layer, GColorClear); text_layer_set_font(s_battery_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD)); text_layer_set_text_alignment(s_battery_layer, GTextAlignmentCenter); text_layer_set_text(s_battery_layer, "100% charged"); battery_state_service_subscribe(handle_battery); // Add it as a child layer to the Window's root layer layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_time_layer)); layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_battery_layer)); // Make sure the time is displayed from the start update_time(); handle_battery(battery_state_service_peek()); }
static void draw_bat(Layer *this_layer, GContext *ctx, int y) { GRect bounds = layer_get_bounds(this_layer); BatteryChargeState bat = battery_state_service_peek(); int16_t width = bounds.size.w; int16_t offset = bounds.size.w/2 - (100 - bat.charge_percent)*width/100; // APP_LOG(APP_LOG_LEVEL_INFO, "o: %d y: %d w: %d", offset, y, width); int g = 50; // 100-50 int ye = 25; // 50-25 int r = 25; // 25-0 #ifdef PBL_COLOR int height = 8; #else int height = 4; #endif GRect green = GRect(offset, y, width*g/100, height); GRect yellow = GRect(green.origin.x+green.size.w, y, width*ye/100, height); #ifndef PBL_COLOR height /= 2; #endif GRect red = GRect(yellow.origin.x+yellow.size.w, y, width*r/100, height); graphics_context_set_fill_color(ctx, COLOR_FALLBACK(GColorGreen, GColorWhite)); graphics_fill_rect(ctx, green, 0, GCornerNone); graphics_context_set_fill_color(ctx, COLOR_FALLBACK(GColorYellow, GColorLightGray)); graphics_fill_rect(ctx, yellow, 0, GCornerNone); graphics_context_set_fill_color(ctx, COLOR_FALLBACK(GColorRed, GColorDarkGray)); graphics_fill_rect(ctx, red, 0, GCornerNone); }
void window_load(Window *window){ //setup text layer for time text_layer = text_layer_create(GRect(0, 120, 132, 168)); text_layer_set_background_color(text_layer, GColorClear); text_layer_set_text_color(text_layer, GColorBlack); text_layer_set_text_alignment(text_layer, GTextAlignmentCenter); text_layer_set_font(text_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_POKEMON_GB_24))); layer_add_child(window_get_root_layer(window), (Layer*) text_layer); //Setup Battery Layer batt_layer = text_layer_create(GRect(5, 5, 144, 30)); text_layer_set_font(batt_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_POKEMON_GB_8))); layer_add_child(window_get_root_layer(window), text_layer_get_layer(batt_layer)); //Get info, copy to long-lived buffer and display BatteryChargeState state = battery_state_service_peek(); static char buffer[] = "HP: 100/100"; snprintf(buffer, sizeof("HP: 100/100"), "HP: %d/100", state.charge_percent); text_layer_set_text(batt_layer, buffer); //Subscribe to AccelerometerService (uncomment one to choose) //accel_tap_service_subscribe(accel_tap_handler); accel_data_service_subscribe(1, accel_raw_handler); //Setup Accel Layer accel_layer = text_layer_create(GRect(5, 15, 144, 30)); text_layer_set_font(accel_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_POKEMON_GB_8))); text_layer_set_text(accel_layer, "Accel tap: N/A"); layer_add_child(window_get_root_layer(window), text_layer_get_layer(accel_layer)); //Get a time structure so that the face doesn't start blank struct tm *t; time_t temp; temp = time(NULL); t = localtime(&temp); //Manually call the tick handler when the window is loading tick_handler(t, MINUTE_UNIT); }
static void main_window_load(Window *window) { // Initialize variables. selected_color = 0; // Set background color. window_set_background_color(s_main_window, GColorFromHEX(background_colors[selected_color])); // Create background canvas. s_canvas = layer_create(GRect(0, 0, 144, 168)); // Create watch texts. s_time_layer = text_layer_create(GRect(0, 30, 144, 54)); s_info_layer = text_layer_create(GRect(10, 134, 124, 24)); // Setup watch text colors. text_layer_set_text_color(s_time_layer, GColorBlack); text_layer_set_background_color(s_time_layer, GColorClear); text_layer_set_text_color(s_info_layer, GColorBlack); text_layer_set_background_color(s_info_layer, GColorClear); // Setup font for watch. s_time_font = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_ROBOTICON_42)); text_layer_set_font(s_time_layer, s_time_font); text_layer_set_font(s_info_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD)); // Set text alignments. text_layer_set_text_alignment(s_time_layer, GTextAlignmentCenter); text_layer_set_text_alignment(s_info_layer, GTextAlignmentCenter); // Add it as a child layer to the Window's root layer layer_add_child(window_get_root_layer(window), s_canvas); layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_time_layer)); layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_info_layer)); // Get the current battery level battery_handler(battery_state_service_peek()); }
static void update_battery(Layer *layer, GContext *ctx) { int bat = (battery_state_service_peek().charge_percent) / 10; if (bat == 0) { bat = 1; } GRect box_frame = GRect(0, 0,((bat * 5)), 4); s_battery_layer = layer_create(box_frame); #ifdef PBL_COLOR if (bat >= 6) { graphics_context_set_fill_color(ctx, GColorGreen); } else if (bat >=3) { graphics_context_set_fill_color(ctx, GColorYellow); } else { graphics_context_set_fill_color(ctx, GColorRed); } #else graphics_context_set_fill_color(ctx, GColorBlack); #endif graphics_fill_rect(ctx, layer_get_bounds(s_battery_layer), 2, GCornersAll); }
static void battery_update_proc(Layer *layer, GContext *ctx) { static BatteryChargeState c_state; c_state = battery_state_service_peek(); graphics_context_set_stroke_color(ctx, c_state.is_charging ? GColorWhite : GColorBlack); graphics_draw_rect(ctx, GRect(0,0,15,15)); graphics_context_set_stroke_color(ctx, GColorWhite); graphics_context_set_fill_color(ctx, GColorWhite); switch(c_state.charge_percent/10){ case 10: graphics_fill_rect(ctx, GRect(1,1,13,13), 0, GCornerNone); break; case 9: graphics_draw_rect(ctx, GRect(2,10,3,3)); case 8: graphics_draw_rect(ctx, GRect(6,10,3,3)); case 7: graphics_draw_rect(ctx, GRect(2,6,3,3)); case 6: graphics_draw_rect(ctx, GRect(10,10,3,3)); case 5: graphics_draw_rect(ctx, GRect(2,2,3,3)); case 4: graphics_draw_rect(ctx, GRect(6,6,3,3)); case 3: graphics_draw_rect(ctx, GRect(10,6,3,3)); case 2: graphics_draw_rect(ctx, GRect(6,2,3,3)); case 1: graphics_draw_rect(ctx, GRect(10,2,3,3)); } }
/* * Manually update the ui. */ static void update_all() { static BatteryChargeState battery_state; static bool bluetooth_state; static time_t gmt; static struct tm *local_time; // Prepare to update the UI manually. // battery_state = battery_state_service_peek(); bluetooth_state = bluetooth_connection_service_peek(); gmt = time(NULL); local_time = localtime(&gmt); // Draw everything that we can, so that there isn't a blank screen // on start-up. // update_time(local_time); update_date(local_time); update_cldr(local_time); update_batt(battery_state); update_blth(bluetooth_state); }
static void update_status() { BatteryChargeState bcs = battery_state_service_peek(); APP_LOG(APP_LOG_LEVEL_DEBUG, "Battery state: %u%%%s%s", bcs.charge_percent, bcs.is_charging ? " charging" : "", bcs.is_plugged ? " plugged" : ""); int i = bcs.charge_percent / 10; if (i > 9) i = 9; if (i < 0) i = 0; bitmap_layer_set_bitmap(s_status_battery_layer, s_bmp_battery[i]); bitmap_layer_set_bitmap(s_status_charge_layer, bcs.is_plugged ? s_bmp_charge : s_bmp_nocharge); bool bt_connected = bluetooth_connection_service_peek(); APP_LOG(APP_LOG_LEVEL_DEBUG, "Bluetooth %s", bt_connected ? "connected" : "disconnected"); bitmap_layer_set_bitmap(s_status_bt_layer, bt_connected ? s_bmp_bt : s_bmp_nobt); if (s_last_bt_connected != bt_connected) { vibes_double_pulse(); } s_last_bt_connected = bt_connected; text_layer_set_text(s_status_text_layer, s_status_label_text); }
static void time_handler(struct tm* tick_time, TimeUnits units_changed) { static char time_text[] = "00:00"; // Needs to be static because it's used by the system later. static char date_text[] = "Xxxxxxxxxxx Xxxxxxxxxx 00"; static char date_num[] = "00000000"; char *time_format; strftime(date_text, sizeof(date_text), "%A, %b %e", tick_time); text_layer_set_text(date_layer, date_text); if(clock_is_24h_style()) { time_format = "%R"; } else { time_format = "%I:%M"; } strftime(time_text, sizeof(time_text), time_format, tick_time); // Kludge to handle lack of non-padded hour format string // for twelve hour clock. if (!clock_is_24h_style() && (time_text[0] == '0')) { memmove(time_text, &time_text[1], sizeof(time_text) - 1); } text_layer_set_text(time_layer, time_text); battery_handler(battery_state_service_peek()); strftime(date_num, sizeof(date_num), "%Y%m%d", tick_time); if(time(NULL) - start >= 300 || time(NULL) - start == 0) { get_events_handler(date_num); time(&start); } }
void handle_minute_tick(struct tm * tick_time, TimeUnits units_changed) { display_time(tick_time); handle_battery(battery_state_service_peek()); }
void window_load(Window *window){ //load bitmap for background/watchface face_bitmap = gbitmap_create_with_resource(RESOURCE_ID_WATCHFACE); //add bitmap layer face_layer = bitmap_layer_create(GRect(0, 0, 144, 168)); bitmap_layer_set_bitmap(face_layer, face_bitmap); layer_add_child(window_get_root_layer(window), bitmap_layer_get_layer(face_layer)); //create text layer for bluetooth status bt_layer = text_layer_create(GRect(0, 130, 144, 38)); text_layer_set_background_color(bt_layer, GColorClear); text_layer_set_text_color(bt_layer, GColorWhite); text_layer_set_text_alignment(bt_layer, GTextAlignmentCenter); text_layer_set_font(bt_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14)); layer_add_child(window_get_root_layer(window), (Layer*) bt_layer); //manually invoke bluetooth handler to refresh status on load bt_handler(); //create text layer for 'pebble' brand at 6oclock brand_layer = text_layer_create(GRect(0, 145, 144, 23)); text_layer_set_background_color(brand_layer, GColorClear); text_layer_set_text_color(brand_layer, GColorWhite); text_layer_set_text_alignment(brand_layer, GTextAlignmentCenter); text_layer_set_font(brand_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD)); text_layer_set_text(brand_layer, "pebble"); layer_add_child(window_get_root_layer(window), (Layer*) brand_layer); //create text layer for pebble battery status batt_layer = text_layer_create(GRect(5, 76, 20, 50)); text_layer_set_background_color(batt_layer, GColorClear); text_layer_set_text_color(batt_layer, GColorWhite); text_layer_set_text_alignment(batt_layer, GTextAlignmentCenter); text_layer_set_font(batt_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14_BOLD)); layer_add_child(window_get_root_layer(window), (Layer*) batt_layer); //manually invoke battery status handler to refresh status on load batt_handler(battery_state_service_peek()); //add text layer for digital time text_layer = text_layer_create(GRect(0, 0, 144, 168)); text_layer_set_background_color(text_layer, GColorClear); text_layer_set_text_color(text_layer, GColorWhite); text_layer_set_text_alignment(text_layer, GTextAlignmentCenter); text_layer_set_font(text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14_BOLD)); layer_add_child(window_get_root_layer(window), (Layer*) text_layer); //create text layer for date date_layer = text_layer_create(GRect(116, 76, 25, 50)); text_layer_set_background_color(date_layer, GColorClear); text_layer_set_text_color(date_layer, GColorWhite); text_layer_set_text_alignment(date_layer, GTextAlignmentCenter); text_layer_set_font(date_layer, fonts_get_system_font(FONT_KEY_GOTHIC_14_BOLD)); layer_add_child(window_get_root_layer(window), (Layer*) date_layer); //add layers for analog clock hours_layer = layer_create(GRect(0, 0, 144, 168)); layer_set_update_proc(hours_layer, hours_layer_update_proc); minutes_layer = layer_create(GRect(0, 0, 144, 168)); layer_set_update_proc(minutes_layer, minutes_layer_update_proc); //draw hands hour_path = gpath_create(&HOUR_PATH_INFO); layer_add_child(window_get_root_layer(window), (Layer*) hours_layer); minute_path = gpath_create(&MINUTE_PATH_INFO); layer_add_child(window_get_root_layer(window), (Layer*) minutes_layer); //time struct to display time on load struct tm *t; time_t temp; temp = time(NULL); t = localtime(&temp); //manually invoke tick handler to refresh time on load tick_handler(t, MINUTE_UNIT); //add centre point centre_layer = layer_create(GRect(0, 0, 144, 168)); layer_set_update_proc(centre_layer, centre_layer_update_proc); layer_add_child(window_get_root_layer(window), (Layer*) centre_layer); }
static void main_window_load(Window *window) { static BatteryChargeState battery_state; static int vpos_batt; static int vpos_dow; static int vpos_date; static int vpos_time; static int vtop; static int vcenter; static int vpos; static int vmove; minute_when_last_updated = -1; vpos_batt = -1; vpos_dow = -1; vpos_date = -1; vpos_time = -1; vpos = 0; if (show_battery) { vpos_batt = vpos; vpos += 20; } vtop = vpos; vcenter = (vtop + 168) / 2; if (show_date) { vpos_dow = vpos; vpos += 20; vpos_date = vpos; vpos += 20; vpos += 20; /* for space between date and time */ } vpos_time = vpos; vpos += 32; /* larger clock font is just as tall */ vmove = vcenter - ((vtop + vpos) / 2); if (vpos_dow > -1) { vpos_dow += vmove; } if (vpos_date > -1) { vpos_date += vmove; } if (vpos_time > -1) { vpos_time += vmove; } fg = black_on_white ? GColorBlack : GColorWhite; bg = black_on_white ? GColorWhite : GColorBlack; window_set_background_color(s_main_window, bg); s_batt_text_layer = NULL; s_dow_text_layer = NULL; s_date_text_layer = NULL; if (show_battery) { s_batt_text_layer = text_layer_create(GRect( 2, vpos_batt, 140, 20)); } if (show_date) { s_dow_text_layer = text_layer_create(GRect( 2, vpos_dow , 140, 20)); s_date_text_layer = text_layer_create(GRect( 2, vpos_date, 140, 20)); } s_time_text_layer = text_layer_create(GRect(0, vpos_time, 144, 32)); /* larger clock font is just as tall */ if (show_battery) { text_layer_set_background_color(s_batt_text_layer, bg); text_layer_set_text_color(s_batt_text_layer, fg); } if (show_date) { text_layer_set_background_color(s_dow_text_layer, bg); text_layer_set_text_color(s_dow_text_layer, fg); text_layer_set_background_color(s_date_text_layer, bg); text_layer_set_text_color(s_date_text_layer, fg); } text_layer_set_background_color(s_time_text_layer, bg); text_layer_set_text_color(s_time_text_layer, fg); if (show_battery || show_date) { has_small_font = 1; s_small_font = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_DOT_MATRIX_NUMBER_ONE_16)); } else { has_small_font = 0; } has_large_font = 1; if (larger_clock_font) { s_large_font = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_DOT_MATRIX_NUMBER_ONE_DOTTED_SEMICONDENSED_32)); } else { s_large_font = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_DOT_MATRIX_NUMBER_ONE_CONDENSED_32)); } if (show_battery) { text_layer_set_font(s_batt_text_layer, s_small_font); text_layer_set_text_alignment(s_batt_text_layer, GTextAlignmentRight); layer_add_child(window_get_root_layer(s_main_window), text_layer_get_layer(s_batt_text_layer)); } if (show_date) { text_layer_set_font(s_dow_text_layer, s_small_font); text_layer_set_font(s_date_text_layer, s_small_font); text_layer_set_text_alignment(s_dow_text_layer, GTextAlignmentLeft); text_layer_set_text_alignment(s_date_text_layer, GTextAlignmentLeft); layer_add_child(window_get_root_layer(s_main_window), text_layer_get_layer(s_dow_text_layer)); layer_add_child(window_get_root_layer(s_main_window), text_layer_get_layer(s_date_text_layer)); } text_layer_set_font(s_time_text_layer, s_large_font); text_layer_set_text_alignment(s_time_text_layer, GTextAlignmentCenter); layer_add_child(window_get_root_layer(s_main_window), text_layer_get_layer(s_time_text_layer)); update_time(); if (show_battery) { battery_state = battery_state_service_peek(); on_battery_state_change(battery_state); battery_state_service_subscribe(on_battery_state_change); } enabled = 1; }
//----------------------------------------------------------------------------------------------------------------------- static void update_configuration(void) { if (persist_exists(CONFIG_KEY_THEME)) { int32_t theme = persist_read_int(CONFIG_KEY_THEME); CfgData.circle = (theme == 0); } else CfgData.circle = false; if (persist_exists(CONFIG_KEY_FSM)) CfgData.fsm = persist_read_bool(CONFIG_KEY_FSM); else CfgData.fsm = false; if (persist_exists(CONFIG_KEY_INV)) CfgData.inv = !CfgData.circle && persist_read_bool(CONFIG_KEY_INV); else CfgData.inv = true; if (persist_exists(CONFIG_KEY_ANIM)) CfgData.anim = persist_read_bool(CONFIG_KEY_ANIM); else CfgData.anim = true; if (persist_exists(CONFIG_KEY_SEP)) CfgData.sep = persist_read_bool(CONFIG_KEY_SEP); else CfgData.sep = true; if (persist_exists(CONFIG_KEY_DATEFMT)) CfgData.datefmt = (int16_t)persist_read_int(CONFIG_KEY_DATEFMT); else CfgData.datefmt = 0; if (persist_exists(CONFIG_KEY_SMART)) CfgData.smart = persist_read_bool(CONFIG_KEY_SMART); else CfgData.smart = true; if (persist_exists(CONFIG_KEY_VIBR)) CfgData.vibr = persist_read_bool(CONFIG_KEY_VIBR); else CfgData.vibr = false; app_log(APP_LOG_LEVEL_DEBUG, __FILE__, __LINE__, "Curr Conf: circle:%d, fsm:%d, inv:%d, anim:%d, sep:%d, datefmt:%d, smart:%d, vibr:%d", CfgData.circle, CfgData.fsm, CfgData.inv, CfgData.anim, CfgData.sep, CfgData.datefmt, CfgData.smart, CfgData.vibr); gbitmap_destroy(batteryAll); batteryAll = gbitmap_create_with_resource(CfgData.inv ? RESOURCE_ID_IMAGE_BATTERY_INV : RESOURCE_ID_IMAGE_BATTERY); bitmap_layer_set_bitmap(radio_layer, NULL); gbitmap_destroy(bmp_radio); bmp_radio = gbitmap_create_as_sub_bitmap(batteryAll, GRect(110, 0, 10, 20)); bitmap_layer_set_bitmap(radio_layer, bmp_radio); Layer *window_layer = window_get_root_layer(window); GRect bounds = layer_get_bounds(window_get_root_layer(window)); window_set_background_color(window, CfgData.inv ? GColorWhite : GColorBlack); //Face Layer first on round layer_remove_from_parent(face_layer); layer_destroy(face_layer); #if defined(PBL_RECT) face_layer = layer_create(GRect(0, 0, bounds.size.w, CfgData.fsm ? bounds.size.h : bounds.size.h-n_bottom_margin)); layer_set_update_proc(face_layer, face_update_proc); #elif defined(PBL_ROUND) face_layer = layer_create(GRect(0, 0, bounds.size.w, bounds.size.h)); layer_set_update_proc(face_layer, face_update_proc); layer_add_child(window_layer, face_layer); #endif //Bottom Layer next, then Radio and Battery layer_remove_from_parent(text_layer_get_layer(date_layer)); layer_remove_from_parent(bitmap_layer_get_layer(radio_layer)); layer_remove_from_parent(bitmap_layer_get_layer(battery_layer)); #if defined(PBL_RECT) if (!CfgData.fsm) #endif { #if defined(PBL_RECT) layer_add_child(window_layer, text_layer_get_layer(date_layer)); #ifdef PBL_COLOR text_layer_set_text_color(date_layer, CfgData.inv ? GColorDarkGray : GColorLightGray); #else text_layer_set_text_color(date_layer, CfgData.inv ? GColorBlack : GColorWhite); #endif text_layer_set_background_color(date_layer, CfgData.inv ? GColorWhite : GColorBlack); #endif if (CfgData.smart) { layer_add_child(window_layer, bitmap_layer_get_layer(radio_layer)); layer_add_child(window_layer, bitmap_layer_get_layer(battery_layer)); } } //On Rect later #if defined(PBL_RECT) layer_add_child(window_layer, face_layer); #endif //Get a time structure so that it doesn't start blank time_t temp = time(NULL); struct tm *t = localtime(&temp); //Manually call the tick handler when the window is loading aktHH = t->tm_hour; aktMM = t->tm_min; handle_tick(t, MINUTE_UNIT); //Set Battery state BatteryChargeState btchg = battery_state_service_peek(); battery_state_service_handler(btchg); //Set Bluetooth state bool connected = bluetooth_connection_service_peek(); bluetooth_connection_handler(connected); }
static void update_time() { // Get a tm structure time_t temp = time(NULL); struct tm *tick_time = localtime(&temp); // Create a long-lived buffer static char buffer[] = "00:00"; static char buffer2[] = "Xxx"; static char buffer2a[] = "00"; static char buffer3[] = "Xxx"; strftime(buffer3, sizeof(buffer3), "%a", tick_time); // Write the current hours and minutes into the buffer if(clock_is_24h_style() == true) { // Use 24 hour format strftime(buffer, sizeof("00:00"), "%H:%M", tick_time); text_layer_set_text(s_time_layer, buffer); } else { // Use 12 hour format strftime(buffer, sizeof(buffer), "%I:%M", tick_time); text_layer_set_text(s_time_layer,buffer+(('0' == buffer[0])?1:0)); } int bmin = BatteryINT; //if (bmin % 2) Even minutes if (tick_time->tm_min % bmin == 0) // divisible by 5 if(tick_time->tm_min % 5 == 0) { layer_set_hidden(s_image_layer, false); layer_set_hidden(s_image_layer2, false); BatteryChargeState charge_state = battery_state_service_peek(); if (charge_state.is_charging) { snprintf(buffer3, sizeof(buffer3), "%d%%", charge_state.charge_percent); s_image2 = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BATCHARGING); } else if (charge_state.charge_percent==100||charge_state.charge_percent==90) { snprintf(buffer3, sizeof(buffer3), "%d%%", charge_state.charge_percent); s_image2 = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BAT100); } else if (charge_state.charge_percent==70||charge_state.charge_percent==80) { snprintf(buffer3, sizeof(buffer3), "%d%%", charge_state.charge_percent); s_image2 = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BAT75); } else if (charge_state.charge_percent==50||charge_state.charge_percent==40||charge_state.charge_percent==60) { snprintf(buffer3, sizeof(buffer3), "%d%%", charge_state.charge_percent); s_image2 = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BAT50); } else if (charge_state.charge_percent==20||charge_state.charge_percent==30) { snprintf(buffer3, sizeof(buffer3), "%d%%", charge_state.charge_percent); s_image2 = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BAT25); } else if (charge_state.charge_percent==10||charge_state.charge_percent==0) { snprintf(buffer3, sizeof(buffer3), "%d%%", charge_state.charge_percent); s_image2 = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BAT00); } else { snprintf(buffer3, sizeof(buffer3), "%d%%", charge_state.charge_percent); s_image2 = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BAT75); } strftime(buffer2, sizeof(buffer2), "%b", tick_time); //Month text_layer_set_text(s_time_layer2, ""); text_layer_set_text(s_time_layer2a, ""); layer_set_update_proc(s_line_layer3, line_layer_update_callback3Red); layer_set_update_proc(s_line_layer4, line_layer_update_callback4Mag); if (bluetooth_connection_service_peek()) { s_image = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BTC55); } else { s_image = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BTNC55); } } else // even { layer_set_hidden(s_image_layer, true); layer_set_hidden(s_image_layer2, true); strftime(buffer2, sizeof(buffer2), "%b", tick_time); //Month strftime(buffer2a, sizeof(buffer2a), "%e", tick_time); //date strftime(buffer3, sizeof(buffer3), "%A", tick_time); //day of Week text_layer_set_text(s_time_layer2, buffer2); text_layer_set_text(s_time_layer2a, buffer2a); layer_set_update_proc(s_line_layer3, line_layer_update_callback3); layer_set_update_proc(s_line_layer4, line_layer_update_callback4); } // Display this time on the TextLayer text_layer_set_text(s_time_layer3, buffer3); }
void init() { // Window window = window_create(); window_stack_push(window, true /* Animated */); window_layer = window_get_root_layer(window); // Background image background_image_container = gbitmap_create_with_resource( RESOURCE_ID_IMAGE_BACKGROUND); background_layer = layer_create(GRECT_FULL_WINDOW); layer_set_update_proc(background_layer, &draw_background_callback); layer_add_child(window_layer, background_layer); // Date setup date_layer = text_layer_create(GRect(27, 100, 90, 21)); text_layer_set_text_color(date_layer, GColorWhite); text_layer_set_text_alignment(date_layer, GTextAlignmentCenter); text_layer_set_background_color(date_layer, GColorClear); text_layer_set_font(date_layer, fonts_get_system_font(FONT_KEY_GOTHIC_18)); layer_add_child(window_layer, text_layer_get_layer(date_layer)); draw_date(); // Status setup icon_battery = gbitmap_create_with_resource(RESOURCE_ID_BATTERY_ICON); icon_battery_charge = gbitmap_create_with_resource(RESOURCE_ID_BATTERY_CHARGE); icon_bt = gbitmap_create_with_resource(RESOURCE_ID_BLUETOOTH); BatteryChargeState initial = battery_state_service_peek(); battery_level = initial.charge_percent; battery_plugged = initial.is_plugged; battery_layer = layer_create(GRect(50,56,24,12)); //24*12 layer_set_update_proc(battery_layer, &battery_layer_update_callback); layer_add_child(window_layer, battery_layer); bt_ok = bluetooth_connection_service_peek(); bt_layer = layer_create(GRect(83,56,9,12)); //9*12 layer_set_update_proc(bt_layer, &bt_layer_update_callback); layer_add_child(window_layer, bt_layer); // Hands setup hour_display_layer = layer_create(GRECT_FULL_WINDOW); layer_set_update_proc(hour_display_layer, &hour_display_layer_update_callback); layer_add_child(window_layer, hour_display_layer); hour_hand_path = gpath_create(&HOUR_HAND_PATH_POINTS); gpath_move_to(hour_hand_path, grect_center_point(&GRECT_FULL_WINDOW)); minute_display_layer = layer_create(GRECT_FULL_WINDOW); layer_set_update_proc(minute_display_layer, &minute_display_layer_update_callback); layer_add_child(window_layer, minute_display_layer); minute_hand_path = gpath_create(&MINUTE_HAND_PATH_POINTS); gpath_move_to(minute_hand_path, grect_center_point(&GRECT_FULL_WINDOW)); center_display_layer = layer_create(GRECT_FULL_WINDOW); layer_set_update_proc(center_display_layer, ¢er_display_layer_update_callback); layer_add_child(window_layer, center_display_layer); second_display_layer = layer_create(GRECT_FULL_WINDOW); layer_set_update_proc(second_display_layer, &second_display_layer_update_callback); layer_add_child(window_layer, second_display_layer); // Configurable inverse #ifdef INVERSE full_inverse_layer = inverter_layer_create(GRECT_FULL_WINDOW); layer_add_child(window_layer, inverter_layer_get_layer(full_inverse_layer)); #endif }
/************************************************************************ * clock_tick_handler() - Analyse data and update display. * Updates the text layer clock_layer to show current time. * This function is the handler for tick events and is called every * second. */ static void clock_tick_handler(struct tm *tick_time, TimeUnits units_changed) { static char s_batt_buffer[16]; static char s_time_buffer[16]; static int dataUpdateCount = 0; static int lastAlarmState = 0; if (isManAlarm) { APP_LOG(APP_LOG_LEVEL_DEBUG,"Manual Alarm - manAlarmTime=%d, manAlarmPeriod=%d", manAlarmTime,manAlarmPeriod); if (manAlarmTime < manAlarmPeriod) { alarmState = ALARM_STATE_MAN_ALARM; text_layer_set_text(alarm_layer, "** MAN ALARM **"); manAlarmTime += 1; } else { isManAlarm = 0; manAlarmTime = 0; } } if (isMuted) { APP_LOG(APP_LOG_LEVEL_DEBUG,"Alarms Muted - muteTime=%d",muteTime); if (muteTime < mutePeriod) { text_layer_set_text(alarm_layer, "** MUTE **"); muteTime += 1; } else { isMuted = 0; muteTime = 0; } } // Do FFT analysis if we have filled the buffer with data. if (accDataFull) { do_analysis(); if (fallActive) check_fall(); // sets fallDetected global variable. // Check the alarm state, and set the global alarmState variable. alarm_check(); // If no seizure detected, modify alarmState to reflect potential fall // detection if ((alarmState == ALARM_STATE_OK) && (fallDetected==1)) alarmState = ALARM_STATE_FALL; // Display alarm message on screen. if (alarmState == ALARM_STATE_OK) { text_layer_set_text(alarm_layer, "OK"); } if (alarmState == ALARM_STATE_WARN) { //vibes_short_pulse(); text_layer_set_text(alarm_layer, "WARNING"); } if (alarmState == ALARM_STATE_ALARM) { //vibes_long_pulse(); text_layer_set_text(alarm_layer, "** ALARM **"); } if (alarmState == ALARM_STATE_FALL) { //vibes_long_pulse(); text_layer_set_text(alarm_layer, "** FALL **"); } if (isManAlarm) { alarmState = ALARM_STATE_MAN_ALARM; text_layer_set_text(alarm_layer, "** MAN ALARM **"); } if (isMuted) { alarmState = ALARM_STATE_MUTE; text_layer_set_text(alarm_layer, "** MUTE **"); } // Send data to phone if we have an alarm condition. // or if alarm state has changed from last time. if ((alarmState != ALARM_STATE_OK && !isMuted) || (alarmState != lastAlarmState)) { sendSdData(); } lastAlarmState = alarmState; } // See if it is time to send data to the phone. dataUpdateCount++; if (dataUpdateCount>=dataUpdatePeriod) { sendSdData(); dataUpdateCount = 0; } // Update the display text_layer_set_text(text_layer, "OpenSeizureDetector"); if (clock_is_24h_style()) { strftime(s_time_buffer, sizeof(s_time_buffer), "%H:%M:%S", tick_time); } else { strftime(s_time_buffer, sizeof(s_time_buffer), "%I:%M:%S", tick_time); } text_layer_set_text(clock_layer, s_time_buffer); BatteryChargeState charge_state = battery_state_service_peek(); snprintf(s_batt_buffer,sizeof(s_batt_buffer), "%d%%", charge_state.charge_percent); text_layer_set_text(batt_layer, s_batt_buffer); }
bool canVibrate(void) { return !config_dontVibrateWhenCharging || !battery_state_service_peek().is_plugged; }
static void update_time() { // Get a tm structure time_t temp = time(NULL); struct tm *tick_time = localtime(&temp); // Manila = UTC+08:00 // Create a long-lived buffer static char buffer[] = "00:00:00"; // Write the current hours and minutes into the buffer if(clock_is_24h_style() == true) { //Use 24h hour format strftime(buffer, sizeof("00:00:00"), "%H:%M:%S", tick_time); } else { //Use 12 hour format strftime(buffer, sizeof("00:00:00"), "%I:%M", tick_time); } // TODO: CONVERT TO subscribe // TODO: vibrate upon change static char buffer_bluetooth [100]; if ((bluetooth_connection_service_peek() == true)) { strncpy(buffer_bluetooth, "", 100); } else { strncpy(buffer_bluetooth, "!", 100); } // http://developer.getpebble.com/docs/c/Foundation/Event_Service/BatteryStateService/ // http://developer.getpebble.com/guides/pebble-apps/app-events/battery-service/ static char buffer_battery [100]; BatteryChargeState charge_state = battery_state_service_peek(); if (charge_state.is_charging) { snprintf(buffer_battery, sizeof(buffer_battery), " %d%%^", charge_state.charge_percent); } else { snprintf(buffer_battery, sizeof(buffer_battery), " %d%%", charge_state.charge_percent); } //http://developer.getpebble.com/blog/2013/07/24/Using-Pebble-System-Fonts/ static char buffer_date [100]; //strftime(buffer_date, sizeof("Saturday 31 September"), "%A %e %B", tick_time); // Sunday 27 September strftime(buffer_date, sizeof("2015-12-31"), "%Y-%m-%d", tick_time); // 2015-12-31 static char buffer_world [100]; time_t rawtime = time(NULL); struct tm *ptm = gmtime ( &rawtime ); ptm->tm_hour += 8; // PH = +8 (depends on DLS) ptm->tm_min += 0; time_t shiftedTime = mktime( ptm ); struct tm *pShiftedTm = gmtime( &shiftedTime ); strftime(buffer_world, sizeof("00 "), "%H ", pShiftedTm); // Display this time on the TextLayer text_layer_set_text(s_time_layer, buffer); int time_min = tick_time->tm_min; int time_hour = tick_time->tm_hour; static char buffer_timeintext [100]; static char buffer_timeintext_row_02 [100]; static char buffer_timeintext_row_03 [100]; static char buffer_timeintext_row_04 [100]; static char buffer_timeintext_row_05 [100]; static char time_hour_word [100]; strncpy(time_hour_word, "het uur", 100); static char time_hour_next_word [100]; strncpy(time_hour_next_word, "volgend uur", 100); if ((time_hour == 0)) { strncpy(time_hour_word, "twaalf", 100); strncpy(time_hour_next_word, "een", 100); } else if ((time_hour == 1)) { strncpy(time_hour_word, "een", 100); strncpy(time_hour_next_word, "twee", 100); } else if ((time_hour == 2)) { strncpy(time_hour_word, "twee", 100); strncpy(time_hour_next_word, "drie", 100); } else if ((time_hour == 3)) { strncpy(time_hour_word, "drie", 100); strncpy(time_hour_next_word, "vier", 100); } else if ((time_hour == 4)) { strncpy(time_hour_word, "vier", 100); strncpy(time_hour_next_word, "vijf", 100); } else if ((time_hour == 5)) { strncpy(time_hour_word, "vijf", 100); strncpy(time_hour_next_word, "zes", 100); } else if ((time_hour == 6)) { strncpy(time_hour_word, "zes", 100); strncpy(time_hour_next_word, "zeven", 100); } else if ((time_hour == 7)) { strncpy(time_hour_word, "zeven", 100); strncpy(time_hour_next_word, "acht", 100); } else if ((time_hour == 8)) { strncpy(time_hour_word, "acht", 100); strncpy(time_hour_next_word, "negen", 100); } else if ((time_hour == 9)) { strncpy(time_hour_word, "negen", 100); strncpy(time_hour_next_word, "tien", 100); } else if ((time_hour == 10)) { strncpy(time_hour_word, "tien", 100); strncpy(time_hour_next_word, "elf", 100); } else if ((time_hour == 11)) { strncpy(time_hour_word, "elf", 100); strncpy(time_hour_next_word, "twaalf", 100); } else if ((time_hour == 12)) { strncpy(time_hour_word, "twaalf", 100); strncpy(time_hour_next_word, "een", 100); } else if ((time_hour == 13)) { strncpy(time_hour_word, "een", 100); strncpy(time_hour_next_word, "twee", 100); } else if ((time_hour == 14)) { strncpy(time_hour_word, "twee", 100); strncpy(time_hour_next_word, "drie", 100); } else if ((time_hour == 15)) { strncpy(time_hour_word, "drie", 100); strncpy(time_hour_next_word, "vier", 100); } else if ((time_hour == 16)) { strncpy(time_hour_word, "vier", 100); strncpy(time_hour_next_word, "vijf", 100); } else if ((time_hour == 17)) { strncpy(time_hour_word, "vijf", 100); strncpy(time_hour_next_word, "zes", 100); } else if ((time_hour == 18)) { strncpy(time_hour_word, "zes", 100); strncpy(time_hour_next_word, "zeven", 100); } else if ((time_hour == 19)) { strncpy(time_hour_word, "zeven", 100); strncpy(time_hour_next_word, "acht", 100); } else if ((time_hour == 20)) { strncpy(time_hour_word, "acht", 100); strncpy(time_hour_next_word, "negen", 100); } else if ((time_hour == 21)) { strncpy(time_hour_word, "negen", 100); strncpy(time_hour_next_word, "tien", 100); } else if ((time_hour == 22)) { strncpy(time_hour_word, "tien", 100); strncpy(time_hour_next_word, "elf", 100); } else if ((time_hour == 23)) { strncpy(time_hour_word, "elf", 100); strncpy(time_hour_next_word, "twaalf", 100); } else if ((time_hour == 24)) { strncpy(time_hour_word, "twaalf", 100); strncpy(time_hour_next_word, "een", 100); } //snprintf(buffer_timeintext, sizeof(buffer_timeintext), "%d", tick_time->tm_min); //http://forums.getpebble.com/discussion/5508/new-to-c-accessing-the-time-data-as-an-integer //layer_set_hidden(LAYERNAME, true); // display TimeInText if ((tick_time->tm_min >= 0 && tick_time->tm_min <= 2)) { // op het uur if ((time_hour > 23)) { strncpy(buffer_timeintext, "", 100); strncpy(buffer_timeintext_row_02, "Midder-\nnacht", 100); strncpy(buffer_timeintext_row_03, "", 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_44); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_44); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else { strncpy(buffer_timeintext, "", 100); strncpy(buffer_timeintext_row_02, "", 100); strncpy(buffer_timeintext_row_03, "", 100); strncpy(buffer_timeintext_row_04, time_hour_word, 100); strncpy(buffer_timeintext_row_05, "uur", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_44); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_44); text_layer_set_font(s_timeintext_row_04_layer, FONT_50); text_layer_set_font(s_timeintext_row_05_layer, FONT_50); } } else if ((time_min >= 58 && time_min <= 62)) { // op het uur if ((time_hour > 23)) { strncpy(buffer_timeintext, "", 100); strncpy(buffer_timeintext_row_02, "Midder-\nnacht", 100); strncpy(buffer_timeintext_row_03, "", 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_50); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_50); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else { strncpy(buffer_timeintext, "", 100); strncpy(buffer_timeintext_row_02, "", 100); strncpy(buffer_timeintext_row_03, "", 100); strncpy(buffer_timeintext_row_04, time_hour_next_word, 100); // next word gebruiken, want is eigenlijk nog maar 2 of 1 voor strncpy(buffer_timeintext_row_05, "uur", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_44); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_44); text_layer_set_font(s_timeintext_row_04_layer, FONT_50); text_layer_set_font(s_timeintext_row_05_layer, FONT_50); } } else if ((time_min >= 3 && time_min <= 7)) { // 5 over strncpy(buffer_timeintext, "vijf", 100); strncpy(buffer_timeintext_row_02, "over", 100); strncpy(buffer_timeintext_row_03, time_hour_word, 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_50); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_50); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else if ((time_min >= 8 && time_min <= 12)) { // 10 over strncpy(buffer_timeintext, "tien", 100); strncpy(buffer_timeintext_row_02, "over", 100); strncpy(buffer_timeintext_row_03, time_hour_word, 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_50); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_50); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else if ((time_min >= 13 && time_min <= 17)) { // kwart over strncpy(buffer_timeintext, "kwart", 100); strncpy(buffer_timeintext_row_02, "over", 100); strncpy(buffer_timeintext_row_03, time_hour_word, 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_50); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_50); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else if ((time_min >= 18 && time_min <= 22)) { // 20 over strncpy(buffer_timeintext, "twintig", 100); strncpy(buffer_timeintext_row_02, "over", 100); strncpy(buffer_timeintext_row_03, time_hour_word, 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_38); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_44); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else if ((time_min >= 23 && time_min <= 27)) { // 5 voor half strncpy(buffer_timeintext, "vijf", 100); strncpy(buffer_timeintext_row_02, "voor half", 100); strncpy(buffer_timeintext_row_03, time_hour_next_word, 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_50); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_50); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else if ((time_min >= 28 && time_min <= 32)) { // half strncpy(buffer_timeintext, "", 100); strncpy(buffer_timeintext_row_02, "", 100); strncpy(buffer_timeintext_row_03, "", 100); strncpy(buffer_timeintext_row_04, "half", 100); strncpy(buffer_timeintext_row_05, time_hour_next_word, 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_50); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_50); text_layer_set_font(s_timeintext_row_04_layer, FONT_50); text_layer_set_font(s_timeintext_row_05_layer, FONT_50); } else if ((time_min >= 33 && time_min <= 37)) { // 5 over half strncpy(buffer_timeintext, "vijf", 100); strncpy(buffer_timeintext_row_02, "over half", 100); strncpy(buffer_timeintext_row_03, time_hour_next_word, 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_50); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_50); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else if ((time_min >= 38 && time_min <= 42)) { // 20 voor strncpy(buffer_timeintext, "twintig", 100); strncpy(buffer_timeintext_row_02, "voor", 100); strncpy(buffer_timeintext_row_03, time_hour_next_word, 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_38); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_44); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else if ((time_min >= 43 && time_min <= 47)) { // kwart voor strncpy(buffer_timeintext, "kwart", 100); strncpy(buffer_timeintext_row_02, "voor", 100); strncpy(buffer_timeintext_row_03, time_hour_next_word, 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_50); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_50); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else if ((time_min >= 48 && time_min <= 52)) { // 10 voor strncpy(buffer_timeintext, "tien", 100); strncpy(buffer_timeintext_row_02, "voor", 100); strncpy(buffer_timeintext_row_03, time_hour_next_word, 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_50); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_50); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else if ((time_min >= 53 && time_min <= 57)) { // 5 voor strncpy(buffer_timeintext, "vijf", 100); strncpy(buffer_timeintext_row_02, "voor", 100); strncpy(buffer_timeintext_row_03, time_hour_next_word, 100); strncpy(buffer_timeintext_row_04, "", 100); strncpy(buffer_timeintext_row_05, "", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_50); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_50); text_layer_set_font(s_timeintext_row_04_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } else { // error strncpy(buffer_timeintext, "error_row_01", 100); strncpy(buffer_timeintext_row_02, "error_row_02", 100); strncpy(buffer_timeintext_row_03, "error_row_03", 100); strncpy(buffer_timeintext_row_04, "error_row_04", 100); strncpy(buffer_timeintext_row_05, "error_row_05", 100); text_layer_set_font(s_timeintext_row_01_layer, FONT_20); text_layer_set_font(s_timeintext_row_02_layer, FONT_20); text_layer_set_font(s_timeintext_row_03_layer, FONT_20); text_layer_set_font(s_timeintext_row_04_layer, FONT_20); text_layer_set_font(s_timeintext_row_05_layer, FONT_20); } // Reduce font for 'twaalf' if ((time_hour == 12)) { text_layer_set_font(s_timeintext_row_03_layer, FONT_44); text_layer_set_font(s_timeintext_row_05_layer, FONT_44); } if ((1 > 2)) { // } else if ((time_min == 58 || time_min == 3 || time_min == 8 || time_min == 13 || time_min == 18 || time_min == 23 || time_min == 28 || time_min == 33 || time_min == 38 || time_min == 43 || time_min == 48 || time_min == 53 )) { // 2 voor text_layer_set_text_color(s_timeintext_row_01_layer, GColorYellow); text_layer_set_text_color(s_timeintext_row_02_layer, GColorYellow); text_layer_set_text_color(s_timeintext_row_03_layer, GColorYellow); text_layer_set_text_color(s_timeintext_row_04_layer, GColorYellow); text_layer_set_text_color(s_timeintext_row_05_layer, GColorYellow); } else if ((time_min == 59 || time_min == 4 || time_min == 9 || time_min == 14 || time_min == 19 || time_min == 24 || time_min == 29 || time_min == 34 || time_min == 39 || time_min == 44 || time_min == 49 || time_min == 54 )) { // 1 voor text_layer_set_text_color(s_timeintext_row_01_layer, GColorVividCerulean); text_layer_set_text_color(s_timeintext_row_02_layer, GColorVividCerulean); text_layer_set_text_color(s_timeintext_row_03_layer, GColorVividCerulean); text_layer_set_text_color(s_timeintext_row_04_layer, GColorVividCerulean); text_layer_set_text_color(s_timeintext_row_05_layer, GColorVividCerulean); } else if ((time_min == 0 || time_min == 5 || time_min == 10 || time_min == 15 || time_min == 20 || time_min == 25 || time_min == 30 || time_min == 35 || time_min == 40 || time_min == 45 || time_min == 50 || time_min == 55 )) { // op het uur text_layer_set_text_color(s_timeintext_row_01_layer, GColorGreen); text_layer_set_text_color(s_timeintext_row_02_layer, GColorGreen); text_layer_set_text_color(s_timeintext_row_03_layer, GColorGreen); text_layer_set_text_color(s_timeintext_row_04_layer, GColorGreen); text_layer_set_text_color(s_timeintext_row_05_layer, GColorGreen); } else if ((time_min == 1 || time_min == 6 || time_min == 11 || time_min == 16 || time_min == 21 || time_min == 26 || time_min == 31 || time_min == 36 || time_min == 41 || time_min == 46 || time_min == 51 || time_min == 56 )) { // 1 na text_layer_set_text_color(s_timeintext_row_01_layer, GColorVividCerulean); text_layer_set_text_color(s_timeintext_row_02_layer, GColorVividCerulean); text_layer_set_text_color(s_timeintext_row_03_layer, GColorVividCerulean); text_layer_set_text_color(s_timeintext_row_04_layer, GColorVividCerulean); text_layer_set_text_color(s_timeintext_row_05_layer, GColorVividCerulean); } else if ((time_min == 2 || time_min == 7 || time_min == 12 || time_min == 17 || time_min == 22 || time_min == 27 || time_min == 32 || time_min == 37 || time_min == 42 || time_min == 47 || time_min == 52 || time_min == 57 )) { // 2 na text_layer_set_text_color(s_timeintext_row_01_layer, GColorRed); text_layer_set_text_color(s_timeintext_row_02_layer, GColorRed); text_layer_set_text_color(s_timeintext_row_03_layer, GColorRed); text_layer_set_text_color(s_timeintext_row_04_layer, GColorRed); text_layer_set_text_color(s_timeintext_row_05_layer, GColorRed); } text_layer_set_text(s_timeintext_row_01_layer, buffer_timeintext); text_layer_set_text(s_timeintext_row_02_layer, buffer_timeintext_row_02); text_layer_set_text(s_timeintext_row_03_layer, buffer_timeintext_row_03); text_layer_set_text(s_timeintext_row_04_layer, buffer_timeintext_row_04); text_layer_set_text(s_timeintext_row_05_layer, buffer_timeintext_row_05); text_layer_set_text(s_bluetooth_layer, buffer_bluetooth); text_layer_set_text(s_battery_layer, buffer_battery); text_layer_set_text(s_date_layer, buffer_date); text_layer_set_text(s_world_layer, buffer_world); }
static void update_display(struct tm *current_time, TimeUnits units_changed){ if(blink == 0){ if(current_time->tm_sec % 2 == 0){ layer_set_hidden(bitmap_layer_get_layer(dots_layer), false); } else { layer_set_hidden(bitmap_layer_get_layer(dots_layer), true); } } if(battery_state_service_peek().is_charging){ if(current_time->tm_sec % 2 == 0){ layer_set_hidden(bitmap_layer_get_layer(meter_bar_layer), false); is_hidden = false; } else { layer_set_hidden(bitmap_layer_get_layer(meter_bar_layer), true); is_hidden = true; } } else { if(is_hidden){ layer_set_hidden(bitmap_layer_get_layer(meter_bar_layer), false); is_hidden = false; } } if (units_changed & MINUTE_UNIT) { set_container_image(&time_digits_images[2], time_digits_layers[2], BIG_DIGIT_IMAGE_RESOURCE_IDS[current_time->tm_min/10]); set_container_image(&time_digits_images[3], time_digits_layers[3], BIG_DIGIT_IMAGE_RESOURCE_IDS[current_time->tm_min%10]); if (units_changed & HOUR_UNIT) { // TODO implement hourly display changes unsigned short display_hour = get_display_hour(current_time->tm_hour); set_container_image(&time_digits_images[0], time_digits_layers[0], BIG_DIGIT_IMAGE_RESOURCE_IDS[display_hour/10]); set_container_image(&time_digits_images[1], time_digits_layers[1], BIG_DIGIT_IMAGE_RESOURCE_IDS[display_hour%10]); if(display_hour < 10 && zeroes == 0) { layer_set_hidden(bitmap_layer_get_layer(time_digits_layers[0]), true); } else { layer_set_hidden(bitmap_layer_get_layer(time_digits_layers[0]), false); } if(!clock_is_24h_style()){ strftime(text_buffer, sizeof(text_buffer), "%p", current_time); text_layer_set_text(time_format_layer, text_buffer); } else { text_layer_set_text(time_format_layer, "24H"); } if (units_changed & DAY_UNIT) { char *formating0 = "%b"; char *formating1 = "%e"; if(date == 0){ formating0 ="%b"; if(zeroes == 0){ formating1 = "%e"; } else { formating1 = "%d"; } } else { if(zeroes == 0){ formating0 = "%e"; } else { formating0 = "%d"; } formating1 = "%b"; } strftime(text_buffer0, sizeof(text_buffer0), formating0, current_time); text_layer_set_text(date_layer[0], text_buffer0); strftime(text_buffer1, sizeof(text_buffer1), formating1, current_time); text_layer_set_text(date_layer[1], text_buffer1); GRect frame = (GRect){{0, 15}, {15, 2}}; if(square == 1){ frame = (GRect){{0, 3}, {15, 13}}; } int offset[] = {0, 16, 33, 48, 67, 82, 94}; int width[] = {15, 17, 14, 19, 14, 12, 15}; frame.origin.x = offset[current_time->tm_wday]; frame.size.w = width[current_time->tm_wday]; if(square == 0){ frame.origin.x = frame.origin.x + 1; frame.size.w = frame.size.w - 2; } layer_set_frame(inverter_layer_get_layer(day_inv_layer), frame); if(units_changed & MONTH_UNIT){ //Showing of month name is already solved during the day show } } } } }
static void tick_handler(struct tm *t, TimeUnits units_changed){ light_enable(true); handle_battery(battery_state_service_peek()); }
void handle_init(void) { window = window_create(); window_stack_push(window, true /* Animated */); window_set_background_color(window, GColorBlack); Layer *window_layer = window_get_root_layer(window); // Setup weather bar Layer *weather_holder = layer_create(GRect(0, 0, 144, 50)); layer_add_child(window_layer, weather_holder); icon_layer = bitmap_layer_create(GRect(8, 7, 40, 40)); layer_add_child(weather_holder, bitmap_layer_get_layer(icon_layer)); temp_layer = text_layer_create(GRect(32, 10, 144 - 40, 28)); text_layer_set_text_color(temp_layer, GColorWhite); text_layer_set_background_color(temp_layer, GColorClear); text_layer_set_font(temp_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28_BOLD)); text_layer_set_text_alignment(temp_layer, GTextAlignmentRight); layer_add_child(weather_holder, text_layer_get_layer(temp_layer)); // Initialize date & time text Layer *date_holder = layer_create(GRect(0, 52, 144, 94)); layer_add_child(window_layer, date_holder); ResHandle roboto_21 = resource_get_handle(RESOURCE_ID_FONT_ROBOTO_CONDENSED_21); text_day_layer = text_layer_create(GRect(8, 0, 144-8, 25)); text_layer_set_text_color(text_day_layer, GColorWhite); text_layer_set_background_color(text_day_layer, GColorClear); text_layer_set_font(text_day_layer, fonts_load_custom_font(roboto_21)); layer_add_child(date_holder, text_layer_get_layer(text_day_layer)); text_date_layer = text_layer_create(GRect(8, 21, 144-8, 25)); text_layer_set_text_color(text_date_layer, GColorWhite); text_layer_set_background_color(text_date_layer, GColorClear); text_layer_set_font(text_date_layer, fonts_load_custom_font(roboto_21)); layer_add_child(date_holder, text_layer_get_layer(text_date_layer)); line_layer = layer_create(GRect(8, 47, 144-16, 2)); layer_set_update_proc(line_layer, line_layer_update_callback); layer_add_child(date_holder, line_layer); line_layer = layer_create(GRect(8, 0, 144-16, 2)); layer_set_update_proc(line_layer, line_layer_update_callback); layer_add_child(date_holder, line_layer); ResHandle roboto_49 = resource_get_handle(RESOURCE_ID_FONT_ROBOTO_BOLD_SUBSET_49); text_time_layer = text_layer_create(GRect(7, 45, 144-7, 49)); text_layer_set_text_color(text_time_layer, GColorWhite); text_layer_set_background_color(text_time_layer, GColorClear); text_layer_set_text_alignment(text_time_layer, GTextAlignmentCenter); text_layer_set_font(text_time_layer, fonts_load_custom_font(roboto_49)); layer_add_child(date_holder, text_layer_get_layer(text_time_layer)); // Setup messaging const int inbound_size = 64; const int outbound_size = 64; app_message_open(inbound_size, outbound_size); Tuplet initial_values[] = { TupletInteger(WEATHER_ICON_KEY, (uint8_t) 13), TupletCString(WEATHER_TEMPERATURE_KEY, ""), TupletInteger(INVERT_COLOR_KEY, persist_read_bool(INVERT_COLOR_KEY)), }; app_sync_init(&sync, sync_buffer, sizeof(sync_buffer), initial_values, ARRAY_LENGTH(initial_values), sync_tuple_changed_callback, NULL, NULL); // FIXME testing code battery_text_layer = text_layer_create(GRect(0, 53, 144-8, 30)); text_layer_set_text_color(battery_text_layer, GColorWhite); text_layer_set_background_color(battery_text_layer, GColorClear); text_layer_set_font(battery_text_layer, fonts_load_custom_font(roboto_21)); text_layer_set_text_alignment(battery_text_layer, GTextAlignmentRight); layer_add_child(window_layer, text_layer_get_layer(battery_text_layer)); // Subscribe to notifications bluetooth_connection_service_subscribe(bluetooth_connection_changed); tick_timer_service_subscribe(MINUTE_UNIT, handle_minute_tick); battery_state_service_subscribe(update_battery_state); // Update the battery on launch update_battery_state(battery_state_service_peek()); // TODO: Update display here to avoid blank display on launch? }
static void main_window_load(Window *window) { Layer *window_layer = window_get_root_layer(window); static BatteryChargeState battery_state; /* defaults */ settings.show_date = 0; settings.show_battery = 0; settings.use_bold_font = 0; settings.use_larger_font = 0; persist_read_data(SETTINGS_KEY, &settings, sizeof(settings)); window_bounds = layer_get_bounds(window_layer); watch_bounds = window_bounds; if (settings.show_date || settings.show_battery) { if (settings.use_larger_font) { watch_bounds.origin.y += 18; watch_bounds.size.h -= 18; } else { watch_bounds.origin.y += 14; watch_bounds.size.h -= 14; } } tick_radius = MIN(watch_bounds.size.h, watch_bounds.size.w) / 2 - 2; second_hand_length = tick_radius - 3; minute_hand_length = ROUND(tick_radius * 0.8); hour_hand_length = ROUND(tick_radius * 0.5); window_set_background_color(window, GColorBlack); s_ticks_layer = layer_create(watch_bounds); layer_set_update_proc(s_ticks_layer, ticks_update_proc); layer_add_child(window_layer, s_ticks_layer); inner_bounds = layer_get_bounds(s_ticks_layer); center = grect_center_point(&inner_bounds); s_wall_time_layer = layer_create(watch_bounds); layer_set_update_proc(s_wall_time_layer, canvas_update_proc); layer_add_child(window_layer, s_wall_time_layer); s_date_text_layer = NULL; s_batt_text_layer = NULL; if (settings.use_bold_font) { if (settings.use_larger_font) { s_font = fonts_get_system_font(FONT_KEY_GOTHIC_18_BOLD); } else { s_font = fonts_get_system_font(FONT_KEY_GOTHIC_14_BOLD); } } else { if (settings.use_larger_font) { s_font = fonts_get_system_font(FONT_KEY_GOTHIC_18); } else { s_font = fonts_get_system_font(FONT_KEY_GOTHIC_14); } } if (settings.show_date) { s_date_text_layer = text_layer_create(GRect(0, 0, 90, settings.use_larger_font ? 18 : 14)); text_layer_set_background_color(s_date_text_layer, GColorBlack); text_layer_set_text_color(s_date_text_layer, GColorWhite); text_layer_set_font(s_date_text_layer, s_font); text_layer_set_text_alignment(s_date_text_layer, GTextAlignmentLeft); layer_add_child(window_layer, text_layer_get_layer(s_date_text_layer)); } if (settings.show_battery) { s_batt_text_layer = text_layer_create(GRect(90, 0, 54, settings.use_larger_font ? 18 : 14)); text_layer_set_background_color(s_batt_text_layer, GColorBlack); text_layer_set_text_color(s_batt_text_layer, GColorWhite); text_layer_set_font(s_batt_text_layer, s_font); text_layer_set_text_alignment(s_batt_text_layer, GTextAlignmentRight); layer_add_child(window_layer, text_layer_get_layer(s_batt_text_layer)); } minute_when_last_updated = -1; layer_mark_dirty(s_wall_time_layer); tick_timer_service_subscribe(SECOND_UNIT, tick_handler); if (settings.show_battery) { battery_state = battery_state_service_peek(); on_battery_state_change(battery_state); battery_state_service_subscribe(on_battery_state_change); } }
static void handle_init() { time_t clock = time(NULL); now = localtime(&clock); window = window_create(); window_stack_push(window, true /* Animated */); window_set_background_color(window, GColorBlack); Layer *window_layer = window_get_root_layer(window); background_layer = layer_create(GRect(0, 0, 144, 144)); layer_set_update_proc(background_layer, background_layer_update_callback); layer_add_child(window_layer, background_layer); hands_layer = layer_create(layer_get_frame(background_layer)); layer_set_update_proc(hands_layer, hands_layer_update_callback); layer_add_child(background_layer, hands_layer); for (int i = 0; i < 22; i++) { battery_images[i] = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BATTERY_0 + i); } battery_layer = bitmap_layer_create(GRect(144-16-3, 3, 16, 10)); layer_add_child(window_layer, bitmap_layer_get_layer(battery_layer)); for (int i = 0; i < 2; i++) bluetooth_images[i] = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BLUETOOTH_OFF + i); bluetooth_layer = bitmap_layer_create(GRect(66, 0, 13, 13)); layer_add_child(background_layer, bitmap_layer_get_layer(bluetooth_layer)); battp_layer = text_layer_create(GRect(0, 0, 32, 16)); text_layer_set_text_color(battp_layer, GColorWhite); text_layer_set_background_color(battp_layer, GColorBlack); layer_add_child(window_layer, text_layer_get_layer(battp_layer)); hour_path = gpath_create(&HOUR_POINTS); hour_in_path = gpath_create(&HOUR_IN_POINTS); gpath_move_to(hour_path, GPoint(CENTER_X, CENTER_Y)); gpath_move_to(hour_in_path, GPoint(CENTER_X, CENTER_Y)); min_path = gpath_create(&MIN_POINTS); gpath_move_to(min_path, GPoint(CENTER_X, CENTER_Y)); font = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_20)); font2 = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_28)); time_layer = text_layer_create(GRect(25,146,94,24)); text_layer_set_text_alignment(time_layer, GTextAlignmentCenter); text_layer_set_text_color(time_layer, GColorWhite); text_layer_set_background_color(time_layer, GColorClear); text_layer_set_font(time_layer, font); layer_add_child(window_layer, text_layer_get_layer(time_layer)); date_layer = text_layer_create(GRect(94, 136, 50, 50)); text_layer_set_text_alignment(date_layer, GTextAlignmentRight); text_layer_set_text_color(date_layer, GColorWhite); text_layer_set_background_color(date_layer, GColorClear); text_layer_set_font(date_layer, font2); layer_add_child(window_layer, text_layer_get_layer(date_layer)); day_layer = text_layer_create(GRect(0, 146, 50, 24)); text_layer_set_text_alignment(day_layer, GTextAlignmentLeft); text_layer_set_text_color(day_layer, GColorWhite); text_layer_set_background_color(day_layer, GColorClear); text_layer_set_font(day_layer, font); layer_add_child(window_layer, text_layer_get_layer(day_layer)); tick_timer_service_subscribe(MINUTE_UNIT, handle_tick); battery_state_service_subscribe(&handle_battery); handle_battery(battery_state_service_peek()); bluetooth_connection_service_subscribe(&handle_bluetooth); handle_bluetooth(bluetooth_connection_service_peek()); handle_tick(now,1); }
void app_event_loop() { bool isRunning=true; SDL_Event event; uint32_t lastTick; int32_t delay; int i; struct tm* now; printf("[DEBUG] Got app_event_loop\n"); while (isRunning) { lastTick=SDL_GetTicks (); SDL_PumpEvents (); while (SDL_PollEvent (&event)) { switch (event.type) { case(SDL_QUIT): { isRunning=false; } break; case(SDL_KEYDOWN): { switch (event.key.keysym.sym) { case(SDLK_ESCAPE): { isRunning=false; } break; case(SDLK_F1): { bodyID=(bodyID+1)%BODY_COUNT; bodyRender=true; } break; case(SDLK_F2): { shadow=!shadow; markDirty(true); bodyRender=true; } break; case(SDLK_F3): { toggle_24h_style(); if (clock_is_24h_style ()) SDL_WM_SetCaption("Pebble Local Simulator - 24H Style",0); else SDL_WM_SetCaption("Pebble Local Simulator - 12H Style",0); } break; case(SDLK_F4): { toggle_bluetooth_connection(); printf("[INFO] Toggle bluetooth %s\n", bluetooth_connection_service_peek() ? "ON":"OFF"); } break; case(SDLK_F5): { BatteryChargeState state; toggle_battery_charger_plugged(); state = battery_state_service_peek(); printf("[INFO] Toggle plugged: %d%%, %s charging, %s plugged\n", state.charge_percent, state.is_charging ? "":"not", state.is_plugged ? "":"not"); } break; case(SDLK_F12): { time_t timeSec=time(0); now=localtime(&timeSec); strftime (titleBuffer,strlen(titleBuffer),"./simdata/screenshots/%Y-%m-%e-%H-%M-%S",now); strcat(titleBuffer,".bmp"); if (SDL_SaveBMP(screen,titleBuffer)<0) printf("[WARN] SDL_SaveBMP: %s\n",SDL_GetError ()); else printf ("[INFO] Saved screenshot: %s\n",titleBuffer); } break; case(SDLK_PLUS): { BatteryChargeState state; battery_charge_increase(); state = battery_state_service_peek(); printf("[INFO] Battery state: %d%%, %s charging, %s plugged\n", state.charge_percent, state.is_charging ? "":"not", state.is_plugged ? "":"not"); } break; case(SDLK_MINUS): { BatteryChargeState state; battery_charge_decrease(); state = battery_state_service_peek(); printf("[INFO] Battery state: %d%%, %s charging, %s plugged\n", state.charge_percent, state.is_charging ? "":"not", state.is_plugged ? "":"not"); } break; case (SDLK_x): { int32_t direction=1; if(event.key.keysym.mod & KMOD_SHIFT) { direction=-1; } accel_do_tap_on_axis(ACCEL_AXIS_X, direction); printf("[INFO] Tap X %d\n", direction); } break; case (SDLK_y): { int32_t direction=1; if(event.key.keysym.mod & KMOD_SHIFT) { direction=-1; } accel_do_tap_on_axis(ACCEL_AXIS_Y, direction); printf("[INFO] Tap Y %d\n", direction); } break; case (SDLK_z): { int32_t direction=1; if(event.key.keysym.mod & KMOD_SHIFT) { direction=-1; } accel_do_tap_on_axis(ACCEL_AXIS_Z, direction); printf("[INFO] Tap Z %d\n", direction); } break; case (KEY_BUTTON_BACK): { buttonState[BUTTON_ID_BACK]=true; bodyRender=true; onButtonDown(BUTTON_ID_BACK); } break; case (KEY_BUTTON_UP): { buttonState[BUTTON_ID_UP]=true; bodyRender=true; onButtonDown(BUTTON_ID_UP); } break; case (KEY_BUTTON_SELECT): { buttonState[BUTTON_ID_SELECT]=true; bodyRender=true; onButtonDown(BUTTON_ID_SELECT); } break; case (KEY_BUTTON_DOWN): { buttonState[BUTTON_ID_DOWN]=true; bodyRender=true; onButtonDown(BUTTON_ID_DOWN); } break; default: ; } } break; case(SDL_KEYUP): { switch (event.key.keysym.sym) { case(KEY_BUTTON_BACK): { buttonState[BUTTON_ID_BACK]=false; bodyRender=true; onButtonUp(BUTTON_ID_BACK); } break; case(KEY_BUTTON_UP): { buttonState[BUTTON_ID_UP]=false; bodyRender=true; onButtonUp(BUTTON_ID_UP); } break; case(KEY_BUTTON_SELECT): { buttonState[BUTTON_ID_SELECT]=false; bodyRender=true; onButtonUp(BUTTON_ID_SELECT); } break; case(KEY_BUTTON_DOWN): { buttonState[BUTTON_ID_DOWN]=false; bodyRender=true; onButtonUp(BUTTON_ID_DOWN); } break; default: ; } } break; default: ; } } for (i=0;i<SIM_SERVICE_COUNT;i++) (serviceData.services[i]) (); if (lastVibeState!=getVibeState()) { bodyRender=true; lastVibeState=getVibeState(); } if (lastLightState!=getLightState()) { bodyRender=true; lastLightState=getLightState(); } if (render ()||bodyRender) simulatorRender (); delay=(SDL_GetTicks()-lastTick); elapsed=delay/1000.0f; delay=16-delay; //equals about 60 frames per second lastTick=SDL_GetTicks(); if (delay>0) SDL_Delay(delay); } }
// update display static void update_display() { // Getting Battery State BatteryChargeState current_battery_charge_state = battery_state_service_peek(); if (current_battery_charge_state.is_charging) { chargeState = -1; } else { chargeState = current_battery_charge_state.charge_percent; } //APP_LOG(APP_LOG_LEVEL_DEBUG, "Setting chargeState = %d", chargeState); // Get a tm structure time_t temp = time(NULL); struct tm *tick_time = localtime(&temp); // Create a long-lived buffers static char buffer_hh[] = "00"; static char buffer_mm[] = "00"; static char buffer_dte[] = "ddd 00 mmm"; // Write the current hours into the buffer if(clock_is_24h_style() == true) { // Use 24 hour format strftime(buffer_hh, sizeof("00:00"), "%H", tick_time); } else { // Use 12 hour format strftime(buffer_hh, sizeof("00:00"), "%I", tick_time); } h1 = ascii_digit_to_int(buffer_hh[0]); h2 = ascii_digit_to_int(buffer_hh[1]); // hide leading zero if required if (h1 == 0 && hh_strip_zero) h1 = -1; // Write the current minuts into the buffer strftime(buffer_mm, sizeof("00"), "%M", tick_time); m1 = ascii_digit_to_int(buffer_mm[0]); m2 = ascii_digit_to_int(buffer_mm[1]); // debug //h1 = h2 = m1 = m2 = 0; // Write the current date into the buffer if (locale != locale_en) { // Ddd 00 Mmm //strftime(buffer_dte, sizeof("ddd 00 mmm"), "%a %d %b", tick_time); snprintf(buffer_dte, sizeof("ddd 00 mmm"), "%s %d %s", DAYS[locale][tick_time->tm_wday], tick_time->tm_mday, MONTHS[locale][tick_time->tm_mon]); } else { // Ddd Mmm 00 //strftime(buffer_dte, sizeof("ddd mmm 00"), "%a %b %d", tick_time); snprintf(buffer_dte, sizeof("ddd mmm 00"), "%s %s %d", DAYS[0][tick_time->tm_wday], MONTHS[0][tick_time->tm_mon], tick_time->tm_mday); } // undload and relaod time images unload_time_images(); load_time_images(); // Display values in TextLayers text_layer_set_text(s_time_layer_dte, buffer_dte); if (connection_service_peek_pebble_app_connection()) { // phone is connected layer_set_hidden(bitmap_layer_get_layer(s_warning_img_layer), true); //layer_set_hidden(text_layer_get_layer(s_time_layer_dte), false); lastBtStateConnected = true; } else { // phone is not connected //layer_set_hidden(text_layer_get_layer(s_time_layer_dte), true); layer_set_hidden(bitmap_layer_get_layer(s_warning_img_layer), false); // if we just lost the connection or if we want to have repeated vibrations, vibe twice if (lastBtStateConnected || repeat_vib) { lastBtStateConnected = false; vibes_double_pulse(); } } }
static void tick_handler(struct tm *tick_time, TimeUnits units_changed) { update_time(); handle_battery(battery_state_service_peek()); }
static void init(void) { window=window_create(); window_stack_push(window, true /* Animated */); background_image_layer=bitmap_layer_create(layer_get_frame(window_get_root_layer(window))); background_image=gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BACKGROUND); bitmap_layer_set_bitmap(background_image_layer, background_image); layer_add_child(window_get_root_layer(window), bitmap_layer_get_layer(background_image_layer)); // Date Layer text_date_layer=text_layer_create(GRect(79, 5, 144-79, 168-5)); text_layer_set_text_color(text_date_layer, GColorWhite); text_layer_set_background_color(text_date_layer, GColorClear); text_layer_set_font(text_date_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_LCARS_BOLD_17))); layer_add_child(window_get_root_layer(window), text_layer_get_layer(text_date_layer)); // Nice date Layer text_nice_date_layer=text_layer_create(GRect(6, 26, 144-6, 168-26)); text_layer_set_background_color(text_nice_date_layer, GColorClear); text_layer_set_font(text_nice_date_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_LCARS_BOLD_17))); layer_add_child(window_get_root_layer(window), text_layer_get_layer(text_nice_date_layer)); // Time Layer text_time_layer=text_layer_create(GRect(36, 12, 144-36, 168-12)); text_layer_set_text_color(text_time_layer, GColorWhite); text_layer_set_background_color(text_time_layer, GColorClear); text_layer_set_font(text_time_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_LCARS_60))); layer_add_child(window_get_root_layer(window), text_layer_get_layer(text_time_layer)); // AMPM Layer text_ampm_layer=text_layer_create(GRect(36, 69, 144-36, 168-69)); text_layer_set_text_color(text_ampm_layer, GColorWhite); text_layer_set_background_color(text_ampm_layer, GColorClear); text_layer_set_font(text_ampm_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_LCARS_BOLD_17))); layer_add_child(window_get_root_layer(window), text_layer_get_layer(text_ampm_layer)); // Stardate Layer text_stardate_layer=text_layer_create(GRect(36, 95, 144-36, 168-95)); text_layer_set_text_color(text_stardate_layer, GColorWhite); text_layer_set_background_color(text_stardate_layer, GColorClear); text_layer_set_font(text_stardate_layer, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_LCARS_36))); layer_add_child(window_get_root_layer(window), text_layer_get_layer(text_stardate_layer)); //Battery layer battery_percent=text_layer_create(GRect(8, 93, 27, 115)); text_layer_set_background_color(battery_percent, GColorClear); text_layer_set_font(battery_percent, fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_LCARS_BOLD_17))); layer_add_child(window_get_root_layer(window), text_layer_get_layer(battery_percent)); //Battery charging layer battery_charge_image_layer=bitmap_layer_create(GRect(10, 92, 16, 3)); battery_charge_image=gbitmap_create_with_resource(RESOURCE_ID_BATTERY_CHARGING_IMAGE); bitmap_layer_set_bitmap(battery_charge_image_layer, battery_charge_image); layer_set_hidden(bitmap_layer_get_layer(battery_charge_image_layer), true); layer_add_child(window_get_root_layer(window), bitmap_layer_get_layer(battery_charge_image_layer)); //Battery status layer battery_status_layer=layer_create(GRect(6, 92, 20, 3)); layer_add_child(window_get_root_layer(window), battery_status_layer); layer_set_update_proc(battery_status_layer, battery_status_layer_update); //Bluetooth status layer bluetooth_status_layer=text_layer_create(GRect(15, 107, 14, 14)); text_layer_set_background_color(bluetooth_status_layer, GColorClear); layer_add_child(window_get_root_layer(window), text_layer_get_layer(bluetooth_status_layer)); //Prevent blank screen on init. time_t now=time(NULL); struct tm* tick_time; tick_time=localtime(&now); update_display(tick_time); update_battery_display(battery_state_service_peek()); update_bluetooth_status(bluetooth_connection_service_peek()); bluetooth_connection_service_subscribe(update_bluetooth_status); battery_state_service_subscribe(update_battery_display); tick_timer_service_subscribe(MINUTE_UNIT, &handle_minute_tick); }
static void update_time() { // Get a tm structure time_t temp = time(NULL); struct tm *tick_time = localtime(&temp); // Create a long-lived buffer static char buffer[] = "00:00"; static char buffer2[]= " "; // static char buffer3[] = "Twitter"; // Write the current hours and minutes into the buffer if(clock_is_24h_style() == true) { // Use 24 hour format strftime(buffer, sizeof("00:00"), "%H:%M", tick_time); } else { // Use 12 hour format //strftime(buffer, sizeof("00:00 A"), "%I:%M %P", tick_time); strftime(buffer, sizeof("00:00"), "%I:%M", tick_time); } // Combine header snprintf(buffer2, sizeof(buffer2), "%s\n%s", s_str,s_str_2); // Generate Cool Humans switch (human) { // This is component that displays the image watchface case 1: // Cycle the icon text_layer_set_text(s_quote_layer, "You have to learn the rules of the game. And then you have to play better than anyone else."); text_layer_set_text(s_twitter_layer, "Albert Einstein"); break; case 2: text_layer_set_text(s_quote_layer, "There is only one corner of the universe you can be certain of improving, and that's your own self."); text_layer_set_text(s_twitter_layer, "Aldous Huxley"); break; case 3: text_layer_set_text(s_quote_layer, "The secret of getting ahead is getting started."); text_layer_set_text(s_twitter_layer, "Mark Twain"); break; case 4: text_layer_set_text(s_quote_layer, "Stay hungry. Stay foolish."); text_layer_set_text(s_twitter_layer, "Steve Jobs"); break; case 5: text_layer_set_text(s_quote_layer, "Breathe in throgh the nose. Pause. Breathe out through the mouth. Pause."); text_layer_set_text(s_twitter_layer, "Lex Dreitser"); break; case 6: human = 1; break; } counter++; if(counter == 10) { counter = 0; human++; } // buffer3 = " Twitter"; text_layer_set_text(s_time_layer, buffer); text_layer_set_text(s_stat_layer, buffer2); battery_state_service_peek(); }