aboutsummaryrefslogtreecommitdiffstats
path: root/pico-watch.c
diff options
context:
space:
mode:
Diffstat (limited to 'pico-watch.c')
-rw-r--r--pico-watch.c51
1 files changed, 40 insertions, 11 deletions
diff --git a/pico-watch.c b/pico-watch.c
index eb5f7cc..37dcd35 100644
--- a/pico-watch.c
+++ b/pico-watch.c
@@ -8,23 +8,27 @@
#include "init.h"
#include "buttons.h"
#include "apps/main_clock.h"
+#include "apps/home_menu.h"
int current_app = 0;
-#define NUMBER_OF_APPS 1
+#define NUMBER_OF_APPS 2
#define APP_DATA_BUFFER_LEN 256
-int (*APPS_FUNC_INIT[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size) = {main_clock_init};
-int (*APPS_FUNC_RENDER[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size) = {main_clock_render};
-int (*APPS_FUNC_BTNPRESS[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size, uint gpio) = {main_clock_btnpressed};
-int (*APPS_FUNC_BGREFRESH[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size) = {main_clock_bgrefresh};
-int (*APPS_FUNC_DESTROY[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size) = {main_clock_destroy};
+int (*APPS_FUNC_INIT[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size) = {home_menu_init, main_clock_init};
+int (*APPS_FUNC_RENDER[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size) = {home_menu_render, main_clock_render};
+int (*APPS_FUNC_BTNPRESS[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size, uint gpio) = {home_menu_btnpressed, main_clock_btnpressed};
+int (*APPS_FUNC_BGREFRESH[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size, char in_foreground) = {home_menu_bgrefresh, main_clock_bgrefresh};
+int (*APPS_FUNC_DESTROY[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size) = {home_menu_destroy, main_clock_destroy};
char APPS_DATA[NUMBER_OF_APPS][APP_DATA_BUFFER_LEN];
-int APPS_DESTROY_ON_EXIT[NUMBER_OF_APPS] = {1};
-int APPS_IS_INIT[NUMBER_OF_APPS] = {0};
+int APPS_DESTROY_ON_EXIT[NUMBER_OF_APPS] = {0, 1};
+int APPS_IS_INIT[NUMBER_OF_APPS] = {0, 0}; // Only run in background if init
int app_init(int app_id) {
- APPS_IS_INIT[app_id] = 1;
- return (*APPS_FUNC_INIT[app_id])(&oled, &APPS_DATA[app_id][0], sizeof(APPS_DATA[app_id]));
+ oledFill(&oled, 0,1); // Clear OLED
+ if (!APPS_IS_INIT[app_id]) {
+ APPS_IS_INIT[app_id] = 1;
+ return (*APPS_FUNC_INIT[app_id])(&oled, &APPS_DATA[app_id][0], sizeof(APPS_DATA[app_id]));
+ }
}
int app_render(int app_id) {
@@ -36,13 +40,38 @@ int app_btnpressed(int app_id, uint gpio) {
}
int app_destroy(int app_id) {
+ // TODO: reset APPS_DATA for the app
+ if (APPS_IS_INIT[app_id]) {
+ APPS_IS_INIT[app_id] = 0;
+ return (*APPS_FUNC_DESTROY[app_id])(&oled, &APPS_DATA[app_id][0], sizeof(APPS_DATA[app_id]));
+ }
+}
+
+int app_bgrefresh(int app_id) {
if (APPS_IS_INIT[app_id])
- return (*APPS_FUNC_INIT[app_id])(&oled, &APPS_DATA[app_id][0], sizeof(APPS_DATA[app_id]));
+ return (*APPS_FUNC_BGREFRESH[app_id])(&oled, &APPS_DATA[app_id][0], sizeof(APPS_DATA[app_id]), app_id==current_app);
+}
+
+bool apps_bgrefresh(struct repeating_timer *t) { // TODO: Refresh done on core1
+ for (int i=0; i < NUMBER_OF_APPS; i++) {
+ app_bgrefresh(i);
+ }
+ return true;
+}
+
+void app_switch(int old_appid, int new_appid) {
+ if (APPS_DESTROY_ON_EXIT[old_appid]) {
+ app_destroy(old_appid);
+ }
+ app_init(new_appid);
+ current_app = new_appid;
}
int main() {
init_all();
init_buttons();
+ struct repeating_timer timer;
+ add_repeating_timer_ms(250, apps_bgrefresh, NULL, &timer);
app_init(current_app);