aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorConfuSomu2021-05-01 14:42:56 -0400
committerConfuSomu2021-05-01 14:42:56 -0400
commit773338c6b8c45d900723b42825d9be304475657d (patch)
treef14a2746b83d48642e07ccf50def27b2e80d525c
parent4f68147aee228631e78356c2f3e75f277023bf48 (diff)
downloadpico-watch-773338c6b8c45d900723b42825d9be304475657d.tar
pico-watch-773338c6b8c45d900723b42825d9be304475657d.tar.gz
pico-watch-773338c6b8c45d900723b42825d9be304475657d.zip
Implement preliminary settings app
-rw-r--r--CMakeLists.txt2
-rw-r--r--apps/home_menu.cpp4
-rw-r--r--apps/settings/main.cpp93
-rw-r--r--apps/settings/main.hpp13
-rw-r--r--pico-watch.cpp17
5 files changed, 119 insertions, 10 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8ec8115..0b0cc8a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -50,6 +50,8 @@ add_executable(pico-watch
apps/home_menu.hpp
apps/main_clock.cpp
apps/main_clock.hpp
+ apps/settings/main.cpp
+ apps/settings/main.hpp
)
pico_set_program_name(pico-watch "pico-watch")
diff --git a/apps/home_menu.cpp b/apps/home_menu.cpp
index 531a53c..239ffda 100644
--- a/apps/home_menu.cpp
+++ b/apps/home_menu.cpp
@@ -8,11 +8,11 @@
extern void app_switch(int old_appid, int new_appid);
extern bool rtc_get_datetime(datetime_t *t);
-#define NUMBER_OF_APPS 2
+#define NUMBER_OF_APPS 3
#define SIZE_APP_NAME 12
namespace app_home_menu {
- const char *APPS_NAME[NUMBER_OF_APPS] = {"Home", "Clock"};
+ const char *APPS_NAME[NUMBER_OF_APPS] = {"Home", "Clock", "Settings"};
int selected_app = 0;
char display_app_name[SIZE_APP_NAME];
diff --git a/apps/settings/main.cpp b/apps/settings/main.cpp
new file mode 100644
index 0000000..a5e1c83
--- /dev/null
+++ b/apps/settings/main.cpp
@@ -0,0 +1,93 @@
+#include <stdio.h>
+#include "pico/stdlib.h"
+
+#include "main.hpp"
+#include "../../api.hpp"
+
+extern void app_switch(int old_appid, int new_appid);
+extern bool rtc_get_datetime(datetime_t *t);
+
+#define MAIN_SET_NUM 4
+#define MAIN_SET_NUM_STR "4"
+#define SIZE_SETTING_NAME 12
+#define SET0_NAME "Time"
+#define SET1_NAME "Date"
+#define SET2_NAME "Brightness"
+#define SET3_NAME "Sleep delay"
+
+namespace app_settings {
+ const char *MAIN_SET_NAMES[MAIN_SET_NUM] = {SET0_NAME, SET1_NAME, SET2_NAME, SET3_NAME};
+ int selected_setting = 0;
+ char display_setting_name[SIZE_SETTING_NAME];
+ bool selected = false;
+
+ void show_title(Api *app_api) {
+ std::string title_str {"Settings (/" MAIN_SET_NUM_STR ")"};
+ title_str.insert(10, std::to_string(selected_setting+1));
+ app_api->gui_header_text(title_str);
+ }
+
+ // Rendering of app
+ int render(Api *app_api) {
+ show_title(app_api);
+ app_api->display_write_string(0,0,3, display_setting_name, FONT_12x16, 0, 1);
+
+ if (selected) {
+ selected = false;
+ switch (selected_setting) {
+ case 0:
+ app_api->gui_popup_text(SET0_NAME, "Todo!");
+ break;
+ case 1:
+ app_api->gui_popup_text(SET1_NAME, "Todo!");
+ break;
+ }
+ }
+
+ return 0;
+ }
+
+ // Example of how button inputs could be interpreted.
+ // Drawing on screen should be done in the render function.
+ int btnpressed(Api *app_api, uint gpio, unsigned long delta) {
+ switch (gpio) {
+ case BUTTON_SELECT:
+ selected = true;
+ break;
+ case BUTTON_DOWN:
+ selected_setting--;
+ break;
+ case BUTTON_UP:
+ selected_setting++;
+ break;
+ }
+ if (selected_setting > MAIN_SET_NUM-1) {
+ selected_setting = MAIN_SET_NUM-1;
+ } else if (selected_setting < 0) {
+ selected_setting = 0;
+ }
+ // Add spaces to avoid "ghost" characters from app names displayed before
+ snprintf(display_setting_name, SIZE_SETTING_NAME, "%s ", MAIN_SET_NAMES[selected_setting]);
+ return 0;
+ }
+
+ // Initlisation of the app.
+ int init(Api *app_api) {
+ app_api->performance_set(Api::perf_modes::LOW_POWER);
+ app_api->performance_render_interval_set(100);
+ selected_setting = 0;
+ selected = false;
+ snprintf(display_setting_name, SIZE_SETTING_NAME, "%s", MAIN_SET_NAMES[0]);
+ return Api::app_init_return_status::OK;
+ }
+
+ // 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(Api *app_api, bool 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(Api *app_api) {
+ return 0;
+ }
+}
diff --git a/apps/settings/main.hpp b/apps/settings/main.hpp
new file mode 100644
index 0000000..0626dc7
--- /dev/null
+++ b/apps/settings/main.hpp
@@ -0,0 +1,13 @@
+#ifndef __SETTINGS_H__
+#define __SETTINGS_H__
+#include "../../api.hpp"
+
+namespace app_settings {
+ int init(Api *app_api);
+ int render(Api *app_api);
+ int btnpressed(Api *app_api, uint gpio, unsigned long delta);
+ int bgrefresh(Api *app_api, bool in_foreground);
+ int destroy(Api *app_api);
+}
+
+#endif
diff --git a/pico-watch.cpp b/pico-watch.cpp
index bbaa679..8673e33 100644
--- a/pico-watch.cpp
+++ b/pico-watch.cpp
@@ -10,19 +10,20 @@
#include "buttons.hpp"
#include "apps/main_clock.hpp"
#include "apps/home_menu.hpp"
+#include "apps/settings/main.hpp"
global_status g_s;
Api app_api;
-#define NUMBER_OF_APPS 2
+#define NUMBER_OF_APPS 3
#define APP_DATA_BUFFER_LEN 256
-int (*APPS_FUNC_INIT[NUMBER_OF_APPS])(Api *app_api) = {app_home_menu::init, app_main_clock::init};
-int (*APPS_FUNC_RENDER[NUMBER_OF_APPS])(Api *app_api) = {app_home_menu::render, app_main_clock::render};
-int (*APPS_FUNC_BTNPRESS[NUMBER_OF_APPS])(Api *app_api, uint gpio, unsigned long delta) = {app_home_menu::btnpressed, app_main_clock::btnpressed};
-int (*APPS_FUNC_BGREFRESH[NUMBER_OF_APPS])(Api *app_api, bool in_foreground) = {app_home_menu::bgrefresh, app_main_clock::bgrefresh};
-int (*APPS_FUNC_DESTROY[NUMBER_OF_APPS])(Api *app_api) = {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
+int (*APPS_FUNC_INIT[NUMBER_OF_APPS])(Api *app_api) = {app_home_menu::init, app_main_clock::init, app_settings::init};
+int (*APPS_FUNC_RENDER[NUMBER_OF_APPS])(Api *app_api) = {app_home_menu::render, app_main_clock::render, app_settings::render};
+int (*APPS_FUNC_BTNPRESS[NUMBER_OF_APPS])(Api *app_api, uint gpio, unsigned long delta) = {app_home_menu::btnpressed, app_main_clock::btnpressed, app_settings::btnpressed};
+int (*APPS_FUNC_BGREFRESH[NUMBER_OF_APPS])(Api *app_api, bool in_foreground) = {app_home_menu::bgrefresh, app_main_clock::bgrefresh, app_settings::bgrefresh};
+int (*APPS_FUNC_DESTROY[NUMBER_OF_APPS])(Api *app_api) = {app_home_menu::destroy, app_main_clock::destroy, app_settings::destroy};
+int APPS_DESTROY_ON_EXIT[NUMBER_OF_APPS] = {0, 1, 1};
+int APPS_IS_INIT[NUMBER_OF_APPS] = {0}; // Only run in background if init
int app_init(int app_id) {
app_api.display_fill(0,1); // Clear OLED