basic launcher switching between two widgets
This commit is contained in:
parent
399caa2582
commit
95ea714d61
@ -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--;
|
||||
}
|
||||
|
@ -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_
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
@ -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_
|
32
launcher/widgets/fake_widget_1.c
Normal file
32
launcher/widgets/fake_widget_1.c
Normal 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;
|
||||
}
|
19
launcher/widgets/fake_widget_1.h
Normal file
19
launcher/widgets/fake_widget_1.h
Normal 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_
|
32
launcher/widgets/fake_widget_2.c
Normal file
32
launcher/widgets/fake_widget_2.c
Normal 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;
|
||||
}
|
19
launcher/widgets/fake_widget_2.h
Normal file
19
launcher/widgets/fake_widget_2.h
Normal 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_
|
Loading…
x
Reference in New Issue
Block a user