From 2a0571ba87183023b1073af1badb5fb91da763cf Mon Sep 17 00:00:00 2001
From: ConfuSomu
Date: Sat, 27 Feb 2021 13:29:37 -0500
Subject: Use an Api class for abstraction

It is currently very basic as functions will be added to it when the time
comes. The idea is to have a method to, for example, show notifications
(and store them in a list with metadata) to the user or also to easily
show a message box overlaying the current display.

Private class members will permit encapsulations of variables related
to these features and limit the privilage that each app has on the
device.
---
 pico-watch.cpp | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

(limited to 'pico-watch.cpp')

diff --git a/pico-watch.cpp b/pico-watch.cpp
index 243f1e1..e888ba1 100644
--- a/pico-watch.cpp
+++ b/pico-watch.cpp
@@ -6,49 +6,51 @@
 #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;
+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.dispFill(0,1); // Clear OLED
     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);
+    return (*APPS_FUNC_BTNPRESS[app_id])(&app_api, 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);
+        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
@@ -69,6 +71,7 @@ void app_switch(int old_appid, int new_appid) {
 int main() {
     init_all();
     init_buttons();
+    app_api.init();
     struct repeating_timer timer;
     add_repeating_timer_ms(250, apps_bgrefresh, NULL, &timer);
 
-- 
cgit v1.2.3-54-g00ecf