diff options
author | ConfuSomu | 2021-02-20 14:17:03 -0500 |
---|---|---|
committer | ConfuSomu | 2021-02-20 14:17:03 -0500 |
commit | 06d5f492eca8e57bc8ce7479ec6149fbc6a15d08 (patch) | |
tree | 6eec7b65d57843cd5ed73baa63a57081d6049ca1 /pico-watch.cpp | |
parent | 5686f56e4fad9130ca8f46f3aa3ff36bc41dbeb1 (diff) | |
download | pico-watch-06d5f492eca8e57bc8ce7479ec6149fbc6a15d08.tar pico-watch-06d5f492eca8e57bc8ce7479ec6149fbc6a15d08.tar.gz pico-watch-06d5f492eca8e57bc8ce7479ec6149fbc6a15d08.zip |
Use dynamic allocation of app variables/data
Stop using APPS_DATA. Dynamic allocation allows to avoid having memory
used by unloaded apps, thus giving more memory to running apps. Make
sure to correctly deallocate with `delete` to avoid memory leaks!
Exceptions to allocate memory will have to be handled...
Diffstat (limited to 'pico-watch.cpp')
-rw-r--r-- | pico-watch.cpp | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/pico-watch.cpp b/pico-watch.cpp index 05d94e2..243f1e1 100644 --- a/pico-watch.cpp +++ b/pico-watch.cpp @@ -14,12 +14,11 @@ int current_app = 0; #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) = {app_home_menu::init, app_main_clock::init}; -int (*APPS_FUNC_RENDER[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size) = {app_home_menu::render, app_main_clock::render}; -int (*APPS_FUNC_BTNPRESS[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size, uint gpio) = {app_home_menu::btnpressed, app_main_clock::btnpressed}; -int (*APPS_FUNC_BGREFRESH[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size, char in_foreground) = {app_home_menu::bgrefresh, app_main_clock::bgrefresh}; -int (*APPS_FUNC_DESTROY[NUMBER_OF_APPS])(SSOLED *oled, char *data, uint data_size) = {app_home_menu::destroy, app_main_clock::destroy}; -char APPS_DATA[NUMBER_OF_APPS][APP_DATA_BUFFER_LEN]; +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_DESTROY_ON_EXIT[NUMBER_OF_APPS] = {0, 1}; int APPS_IS_INIT[NUMBER_OF_APPS] = {0, 0}; // Only run in background if init @@ -27,29 +26,29 @@ int app_init(int 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])); + return (*APPS_FUNC_INIT[app_id])(&oled); } } int app_render(int app_id) { - return (*APPS_FUNC_RENDER[app_id])(&oled, &APPS_DATA[app_id][0], sizeof(APPS_DATA[app_id])); + return (*APPS_FUNC_RENDER[app_id])(&oled); } int app_btnpressed(int app_id, uint gpio) { - return (*APPS_FUNC_BTNPRESS[app_id])(&oled, &APPS_DATA[app_id][0], sizeof(APPS_DATA[app_id]), gpio); + return (*APPS_FUNC_BTNPRESS[app_id])(&oled, 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])); + return (*APPS_FUNC_DESTROY[app_id])(&oled); } } int app_bgrefresh(int app_id) { if (APPS_IS_INIT[app_id]) - return (*APPS_FUNC_BGREFRESH[app_id])(&oled, &APPS_DATA[app_id][0], sizeof(APPS_DATA[app_id]), app_id==current_app); + return (*APPS_FUNC_BGREFRESH[app_id])(&oled, app_id==current_app); } bool apps_bgrefresh(struct repeating_timer *t) { // TODO: Refresh done on core1 |