Add menu for setting timezone

This commit is contained in:
Lewis Jackson 2023-05-29 22:07:52 +03:00
parent 15838abd5a
commit a3aaacf5e7
4 changed files with 66 additions and 22 deletions

View file

@ -76,6 +76,7 @@ void Menu::HandleButtonPress(uint64_t buttonMask)
m_currentPage = m_pages[m_currentPage].menuItems[m_currentMenuItem].pageNum; m_currentPage = m_pages[m_currentPage].menuItems[m_currentMenuItem].pageNum;
m_currentMenuItem = 0; m_currentMenuItem = 0;
m_numMenuItemsinCurrentPage = m_pages[m_currentPage].menuItems.size();
Redraw(false); Redraw(false);
@ -85,6 +86,7 @@ void Menu::HandleButtonPress(uint64_t buttonMask)
if (buttonMask & BACK_BTN_MASK) { if (buttonMask & BACK_BTN_MASK) {
m_currentPage = m_pages[m_currentPage].backPageNum; m_currentPage = m_pages[m_currentPage].backPageNum;
m_currentMenuItem = 0; m_currentMenuItem = 0;
m_numMenuItemsinCurrentPage = m_pages[m_currentPage].menuItems.size();
Redraw(false); Redraw(false);
return; return;
@ -93,20 +95,6 @@ void Menu::HandleButtonPress(uint64_t buttonMask)
void Menu::SetPages(const std::vector<MenuPage> & pages) void Menu::SetPages(const std::vector<MenuPage> & pages)
{ {
// If the number of pages has changed, reset the current page and menu item.
if (pages.size() != m_numPages) {
Serial.println("Resetting current page");
m_currentPage = 0;
m_currentMenuItem = 0;
}
// If the number of menu items has changed, reset the current menu item.
if (pages.size() > 0 && pages[m_currentMenuItem].menuItems.size() != m_numMenuItemsinCurrentPage) {
Serial.println("Resetting current menu item");
m_currentMenuItem = 0;
m_numMenuItemsinCurrentPage = pages[m_currentPage].menuItems.size();
}
m_pages = pages; m_pages = pages;
m_numPages = pages.size(); m_numPages = pages.size();
} }
@ -179,7 +167,7 @@ void Menu::Redraw(bool partialRefresh)
for (uint8_t i = 0; i < m_numMenuItemsinCurrentPage; i++) { for (uint8_t i = 0; i < m_numMenuItemsinCurrentPage; i++) {
int16_t x, y; int16_t x, y;
uint16_t w, h; uint16_t w, h;
m_display->getTextBounds(m_pages[m_currentPage].menuItems[m_currentMenuItem].title.c_str(), 5, top, &x, &y, &w, &h); m_display->getTextBounds(m_pages[m_currentPage].menuItems[i].title.c_str(), 5, top, &x, &y, &w, &h);
if (i == m_currentMenuItem) { if (i == m_currentMenuItem) {
m_display->fillRect(5, top, m_display->width() - 15, h + 6, GxEPD_BLACK); m_display->fillRect(5, top, m_display->width() - 15, h + 6, GxEPD_BLACK);

View file

@ -4,16 +4,21 @@
RTC_DATA_ATTR bool WatchFace::m_menuSetup = false; RTC_DATA_ATTR bool WatchFace::m_menuSetup = false;
RTC_DATA_ATTR bool WatchFace::m_inMenu = false; RTC_DATA_ATTR bool WatchFace::m_inMenu = false;
RTC_DATA_ATTR int WatchFace::m_tzOffset = TZ_OFFSET;
Menu WatchFace::m_menu; Menu WatchFace::m_menu;
void WatchFace::Setup() // Called after hardware is set up void WatchFace::Setup() // Called after hardware is set up
{ {
if (!m_menuSetup) { if (!m_menuSetup) {
m_menuSetup = true;
m_menu.Init(m_display); m_menu.Init(m_display);
} }
SetupVolatileMenuStuff(); SetupVolatileMenuStuff();
if (!m_menuSetup) {
m_menu.Reset();
m_menuSetup = true;
}
} }
void WatchFace::HandleButtonPress(uint64_t buttonMask) void WatchFace::HandleButtonPress(uint64_t buttonMask)
@ -44,7 +49,7 @@ void WatchFace::DrawWatchFace(bool partialRefresh)
DrawBatteryIcon(); DrawBatteryIcon();
tmElements_t currentTime; tmElements_t currentTime;
m_RTC.read(currentTime, TZ_OFFSET); m_RTC.read(currentTime, m_tzOffset);
SevenSegment sevenSegment(30, 60, 6, 5, 5); SevenSegment sevenSegment(30, 60, 6, 5, 5);
if (currentTime.Hour < 10) { if (currentTime.Hour < 10) {
@ -99,6 +104,11 @@ void WatchFace::SetupVolatileMenuStuff()
nullptr, // callback nullptr, // callback
1 // pageNum 1 // pageNum
}, },
{
"Set TZ", // title
nullptr, // callback
2 // pageNum
},
{ {
"Back", // title "Back", // title
nullptr, // callback nullptr, // callback
@ -124,6 +134,39 @@ void WatchFace::SetupVolatileMenuStuff()
} }
}, },
}, },
{
0, // backPageNum
"TIMEZONE", // title
ALIGNMENT_CENTER, // titleAlignment
"", // body
{ // Menu items
{
"+0", // title
std::bind(&WatchFace::MenuTimeZoneSelected, this, 0), // callback
0 // pageNum
},
{
"+1", // title
std::bind(&WatchFace::MenuTimeZoneSelected, this, 3600), // callback
0 // pageNum
},
{
"+2", // title
std::bind(&WatchFace::MenuTimeZoneSelected, this, 7200), // callback
0 // pageNum
},
{
"+3", // title
std::bind(&WatchFace::MenuTimeZoneSelected, this, 10800), // callback
0 // pageNum
},
{
"Back", // title
nullptr, // callback
0 // pageNum
}
},
}
}; };
m_menu.SetPages(menuPages); m_menu.SetPages(menuPages);
@ -144,6 +187,17 @@ void WatchFace::MenuNTPSyncSelected()
SyncNTPTime(); SyncNTPTime();
DisconnectWiFi(); DisconnectWiFi();
if (m_inMenu) {
m_inMenu = false;
m_menu.Reset();
DrawWatchFace(false);
}
}
void WatchFace::MenuTimeZoneSelected(int tzOffset)
{
m_tzOffset = tzOffset;
if (m_inMenu) { if (m_inMenu) {
m_inMenu = false; m_inMenu = false;
m_menu.Reset(); m_menu.Reset();

View file

@ -14,9 +14,11 @@ private:
RTC_DATA_ATTR static bool m_menuSetup; RTC_DATA_ATTR static bool m_menuSetup;
RTC_DATA_ATTR static bool m_inMenu; RTC_DATA_ATTR static bool m_inMenu;
RTC_DATA_ATTR static Menu m_menu; RTC_DATA_ATTR static Menu m_menu;
RTC_DATA_ATTR static int m_tzOffset;
void SetupVolatileMenuStuff(); void SetupVolatileMenuStuff();
void DrawBatteryIcon(); void DrawBatteryIcon();
void MenuExited(); void MenuExited();
void MenuNTPSyncSelected(); void MenuNTPSyncSelected();
void MenuTimeZoneSelected(int tzOffset);
}; };

View file

@ -65,15 +65,15 @@ void Watchy::DeepSleep()
// Set GPIOs 0-39 to input to avoid power leaking out // Set GPIOs 0-39 to input to avoid power leaking out
const uint64_t ignore = 0b11110001000000110000100111000010; // Ignore some GPIOs due to resets const uint64_t ignore = 0b11110001000000110000100111000010; // Ignore some GPIOs due to resets
for (int i = 0; i < GPIO_NUM_MAX; i++) { for (int i = 0; i < GPIO_NUM_MAX; i++) {
if ((ignore >> i) & 0b1) if ((ignore >> i) & 0b1) {
continue; continue;
}
pinMode(i, INPUT); pinMode(i, INPUT);
} }
esp_sleep_enable_ext0_wakeup((gpio_num_t)RTC_INT_PIN, esp_sleep_enable_ext0_wakeup((gpio_num_t)RTC_INT_PIN, 0); // enable deep sleep wake on RTC interrupt
0); // enable deep sleep wake on RTC interrupt
esp_sleep_enable_ext1_wakeup( esp_sleep_enable_ext1_wakeup(
BTN_PIN_MASK, BTN_PIN_MASK,
ESP_EXT1_WAKEUP_ANY_HIGH); // enable deep sleep wake on button press ESP_EXT1_WAKEUP_ANY_HIGH);
esp_deep_sleep_start(); esp_deep_sleep_start();
} }