From b744b96622e684a2aa29c358e124f288ba3cf9cc Mon Sep 17 00:00:00 2001 From: JF Date: Sat, 28 Dec 2019 14:34:50 +0100 Subject: Add DateTimeController to manage the time. Use messages in message queues to refresh the UI --- src/DisplayApp/DisplayApp.cpp | 145 ++++++++++++++++++++++++++---------------- 1 file changed, 91 insertions(+), 54 deletions(-) (limited to 'src/DisplayApp/DisplayApp.cpp') 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 #include "Components/Gfx/Gfx.h" #include +#include 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(instance); + auto *app = static_cast(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(month)]; +} + +const char *DisplayApp::DayOfWeekToString(Pinetime::Controllers::DateTime::Days dayOfWeek) { + return DisplayApp::DaysString[static_cast(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? } -- cgit v1.2.3