basic launcher switching between two widgets

This commit is contained in:
Joey Castillo 2021-10-03 14:26:17 -04:00
parent 399caa2582
commit 95ea714d61
10 changed files with 155 additions and 100 deletions

View File

@ -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]);
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 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]);
}
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--;
}

View File

@ -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_

View File

@ -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,
};

View File

@ -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

View File

@ -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;
}

View File

@ -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_

View File

@ -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;
}

View File

@ -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_

View File

@ -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;
}

View File

@ -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_