From e7723598a65c6c041e3b4dff4d0bb144d1c697a0 Mon Sep 17 00:00:00 2001 From: JF Date: Mon, 1 Jun 2020 20:40:11 +0200 Subject: [PATCH] Automatically go to sleep after 5 sec of inactivity. Advertise for 3 minutes at startup and on wake-up. Disable automatic continuous StartAdvertising. --- src/Components/Ble/NimbleController.cpp | 7 ++-- src/SystemTask/SystemTask.cpp | 53 +++++++++++++++++++++---- src/SystemTask/SystemTask.h | 9 ++++- 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/Components/Ble/NimbleController.cpp b/src/Components/Ble/NimbleController.cpp index 7a7753b1..4c8035b7 100644 --- a/src/Components/Ble/NimbleController.cpp +++ b/src/Components/Ble/NimbleController.cpp @@ -33,8 +33,8 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask, spiNorFlash{spiNorFlash}, dfuService{systemTask, bleController, spiNorFlash}, currentTimeClient{dateTimeController}, - alertNotificationClient{systemTask, notificationManager}, anService{systemTask, notificationManager}, + alertNotificationClient{systemTask, notificationManager}, currentTimeService{dateTimeController} { } @@ -97,6 +97,8 @@ void NimbleController::Init() { } void NimbleController::StartAdvertising() { + if(ble_gap_adv_active()) return; + ble_svc_gap_device_name_set("Pinetime-JF"); /* set adv parameters */ @@ -136,7 +138,7 @@ void NimbleController::StartAdvertising() { res = ble_gap_adv_rsp_set_fields(&rsp_fields); // ASSERT(res == 0); - res = ble_gap_adv_start(addrType, NULL, 10000, + res = ble_gap_adv_start(addrType, NULL, 180000, &adv_params, GAPEventCallback, this); // ASSERT(res == 0);// TODO I've disabled these ASSERT as they sometime asserts and reset the mcu. // For now, the advertising is restarted as soon as it ends. There may be a race condition @@ -160,7 +162,6 @@ int NimbleController::OnGAPEvent(ble_gap_event *event) { case BLE_GAP_EVENT_ADV_COMPLETE: NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_ADV_COMPLETE"); NRF_LOG_INFO("advertise complete; reason=%dn status=%d", event->adv_complete.reason, event->connect.status); - StartAdvertising(); break; case BLE_GAP_EVENT_CONNECT: { NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_CONNECT"); diff --git a/src/SystemTask/SystemTask.cpp b/src/SystemTask/SystemTask.cpp index eb36c7b8..b0f58d17 100644 --- a/src/SystemTask/SystemTask.cpp +++ b/src/SystemTask/SystemTask.cpp @@ -15,6 +15,12 @@ using namespace Pinetime::System; +void IdleTimerCallback(TimerHandle_t xTimer) { + auto sysTask = static_cast(pvTimerGetTimerID(xTimer)); + sysTask->OnIdle(); +} + + SystemTask::SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, Pinetime::Drivers::SpiNorFlash& spiNorFlash, Drivers::Cst816S &touchPanel, Components::LittleVgl &lvgl, @@ -92,35 +98,55 @@ void SystemTask::Work() { nrfx_gpiote_in_init(pinTouchIrq, &pinConfig, nrfx_gpiote_evt_handler); + idleTimer = xTimerCreate ("idleTimer", idleTime, pdFALSE, this, IdleTimerCallback); + xTimerStart(idleTimer, 0); while(true) { uint8_t msg; if (xQueueReceive(systemTaksMsgQueue, &msg, isSleeping?2500 : 1000)) { Messages message = static_cast(msg); switch(message) { - case Messages::GoToRunning: isSleeping = false; break; + case Messages::GoToRunning: + isSleeping = false; + xTimerStart(idleTimer, 0); + nimbleController.StartAdvertising(); + break; case Messages::GoToSleep: NRF_LOG_INFO("[SystemTask] Going to sleep"); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::GoToSleep); - isSleeping = true; break; + isSleeping = true; + break; case Messages::OnNewTime: + xTimerReset(idleTimer, 0); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateDateTime); break; case Messages::OnNewNotification: + xTimerReset(idleTimer, 0); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::NewNotification); break; case Messages::BleConnected: + xTimerReset(idleTimer, 0); isBleDiscoveryTimerRunning = true; bleDiscoveryTimer = 5; break; case Messages::BleFirmwareUpdateStarted: + doNotGoToSleep = true; + if(isSleeping) GoToRunning(); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::BleFirmwareUpdateStarted); break; case Messages::BleFirmwareUpdateFinished: + doNotGoToSleep = false; + xTimerStart(idleTimer, 0); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::BleFirmwareUpdateFinished); if(bleController.State() == Pinetime::Controllers::Ble::FirmwareUpdateStates::Validated) NVIC_SystemReset(); break; + case Messages::OnTouchEvent: + xTimerReset(idleTimer, 0); + break; + case Messages::OnButtonEvent: + xTimerReset(idleTimer, 0); + break; default: break; } } @@ -146,22 +172,29 @@ void SystemTask::Work() { } void SystemTask::OnButtonPushed() { - if(!isSleeping) { NRF_LOG_INFO("[SystemTask] Button pushed"); + PushMessage(Messages::OnButtonEvent); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::ButtonPushed); } else { NRF_LOG_INFO("[SystemTask] Button pushed, waking up"); - displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::GoToRunning); - isSleeping = false; - displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateBatteryLevel); + GoToRunning(); } } +void SystemTask::GoToRunning() { + PushMessage(Messages::GoToRunning); + displayApp->PushMessage(Applications::DisplayApp::Messages::GoToRunning); + displayApp->PushMessage(Applications::DisplayApp::Messages::UpdateBatteryLevel); +} + void SystemTask::OnTouchEvent() { NRF_LOG_INFO("[SystemTask] Touch event"); - displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::TouchEvent); + if(!isSleeping) { + PushMessage(Messages::OnTouchEvent); + displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::TouchEvent); + } } void SystemTask::PushMessage(SystemTask::Messages msg) { @@ -173,3 +206,9 @@ void SystemTask::PushMessage(SystemTask::Messages msg) { // TODO : should I do something here? } } + +void SystemTask::OnIdle() { + if(doNotGoToSleep) return; + NRF_LOG_INFO("Idle timeout -> Going to sleep") + PushMessage(Messages::GoToSleep); +} diff --git a/src/SystemTask/SystemTask.h b/src/SystemTask/SystemTask.h index 53e69fa7..b6ecf7c9 100644 --- a/src/SystemTask/SystemTask.h +++ b/src/SystemTask/SystemTask.h @@ -16,7 +16,7 @@ namespace Pinetime { class SystemTask { public: enum class Messages {GoToSleep, GoToRunning, OnNewTime, OnNewNotification, BleConnected, - BleFirmwareUpdateStarted, BleFirmwareUpdateFinished + BleFirmwareUpdateStarted, BleFirmwareUpdateFinished, OnTouchEvent, OnButtonEvent }; SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, @@ -32,6 +32,9 @@ namespace Pinetime { void OnButtonPushed(); void OnTouchEvent(); + + void OnIdle(); + private: TaskHandle_t taskHandle; @@ -64,7 +67,11 @@ namespace Pinetime { void Work(); bool isBleDiscoveryTimerRunning = false; uint8_t bleDiscoveryTimer = 0; + static constexpr uint32_t idleTime = 5000; + TimerHandle_t idleTimer; + bool doNotGoToSleep = false; + void GoToRunning(); }; } } \ No newline at end of file