aboutsummaryrefslogtreecommitdiffstats
path: root/pico-watch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'pico-watch.cpp')
-rw-r--r--pico-watch.cpp38
1 files changed, 23 insertions, 15 deletions
diff --git a/pico-watch.cpp b/pico-watch.cpp
index 243f1e1..9df6799 100644
--- a/pico-watch.cpp
+++ b/pico-watch.cpp
@@ -3,52 +3,56 @@
#include "hardware/i2c.h"
#include "hardware/rtc.h"
#include "pico/util/datetime.h"
-#include "oled/ss_oled.h"
#include "init.hpp"
+#include "api.hpp"
#include "buttons.hpp"
#include "apps/main_clock.hpp"
#include "apps/home_menu.hpp"
int current_app = 0;
+bool app_ready = true;
+Api app_api;
#define NUMBER_OF_APPS 2
#define APP_DATA_BUFFER_LEN 256
-int (*APPS_FUNC_INIT[NUMBER_OF_APPS])(SSOLED *oled) = {app_home_menu::init, app_main_clock::init};
-int (*APPS_FUNC_RENDER[NUMBER_OF_APPS])(SSOLED *oled) = {app_home_menu::render, app_main_clock::render};
-int (*APPS_FUNC_BTNPRESS[NUMBER_OF_APPS])(SSOLED *oled, uint gpio) = {app_home_menu::btnpressed, app_main_clock::btnpressed};
-int (*APPS_FUNC_BGREFRESH[NUMBER_OF_APPS])(SSOLED *oled, char in_foreground) = {app_home_menu::bgrefresh, app_main_clock::bgrefresh};
-int (*APPS_FUNC_DESTROY[NUMBER_OF_APPS])(SSOLED *oled) = {app_home_menu::destroy, app_main_clock::destroy};
+int (*APPS_FUNC_INIT[NUMBER_OF_APPS])(Api *app_api) = {app_home_menu::init, app_main_clock::init};
+int (*APPS_FUNC_RENDER[NUMBER_OF_APPS])(Api *app_api) = {app_home_menu::render, app_main_clock::render};
+int (*APPS_FUNC_BTNPRESS[NUMBER_OF_APPS])(Api *app_api, uint gpio) = {app_home_menu::btnpressed, app_main_clock::btnpressed};
+int (*APPS_FUNC_BGREFRESH[NUMBER_OF_APPS])(Api *app_api, char in_foreground) = {app_home_menu::bgrefresh, app_main_clock::bgrefresh};
+int (*APPS_FUNC_DESTROY[NUMBER_OF_APPS])(Api *app_api) = {app_home_menu::destroy, app_main_clock::destroy};
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) {
- oledFill(&oled, 0,1); // Clear OLED
+ app_api.display_fill(0,1); // Clear OLED
+ app_api.performance_render_interval_set(500); // Reset interval
if (!APPS_IS_INIT[app_id]) {
APPS_IS_INIT[app_id] = 1;
- return (*APPS_FUNC_INIT[app_id])(&oled);
+ return (*APPS_FUNC_INIT[app_id])(&app_api);
}
}
int app_render(int app_id) {
- return (*APPS_FUNC_RENDER[app_id])(&oled);
+ return (*APPS_FUNC_RENDER[app_id])(&app_api);
}
int app_btnpressed(int app_id, uint gpio) {
- return (*APPS_FUNC_BTNPRESS[app_id])(&oled, gpio);
+ if (app_api.m_send_button_press_to_app)
+ return (*APPS_FUNC_BTNPRESS[app_id])(&app_api, gpio);
+ return 2;
}
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);
+ return (*APPS_FUNC_DESTROY[app_id])(&app_api);
}
}
int app_bgrefresh(int app_id) {
if (APPS_IS_INIT[app_id])
- return (*APPS_FUNC_BGREFRESH[app_id])(&oled, app_id==current_app);
+ return (*APPS_FUNC_BGREFRESH[app_id])(&app_api, app_id==current_app);
}
bool apps_bgrefresh(struct repeating_timer *t) { // TODO: Refresh done on core1
@@ -59,24 +63,28 @@ bool apps_bgrefresh(struct repeating_timer *t) { // TODO: Refresh done on core1
}
void app_switch(int old_appid, int new_appid) {
+ app_ready = false;
if (APPS_DESTROY_ON_EXIT[old_appid]) {
app_destroy(old_appid);
}
app_init(new_appid);
current_app = new_appid;
+ app_ready = true;
}
int main() {
init_all();
init_buttons();
+ app_api.init();
struct repeating_timer timer;
add_repeating_timer_ms(250, apps_bgrefresh, NULL, &timer);
app_init(current_app);
while (1) {
- app_render(current_app);
- sleep_ms(500);
+ if (app_ready)
+ app_render(current_app); // FIXME: This may cause race conditions when switching app
+ sleep_ms(app_api.performance_render_interval_get());
}
return 0;
}