From e85d1ffc625c73dcbb30c783707bfb6110af6a41 Mon Sep 17 00:00:00 2001 From: Avamander Date: Sun, 4 Oct 2020 15:09:17 +0300 Subject: Replaced NULL with nullptr --- src/systemtask/SystemMonitor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/systemtask') diff --git a/src/systemtask/SystemMonitor.h b/src/systemtask/SystemMonitor.h index ec1fd817..029a1364 100644 --- a/src/systemtask/SystemMonitor.h +++ b/src/systemtask/SystemMonitor.h @@ -27,7 +27,7 @@ namespace Pinetime { void Process() const { if(xTaskGetTickCount() - lastTick > 10000) { NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize()); - auto nb = uxTaskGetSystemState(tasksStatus, 10, NULL); + auto nb = uxTaskGetSystemState(tasksStatus, 10, nullptr); for (uint32_t i = 0; i < nb; i++) { NRF_LOG_INFO("Task [%s] - %d", tasksStatus[i].pcTaskName, tasksStatus[i].usStackHighWaterMark); if (tasksStatus[i].usStackHighWaterMark < 20) -- cgit v1.2.3 From 1d96758acd4e3bf03c3e733a3a95d0deb74f6042 Mon Sep 17 00:00:00 2001 From: Avamander Date: Sun, 4 Oct 2020 15:11:21 +0300 Subject: Minor #include improvements --- src/displayapp/screens/Tab.cpp | 4 ++-- src/systemtask/SystemTask.cpp | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) (limited to 'src/systemtask') diff --git a/src/displayapp/screens/Tab.cpp b/src/displayapp/screens/Tab.cpp index adc32578..44b806c0 100644 --- a/src/displayapp/screens/Tab.cpp +++ b/src/displayapp/screens/Tab.cpp @@ -1,13 +1,13 @@ #include #include -#include +#include "components/datetime/DateTimeController.h" #include #include #include #include #include #include "Tab.h" -#include +#include "displayapp/DisplayApp.h" using namespace Pinetime::Applications::Screens; diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 68f8ab53..0ed99f86 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -11,7 +11,7 @@ #include #include #include -#include "../main.h" +#include "main.h" #include "components/ble/NimbleController.h" using namespace Pinetime::System; @@ -36,7 +36,7 @@ SystemTask::SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, bleController{bleController}, dateTimeController{dateTimeController}, watchdog{}, watchdogView{watchdog}, notificationManager{notificationManager}, nimbleController(*this, bleController,dateTimeController, notificationManager, batteryController, spiNorFlash) { - systemTaksMsgQueue = xQueueCreate(10, 1); + systemTasksMsgQueue = xQueueCreate(10, 1); } void SystemTask::Start() { @@ -102,7 +102,7 @@ void SystemTask::Work() { while(true) { uint8_t msg; - if (xQueueReceive(systemTaksMsgQueue, &msg, isSleeping?2500 : 1000)) { + if (xQueueReceive(systemTasksMsgQueue, &msg, isSleeping ? 2500 : 1000)) { Messages message = static_cast(msg); switch(message) { case Messages::GoToRunning: @@ -191,6 +191,8 @@ void SystemTask::Work() { if(!nrf_gpio_pin_read(pinButton)) watchdog.Kick(); } + // Clear diagnostic suppression + #pragma clang diagnostic pop } void SystemTask::OnButtonPushed() { @@ -228,7 +230,7 @@ void SystemTask::PushMessage(SystemTask::Messages msg) { } BaseType_t xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; - xQueueSendFromISR(systemTaksMsgQueue, &msg, &xHigherPriorityTaskWoken); + xQueueSendFromISR(systemTasksMsgQueue, &msg, &xHigherPriorityTaskWoken); if (xHigherPriorityTaskWoken) { /* Actual macro used here is port specific. */ // TODO : should I do something here? -- cgit v1.2.3 From 9b7ba7b5b84072e5abbb0c77c7ea5c52cbbb1098 Mon Sep 17 00:00:00 2001 From: Avamander Date: Sun, 4 Oct 2020 15:13:01 +0300 Subject: Fixed a typo in SystemTask --- src/systemtask/SystemTask.cpp | 6 +++--- src/systemtask/SystemTask.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/systemtask') diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 68f8ab53..bb3a7728 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -36,7 +36,7 @@ SystemTask::SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, bleController{bleController}, dateTimeController{dateTimeController}, watchdog{}, watchdogView{watchdog}, notificationManager{notificationManager}, nimbleController(*this, bleController,dateTimeController, notificationManager, batteryController, spiNorFlash) { - systemTaksMsgQueue = xQueueCreate(10, 1); + systemTasksMsgQueue = xQueueCreate(10, 1); } void SystemTask::Start() { @@ -102,7 +102,7 @@ void SystemTask::Work() { while(true) { uint8_t msg; - if (xQueueReceive(systemTaksMsgQueue, &msg, isSleeping?2500 : 1000)) { + if (xQueueReceive(systemTasksMsgQueue, &msg, isSleeping?2500 : 1000)) { Messages message = static_cast(msg); switch(message) { case Messages::GoToRunning: @@ -228,7 +228,7 @@ void SystemTask::PushMessage(SystemTask::Messages msg) { } BaseType_t xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; - xQueueSendFromISR(systemTaksMsgQueue, &msg, &xHigherPriorityTaskWoken); + xQueueSendFromISR(systemTasksMsgQueue, &msg, &xHigherPriorityTaskWoken); if (xHigherPriorityTaskWoken) { /* Actual macro used here is port specific. */ // TODO : should I do something here? diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index 1be28e3f..6ef0cfbf 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -54,7 +54,7 @@ namespace Pinetime { std::unique_ptr displayApp; Pinetime::Controllers::Ble& bleController; Pinetime::Controllers::DateTime& dateTimeController; - QueueHandle_t systemTaksMsgQueue; + QueueHandle_t systemTasksMsgQueue; std::atomic isSleeping{false}; std::atomic isGoingToSleep{false}; std::atomic isWakingUp{false}; -- cgit v1.2.3 From f68c7b65b31f0bb7ff729740a29d5796b2c04f01 Mon Sep 17 00:00:00 2001 From: Avamander Date: Sun, 4 Oct 2020 15:08:48 +0300 Subject: Minor formatting, diagnostic and documentation changes --- src/CMakeLists.txt | 2 +- src/displayapp/screens/InfiniPaint.cpp | 12 ++++++------ src/displayapp/screens/Screen.h | 18 +++++++++++++++--- src/logging/NrfLogger.cpp | 5 +++++ src/systemtask/SystemTask.cpp | 5 ++++- 5 files changed, 31 insertions(+), 11 deletions(-) (limited to 'src/systemtask') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 961dedb4..cd37810f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -552,7 +552,7 @@ link_directories( ) -set(COMMON_FLAGS -MP -MD -mthumb -mabi=aapcs -Wall -g3 -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin --short-enums -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wreturn-type -Werror=return-type) +set(COMMON_FLAGS -MP -MD -mthumb -mabi=aapcs -Wall -Wno-unknown-pragmas -g3 -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin --short-enums -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wreturn-type -Werror=return-type) add_definitions(-DCONFIG_GPIO_AS_PINRESET) add_definitions(-DDEBUG) add_definitions(-DNIMBLE_CFG_CONTROLLER) diff --git a/src/displayapp/screens/InfiniPaint.cpp b/src/displayapp/screens/InfiniPaint.cpp index b340f5d8..312bb93a 100644 --- a/src/displayapp/screens/InfiniPaint.cpp +++ b/src/displayapp/screens/InfiniPaint.cpp @@ -7,9 +7,9 @@ using namespace Pinetime::Applications::Screens; extern lv_font_t jetbrains_mono_extrabold_compressed; extern lv_font_t jetbrains_mono_bold_20; -InfiniPaint::InfiniPaint(Pinetime::Applications::DisplayApp *app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl{lvgl} { +InfiniPaint::InfiniPaint(Pinetime::Applications::DisplayApp *app, Pinetime::Components::LittleVgl &lvgl) : Screen(app), lvgl{lvgl} { app->SetTouchMode(DisplayApp::TouchModes::Polling); - std::fill(b, b+bufferSize, LV_COLOR_WHITE); + std::fill(b, b + bufferSize, LV_COLOR_WHITE); } InfiniPaint::~InfiniPaint() { @@ -33,10 +33,10 @@ bool InfiniPaint::OnTouchEvent(Pinetime::Applications::TouchEvents event) { bool InfiniPaint::OnTouchEvent(uint16_t x, uint16_t y) { lv_area_t area; - area.x1 = x-(width/2); - area.y1 = y-(height/2); - area.x2 = x+(width/2)-1; - area.y2 = y+(height/2)-1; + area.x1 = x - (width / 2); + area.y1 = y - (height / 2); + area.x2 = x + (width / 2) - 1; + area.y2 = y + (height / 2) - 1; lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::None); lvgl.FlushDisplay(&area, b); return true; diff --git a/src/displayapp/screens/Screen.h b/src/displayapp/screens/Screen.h index 0a17b4da..6b1d0eec 100644 --- a/src/displayapp/screens/Screen.h +++ b/src/displayapp/screens/Screen.h @@ -12,13 +12,25 @@ namespace Pinetime { explicit Screen(DisplayApp* app) : app{app} {} virtual ~Screen() = default; - // Return false if the app can be closed, true if it must continue to run + /** + * Most of the time, apps only react to events (touch events, for example). + * In this case you don't need to do anything in this method. + * + * For example, InfiniPaint does nothing in Refresh(). + * But, if you want to update your display periodically, draw an animation... + * you cannot do it in a touch event handler because these handlers are not + * called if the user does not touch the screen. + * + * That's why Refresh() is there: update the display periodically. + * + * @return false if the app can be closed, true if it must continue to run + **/ virtual bool Refresh() = 0; - // Return false if the button hasn't been handled by the app, true if it has been handled + /** @return false if the button hasn't been handled by the app, true if it has been handled */ virtual bool OnButtonPushed() { return false; } - // Return false if the event hasn't been handled by the app, true if it has been handled + /** @return false if the event hasn't been handled by the app, true if it has been handled */ virtual bool OnTouchEvent(TouchEvents event) { return false; } virtual bool OnTouchEvent(uint16_t x, uint16_t y) { return false; } diff --git a/src/logging/NrfLogger.cpp b/src/logging/NrfLogger.cpp index 7ccacc82..0d95c06a 100644 --- a/src/logging/NrfLogger.cpp +++ b/src/logging/NrfLogger.cpp @@ -19,10 +19,15 @@ void NrfLogger::Init() { void NrfLogger::Process(void*) { NRF_LOG_INFO("Logger task started!"); + // Suppress endless loop diagnostic + #pragma clang diagnostic push + #pragma ide diagnostic ignored "EndlessLoop" while (1) { NRF_LOG_FLUSH(); vTaskDelay(100); // Not good for power consumption, it will wake up every 100ms... } + // Clear diagnostic suppression + #pragma clang diagnostic pop } void NrfLogger::Resume() { diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index c0552d53..01942daf 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -100,6 +100,9 @@ void SystemTask::Work() { idleTimer = xTimerCreate ("idleTimer", idleTime, pdFALSE, this, IdleTimerCallback); xTimerStart(idleTimer, 0); + // Suppress endless loop diagnostic + #pragma clang diagnostic push + #pragma ide diagnostic ignored "EndlessLoop" while(true) { uint8_t msg; if (xQueueReceive(systemTasksMsgQueue, &msg, isSleeping ? 2500 : 1000)) { @@ -231,7 +234,7 @@ void SystemTask::PushMessage(SystemTask::Messages msg) { xQueueSendFromISR(systemTasksMsgQueue, &msg, &xHigherPriorityTaskWoken); if (xHigherPriorityTaskWoken) { /* Actual macro used here is port specific. */ - // TODO : should I do something here? + // TODO: should I do something here? } } -- cgit v1.2.3 From 189c5a83b2599dd843b06d2cccdc1f28a89d404f Mon Sep 17 00:00:00 2001 From: Avamander Date: Sun, 4 Oct 2020 16:24:52 +0300 Subject: Made sure to unsuppress the diagnostic check after the infinite loop declaration --- src/systemtask/SystemTask.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/systemtask') diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 01942daf..3efe21b8 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -194,6 +194,8 @@ void SystemTask::Work() { if(!nrf_gpio_pin_read(pinButton)) watchdog.Kick(); } + // Clear diagnostic suppression + #pragma clang diagnostic pop } void SystemTask::OnButtonPushed() { -- cgit v1.2.3 From 1bb2eb9dcd59fbb198be157e34b7ff25367adea0 Mon Sep 17 00:00:00 2001 From: JF Date: Tue, 27 Oct 2020 19:38:45 +0100 Subject: Disable sleep mode on the SPI NOR Flash when the version is unknown. This is because the current bootloader (which does not exposes its version) cannot initialize the chip when it's in sleep mode. This feature will be re-enabled when the bootloader expses it's version. --- src/BootloaderVersion.cpp | 26 ++++++++++++++++++++++++++ src/BootloaderVersion.h | 12 ++++++++++++ src/CMakeLists.txt | 2 ++ src/drivers/SpiNorFlash.cpp | 6 +++--- src/systemtask/SystemTask.cpp | 7 ++++++- 5 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 src/BootloaderVersion.cpp create mode 100644 src/BootloaderVersion.h (limited to 'src/systemtask') diff --git a/src/BootloaderVersion.cpp b/src/BootloaderVersion.cpp new file mode 100644 index 00000000..8555593f --- /dev/null +++ b/src/BootloaderVersion.cpp @@ -0,0 +1,26 @@ +#include +#include "BootloaderVersion.h" + +using namespace Pinetime; + +// NOTE : current bootloader does not export its version to the application firmware. + +uint32_t BootloaderVersion::Major() { + return 0; +} + +uint32_t BootloaderVersion::Minor() { + return 0; +} + +uint32_t BootloaderVersion::Patch() { + return 0; +} + +const char *BootloaderVersion::VersionString() { + return "0.0.0"; +} + +bool BootloaderVersion::IsValid() { + return false; +} diff --git a/src/BootloaderVersion.h b/src/BootloaderVersion.h new file mode 100644 index 00000000..c7fcbd98 --- /dev/null +++ b/src/BootloaderVersion.h @@ -0,0 +1,12 @@ +#pragma once + +namespace Pinetime { + class BootloaderVersion { + public: + static uint32_t Major(); + static uint32_t Minor(); + static uint32_t Patch(); + static const char* VersionString(); + static bool IsValid(); + }; +} \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cd37810f..af0b110e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -322,6 +322,7 @@ list(APPEND IMAGE_FILES ) list(APPEND SOURCE_FILES + BootloaderVersion.cpp logging/NrfLogger.cpp displayapp/DisplayApp.cpp displayapp/screens/Screen.cpp @@ -397,6 +398,7 @@ list(APPEND GRAPHICS_SOURCE_FILES ) set(INCLUDE_FILES + BootloaderVersion.h logging/Logger.h logging/NrfLogger.h displayapp/DisplayApp.h diff --git a/src/drivers/SpiNorFlash.cpp b/src/drivers/SpiNorFlash.cpp index 351a9dfc..bd24834e 100644 --- a/src/drivers/SpiNorFlash.cpp +++ b/src/drivers/SpiNorFlash.cpp @@ -12,7 +12,7 @@ SpiNorFlash::SpiNorFlash(Spi& spi) : spi{spi} { void SpiNorFlash::Init() { device_id = ReadIdentificaion(); - NRF_LOG_INFO("[SPI FLASH] Manufacturer : %d, Memory type : %d, memory density : %d", device_id.manufacturer, device_id.type, device_id.density); + NRF_LOG_INFO("[SpiNorFlash] Manufacturer : %d, Memory type : %d, memory density : %d", device_id.manufacturer, device_id.type, device_id.density); } void SpiNorFlash::Uninit() { @@ -22,7 +22,7 @@ void SpiNorFlash::Uninit() { void SpiNorFlash::Sleep() { auto cmd = static_cast(Commands::DeepPowerDown); spi.Write(&cmd, sizeof(uint8_t)); - NRF_LOG_INFO("[FLASH] Sleep") + NRF_LOG_INFO("[SpiNorFlash] Sleep") } void SpiNorFlash::Wakeup() { @@ -38,7 +38,7 @@ void SpiNorFlash::Wakeup() { else { NRF_LOG_INFO("[SpiNorFlash] ID on Wakeup: %d", id); } - NRF_LOG_INFO("[FLASH] Wakeup") + NRF_LOG_INFO("[SpiNorFlash] Wakeup") } SpiNorFlash::Identification SpiNorFlash::ReadIdentificaion() { diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 3efe21b8..dac4ce29 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -13,6 +13,7 @@ #include #include "main.h" #include "components/ble/NimbleController.h" +#include "../BootloaderVersion.h" using namespace Pinetime::System; @@ -161,7 +162,11 @@ void SystemTask::Work() { ReloadIdleTimer(); break; case Messages::OnDisplayTaskSleeping: - spiNorFlash.Sleep(); + if(BootloaderVersion::IsValid()) { + // First versions of the bootloader do not expose their version and cannot initialize the SPI NOR FLASH + // if it's in sleep mode. Avoid bricked device by disabling sleep mode on these versions. + spiNorFlash.Sleep(); + } lcd.Sleep(); touchPanel.Sleep(); -- cgit v1.2.3