From 95ea714d61b058f2b25aea6c01021cb3b3b2c3be Mon Sep 17 00:00:00 2001 From: Joey Castillo Date: Sun, 3 Oct 2021 14:26:17 -0400 Subject: basic launcher switching between two widgets --- launcher/launcher.c | 90 +++++++++++++++++++--------------------- launcher/launcher.h | 8 ++-- launcher/launcher_config.h | 8 ++-- launcher/make/Makefile | 3 +- launcher/widgets/fake_widget.c | 24 ----------- launcher/widgets/fake_widget.h | 20 --------- launcher/widgets/fake_widget_1.c | 32 ++++++++++++++ launcher/widgets/fake_widget_1.h | 19 +++++++++ launcher/widgets/fake_widget_2.c | 32 ++++++++++++++ launcher/widgets/fake_widget_2.h | 19 +++++++++ 10 files changed, 155 insertions(+), 100 deletions(-) delete mode 100644 launcher/widgets/fake_widget.c delete mode 100644 launcher/widgets/fake_widget.h create mode 100644 launcher/widgets/fake_widget_1.c create mode 100644 launcher/widgets/fake_widget_1.h create mode 100644 launcher/widgets/fake_widget_2.c create mode 100644 launcher/widgets/fake_widget_2.h diff --git a/launcher/launcher.c b/launcher/launcher.c index 26fec93e..ff10cf6e 100644 --- a/launcher/launcher.c +++ b/launcher/launcher.c @@ -7,6 +7,11 @@ LauncherState launcher_state; void * widget_contexts[LAUNCHER_NUM_WIDGETS]; +void cb_mode_pressed(); +void cb_light_pressed(); +void cb_alarm_pressed(); +void cb_tick(); + void launcher_request_tick_frequency(uint8_t freq) { watch_rtc_disable_all_periodic_callbacks(); watch_rtc_register_periodic_callback(cb_tick, freq); @@ -16,10 +21,26 @@ void launcher_illuminate_led() { launcher_state.light_ticks = 3; } +void launcher_move_to_next_widget() { + launcher_state.widget_changed = true; + widgets[launcher_state.current_widget].resign(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); + launcher_state.current_widget = (launcher_state.current_widget + 1) % LAUNCHER_NUM_WIDGETS; + widgets[launcher_state.current_widget].activate(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); + watch_display_string(widgets[launcher_state.current_widget].widget_name, 0); +} + +void launcher_move_to_first_widget() { + launcher_state.widget_changed = true; + widgets[launcher_state.current_widget].resign(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); + launcher_state.current_widget = 0; + widgets[0].activate(&launcher_state.launcher_settings, widget_contexts[0]); + watch_display_string(widgets[launcher_state.current_widget].widget_name, 0); +} void app_init() { memset(&launcher_state, 0, sizeof(launcher_state)); launcher_state.launcher_settings.bit.led_green_color = 0xF; + launcher_state.launcher_settings.bit.led_red_color = 0x0; } void app_wake_from_deep_sleep() { @@ -41,6 +62,8 @@ void app_setup() { for(uint8_t i = 0; i < LAUNCHER_NUM_WIDGETS; i++) { widgets[i].setup(&launcher_state.launcher_settings, widget_contexts[i]); } + + launcher_move_to_first_widget(); } void app_prepare_for_sleep() { @@ -61,8 +84,10 @@ bool app_loop() { // If the LED is off and should be on, turn it on if (launcher_state.light_ticks > 0 && !launcher_state.led_on) { - watch_set_led_color(launcher_state.launcher_settings.bit.led_red_color, launcher_state.launcher_settings.bit.led_green_color); + watch_set_led_color(launcher_state.launcher_settings.bit.led_red_color ? (0xF | launcher_state.launcher_settings.bit.led_red_color << 4) : 0, + launcher_state.launcher_settings.bit.led_green_color ? (0xF | launcher_state.launcher_settings.bit.led_green_color << 4) : 0); launcher_state.led_on = true; + } // if the LED is on and should be off, turn it off @@ -77,71 +102,42 @@ bool app_loop() { } if (event) { - event = 0; widgets[launcher_state.current_widget].loop(event, &launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); + event = 0; } + if (launcher_state.led_on) return false; return true; } -void move_to_next_widget() { - launcher_state.widget_changed = true; - widgets[launcher_state.current_widget].resign(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); - launcher_state.current_widget = (launcher_state.current_widget + 1) % LAUNCHER_NUM_WIDGETS; - widgets[launcher_state.current_widget].activate(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); -} - -void move_to_first_widget() { - launcher_state.widget_changed = true; - widgets[launcher_state.current_widget].resign(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); - launcher_state.current_widget = 0; - widgets[0].activate(&launcher_state.launcher_settings, widget_contexts[0]); +LauncherEvent _figure_out_button_event(LauncherEvent button_down_event, uint8_t *down_timestamp) { + watch_date_time date_time = watch_rtc_get_date_time(); + if (*down_timestamp) { + uint8_t diff = ((61 + date_time.unit.second) - *down_timestamp) % 60; + *down_timestamp = 0; + if (diff > 1) return button_down_event + 2; + else return button_down_event + 1; + } else { + *down_timestamp = date_time.unit.second + 1; + return button_down_event; + } } void cb_light_pressed() { - struct calendar_date_time date_time; - watch_get_date_time(&date_time); - if (launcher_state.light_down_timestamp) { - uint8_t diff = (61 + date_time.time.sec) - launcher_state.light_down_timestamp; - if (diff > 1) event = EVENT_LIGHT_LONG_PRESS; - else event = EVENT_LIGHT_BUTTON_UP; - launcher_state.light_down_timestamp = 0; - } else { - launcher_state.light_down_timestamp = date_time.time.sec + 1; - event = EVENT_LIGHT_BUTTON_DOWN; - } + event = _figure_out_button_event(EVENT_LIGHT_BUTTON_DOWN, &launcher_state.light_down_timestamp); } void cb_mode_pressed() { - struct calendar_date_time date_time; - watch_get_date_time(&date_time); - if (launcher_state.mode_down_timestamp) { - uint8_t diff = (61 + date_time.time.sec) - launcher_state.mode_down_timestamp; - if (diff > 1) event = EVENT_MODE_LONG_PRESS; - else event = EVENT_MODE_BUTTON_UP; - launcher_state.mode_down_timestamp = 0; - } else { - launcher_state.mode_down_timestamp = date_time.time.sec + 1; - event = EVENT_MODE_BUTTON_DOWN; - } + event = _figure_out_button_event(EVENT_MODE_BUTTON_DOWN, &launcher_state.mode_down_timestamp); } void cb_alarm_pressed() { - struct calendar_date_time date_time; - watch_get_date_time(&date_time); - if (launcher_state.alarm_down_timestamp) { - uint8_t diff = (61 + date_time.time.sec) - launcher_state.alarm_down_timestamp; - if (diff > 1) event = EVENT_ALARM_LONG_PRESS; - else event = EVENT_ALARM_BUTTON_UP; - launcher_state.alarm_down_timestamp = 0; - } else { - launcher_state.alarm_down_timestamp = date_time.time.sec + 1; - event = EVENT_ALARM_BUTTON_DOWN; - } + event = _figure_out_button_event(EVENT_ALARM_BUTTON_DOWN, &launcher_state.alarm_down_timestamp); } void cb_tick() { event = EVENT_TICK; + if (launcher_state.light_ticks) launcher_state.light_ticks--; } diff --git a/launcher/launcher.h b/launcher/launcher.h index bc8d9191..7a794545 100644 --- a/launcher/launcher.h +++ b/launcher/launcher.h @@ -42,7 +42,6 @@ typedef void (*launcher_widget_resign)(LauncherSettings *settings, void *context typedef struct WatchWidget { char widget_name[11]; - bool snapback_enabled; launcher_widget_setup setup; launcher_widget_activate activate; launcher_widget_loop loop; @@ -67,9 +66,8 @@ typedef struct LauncherState { uint8_t alarm_down_timestamp; } LauncherState; -void cb_mode_pressed(); -void cb_light_pressed(); -void cb_alarm_pressed(); -void cb_tick(); +void launcher_move_to_next_widget(); +void launcher_move_to_first_widget(); +void launcher_illuminate_led(); #endif // LAUNCHER_H_ diff --git a/launcher/launcher_config.h b/launcher/launcher_config.h index cb820a7e..db9d1be1 100644 --- a/launcher/launcher_config.h +++ b/launcher/launcher_config.h @@ -1,12 +1,14 @@ #ifndef LAUNCHER_CONFIG_H_ #define LAUNCHER_CONFIG_H_ -#include "fake_widget.h" +#include "fake_widget_1.h" +#include "fake_widget_2.h" -#define LAUNCHER_NUM_WIDGETS 1 +#define LAUNCHER_NUM_WIDGETS 2 WatchWidget widgets[LAUNCHER_NUM_WIDGETS] = { - fake_widget + fake_widget_1, + fake_widget_2, }; diff --git a/launcher/make/Makefile b/launcher/make/Makefile index dce33f45..f02c1853 100755 --- a/launcher/make/Makefile +++ b/launcher/make/Makefile @@ -20,7 +20,8 @@ INCLUDES += \ # ../utils/temperature.c SRCS += \ ../launcher.c \ - ../widgets/fake_widget.c \ + ../widgets/fake_widget_1.c \ + ../widgets/fake_widget_2.c \ # Leave this line at the bottom of the file; it has all the targets for making your project. include $(TOP)/rules.mk diff --git a/launcher/widgets/fake_widget.c b/launcher/widgets/fake_widget.c deleted file mode 100644 index 70b6918c..00000000 --- a/launcher/widgets/fake_widget.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "fake_widget.h" - -void fake_widget_setup(LauncherSettings *settings, void ** context_ptr) { - (void) settings; - *context_ptr = NULL; -} - -void fake_widget_activate(LauncherSettings *settings, void *context) { - (void) settings; - (void) context; -} - -void fake_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context) { - (void) event; - (void) settings; - (void) context; - - return true; -} - -void fake_widget_resign(LauncherSettings *settings, void *context) { - (void) settings; - (void) context; -} diff --git a/launcher/widgets/fake_widget.h b/launcher/widgets/fake_widget.h deleted file mode 100644 index 470cdf99..00000000 --- a/launcher/widgets/fake_widget.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef FAKE_WIDGET_H_ -#define FAKE_WIDGET_H_ - -#include "launcher.h" - -void fake_widget_setup(LauncherSettings *settings, void ** context_ptr); -void fake_widget_activate(LauncherSettings *settings, void *context); -void fake_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context); -void fake_widget_resign(LauncherSettings *settings, void *context); - -#define fake_widget { \ - "WI dGIt01", \ - true, \ - fake_widget_setup, \ - fake_widget_activate, \ - fake_widget_loop, \ - fake_widget_resign, \ -} - -#endif // FAKE_WIDGET_H_ \ No newline at end of file diff --git a/launcher/widgets/fake_widget_1.c b/launcher/widgets/fake_widget_1.c new file mode 100644 index 00000000..aa4af2c2 --- /dev/null +++ b/launcher/widgets/fake_widget_1.c @@ -0,0 +1,32 @@ +#include "fake_widget_1.h" + +void fake_widget_1_setup(LauncherSettings *settings, void ** context_ptr) { + (void) settings; + // *context_ptr = NULL; +} + +void fake_widget_1_activate(LauncherSettings *settings, void *context) { + (void) settings; + (void) context; +} + +void fake_widget_1_loop(LauncherEvent event, LauncherSettings *settings, void *context) { + (void) settings; + (void) context; + + switch (event) { + case EVENT_MODE_BUTTON_UP: + launcher_move_to_next_widget(); + break; + case EVENT_LIGHT_BUTTON_UP: + launcher_illuminate_led(); + break; + default: + break; + } +} + +void fake_widget_1_resign(LauncherSettings *settings, void *context) { + (void) settings; + (void) context; +} diff --git a/launcher/widgets/fake_widget_1.h b/launcher/widgets/fake_widget_1.h new file mode 100644 index 00000000..00db80cb --- /dev/null +++ b/launcher/widgets/fake_widget_1.h @@ -0,0 +1,19 @@ +#ifndef FAKE_WIDGET_1_H_ +#define FAKE_WIDGET_1_H_ + +#include "launcher.h" + +void fake_widget_1_setup(LauncherSettings *settings, void ** context_ptr); +void fake_widget_1_activate(LauncherSettings *settings, void *context); +void fake_widget_1_loop(LauncherEvent event, LauncherSettings *settings, void *context); +void fake_widget_1_resign(LauncherSettings *settings, void *context); + +#define fake_widget_1 { \ + "W1 d get01", \ + fake_widget_1_setup, \ + fake_widget_1_activate, \ + fake_widget_1_loop, \ + fake_widget_1_resign, \ +} + +#endif // FAKE_WIDGET_1_H_ \ No newline at end of file diff --git a/launcher/widgets/fake_widget_2.c b/launcher/widgets/fake_widget_2.c new file mode 100644 index 00000000..4ce00ce2 --- /dev/null +++ b/launcher/widgets/fake_widget_2.c @@ -0,0 +1,32 @@ +#include "fake_widget_2.h" + +void fake_widget_2_setup(LauncherSettings *settings, void ** context_ptr) { + (void) settings; + *context_ptr = NULL; +} + +void fake_widget_2_activate(LauncherSettings *settings, void *context) { + (void) settings; + (void) context; +} + +void fake_widget_2_loop(LauncherEvent event, LauncherSettings *settings, void *context) { + (void) settings; + (void) context; + + switch (event) { + case EVENT_MODE_BUTTON_UP: + launcher_move_to_next_widget(); + break; + case EVENT_LIGHT_BUTTON_UP: + launcher_illuminate_led(); + break; + default: + break; + } +} + +void fake_widget_2_resign(LauncherSettings *settings, void *context) { + (void) settings; + (void) context; +} diff --git a/launcher/widgets/fake_widget_2.h b/launcher/widgets/fake_widget_2.h new file mode 100644 index 00000000..31bf30bc --- /dev/null +++ b/launcher/widgets/fake_widget_2.h @@ -0,0 +1,19 @@ +#ifndef FAKE_WIDGET_2_H_ +#define FAKE_WIDGET_2_H_ + +#include "launcher.h" + +void fake_widget_2_setup(LauncherSettings *settings, void ** context_ptr); +void fake_widget_2_activate(LauncherSettings *settings, void *context); +void fake_widget_2_loop(LauncherEvent event, LauncherSettings *settings, void *context); +void fake_widget_2_resign(LauncherSettings *settings, void *context); + +#define fake_widget_2 { \ + "W1 d get02", \ + fake_widget_2_setup, \ + fake_widget_2_activate, \ + fake_widget_2_loop, \ + fake_widget_2_resign, \ +} + +#endif // FAKE_WIDGET_2_H_ \ No newline at end of file -- cgit v1.2.3