diff options
author | ConfuSomu | 2021-02-08 12:44:05 -0500 |
---|---|---|
committer | ConfuSomu | 2021-02-08 12:44:05 -0500 |
commit | 8c27dc6445eedd928e8f7886f9d1b62f74e189f1 (patch) | |
tree | b18492e60eee24add13c79a8ffcbbbed84f33b61 | |
parent | fef4e0343b14d8d95749e60867828b2773bf8f7d (diff) | |
download | pico-watch-8c27dc6445eedd928e8f7886f9d1b62f74e189f1.tar pico-watch-8c27dc6445eedd928e8f7886f9d1b62f74e189f1.tar.gz pico-watch-8c27dc6445eedd928e8f7886f9d1b62f74e189f1.zip |
Create a sort of framework for apps
Each app has its own init, render, bgrefresh and destroy functions.
The app data array alllows apps to persist data between function calls.
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | apps/main_clock.c | 72 | ||||
-rw-r--r-- | apps/main_clock.h | 16 | ||||
-rw-r--r-- | pico-watch.c | 71 |
4 files changed, 117 insertions, 43 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f5e46b..0b849c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ add_executable(pico-watch pico-watch.c init.c init.h + apps/main_clock.c ) pico_set_program_name(pico-watch "pico-watch") diff --git a/apps/main_clock.c b/apps/main_clock.c new file mode 100644 index 0000000..ec95585 --- /dev/null +++ b/apps/main_clock.c @@ -0,0 +1,72 @@ +#include <stdio.h> +#include "pico/stdlib.h" +#include "hardware/rtc.h" +#include "pico/util/datetime.h" +#include "../oled/ss_oled.h" + +#include "main_clock.h" + +// Time as string +// Adapted from pico-sdk/scr/common/pico_util/datetime.c +void time_as_str(char *buf, uint buf_size, const datetime_t *t) { + snprintf(buf, + buf_size, + "%d:%02d:%02d", + t->hour, + t->min, + t->sec); +}; +void date_as_str(char *buf, uint buf_size, const datetime_t *t) { + static const char *DATETIME_DOWS[7] = { + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + }; + snprintf(buf, + buf_size, + "%02d-%02d-%02d %s", + t->year, + t->month, + t->day, + DATETIME_DOWS[t->dotw - 1]); +}; + +void show_datetime(SSOLED *oled) { + char datetime_buf[256]; + char *datetime_str = &datetime_buf[0]; + datetime_t t; + rtc_get_datetime(&t); + + // time + time_as_str(datetime_str, sizeof(datetime_buf), &t); + oledWriteString(oled, 0,10,3, datetime_str, FONT_12x16, 0, 1); + + // date + date_as_str(datetime_str, sizeof(datetime_buf), &t); + oledWriteString(oled, 0,0,7, datetime_str, FONT_8x8, 0, 1); +} + +int main_clock_render(SSOLED *oled, char *data, uint data_size) { + show_datetime(oled); +// data[1] += 1; // testing +// oledWriteString(oled, 0,0,2, &data[0], FONT_6x8, 0, 1); + return 0; +} + +int main_clock_init(SSOLED *oled, char *data, uint data_size) { +// data[0] = 'a'; // testing, to showcase the use of data +// data[1] = 'b'; + return 1; // return 1 when function not implemented +} + +int main_clock_bgrefresh(SSOLED *oled, char *data, uint data_size) { + return 1; +} + +int main_clock_destroy(SSOLED *oled, char *data, uint data_size) { + return 1; +} diff --git a/apps/main_clock.h b/apps/main_clock.h new file mode 100644 index 0000000..d47e837 --- /dev/null +++ b/apps/main_clock.h @@ -0,0 +1,16 @@ +#ifndef __MAIN_CLOCK_H__ +#define __MAIN_CLOCK_H__ + +#include "pico/util/datetime.h" +#include "../oled/ss_oled.h" + +void time_as_str(char *buf, uint buf_size, const datetime_t *t); +void date_as_str(char *buf, uint buf_size, const datetime_t *t); +void show_datetime(SSOLED *oled); + +int main_clock_init(SSOLED *oled, char *data, uint data_size); +int main_clock_render(SSOLED *oled, char *data, uint data_size); +int main_clock_bgrefresh(SSOLED *oled, char *data, uint data_size); +int main_clock_destroy(SSOLED *oled, char *data, uint data_size); + +#endif
\ No newline at end of file diff --git a/pico-watch.c b/pico-watch.c index a07cd23..a7c3886 100644 --- a/pico-watch.c +++ b/pico-watch.c @@ -6,57 +6,42 @@ #include "oled/ss_oled.h" #include "init.h" +#include "apps/main_clock.h" +int current_app = 0; -// Time as string -// Adapted from pico-sdk/scr/common/pico_util/datetime.c -void time_as_str(char *buf, uint buf_size, const datetime_t *t) { - snprintf(buf, - buf_size, - "%d:%02d:%02d", - t->hour, - t->min, - t->sec); -}; -void date_as_str(char *buf, uint buf_size, const datetime_t *t) { - static const char *DATETIME_DOWS[7] = { - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - }; - snprintf(buf, - buf_size, - "%02d-%02d-%02d %s", - t->year, - t->month, - t->day, - DATETIME_DOWS[t->dotw - 1]); -}; - -void show_datetime() { - char datetime_buf[256]; - char *datetime_str = &datetime_buf[0]; - datetime_t t; - rtc_get_datetime(&t); - - // time - time_as_str(datetime_str, sizeof(datetime_buf), &t); - oledWriteString(&oled, 0,10,3, datetime_str, FONT_12x16, 0, 1); - - // date - date_as_str(datetime_str, sizeof(datetime_buf), &t); - oledWriteString(&oled, 0,0,7, datetime_str, FONT_8x8, 0, 1); +#define NUMBER_OF_APPS 1 +#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_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}; +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 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])); +} + +int app_render(int app_id) { + return (*APPS_FUNC_RENDER[app_id])(&oled, &APPS_DATA[app_id][0], sizeof(APPS_DATA[app_id])); +} + +int app_destroy(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])); } int main() { init_all(); + + app_init(current_app); + oledWriteString(&oled, 0,15,0, (char *)"Test clock", FONT_8x8, 0, 1); while (1) { - show_datetime(); + app_render(current_app); sleep_ms(500); } return 0; |