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