summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRiku Isokoski <riksu9000@gmail.com>2021-07-24 21:29:10 +0300
committerGitHub <noreply@github.com>2021-07-24 20:29:10 +0200
commit34949a47c59e7a4d8f67a0188bba6d08a046340d (patch)
tree0a73f39c35ecc8eb46908ef6bdd4272183ac7387 /src
parentce26ef8a67f75e551975942c3217a4fd6846f591 (diff)
Dim screen before sleep (#464)
* Implement dimming
Diffstat (limited to 'src')
-rw-r--r--src/displayapp/DisplayApp.cpp13
-rw-r--r--src/displayapp/Messages.h6
-rw-r--r--src/systemtask/SystemTask.cpp45
-rw-r--r--src/systemtask/SystemTask.h7
4 files changed, 54 insertions, 17 deletions
diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp
index b0948393..b5ad26f0 100644
--- a/src/displayapp/DisplayApp.cpp
+++ b/src/displayapp/DisplayApp.cpp
@@ -165,8 +165,15 @@ void DisplayApp::Refresh() {
lastWakeTime = xTaskGetTickCount();
if (messageReceived) {
switch (msg) {
- case Messages::GoToSleep:
+ case Messages::DimScreen:
+ // Backup brightness is the brightness to return to after dimming or sleeping
brightnessController.Backup();
+ brightnessController.Set(Controllers::BrightnessController::Levels::Low);
+ break;
+ case Messages::RestoreBrightness:
+ brightnessController.Restore();
+ break;
+ case Messages::GoToSleep:
while (brightnessController.Level() != Controllers::BrightnessController::Levels::Off) {
brightnessController.Lower();
vTaskDelay(100);
@@ -230,6 +237,8 @@ void DisplayApp::Refresh() {
}
} else if (returnTouchEvent == gesture) {
LoadApp(returnToApp, returnDirection);
+ brightnessController.Set(settingsController.GetBrightness());
+ brightnessController.Backup();
} else if (touchMode == TouchModes::Gestures) {
if (gesture == TouchEvents::Tap) {
lvgl.SetNewTapEvent(info.x, info.y);
@@ -243,6 +252,8 @@ void DisplayApp::Refresh() {
} else {
if (!currentScreen->OnButtonPushed()) {
LoadApp(returnToApp, returnDirection);
+ brightnessController.Set(settingsController.GetBrightness());
+ brightnessController.Backup();
}
}
break;
diff --git a/src/displayapp/Messages.h b/src/displayapp/Messages.h
index ce65f846..322505e6 100644
--- a/src/displayapp/Messages.h
+++ b/src/displayapp/Messages.h
@@ -13,8 +13,10 @@ namespace Pinetime {
NewNotification,
TimerDone,
BleFirmwareUpdateStarted,
- UpdateTimeOut
+ UpdateTimeOut,
+ DimScreen,
+ RestoreBrightness
};
}
}
-} \ No newline at end of file
+}
diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp
index 7efd1d6b..8915ce74 100644
--- a/src/systemtask/SystemTask.cpp
+++ b/src/systemtask/SystemTask.cpp
@@ -33,6 +33,13 @@ namespace {
}
}
+void DimTimerCallback(TimerHandle_t xTimer) {
+
+ NRF_LOG_INFO("DimTimerCallback");
+ auto sysTask = static_cast<SystemTask*>(pvTimerGetTimerID(xTimer));
+ sysTask->OnDim();
+}
+
void IdleTimerCallback(TimerHandle_t xTimer) {
NRF_LOG_INFO("IdleTimerCallback");
@@ -105,7 +112,7 @@ void SystemTask::Work() {
APP_GPIOTE_INIT(2);
app_timer_init();
-
+
spi.Init();
spiNorFlash.Init();
spiNorFlash.Wakeup();
@@ -114,7 +121,6 @@ void SystemTask::Work() {
nimbleController.Init();
nimbleController.StartAdvertising();
- brightnessController.Init();
lcd.Init();
twiMaster.Init();
@@ -179,8 +185,9 @@ void SystemTask::Work() {
nrf_gpio_cfg_sense_input(pinPowerPresentIrq, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_HIGH);
}
- idleTimer = xTimerCreate("idleTimer", pdMS_TO_TICKS(settingsController.GetScreenTimeOut()), pdFALSE, this, IdleTimerCallback);
- xTimerStart(idleTimer, 0);
+ idleTimer = xTimerCreate("idleTimer", pdMS_TO_TICKS(2000), pdFALSE, this, IdleTimerCallback);
+ dimTimer = xTimerCreate("dimTimer", pdMS_TO_TICKS(settingsController.GetScreenTimeOut() - 2000), pdFALSE, this, DimTimerCallback);
+ xTimerStart(dimTimer, 0);
// Suppress endless loop diagnostic
#pragma clang diagnostic push
@@ -208,7 +215,7 @@ void SystemTask::Work() {
doNotGoToSleep = true;
break;
case Messages::UpdateTimeOut:
- xTimerChangePeriod(idleTimer, pdMS_TO_TICKS(settingsController.GetScreenTimeOut()), 0);
+ xTimerChangePeriod(dimTimer, pdMS_TO_TICKS(settingsController.GetScreenTimeOut() - 2000), 0);
break;
case Messages::GoToRunning:
spi.Wakeup();
@@ -220,7 +227,7 @@ void SystemTask::Work() {
}
nimbleController.StartAdvertising();
- xTimerStart(idleTimer, 0);
+ xTimerStart(dimTimer, 0);
spiNorFlash.Wakeup();
lcd.Wakeup();
@@ -230,6 +237,7 @@ void SystemTask::Work() {
isSleeping = false;
isWakingUp = false;
+ isDimmed = false;
break;
case Messages::TouchWakeUp: {
twiMaster.Wakeup();
@@ -246,6 +254,7 @@ void SystemTask::Work() {
isGoingToSleep = true;
NRF_LOG_INFO("[systemtask] Going to sleep");
xTimerStop(idleTimer, 0);
+ xTimerStop(dimTimer, 0);
displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToSleep);
heartRateApp.PushMessage(Pinetime::Applications::HeartRateTask::Messages::GoToSleep);
break;
@@ -283,13 +292,15 @@ void SystemTask::Work() {
NVIC_SystemReset();
}
doNotGoToSleep = false;
- xTimerStart(idleTimer, 0);
+ xTimerStart(dimTimer, 0);
break;
case Messages::OnTouchEvent:
ReloadIdleTimer();
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::TouchEvent);
break;
case Messages::OnButtonEvent:
ReloadIdleTimer();
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::ButtonPushed);
break;
case Messages::OnDisplayTaskSleeping:
if (BootloaderVersion::IsValid()) {
@@ -381,7 +392,6 @@ void SystemTask::OnButtonPushed() {
if (!isSleeping) {
NRF_LOG_INFO("[systemtask] Button pushed");
PushMessage(Messages::OnButtonEvent);
- displayApp.PushMessage(Pinetime::Applications::Display::Messages::ButtonPushed);
} else {
if (!isWakingUp) {
NRF_LOG_INFO("[systemtask] Button pushed, waking up");
@@ -402,7 +412,6 @@ void SystemTask::OnTouchEvent() {
return;
if (!isSleeping) {
PushMessage(Messages::OnTouchEvent);
- displayApp.PushMessage(Pinetime::Applications::Display::Messages::TouchEvent);
} else if (!isWakingUp) {
if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap) or
settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
@@ -430,6 +439,15 @@ void SystemTask::PushMessage(System::Messages msg) {
}
}
+void SystemTask::OnDim() {
+ if (doNotGoToSleep)
+ return;
+ NRF_LOG_INFO("Dim timeout -> Dim screen")
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::DimScreen);
+ xTimerStart(idleTimer, 0);
+ isDimmed = true;
+}
+
void SystemTask::OnIdle() {
if (doNotGoToSleep)
return;
@@ -437,8 +455,13 @@ void SystemTask::OnIdle() {
PushMessage(Messages::GoToSleep);
}
-void SystemTask::ReloadIdleTimer() const {
+void SystemTask::ReloadIdleTimer() {
if (isSleeping || isGoingToSleep)
return;
- xTimerReset(idleTimer, 0);
+ if (isDimmed) {
+ displayApp.PushMessage(Pinetime::Applications::Display::Messages::RestoreBrightness);
+ isDimmed = false;
+ }
+ xTimerReset(dimTimer, 0);
+ xTimerStop(idleTimer, 0);
}
diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h
index f8cf6370..ba434298 100644
--- a/src/systemtask/SystemTask.h
+++ b/src/systemtask/SystemTask.h
@@ -71,6 +71,7 @@ namespace Pinetime {
void OnTouchEvent();
void OnIdle();
+ void OnDim();
Pinetime::Controllers::NimbleController& nimble() {
return nimbleController;
@@ -99,6 +100,7 @@ namespace Pinetime {
std::atomic<bool> isSleeping {false};
std::atomic<bool> isGoingToSleep {false};
std::atomic<bool> isWakingUp {false};
+ std::atomic<bool> isDimmed {false};
Pinetime::Drivers::Watchdog& watchdog;
Pinetime::Controllers::NotificationManager& notificationManager;
Pinetime::Controllers::MotorController& motorController;
@@ -106,8 +108,6 @@ namespace Pinetime {
Pinetime::Drivers::Bma421& motionSensor;
Pinetime::Controllers::Settings& settingsController;
Pinetime::Controllers::HeartRateController& heartRateController;
-
- Controllers::BrightnessController brightnessController;
Pinetime::Controllers::MotionController& motionController;
Pinetime::Applications::DisplayApp& displayApp;
@@ -126,9 +126,10 @@ namespace Pinetime {
static void Process(void* instance);
void Work();
- void ReloadIdleTimer() const;
+ void ReloadIdleTimer();
bool isBleDiscoveryTimerRunning = false;
uint8_t bleDiscoveryTimer = 0;
+ TimerHandle_t dimTimer;
TimerHandle_t idleTimer;
bool doNotGoToSleep = false;