diff options
author | ConfuSomu | 2021-05-01 14:42:56 -0400 |
---|---|---|
committer | ConfuSomu | 2021-05-01 14:42:56 -0400 |
commit | 773338c6b8c45d900723b42825d9be304475657d (patch) | |
tree | f14a2746b83d48642e07ccf50def27b2e80d525c | |
parent | 4f68147aee228631e78356c2f3e75f277023bf48 (diff) | |
download | pico-watch-773338c6b8c45d900723b42825d9be304475657d.tar pico-watch-773338c6b8c45d900723b42825d9be304475657d.tar.gz pico-watch-773338c6b8c45d900723b42825d9be304475657d.zip |
Implement preliminary settings app
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | apps/home_menu.cpp | 4 | ||||
-rw-r--r-- | apps/settings/main.cpp | 93 | ||||
-rw-r--r-- | apps/settings/main.hpp | 13 | ||||
-rw-r--r-- | pico-watch.cpp | 17 |
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 |