diff --git a/.gitignore b/.gitignore index c2b822b..ec2184a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /build /.clangd /.lock-waf* +/package-lock.json diff --git a/package.json b/package.json index 6005d33..03736d2 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "CLAY_SHOW_TIME_MG", "CLAY_LED_COLOR", "CLAY_BG_COLOR", - "CLAY_MG_COLOR", + "CLAY_BAR_MG_COLOR", + "CLAY_TIME_MG_COLOR", "CLAY_FG_COLOR" ], "resources": { diff --git a/src/c/main.c b/src/c/main.c index a5787c8..31abe52 100644 --- a/src/c/main.c +++ b/src/c/main.c @@ -1,5 +1,5 @@ #include "palette_manip.h" -#include "src/resource_ids.auto.h" +#include "settings.h" #include // window statics @@ -26,18 +26,12 @@ static const GRect s_time_grects[4] = {GRect(s_x_l, 2, 69, 110), GRect(s_x_r, 2, static const uint8_t s_temp_guage_x_pos = 6; static const uint16_t s_fuel_guage_x_pos = PBL_DISPLAY_WIDTH - 23; -// persist statics&defines -static GColor8 s_mg_color; -static GColor8 s_fg_color; -#define storage_key_show_time_mg 0 -#define storage_key_led_color 1 -#define storage_key_bg_color 2 -#define storage_key_mg_color 3 -#define storage_key_fg_color 4 +// settings statics +static ClaySettings settings; -// bitmaps +// bitmap statics static GBitmap *s_font_bitmaps[10]; -static GBitmap *s_time_mg_0; +static GBitmap *s_time_mg_8; static GBitmap *s_c_icon; static GBitmap *s_h_icon; static GBitmap *s_e_icon; @@ -82,7 +76,7 @@ static void fuel_update_proc(Layer *layer, GContext *ctx) { static void temp_fuel_mg_update_proc_helper(Layer *layer, GContext *ctx, bool isFuel) { GRect bounds = layer_get_bounds(layer); - graphics_context_set_fill_color(ctx, s_mg_color); + graphics_context_set_fill_color(ctx, settings.ColorMGBars); graphics_fill_rect(ctx, bounds, 0, GCornerNone); if (isFuel) { graphics_context_set_stroke_color(ctx, GColorRed); @@ -111,29 +105,21 @@ static void fuel_mg_update_proc(Layer *layer, GContext *ctx) { static void main_window_load() { Layer *window_layer = window_get_root_layer(s_main_window); - if (persist_exists(storage_key_led_color)) { - light_set_color_rgb888(persist_read_int(storage_key_led_color)); - } else { - light_set_color(GColorWhite); - } - - if (persist_exists(storage_key_bg_color)) { - window_set_background_color(s_main_window, (GColor8){.argb = persist_read_int(storage_key_bg_color)}); - } else { - window_set_background_color(s_main_window, GColorBlue); - } + // background (+led) colors + light_set_color(settings.ColorLED); // no-op on unsupported platforms + window_set_background_color(s_main_window, settings.ColorBG); s_temp_mg_layer = layer_create(GRect(s_temp_guage_x_pos - 1, 21, s_bar_width + 2, PBL_DISPLAY_HEIGHT - 43)); layer_set_update_proc(s_temp_mg_layer, temp_mg_update_proc); s_fuel_mg_layer = layer_create(GRect(s_fuel_guage_x_pos - 1, 21, s_bar_width + 2, PBL_DISPLAY_HEIGHT - 43)); layer_set_update_proc(s_fuel_mg_layer, fuel_mg_update_proc); - if (persist_read_bool(storage_key_show_time_mg)) { - s_time_mg_0 = gbitmap_create_with_resource(RESOURCE_ID_0); - replace_gbitmap_color(GColorWhite, s_mg_color, s_time_mg_0, NULL); + if (settings.ShowTimeMG) { + s_time_mg_8 = gbitmap_create_with_resource(RESOURCE_ID_8); + replace_gbitmap_color(GColorWhite, settings.ColorMGTime, s_time_mg_8, NULL); for (int i = 0; i < 4; ++i) { s_time_mg_layers[i] = bitmap_layer_create(s_time_grects[i]); - bitmap_layer_set_bitmap(s_time_mg_layers[i], s_time_mg_0); + bitmap_layer_set_bitmap(s_time_mg_layers[i], s_time_mg_8); bitmap_layer_set_compositing_mode(s_time_mg_layers[i], GCompOpSet); layer_add_child(window_layer, bitmap_layer_get_layer(s_time_mg_layers[i])); } @@ -152,14 +138,14 @@ static void main_window_load() { bitmap_layer_set_compositing_mode(s_e_layer, GCompOpSet); bitmap_layer_set_compositing_mode(s_f_layer, GCompOpSet); - if (s_fg_color.argb != GColorWhite.argb) { + if (settings.ColorFG.argb != GColorWhite.argb) { for (int i = 0; i < 10; ++i) { - replace_gbitmap_color(GColorWhite, s_fg_color, s_font_bitmaps[i], NULL); + replace_gbitmap_color(GColorWhite, settings.ColorFG, s_font_bitmaps[i], NULL); } - replace_gbitmap_color(GColorWhite, s_fg_color, s_c_icon, NULL); - replace_gbitmap_color(GColorWhite, s_fg_color, s_h_icon, NULL); - replace_gbitmap_color(GColorWhite, s_fg_color, s_e_icon, NULL); - replace_gbitmap_color(GColorWhite, s_fg_color, s_f_icon, NULL); + replace_gbitmap_color(GColorWhite, settings.ColorFG, s_c_icon, NULL); + replace_gbitmap_color(GColorWhite, settings.ColorFG, s_h_icon, NULL); + replace_gbitmap_color(GColorWhite, settings.ColorFG, s_e_icon, NULL); + replace_gbitmap_color(GColorWhite, settings.ColorFG, s_f_icon, NULL); } for (int i = 0; i < 4; ++i) { @@ -177,6 +163,7 @@ static void main_window_load() { static void main_window_unload() { layer_destroy(s_fuel_mg_layer); + layer_destroy(s_temp_mg_layer); bitmap_layer_destroy(s_f_layer); bitmap_layer_destroy(s_e_layer); bitmap_layer_destroy(s_h_layer); @@ -185,11 +172,12 @@ static void main_window_unload() { if (s_time_mg_layers[i]) { bitmap_layer_destroy(s_time_mg_layers[i]); s_time_mg_layers[i] = NULL; - if (i == 0) { - gbitmap_destroy(s_time_mg_0); - } } } + if (s_time_mg_8) { + gbitmap_destroy(s_time_mg_8); + s_time_mg_8 = NULL; + } } static void update_minute_1() { @@ -221,16 +209,6 @@ static void minute_handler(struct tm *tick_time, TimeUnits units_changed) { } static void soft_reload(bool first_load) { - if (persist_exists(storage_key_mg_color)) { - s_mg_color = (GColor8){.argb = persist_read_int(storage_key_mg_color)}; - } else { - s_mg_color = GColorLightGray; - } - if (persist_exists(storage_key_fg_color)) { - s_fg_color = (GColor8){.argb = persist_read_int(storage_key_fg_color)}; - } else { - s_fg_color = GColorWhite; - } if (!first_load) { window_stack_remove(s_main_window, false); window_destroy(s_main_window); @@ -245,23 +223,59 @@ static void soft_reload(bool first_load) { static void inbox_received_handler(DictionaryIterator *iter, void *context) { Tuple *ready_tuple = dict_find(iter, MESSAGE_KEY_PKJS_READY); if (ready_tuple) { - APP_LOG(APP_LOG_LEVEL_DEBUG, "PKJS IS READY"); // TODO request temp bars from PKJS return; } - // TODO set up receive handler for temp bars; be sure to return after to avoid soft reloading - - Tuple *time_mg_tuple = dict_find(iter, MESSAGE_KEY_CLAY_SHOW_TIME_MG); - if (time_mg_tuple) { - APP_LOG(APP_LOG_LEVEL_DEBUG, "TIME MG TOGGLED"); - persist_write_bool(storage_key_show_time_mg, time_mg_tuple->value->int32 == 1); - soft_reload(false); + // TEMPERATURE DATA + Tuple *temp_bar_count = dict_find(iter, MESSAGE_KEY_PKJS_TEMP_BAR_COUNT); + if (temp_bar_count) { + // TODO return; } + + // CLAY SETTINGS + Tuple *show_time_mg_tuple = dict_find(iter, MESSAGE_KEY_CLAY_SHOW_TIME_MG); + Tuple *color_led_tuple = dict_find(iter, MESSAGE_KEY_CLAY_LED_COLOR); + Tuple *color_bg_tuple = dict_find(iter, MESSAGE_KEY_CLAY_BG_COLOR); + Tuple *color_mg_bar_tuple = dict_find(iter, MESSAGE_KEY_CLAY_BAR_MG_COLOR); + Tuple *color_mg_time_tuple = dict_find(iter, MESSAGE_KEY_CLAY_TIME_MG_COLOR); + Tuple *color_fg_tuple = dict_find(iter, MESSAGE_KEY_CLAY_FG_COLOR); + if (show_time_mg_tuple) { + settings.ShowTimeMG = show_time_mg_tuple->value->uint8; + } + if (color_led_tuple) { + settings.ColorLED = GColorFromHEX(color_led_tuple->value->int32); + } + if (color_bg_tuple) { + settings.ColorBG = GColorFromHEX(color_bg_tuple->value->int32); + } + if (color_mg_bar_tuple) { + settings.ColorMGBars = GColorFromHEX(color_mg_bar_tuple->value->int32); + } + if (color_mg_time_tuple) { + settings.ColorMGTime = GColorFromHEX(color_mg_time_tuple->value->int32); + } + if (color_fg_tuple) { + settings.ColorFG = GColorFromHEX(color_fg_tuple->value->int32); + } + persist_write_data(STORAGE_KEY_SETTINGS, &settings, sizeof(settings)); + soft_reload(false); } static void init() { + // load settings from persist (or set defaults if not present) + if (persist_exists(STORAGE_KEY_SETTINGS)) { + persist_read_data(STORAGE_KEY_SETTINGS, &settings, sizeof(settings)); + } else { + settings.ShowTimeMG = false; + settings.ColorLED = GColorWhite; + settings.ColorBG = GColorBlue; + settings.ColorMGBars = GColorDarkGray; + settings.ColorMGTime = GColorDarkGray; + settings.ColorFG = GColorWhite; + } + // load bitmaps s_font_bitmaps[0] = gbitmap_create_with_resource(RESOURCE_ID_0); s_font_bitmaps[1] = gbitmap_create_with_resource(RESOURCE_ID_1); diff --git a/src/c/settings.h b/src/c/settings.h new file mode 100644 index 0000000..b039a03 --- /dev/null +++ b/src/c/settings.h @@ -0,0 +1,15 @@ +#pragma once +#include + +#define STORAGE_KEY_SETTINGS 69 + +typedef struct ClaySettings { + bool ShowTimeMG; + GColor ColorLED; + GColor ColorBG; + GColor ColorMGBars; + GColor ColorMGTime; + GColor ColorFG; +} __attribute__((__packed__)) ClaySettings; + +_Static_assert(sizeof(ClaySettings) <= 256, "ClaySettings exceeds Pebble 256-byte persist limit!"); diff --git a/src/pkjs/config.js b/src/pkjs/config.js index eb30412..ec00357 100644 --- a/src/pkjs/config.js +++ b/src/pkjs/config.js @@ -12,6 +12,7 @@ module.exports = [ "defaultValue": "Options" }, { + "id": "time_mg_toggle", "type": "toggle", "messageKey": "CLAY_SHOW_TIME_MG", "defaultValue": false, @@ -30,13 +31,15 @@ module.exports = [ { "id": "custom_colors_toggle", "type": "toggle", + "messageKey": "PRIV_CUSTOM_COLORS_TOGGLE", "defaultValue": false, "label": "Use custom colors" }, { "id": "color_preset_selector", "type": "select", - "defaultValue": "Standard", + "messageKey": "PRIV_COLOR_PRESET_TOGGLE", + "defaultValue": "civic_standard", "label": "Color Preset", "options": [ { @@ -52,10 +55,9 @@ module.exports = [ { "id": "custom_color_led", "type": "color", - "capabilities": ["PLATFORM_EMERY"], "messageKey": "CLAY_LED_COLOR", - "defaultValue": "0000ff", - "label": "LED color", + "defaultValue": "ffffff", + "label": "Backlight color (Time 2)", "sunlight": false, }, { @@ -67,11 +69,19 @@ module.exports = [ "sunlight": false, }, { - "id": "custom_color_mg", + "id": "custom_color_mg_bars", "type": "color", - "messageKey": "CLAY_MG_COLOR", + "messageKey": "CLAY_BAR_MG_COLOR", "defaultValue": "aaaaaa", - "label": "Midground color", + "label": "Bar midground color", + "sunlight": false, + }, + { + "id": "custom_color_mg_time", + "type": "color", + "messageKey": "CLAY_TIME_MG_COLOR", + "defaultValue": "555555", + "label": "Time segment midground color", "sunlight": false, }, { diff --git a/src/pkjs/customClay.js b/src/pkjs/customClay.js index c56b392..022343b 100644 --- a/src/pkjs/customClay.js +++ b/src/pkjs/customClay.js @@ -4,34 +4,41 @@ module.exports = function (minified) { var $ = minified.$; var HTML = minified.HTML; - // TODO set LED color (only on emery) function setColorsToPreset() { - selectedPreset = clayConfig.getItemById('color_preset_selector').get() + var selectedPreset = clayConfig.getItemById('color_preset_selector').get(); switch (selectedPreset) { case 'civic_si': - clayConfig.getItemById('custom_color_bg').set('ff0000'); - clayConfig.getItemById('custom_color_mg').set('aaaaaa'); - clayConfig.getItemById('custom_color_fg').set('ffffff'); + clayConfig.getItemById('custom_color_led').set('ff0000'); + clayConfig.getItemById('custom_color_bg').set('000000'); + clayConfig.getItemById('custom_color_mg_bars').set('555555'); + clayConfig.getItemById('custom_color_mg_time').set('555555'); + clayConfig.getItemById('custom_color_fg').set('ff0000'); break default: + clayConfig.getItemById('custom_color_led').set('ffffff'); clayConfig.getItemById('custom_color_bg').set('0000ff'); - clayConfig.getItemById('custom_color_mg').set('aaaaaa'); + clayConfig.getItemById('custom_color_mg_bars').set('555555'); + clayConfig.getItemById('custom_color_mg_time').set('555555'); clayConfig.getItemById('custom_color_fg').set('ffffff'); } } // TODO show/hide LED color selector (only on emery) function toggleCustomColors() { - setColorsToPreset(); if (this.get()) { clayConfig.getItemById('color_preset_selector').hide(); + clayConfig.getItemById('custom_color_led').show(); clayConfig.getItemById('custom_color_bg').show(); - clayConfig.getItemById('custom_color_mg').show(); + clayConfig.getItemById('custom_color_mg_bars').show(); + clayConfig.getItemById('custom_color_mg_time').show(); clayConfig.getItemById('custom_color_fg').show(); } else { + setColorsToPreset(); clayConfig.getItemById('color_preset_selector').show(); + clayConfig.getItemById('custom_color_led').hide(); clayConfig.getItemById('custom_color_bg').hide(); - clayConfig.getItemById('custom_color_mg').hide(); + clayConfig.getItemById('custom_color_mg_bars').hide(); + clayConfig.getItemById('custom_color_mg_time').hide(); clayConfig.getItemById('custom_color_fg').hide(); } } @@ -41,6 +48,6 @@ module.exports = function (minified) { toggleCustomColors.call(customColorsToggle); customColorsToggle.on('change', toggleCustomColors); - clayConfig.getItemById('color_preset_selector').on('change', setColorsToPreset()); + clayConfig.getItemById('color_preset_selector').on('change', setColorsToPreset); }); };