aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorConfuSomu2021-02-08 12:44:05 -0500
committerConfuSomu2021-02-08 12:44:05 -0500
commit8c27dc6445eedd928e8f7886f9d1b62f74e189f1 (patch)
treeb18492e60eee24add13c79a8ffcbbbed84f33b61
parentfef4e0343b14d8d95749e60867828b2773bf8f7d (diff)
downloadpico-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.txt1
-rw-r--r--apps/main_clock.c72
-rw-r--r--apps/main_clock.h16
-rw-r--r--pico-watch.c71
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;