feat: always on display

This commit is contained in:
KaffeinatedKat 2023-09-29 21:00:07 -06:00 committed by JF
parent f8f8993fac
commit 20ac7e8df3
5 changed files with 43 additions and 9 deletions

View file

@ -214,6 +214,17 @@ namespace Pinetime {
return settings.screenTimeOut; return settings.screenTimeOut;
}; };
void SetAlwaysOnDisplay(bool state) {
if (state != settings.alwaysOnDisplay) {
settingsChanged = true;
}
settings.alwaysOnDisplay = state;
};
bool GetAlwaysOnDisplay() const {
return settings.alwaysOnDisplay;
};
void SetShakeThreshold(uint16_t thresh) { void SetShakeThreshold(uint16_t thresh) {
if (settings.shakeWakeThreshold != thresh) { if (settings.shakeWakeThreshold != thresh) {
settings.shakeWakeThreshold = thresh; settings.shakeWakeThreshold = thresh;
@ -286,13 +297,15 @@ namespace Pinetime {
private: private:
Pinetime::Controllers::FS& fs; Pinetime::Controllers::FS& fs;
static constexpr uint32_t settingsVersion = 0x0007; static constexpr uint32_t settingsVersion = 0x0008;
struct SettingsData { struct SettingsData {
uint32_t version = settingsVersion; uint32_t version = settingsVersion;
uint32_t stepsGoal = 10000; uint32_t stepsGoal = 10000;
uint32_t screenTimeOut = 15000; uint32_t screenTimeOut = 15000;
bool alwaysOnDisplay = false;
ClockType clockType = ClockType::H24; ClockType clockType = ClockType::H24;
WeatherFormat weatherFormat = WeatherFormat::Metric; WeatherFormat weatherFormat = WeatherFormat::Metric;
Notification notificationStatus = Notification::On; Notification notificationStatus = Notification::On;

View file

@ -203,7 +203,11 @@ void DisplayApp::Refresh() {
TickType_t queueTimeout; TickType_t queueTimeout;
switch (state) { switch (state) {
case States::Idle: case States::Idle:
queueTimeout = portMAX_DELAY; if (settingsController.GetAlwaysOnDisplay()) {
queueTimeout = lv_task_handler();
} else {
queueTimeout = portMAX_DELAY;
}
break; break;
case States::Running: case States::Running:
if (!currentScreen->IsRunning()) { if (!currentScreen->IsRunning()) {

View file

@ -15,7 +15,7 @@ namespace {
} }
} }
constexpr std::array<uint16_t, 6> SettingDisplay::options; constexpr std::array<uint16_t, 7> SettingDisplay::options;
SettingDisplay::SettingDisplay(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) SettingDisplay::SettingDisplay(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
: app {app}, settingsController {settingsController} { : app {app}, settingsController {settingsController} {
@ -46,7 +46,11 @@ SettingDisplay::SettingDisplay(Pinetime::Applications::DisplayApp* app, Pinetime
char buffer[4]; char buffer[4];
for (unsigned int i = 0; i < options.size(); i++) { for (unsigned int i = 0; i < options.size(); i++) {
cbOption[i] = lv_checkbox_create(container1, nullptr); cbOption[i] = lv_checkbox_create(container1, nullptr);
snprintf(buffer, sizeof(buffer), "%2" PRIu16 "s", options[i] / 1000); if (options[i] == 0) {
sprintf(buffer, "%s", "Always On");
} else {
sprintf(buffer, "%2ds", options[i] / 1000);
}
lv_checkbox_set_text(cbOption[i], buffer); lv_checkbox_set_text(cbOption[i], buffer);
cbOption[i]->user_data = this; cbOption[i]->user_data = this;
lv_obj_set_event_cb(cbOption[i], event_handler); lv_obj_set_event_cb(cbOption[i], event_handler);
@ -64,6 +68,12 @@ SettingDisplay::~SettingDisplay() {
} }
void SettingDisplay::UpdateSelected(lv_obj_t* object, lv_event_t event) { void SettingDisplay::UpdateSelected(lv_obj_t* object, lv_event_t event) {
if (settingsController.GetScreenTimeOut() == 0) {
settingsController.SetAlwaysOnDisplay(true);
} else {
settingsController.SetAlwaysOnDisplay(false);
}
if (event == LV_EVENT_CLICKED) { if (event == LV_EVENT_CLICKED) {
for (unsigned int i = 0; i < options.size(); i++) { for (unsigned int i = 0; i < options.size(); i++) {
if (object == cbOption[i]) { if (object == cbOption[i]) {

View file

@ -21,7 +21,7 @@ namespace Pinetime {
private: private:
DisplayApp* app; DisplayApp* app;
static constexpr std::array<uint16_t, 6> options = {5000, 7000, 10000, 15000, 20000, 30000}; static constexpr std::array<uint16_t, 7> options = {5000, 7000, 10000, 15000, 20000, 30000, 0};
Controllers::Settings& settingsController; Controllers::Settings& settingsController;
lv_obj_t* cbOption[options.size()]; lv_obj_t* cbOption[options.size()];

View file

@ -198,7 +198,10 @@ void SystemTask::Work() {
doNotGoToSleep = true; doNotGoToSleep = true;
break; break;
case Messages::GoToRunning: case Messages::GoToRunning:
spi.Wakeup(); // SPI doesn't go to sleep for always on mode
if (!settingsController.GetAlwaysOnDisplay()) {
spi.Wakeup();
}
// Double Tap needs the touch screen to be in normal mode // Double Tap needs the touch screen to be in normal mode
if (!settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) { if (!settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
@ -231,7 +234,7 @@ void SystemTask::Work() {
break; break;
} }
case Messages::GoToSleep: case Messages::GoToSleep:
if (doNotGoToSleep) { if (doNotGoToSleep or settingsController.GetAlwaysOnDisplay()) {
break; break;
} }
state = SystemTaskState::GoingToSleep; // Already set in PushMessage() state = SystemTaskState::GoingToSleep; // Already set in PushMessage()
@ -323,7 +326,11 @@ void SystemTask::Work() {
// if it's in sleep mode. Avoid bricked device by disabling sleep mode on these versions. // if it's in sleep mode. Avoid bricked device by disabling sleep mode on these versions.
spiNorFlash.Sleep(); spiNorFlash.Sleep();
} }
spi.Sleep();
// Must keep SPI awake when still updating the display for always on
if (!settingsController.GetAlwaysOnDisplay()) {
spi.Sleep();
}
// Double Tap needs the touch screen to be in normal mode // Double Tap needs the touch screen to be in normal mode
if (!settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) { if (!settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
@ -503,7 +510,7 @@ void SystemTask::OnTouchEvent() {
} }
void SystemTask::PushMessage(System::Messages msg) { void SystemTask::PushMessage(System::Messages msg) {
if (msg == Messages::GoToSleep && !doNotGoToSleep) { if (msg == Messages::GoToSleep && !doNotGoToSleep && !settingsController.GetAlwaysOnDisplay()) {
state = SystemTaskState::GoingToSleep; state = SystemTaskState::GoingToSleep;
} }