diff options
Diffstat (limited to 'src/DisplayApp')
-rw-r--r-- | src/DisplayApp/DisplayApp.cpp | 145 | ||||
-rw-r--r-- | src/DisplayApp/DisplayApp.h | 26 |
2 files changed, 107 insertions, 64 deletions
diff --git a/src/DisplayApp/DisplayApp.cpp b/src/DisplayApp/DisplayApp.cpp index f72f057b..24cd2f36 100644 --- a/src/DisplayApp/DisplayApp.cpp +++ b/src/DisplayApp/DisplayApp.cpp @@ -7,12 +7,43 @@ #include <hal/nrf_rtc.h> #include "Components/Gfx/Gfx.h" #include <queue.h> +#include <Components/DateTime/DateTimeController.h> using namespace Pinetime::Applications; -DisplayApp::DisplayApp(Pinetime::Controllers::Battery &batteryController, Pinetime::Controllers::Ble &bleController) : +char const *DisplayApp::DaysString[] = { + "", + "MONDAY", + "TUESDAY", + "WEDNESDAY", + "THURSDAY", + "FRIDAY", + "SATURDAY", + "SUNDAY" +}; + +char const *DisplayApp::MonthsString[] = { + "", + "JAN", + "FEB", + "MAR", + "APR", + "MAY", + "JUN", + "JUL", + "AUG", + "SEP", + "OCT", + "NOV", + "DEC" +}; + +DisplayApp::DisplayApp(Controllers::Battery &batteryController, + Controllers::Ble &bleController, + Controllers::DateTime &dateTimeController) : batteryController{batteryController}, - bleController{bleController} { + bleController{bleController}, + dateTimeController{dateTimeController} { msgQueue = xQueueCreate(queueSize, itemSize); } @@ -22,7 +53,7 @@ void DisplayApp::Start() { } void DisplayApp::Process(void *instance) { - auto* app = static_cast<DisplayApp*>(instance); + auto *app = static_cast<DisplayApp *>(instance); NRF_LOG_INFO("DisplayApp task started!"); app->InitHw(); @@ -54,7 +85,7 @@ void DisplayApp::InitHw() { gfx->ClearScreen(); uint8_t x = 7; - gfx->DrawChar(&largeFont , '0', &x, 78, 0xffff); + gfx->DrawChar(&largeFont, '0', &x, 78, 0xffff); x = 61; gfx->DrawChar(&largeFont, '0', &x, 78, 0xffff); @@ -69,12 +100,12 @@ void DisplayApp::InitHw() { gfx->DrawChar(&largeFont, '0', &x, 78, 0xffff); gfx->DrawString(10, 0, 0x0000, "BLE", &smallFont, false); - gfx->DrawString(20, 180, 0xffff, "FRIDAY 27 DEC 2019", &smallFont, false); + gfx->DrawString(20, 180, 0xffff, "", &smallFont, false); } void DisplayApp::Refresh() { TickType_t queueTimeout; - switch(state) { + switch (state) { case States::Idle: IdleState(); queueTimeout = portMAX_DELAY; @@ -86,8 +117,8 @@ void DisplayApp::Refresh() { } Messages msg; - if(xQueueReceive( msgQueue, &msg, queueTimeout)) { - switch(msg) { + if (xQueueReceive(msgQueue, &msg, queueTimeout)) { + switch (msg) { case Messages::GoToSleep: nrf_gpio_pin_set(23); vTaskDelay(100); @@ -102,66 +133,53 @@ void DisplayApp::Refresh() { nrf_gpio_pin_clear(14); state = States::Running; break; + case Messages::UpdateDateTime: + deltaSeconds = nrf_rtc_counter_get(portNRF_RTC_REG) / 1000; + this->seconds = dateTimeController.Seconds(); + this->minutes = dateTimeController.Minutes(); + this->hours = dateTimeController.Hours(); + dateUpdated = true; + break; + case Messages::UpdateBleConnection: + bleConnectionUpdated = true; + break; + case Messages::UpdateBatteryLevel: + batteryLevelUpdated = true; + break; } } } -void DisplayApp::Minutes(uint8_t m) { - // TODO yeah, I know, race condition... - minutes = m; -} - -void DisplayApp::Hours(uint8_t h) { - // TODO yeah, I know, race condition too... - hours = h; -} - -void DisplayApp::SetTime(uint8_t minutes, uint8_t hours) { - deltaSeconds = nrf_rtc_counter_get(portNRF_RTC_REG) / 1000; - this->minutes = minutes; - this->hours = hours; -} - void DisplayApp::RunningState() { uint32_t systick_counter = nrf_rtc_counter_get(portNRF_RTC_REG); - char batteryChar[11]; - uint16_t newBatteryValue = batteryController.PercentRemaining(); - newBatteryValue = (newBatteryValue>100) ? 100 : newBatteryValue; - newBatteryValue = (newBatteryValue<0) ? 0 : newBatteryValue; - if(newBatteryValue != battery) { - battery = newBatteryValue; - sprintf(batteryChar, "BAT: %d%%", battery); - gfx->DrawString((240-108), 0, 0xffff, batteryChar, &smallFont, false); + if (batteryLevelUpdated) { + char batteryChar[11]; + uint16_t newBatteryValue = batteryController.PercentRemaining(); + newBatteryValue = (newBatteryValue > 100) ? 100 : newBatteryValue; + newBatteryValue = (newBatteryValue < 0) ? 0 : newBatteryValue; + + batteryLevelUpdated = false; + sprintf(batteryChar, "BAT: %d%%", newBatteryValue); + gfx->DrawString((240 - 108), 0, 0xffff, batteryChar, &smallFont, false); } - bool newIsBleConnected = bleController.IsConnected(); - if(newIsBleConnected != bleConnected) { - bleConnected = newIsBleConnected; - uint16_t color = (bleConnected) ? 0xffff : 0x0000; + if (bleConnectionUpdated) { + bleConnectionUpdated = false; + uint16_t color = (bleController.IsConnected()) ? 0xffff : 0x0000; gfx->DrawString(10, 0, color, "BLE", &smallFont, false); } auto raw = systick_counter / 1000; auto currentDeltaSeconds = raw - deltaSeconds; - auto deltaMinutes = (currentDeltaSeconds / 60); auto currentMinutes = minutes + deltaMinutes; auto deltaHours = currentMinutes / 60; currentMinutes -= (deltaHours * 60); - -// -// TODO make this better! -// minutes = raw / 60; -// seconds = raw - (minutes*60); - - auto currentHours = hours + deltaHours; - - char minutesChar[3]; sprintf(minutesChar, "%02d", currentMinutes); @@ -169,30 +187,51 @@ void DisplayApp::RunningState() { sprintf(hoursChar, "%02d", currentHours); uint8_t x = 7; - if(hoursChar[0] != currentChar[0]) { + if (hoursChar[0] != currentChar[0]) { gfx->DrawChar(&largeFont, hoursChar[0], &x, 78, 0xffff); currentChar[0] = hoursChar[0]; } x = 61; - if(hoursChar[1] != currentChar[1]) { + if (hoursChar[1] != currentChar[1]) { gfx->DrawChar(&largeFont, hoursChar[1], &x, 78, 0xffff); currentChar[1] = hoursChar[1]; } x = 127; - if(minutesChar[0] != currentChar[2]) { + if (minutesChar[0] != currentChar[2]) { gfx->DrawChar(&largeFont, minutesChar[0], &x, 78, 0xffff); currentChar[2] = minutesChar[0]; } x = 181; - if(minutesChar[1] != currentChar[3]) { + if (minutesChar[1] != currentChar[3]) { gfx->DrawChar(&largeFont, minutesChar[1], &x, 78, 0xffff); currentChar[3] = minutesChar[1]; } + + if (dateUpdated) { + auto year = dateTimeController.Year(); + auto month = dateTimeController.Month(); + auto day = dateTimeController.Day(); + auto dayOfWeek = dateTimeController.DayOfWeek(); + + char dateStr[22]; + sprintf(dateStr, "%s %d %s %d", DayOfWeekToString(dayOfWeek), day, MonthToString(month), year); + gfx->DrawString(10, 180, 0xffff, dateStr, &smallFont, false); + dateUpdated = false; + } } +const char *DisplayApp::MonthToString(Pinetime::Controllers::DateTime::Months month) { + return DisplayApp::MonthsString[static_cast<uint8_t>(month)]; +} + +const char *DisplayApp::DayOfWeekToString(Pinetime::Controllers::DateTime::Days dayOfWeek) { + return DisplayApp::DaysString[static_cast<uint8_t>(dayOfWeek)]; +} + + void DisplayApp::IdleState() { } @@ -200,10 +239,8 @@ void DisplayApp::IdleState() { void DisplayApp::PushMessage(DisplayApp::Messages msg) { BaseType_t xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; - xQueueSendFromISR( msgQueue, &msg, &xHigherPriorityTaskWoken ); - - /* Now the buffer is empty we can switch context if necessary. */ - if(xHigherPriorityTaskWoken) { + xQueueSendFromISR(msgQueue, &msg, &xHigherPriorityTaskWoken); + if (xHigherPriorityTaskWoken) { /* Actual macro used here is port specific. */ // TODO : should I do something here? } diff --git a/src/DisplayApp/DisplayApp.h b/src/DisplayApp/DisplayApp.h index 3bc9f468..24b8e45d 100644 --- a/src/DisplayApp/DisplayApp.h +++ b/src/DisplayApp/DisplayApp.h @@ -8,6 +8,7 @@ #include <queue.h> #include <Components/Battery/BatteryController.h> #include <Components/Ble/BleController.h> +#include <Components/DateTime/DateTimeController.h> #include "lcdfont14.h" extern const FONT_INFO lCD_70ptFontInfo; @@ -17,15 +18,11 @@ namespace Pinetime { class DisplayApp { public: enum class States {Idle, Running}; - enum class Messages : uint8_t {GoToSleep, GoToRunning} ; - DisplayApp(Pinetime::Controllers::Battery& batteryController, Pinetime::Controllers::Ble& bleController); + enum class Messages : uint8_t {GoToSleep, GoToRunning, UpdateDateTime, UpdateBleConnection, UpdateBatteryLevel} ; + DisplayApp(Controllers::Battery &batteryController, + Controllers::Ble &bleController, + Controllers::DateTime& dateTimeController); void Start(); - - void Minutes(uint8_t m); - void Hours(uint8_t h); - - void SetTime(uint8_t minutes, uint8_t hours); - void PushMessage(Messages msg); private: @@ -39,6 +36,8 @@ namespace Pinetime { const FONT_INFO smallFont {lCD_14ptFontInfo.height, lCD_14ptFontInfo.startChar, lCD_14ptFontInfo.endChar, lCD_14ptFontInfo.spacePixels, lCD_14ptFontInfo.charInfo, lCD_14ptFontInfo.data}; void Refresh(); + static const char* MonthToString(Pinetime::Controllers::DateTime::Months month); + static const char* DayOfWeekToString(Pinetime::Controllers::DateTime::Days dayOfWeek); uint8_t seconds = 0; uint8_t minutes = 0; uint8_t hours = 0; @@ -55,8 +54,15 @@ namespace Pinetime { Pinetime::Controllers::Battery &batteryController; Pinetime::Controllers::Ble &bleController; - uint16_t battery = 0; - bool bleConnected = false; + Pinetime::Controllers::DateTime& dateTimeController; + bool bleConnectionUpdated = false; + bool batteryLevelUpdated = false; + + static char const *DaysString[]; + + static char const *MonthsString[]; + + bool dateUpdated = false; }; } |