From 8ad7e71440e603e94e972c099769ef2fc5e470e1 Mon Sep 17 00:00:00 2001
From: ConfuSomu
Date: Sat, 20 Feb 2021 12:55:39 -0500
Subject: Adopt C++

A large number of changes had to be made to use C++. "extern C" had to
be added for a few headers not adapted to C++. See
https://github.com/raspberrypi/pico-sdk/pull/106 for fix in affected
files. They will be removed when the pull request is merged in
pico-sdk's master branch.
---
 apps/home_menu.c    | 88 ------------------------------------------------
 apps/home_menu.cpp  | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++
 apps/home_menu.h    | 15 ---------
 apps/home_menu.hpp  | 15 +++++++++
 apps/main_clock.c   | 95 ---------------------------------------------------
 apps/main_clock.cpp | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 apps/main_clock.h   | 17 ----------
 apps/main_clock.hpp | 17 ++++++++++
 8 files changed, 222 insertions(+), 215 deletions(-)
 delete mode 100644 apps/home_menu.c
 create mode 100644 apps/home_menu.cpp
 delete mode 100644 apps/home_menu.h
 create mode 100644 apps/home_menu.hpp
 delete mode 100644 apps/main_clock.c
 create mode 100644 apps/main_clock.cpp
 delete mode 100644 apps/main_clock.h
 create mode 100644 apps/main_clock.hpp

(limited to 'apps')

diff --git a/apps/home_menu.c b/apps/home_menu.c
deleted file mode 100644
index b7c15b0..0000000
--- a/apps/home_menu.c
+++ /dev/null
@@ -1,88 +0,0 @@
-#include <stdio.h>
-#include "pico/stdlib.h"
-#include "hardware/rtc.h"
-#include "pico/util/datetime.h"
-#include "../oled/ss_oled.h"
-
-#include "home_menu.h"
-#include "../buttons.h"
-
-extern void app_switch(int old_appid, int new_appid);
-
-#define NUMBER_OF_APPS 2
-
-char* APPS_NAME[NUMBER_OF_APPS][12] = {"Home", "Clock"};
-
-void title_str(char *buf, uint buf_size, const datetime_t *t) {
-    snprintf(buf,
-             buf_size,
-             "%d:%02d Home Menu",
-             t->hour,
-             t->min,
-             t->sec);
-};
-
-void show_title(SSOLED *oled) {
-    char datetime_buf[256];
-    char *datetime_str = &datetime_buf[0];
-    datetime_t t;
-    rtc_get_datetime(&t);
-
-    // title with time
-    title_str(datetime_str, sizeof(datetime_buf), &t);
-    oledWriteString(oled, 0,0,0, datetime_str, FONT_8x8, 0, 1);
-}
-
-// Rendering of app
-int home_menu_render(SSOLED *oled, char *data, uint data_size) {
-    show_title(oled);
-    oledWriteString(oled, 0,0,2, &data[0], FONT_6x8, 0, 1);
-    oledWriteString(oled, 0,5,3, APPS_NAME[data[1]][0], FONT_12x16, 0, 1); // FIXME: The name does not update, it seems that the second string is empty… but data[1]'s content is correct, as BUTTON_SELECT switches to the correct app.
-    return 0;
-}
-
-// Interpret button inputs
-int home_menu_btnpressed(SSOLED *oled, char *data, uint data_size, uint gpio) {
-    switch (gpio) {
-        case BUTTON_HOME:
-            data[0] = 'H'; break;
-        case BUTTON_SELECT:
-            data[0] = 'S';
-            app_switch(0, data[1]);
-            break;
-        case BUTTON_MODE:
-            data[0] = 'M'; break;
-        case BUTTON_DOWN:
-            data[0] = 'D';
-            data[1]--;
-            break;
-        case BUTTON_UP:
-            data[0] = 'U';
-            data[1]++;
-            break;
-        default:
-            data[0] = '?';
-    }
-    if (data[1] > NUMBER_OF_APPS-1) {
-        data[1] = NUMBER_OF_APPS-1; data[0] = '>';
-    } else if (data[1] < NUMBER_OF_APPS-1) {
-        data[1] = 0; data[0] = '<';
-    }
-    return 0;
-}
-
-// Initlisation of the app.
-int home_menu_init(SSOLED *oled, char *data, uint data_size) {
-    data[1] = 0;
-    return 0; // return 1 when function not implemented
-}
-
-// Processor intensive operations and functions related to drawing to the screen should only be done when the app is in_foreground(=1). This function is only called when the app is init.
-int home_menu_bgrefresh(SSOLED *oled, char *data, uint data_size, char in_foreground) {
-    return 1;
-}
-
-// Destruction of app, deinitlisation should be done here. This is only called if the app's APPS_DESTROY_ON_EXIT is set to 1. When it is not a "service" app.
-int home_menu_destroy(SSOLED *oled, char *data, uint data_size) {
-    return 1;
-}
diff --git a/apps/home_menu.cpp b/apps/home_menu.cpp
new file mode 100644
index 0000000..30caed0
--- /dev/null
+++ b/apps/home_menu.cpp
@@ -0,0 +1,93 @@
+#include <stdio.h>
+#include "pico/stdlib.h"
+extern "C" {
+#include "hardware/rtc.h"
+}
+#include "pico/util/datetime.h"
+#include "../oled/ss_oled.h"
+
+#include "home_menu.hpp"
+#include "../buttons.hpp"
+
+extern void app_switch(int old_appid, int new_appid);
+extern bool rtc_get_datetime(datetime_t *t);
+
+#define NUMBER_OF_APPS 2
+
+namespace app_home_menu {
+    const char* APPS_NAME[NUMBER_OF_APPS][12] = {"Home", "Clock"};
+
+    void title_str(char *buf, uint buf_size, const datetime_t *t) {
+        snprintf(buf,
+                buf_size,
+                "%d:%02d Home Menu",
+                t->hour,
+                t->min,
+                t->sec);
+    };
+
+    void show_title(SSOLED *oled) {
+        char datetime_buf[256];
+        char *datetime_str = &datetime_buf[0];
+        datetime_t t;
+        rtc_get_datetime(&t);
+
+        // title with time
+        title_str(datetime_str, sizeof(datetime_buf), &t);
+        oledWriteString(oled, 0,0,0, datetime_str, FONT_8x8, 0, 1);
+    }
+
+    // Rendering of app
+    int render(SSOLED *oled, char *data, uint data_size) {
+        show_title(oled);
+        oledWriteString(oled, 0,0,2, &data[0], FONT_6x8, 0, 1);
+        oledWriteString(oled, 0,5,3, const_cast<char*>(APPS_NAME[data[1]][0]), FONT_12x16, 0, 1); // FIXME: The name does not update, it seems that the second string is empty… but data[1]'s content is correct, as BUTTON_SELECT switches to the correct app.
+        return 0;
+    }
+
+    // Interpret button inputs
+    int btnpressed(SSOLED *oled, char *data, uint data_size, uint gpio) {
+        switch (gpio) {
+            case BUTTON_HOME:
+                data[0] = 'H'; break;
+            case BUTTON_SELECT:
+                data[0] = 'S';
+                app_switch(0, data[1]);
+                break;
+            case BUTTON_MODE:
+                data[0] = 'M'; break;
+            case BUTTON_DOWN:
+                data[0] = 'D';
+                data[1]--;
+                break;
+            case BUTTON_UP:
+                data[0] = 'U';
+                data[1]++;
+                break;
+            default:
+                data[0] = '?';
+        }
+        if (data[1] > NUMBER_OF_APPS-1) {
+            data[1] = NUMBER_OF_APPS-1; data[0] = '>';
+        } else if (data[1] < NUMBER_OF_APPS-1) {
+            data[1] = 0; data[0] = '<';
+        }
+        return 0;
+    }
+
+    // Initlisation of the app.
+    int init(SSOLED *oled, char *data, uint data_size) {
+        data[1] = 0;
+        return 0; // return 1 when function not implemented
+    }
+
+    // Processor intensive operations and functions related to drawing to the screen should only be done when the app is in_foreground(=1). This function is only called when the app is init.
+    int bgrefresh(SSOLED *oled, char *data, uint data_size, char in_foreground) {
+        return 1;
+    }
+
+    // Destruction of app, deinitlisation should be done here. This is only called if the app's APPS_DESTROY_ON_EXIT is set to 1. When it is not a "service" app.
+    int destroy(SSOLED *oled, char *data, uint data_size) {
+        return 1;
+    }
+}
diff --git a/apps/home_menu.h b/apps/home_menu.h
deleted file mode 100644
index 507e818..0000000
--- a/apps/home_menu.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef __HOME_MENU_H__
-#define __HOME_MENU_H__
-
-#include "pico/util/datetime.h"
-#include "../oled/ss_oled.h"
-
-void show_title(SSOLED *oled);
-
-int home_menu_init(SSOLED *oled, char *data, uint data_size);
-int home_menu_render(SSOLED *oled, char *data, uint data_size);
-int home_menu_btnpressed(SSOLED *oled, char *data, uint data_size, uint gpio);
-int home_menu_bgrefresh(SSOLED *oled, char *data, uint data_size, char in_foreground);
-int home_menu_destroy(SSOLED *oled, char *data, uint data_size);
-
-#endif
\ No newline at end of file
diff --git a/apps/home_menu.hpp b/apps/home_menu.hpp
new file mode 100644
index 0000000..bd648d3
--- /dev/null
+++ b/apps/home_menu.hpp
@@ -0,0 +1,15 @@
+#ifndef __HOME_MENU_H__
+#define __HOME_MENU_H__
+
+#include "pico/util/datetime.h"
+#include "../oled/ss_oled.h"
+
+namespace app_home_menu {
+    int init(SSOLED *oled, char *data, uint data_size);
+    int render(SSOLED *oled, char *data, uint data_size);
+    int btnpressed(SSOLED *oled, char *data, uint data_size, uint gpio);
+    int bgrefresh(SSOLED *oled, char *data, uint data_size, char in_foreground);
+    int destroy(SSOLED *oled, char *data, uint data_size);
+}
+
+#endif
diff --git a/apps/main_clock.c b/apps/main_clock.c
deleted file mode 100644
index 547057e..0000000
--- a/apps/main_clock.c
+++ /dev/null
@@ -1,95 +0,0 @@
-#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"
-#include "../buttons.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);
-}
-
-// Rendering of the app
-int main_clock_render(SSOLED *oled, char *data, uint data_size) {
-    oledWriteString(oled, 0,15,0, (char *)"Test clock", FONT_8x8, 0, 1);
-    show_datetime(oled);
-    oledWriteString(oled, 0,0,0, &data[0], FONT_6x8, 0, 1);
-    return 0;
-}
-
-// Example of how button inputs could be interpreted.
-// Drawing on screen should be done in the render function.
-int main_clock_btnpressed(SSOLED *oled, char *data, uint data_size, uint gpio) {
-    switch (gpio) {
-        case BUTTON_HOME: // Apps will generally not receive the Home button press
-            data[0] = 'H'; break;
-        case BUTTON_SELECT:
-            data[0] = 'S'; break;
-        case BUTTON_MODE:
-            data[0] = 'M'; break;
-        case BUTTON_DOWN:
-            data[0] = 'D'; break;
-        case BUTTON_UP:
-            data[0] = 'U'; break;
-        default:
-            data[0] = '?';
-    }
-    return 0;
-}
-
-// Initlisation of the app.
-int main_clock_init(SSOLED *oled, char *data, uint data_size) {
-    return 1; // return 1 when function not implemented
-}
-
-// Processor intensive operations and functions related to drawing to the screen should only be done when the app is in_foreground(=1). This function is only called when the app is init.
-int main_clock_bgrefresh(SSOLED *oled, char *data, uint data_size, char in_foreground) {
-    return 1;
-}
-
-// Destruction of app, deinitlisation should be done here. This is only called if the app's APPS_DESTROY_ON_EXIT is set to 1. When it is not a "service" app.
-int main_clock_destroy(SSOLED *oled, char *data, uint data_size) {
-    return 1;
-}
diff --git a/apps/main_clock.cpp b/apps/main_clock.cpp
new file mode 100644
index 0000000..9dfee0f
--- /dev/null
+++ b/apps/main_clock.cpp
@@ -0,0 +1,97 @@
+#include <stdio.h>
+#include "pico/stdlib.h"
+extern "C" {
+#include "hardware/rtc.h"
+}
+#include "pico/util/datetime.h"
+#include "../oled/ss_oled.h"
+
+#include "main_clock.hpp"
+#include "../buttons.hpp"
+
+// 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);
+}
+
+// Rendering of the app
+int main_clock_render(SSOLED *oled, char *data, uint data_size) {
+    oledWriteString(oled, 0,15,0, (char *)"Test clock", FONT_8x8, 0, 1);
+    show_datetime(oled);
+    oledWriteString(oled, 0,0,0, &data[0], FONT_6x8, 0, 1);
+    return 0;
+}
+
+// Example of how button inputs could be interpreted.
+// Drawing on screen should be done in the render function.
+int main_clock_btnpressed(SSOLED *oled, char *data, uint data_size, uint gpio) {
+    switch (gpio) {
+        case BUTTON_HOME: // Apps will generally not receive the Home button press
+            data[0] = 'H'; break;
+        case BUTTON_SELECT:
+            data[0] = 'S'; break;
+        case BUTTON_MODE:
+            data[0] = 'M'; break;
+        case BUTTON_DOWN:
+            data[0] = 'D'; break;
+        case BUTTON_UP:
+            data[0] = 'U'; break;
+        default:
+            data[0] = '?';
+    }
+    return 0;
+}
+
+// Initlisation of the app.
+int main_clock_init(SSOLED *oled, char *data, uint data_size) {
+    return 1; // return 1 when function not implemented
+}
+
+// Processor intensive operations and functions related to drawing to the screen should only be done when the app is in_foreground(=1). This function is only called when the app is init.
+int main_clock_bgrefresh(SSOLED *oled, char *data, uint data_size, char in_foreground) {
+    return 1;
+}
+
+// Destruction of app, deinitlisation should be done here. This is only called if the app's APPS_DESTROY_ON_EXIT is set to 1. When it is not a "service" app.
+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
deleted file mode 100644
index 70d9755..0000000
--- a/apps/main_clock.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#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_btnpressed(SSOLED *oled, char *data, uint data_size, uint gpio);
-int main_clock_bgrefresh(SSOLED *oled, char *data, uint data_size, char in_foreground);
-int main_clock_destroy(SSOLED *oled, char *data, uint data_size);
-
-#endif
\ No newline at end of file
diff --git a/apps/main_clock.hpp b/apps/main_clock.hpp
new file mode 100644
index 0000000..70d9755
--- /dev/null
+++ b/apps/main_clock.hpp
@@ -0,0 +1,17 @@
+#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_btnpressed(SSOLED *oled, char *data, uint data_size, uint gpio);
+int main_clock_bgrefresh(SSOLED *oled, char *data, uint data_size, char in_foreground);
+int main_clock_destroy(SSOLED *oled, char *data, uint data_size);
+
+#endif
\ No newline at end of file
-- 
cgit v1.2.3-54-g00ecf