Skip to content

Commit 20ac7e8

Browse files
KaffeinatedKatJF002
authored andcommitted
feat: always on display
1 parent f8f8993 commit 20ac7e8

5 files changed

Lines changed: 43 additions & 9 deletions

File tree

src/components/settings/Settings.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,17 @@ namespace Pinetime {
214214
return settings.screenTimeOut;
215215
};
216216

217+
void SetAlwaysOnDisplay(bool state) {
218+
if (state != settings.alwaysOnDisplay) {
219+
settingsChanged = true;
220+
}
221+
settings.alwaysOnDisplay = state;
222+
};
223+
224+
bool GetAlwaysOnDisplay() const {
225+
return settings.alwaysOnDisplay;
226+
};
227+
217228
void SetShakeThreshold(uint16_t thresh) {
218229
if (settings.shakeWakeThreshold != thresh) {
219230
settings.shakeWakeThreshold = thresh;
@@ -286,13 +297,15 @@ namespace Pinetime {
286297
private:
287298
Pinetime::Controllers::FS& fs;
288299

289-
static constexpr uint32_t settingsVersion = 0x0007;
300+
static constexpr uint32_t settingsVersion = 0x0008;
290301

291302
struct SettingsData {
292303
uint32_t version = settingsVersion;
293304
uint32_t stepsGoal = 10000;
294305
uint32_t screenTimeOut = 15000;
295306

307+
bool alwaysOnDisplay = false;
308+
296309
ClockType clockType = ClockType::H24;
297310
WeatherFormat weatherFormat = WeatherFormat::Metric;
298311
Notification notificationStatus = Notification::On;

src/displayapp/DisplayApp.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,11 @@ void DisplayApp::Refresh() {
203203
TickType_t queueTimeout;
204204
switch (state) {
205205
case States::Idle:
206-
queueTimeout = portMAX_DELAY;
206+
if (settingsController.GetAlwaysOnDisplay()) {
207+
queueTimeout = lv_task_handler();
208+
} else {
209+
queueTimeout = portMAX_DELAY;
210+
}
207211
break;
208212
case States::Running:
209213
if (!currentScreen->IsRunning()) {

src/displayapp/screens/settings/SettingDisplay.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace {
1515
}
1616
}
1717

18-
constexpr std::array<uint16_t, 6> SettingDisplay::options;
18+
constexpr std::array<uint16_t, 7> SettingDisplay::options;
1919

2020
SettingDisplay::SettingDisplay(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
2121
: app {app}, settingsController {settingsController} {
@@ -46,7 +46,11 @@ SettingDisplay::SettingDisplay(Pinetime::Applications::DisplayApp* app, Pinetime
4646
char buffer[4];
4747
for (unsigned int i = 0; i < options.size(); i++) {
4848
cbOption[i] = lv_checkbox_create(container1, nullptr);
49-
snprintf(buffer, sizeof(buffer), "%2" PRIu16 "s", options[i] / 1000);
49+
if (options[i] == 0) {
50+
sprintf(buffer, "%s", "Always On");
51+
} else {
52+
sprintf(buffer, "%2ds", options[i] / 1000);
53+
}
5054
lv_checkbox_set_text(cbOption[i], buffer);
5155
cbOption[i]->user_data = this;
5256
lv_obj_set_event_cb(cbOption[i], event_handler);
@@ -64,6 +68,12 @@ SettingDisplay::~SettingDisplay() {
6468
}
6569

6670
void SettingDisplay::UpdateSelected(lv_obj_t* object, lv_event_t event) {
71+
if (settingsController.GetScreenTimeOut() == 0) {
72+
settingsController.SetAlwaysOnDisplay(true);
73+
} else {
74+
settingsController.SetAlwaysOnDisplay(false);
75+
}
76+
6777
if (event == LV_EVENT_CLICKED) {
6878
for (unsigned int i = 0; i < options.size(); i++) {
6979
if (object == cbOption[i]) {

src/displayapp/screens/settings/SettingDisplay.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace Pinetime {
2121

2222
private:
2323
DisplayApp* app;
24-
static constexpr std::array<uint16_t, 6> options = {5000, 7000, 10000, 15000, 20000, 30000};
24+
static constexpr std::array<uint16_t, 7> options = {5000, 7000, 10000, 15000, 20000, 30000, 0};
2525

2626
Controllers::Settings& settingsController;
2727
lv_obj_t* cbOption[options.size()];

src/systemtask/SystemTask.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,10 @@ void SystemTask::Work() {
198198
doNotGoToSleep = true;
199199
break;
200200
case Messages::GoToRunning:
201-
spi.Wakeup();
201+
// SPI doesn't go to sleep for always on mode
202+
if (!settingsController.GetAlwaysOnDisplay()) {
203+
spi.Wakeup();
204+
}
202205

203206
// Double Tap needs the touch screen to be in normal mode
204207
if (!settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
@@ -231,7 +234,7 @@ void SystemTask::Work() {
231234
break;
232235
}
233236
case Messages::GoToSleep:
234-
if (doNotGoToSleep) {
237+
if (doNotGoToSleep or settingsController.GetAlwaysOnDisplay()) {
235238
break;
236239
}
237240
state = SystemTaskState::GoingToSleep; // Already set in PushMessage()
@@ -323,7 +326,11 @@ void SystemTask::Work() {
323326
// if it's in sleep mode. Avoid bricked device by disabling sleep mode on these versions.
324327
spiNorFlash.Sleep();
325328
}
326-
spi.Sleep();
329+
330+
// Must keep SPI awake when still updating the display for always on
331+
if (!settingsController.GetAlwaysOnDisplay()) {
332+
spi.Sleep();
333+
}
327334

328335
// Double Tap needs the touch screen to be in normal mode
329336
if (!settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) {
@@ -503,7 +510,7 @@ void SystemTask::OnTouchEvent() {
503510
}
504511

505512
void SystemTask::PushMessage(System::Messages msg) {
506-
if (msg == Messages::GoToSleep && !doNotGoToSleep) {
513+
if (msg == Messages::GoToSleep && !doNotGoToSleep && !settingsController.GetAlwaysOnDisplay()) {
507514
state = SystemTaskState::GoingToSleep;
508515
}
509516

0 commit comments

Comments
 (0)