From e8461984d60a80841a5f4b219358cc20567114f8 Mon Sep 17 00:00:00 2001 From: Joey Castillo Date: Sat, 16 Oct 2021 12:58:14 -0400 Subject: launcher is now movement --- movement/widgets/settings/preferences_widget.c | 120 +++++++++++++++++++++++++ movement/widgets/settings/preferences_widget.h | 18 ++++ movement/widgets/settings/set_time_widget.c | 109 ++++++++++++++++++++++ movement/widgets/settings/set_time_widget.h | 18 ++++ 4 files changed, 265 insertions(+) create mode 100644 movement/widgets/settings/preferences_widget.c create mode 100644 movement/widgets/settings/preferences_widget.h create mode 100644 movement/widgets/settings/set_time_widget.c create mode 100644 movement/widgets/settings/set_time_widget.h (limited to 'movement/widgets/settings') diff --git a/movement/widgets/settings/preferences_widget.c b/movement/widgets/settings/preferences_widget.c new file mode 100644 index 00000000..c4537329 --- /dev/null +++ b/movement/widgets/settings/preferences_widget.c @@ -0,0 +1,120 @@ +#include +#include "preferences_widget.h" +#include "watch.h" + +#define PREFERENCES_WIDGET_NUM_PREFEFENCES (5) +const char preferences_widget_titles[PREFERENCES_WIDGET_NUM_PREFEFENCES][11] = {"CL ", "Bt Beep ", "SC ", "Lt grn ", "Lt red "}; + +void preferences_widget_setup(LauncherSettings *settings, void ** context_ptr) { + (void) settings; + if (*context_ptr == NULL) *context_ptr = malloc(sizeof(uint8_t)); +} + +void preferences_widget_activate(LauncherSettings *settings, void *context) { + (void) settings; + *((uint8_t *)context) = 0; + movement_request_tick_frequency(4); // we need to manually blink some pixels +} + +bool preferences_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context) { + printf("preferences_widget_loop\n"); + uint8_t current_page = *((uint8_t *)context); + switch (event.event_type) { + case EVENT_MODE_BUTTON_UP: + watch_set_led_off(); + movement_move_to_next_widget(); + return false; + case EVENT_LIGHT_BUTTON_UP: + current_page = (current_page + 1) % PREFERENCES_WIDGET_NUM_PREFEFENCES; + *((uint8_t *)context) = current_page; + break; + case EVENT_ALARM_BUTTON_UP: + switch (current_page) { + case 0: + settings->bit.clock_mode_24h = !(settings->bit.clock_mode_24h); + break; + case 1: + settings->bit.button_should_sound = !(settings->bit.button_should_sound); + break; + case 2: + settings->bit.screensaver_interval = settings->bit.screensaver_interval + 1; + break; + case 3: + settings->bit.led_green_color = settings->bit.led_green_color + 1; + break; + case 4: + settings->bit.led_red_color = settings->bit.led_red_color + 1; + break; + } + break; + default: + break; + } + + watch_display_string((char *)preferences_widget_titles[current_page], 0); + + if (event.subsecond % 2) return current_page <= 2; + char buf[3]; + switch (current_page) { + case 0: + if (settings->bit.clock_mode_24h) watch_display_string("24h", 4); + else watch_display_string("12h", 4); + break; + case 1: + if (settings->bit.button_should_sound) watch_display_string("y", 9); + else watch_display_string("n", 9); + break; + case 2: + switch (settings->bit.screensaver_interval) { + case 0: + watch_display_string(" never", 4); + break; + case 1: + watch_display_string("1 hour", 4); + break; + case 2: + watch_display_string("2 hour", 4); + break; + case 3: + watch_display_string("6 hour", 4); + break; + case 4: + watch_display_string("12 hr", 4); + break; + case 5: + watch_display_string(" 1 day", 4); + break; + case 6: + watch_display_string(" 2 day", 4); + break; + case 7: + watch_display_string(" 7 day", 4); + break; + } + break; + case 3: + sprintf(buf, "%2d", settings->bit.led_green_color); + watch_display_string(buf, 8); + break; + case 4: + sprintf(buf, "%2d", settings->bit.led_red_color); + watch_display_string(buf, 8); + break; + } + + if (current_page > 2) { + watch_set_led_color(settings->bit.led_red_color ? (0xF | settings->bit.led_red_color << 4) : 0, + settings->bit.led_green_color ? (0xF | settings->bit.led_green_color << 4) : 0); + return false; + } + + watch_set_led_off(); + return true; +} + +void preferences_widget_resign(LauncherSettings *settings, void *context) { + (void) settings; + (void) context; + watch_set_led_off(); + movement_request_tick_frequency(1); +} diff --git a/movement/widgets/settings/preferences_widget.h b/movement/widgets/settings/preferences_widget.h new file mode 100644 index 00000000..3d463027 --- /dev/null +++ b/movement/widgets/settings/preferences_widget.h @@ -0,0 +1,18 @@ +#ifndef PREFERENCES_WIDGET_H_ +#define PREFERENCES_WIDGET_H_ + +#include "movement.h" + +void preferences_widget_setup(LauncherSettings *settings, void ** context_ptr); +void preferences_widget_activate(LauncherSettings *settings, void *context); +bool preferences_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context); +void preferences_widget_resign(LauncherSettings *settings, void *context); + +#define preferences_widget { \ + preferences_widget_setup, \ + preferences_widget_activate, \ + preferences_widget_loop, \ + preferences_widget_resign, \ +} + +#endif // PREFERENCES_WIDGET_H_ \ No newline at end of file diff --git a/movement/widgets/settings/set_time_widget.c b/movement/widgets/settings/set_time_widget.c new file mode 100644 index 00000000..9464eb5b --- /dev/null +++ b/movement/widgets/settings/set_time_widget.c @@ -0,0 +1,109 @@ +#include +#include "set_time_widget.h" +#include "watch.h" + +#define SET_TIME_WIDGET_NUM_SETTINGS (6) +const char set_time_widget_titles[SET_TIME_WIDGET_NUM_SETTINGS][3] = {"HR", "MN", "SE", "YR", "MO", "DA"}; + +void set_time_widget_setup(LauncherSettings *settings, void ** context_ptr) { + (void) settings; + if (*context_ptr == NULL) *context_ptr = malloc(sizeof(uint8_t)); +} + +void set_time_widget_activate(LauncherSettings *settings, void *context) { + (void) settings; + *((uint8_t *)context) = 0; + movement_request_tick_frequency(4); +} + +bool set_time_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context) { + uint8_t current_page = *((uint8_t *)context); + const uint8_t days_in_month[12] = {31, 28, 31, 30, 31, 30, 30, 31, 30, 31, 30, 31}; + watch_date_time date_time = watch_rtc_get_date_time(); + + switch (event.event_type) { + case EVENT_MODE_BUTTON_UP: + movement_move_to_next_widget(); + return false; + case EVENT_LIGHT_BUTTON_UP: + current_page = (current_page + 1) % SET_TIME_WIDGET_NUM_SETTINGS; + *((uint8_t *)context) = current_page; + break; + case EVENT_ALARM_BUTTON_UP: + switch (current_page) { + case 0: // hour + date_time.unit.hour = (date_time.unit.hour + 1) % 24; + break; + case 1: // minute + date_time.unit.minute = (date_time.unit.minute + 1) % 60; + break; + case 2: // second + date_time.unit.second = 0; + break; + case 3: // year + // only allow 2021-2030. fix this sometime next decade + date_time.unit.year = ((date_time.unit.year % 10) + 1); + break; + case 4: // month + date_time.unit.month = (date_time.unit.month % 12) + 1; + break; + case 5: // day + date_time.unit.day = date_time.unit.day + 1; + // can't set to the 29th on a leap year. if it's february 29, set to 11:59 on the 28th. + // and it should roll over. + if (date_time.unit.day > days_in_month[date_time.unit.month - 1]) { + date_time.unit.day = 1; + } + break; + } + watch_rtc_set_date_time(date_time); + break; + default: + break; + } + + char buf[11]; + if (current_page < 3) { + watch_set_colon(); + if (settings->bit.clock_mode_24h) { + watch_set_indicator(WATCH_INDICATOR_24H); + sprintf(buf, "%s %2d%02d%02d", set_time_widget_titles[current_page], date_time.unit.hour, date_time.unit.minute, date_time.unit.second); + } else { + sprintf(buf, "%s %2d%02d%02d", set_time_widget_titles[current_page], (date_time.unit.hour % 12) ? (date_time.unit.hour % 12) : 12, date_time.unit.minute, date_time.unit.second); + if (date_time.unit.hour > 12) watch_set_indicator(WATCH_INDICATOR_PM); + else watch_clear_indicator(WATCH_INDICATOR_PM); + } + } else { + watch_clear_colon(); + watch_clear_indicator(WATCH_INDICATOR_24H); + watch_clear_indicator(WATCH_INDICATOR_PM); + sprintf(buf, "%s %2d%02d%02d", set_time_widget_titles[current_page], date_time.unit.year + 20, date_time.unit.month, date_time.unit.day); + } + if (event.subsecond % 2) { + switch (current_page) { + case 0: + case 3: + buf[4] = buf[5] = ' '; + break; + case 1: + case 4: + buf[6] = buf[7] = ' '; + break; + case 2: + case 5: + buf[8] = buf[9] = ' '; + break; + } + } + + watch_display_string(buf, 0); + + return true; +} + +void set_time_widget_resign(LauncherSettings *settings, void *context) { + (void) settings; + (void) context; + watch_set_led_off(); + movement_request_tick_frequency(1); +} diff --git a/movement/widgets/settings/set_time_widget.h b/movement/widgets/settings/set_time_widget.h new file mode 100644 index 00000000..363fd571 --- /dev/null +++ b/movement/widgets/settings/set_time_widget.h @@ -0,0 +1,18 @@ +#ifndef SET_TIME_WIDGET_H_ +#define SET_TIME_WIDGET_H_ + +#include "movement.h" + +void set_time_widget_setup(LauncherSettings *settings, void ** context_ptr); +void set_time_widget_activate(LauncherSettings *settings, void *context); +bool set_time_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context); +void set_time_widget_resign(LauncherSettings *settings, void *context); + +#define set_time_widget { \ + set_time_widget_setup, \ + set_time_widget_activate, \ + set_time_widget_loop, \ + set_time_widget_resign, \ +} + +#endif // SET_TIME_WIDGET_H_ -- cgit v1.2.3