bring back functionality where displaying various info can be overwritten by adding a display controller class

This commit is contained in:
Nicu Hodos 2025-02-12 08:14:51 +01:00
parent 21cf917906
commit 985bcd1c09
3 changed files with 45 additions and 27 deletions

View File

@ -80,7 +80,7 @@ namespace Devices {
if (strcmp("PRESS", msg) == 0 && !Display::tDisplaySensor.isEnabled()) {
Bme::data.readAll();
Display::tDisplaySensor.setIterations(DISPLAY_SENSOR_ITERATIONS);
Display::tDisplaySensor.restart();
Display::displayTask.activate(Display::tDisplaySensor);
};
}
}).build()
@ -89,7 +89,7 @@ namespace Devices {
Builder<Button>::instance(new Button{"Display date", "display_date",
[](const char* msg) {
if (strcmp("PRESS", msg) == 0 && !Display::tDisplayDate.isEnabled()) {
Display::tDisplayDate.restart();
Display::displayTask.activate(Display::tDisplayDate);
};
}
}).build()
@ -98,7 +98,7 @@ namespace Devices {
Builder<Button>::instance(new Button{"Display remaining timer", "display_remaining_timer",
[](const char* msg) {
if (strcmp("PRESS", msg) == 0 && !Display::tDisplayTimer.isEnabled()) {
Display::tDisplayTimer.restart();
Display::displayTask.activate(Display::tDisplayTimer);
}
}
}).build()

View File

@ -20,6 +20,36 @@ namespace Display {
// Create display object
Adafruit_7segment clockDisplay = Adafruit_7segment();
struct {
operator Task&() {
return *perm;
}
Task& activate(Task& task) {
if (temp) temp->cancel();
if (perm) perm->cancel();
if (task.getIterations() == TASK_FOREVER) {
task.enable();
perm = &task;
} else {
task.restart();
temp = &task;
}
return task;
}
void restorePerm() {
if (temp && temp->isEnabled()) return; // don't enable perm when triggered by another temp on top of exsting temp
if (perm) perm->enable();
}
bool isPerm(Task& task) {
return perm == &task;
}
private:
Task *temp = nullptr, *perm = nullptr;
} displayTask;
void displayTime();
void displayDate();
void displayTemp();
@ -36,23 +66,16 @@ namespace Display {
});
Task tDisplaySensor(SECONDS(5), DISPLAY_SENSOR_ITERATIONS, nullptr, &ts, false,
[]() {
if (!tDisplayTime.isEnabled()) return false;
tDisplayTime.disable();
tDisplaySensor.setCallback(displayTemp);
return true;
},
[]() {
tDisplaySensor.setIterations((DISPLAY_SENSOR_ITERATIONS - 1) * 2 + 1);
tDisplayTime.enable();
displayTask.restorePerm();
});
Task tDisplayDate(SECONDS(5), TASK_ONCE + 1, displayDate, &ts, false,
Task tDisplayDate(SECONDS(5), TASK_ONCE + 1, displayDate, &ts, false, nullptr,
[]() {
if (!tDisplayTime.isEnabled()) return false;
tDisplayTime.disable();
return true;
},
[]() {
tDisplayTime.enable();
displayTask.restorePerm();
});
Task tDisplayTimer(SECONDS(10), TASK_ONCE + 1,
[]{
@ -60,15 +83,10 @@ namespace Display {
clockDisplay.print(timer, DEC);
clockDisplay.writeDisplay();
}
}, &ts, false,
[]{
if (!tDisplayTime.isEnabled()) return false;
tDisplayTime.disable();
return true;
},
}, &ts, false, nullptr,
[]{
tDisplayTimer.setIterations(TASK_ONCE + 1);
tDisplayTime.enable();
if (!displayTask.isPerm(tDisplayTimer)) displayTask.restorePerm();
});
Task tTimer(MINUTES(1), TASK_FOREVER,
[]{
@ -76,10 +94,10 @@ namespace Display {
timer.decrease();
if (timer.atBeginning()) {
if (timer <= threshold) tDisplayTimer.setIterations(TASK_FOREVER);
tDisplayTimer.restart();
displayTask.activate(tDisplayTimer);
} else if (timer == threshold) {
tDisplayTimer.setIterations(TASK_FOREVER);
tDisplayTimer.restart();
displayTask.activate(tDisplayTimer);
}
}, &ts, false,
[]{
@ -87,7 +105,7 @@ namespace Display {
return true;
},
[]{
tDisplayTimer.disable();
displayTask.activate(tDisplayTime);
});
struct HourFormat : public CallbackAware<callback_t> {
@ -98,7 +116,7 @@ namespace Display {
void operator=(bool value) {
format24 = value;
tDisplayTime.restart();
if (displayTask.isPerm(tDisplayTime)) drawTime();
if (callback) callback();
}
private:
@ -225,6 +243,6 @@ namespace Display {
void setup() {
clockDisplay.begin(DISPLAY_ADDRESS);
clockDisplay.setBrightness(brightness);
tDisplayTime.enable();
displayTask.activate(tDisplayTime);
}
}

View File

@ -31,7 +31,7 @@ Task tButton(TASK_IMMEDIATE, TASK_ONCE,
if (Display::tDisplaySensor.isEnabled()) return;
Bme::data.readAll();
Display::tDisplaySensor.setIterations(DISPLAY_SENSOR_ITERATIONS);
Display::tDisplaySensor.restart();
Display::displayTask.activate(Display::tDisplaySensor);
}, &ts);
Task tLed(TASK_IMMEDIATE, TASK_ONCE,
[]() {
@ -46,7 +46,7 @@ Task tReadBme(TASK_MINUTE, TASK_FOREVER, []() {
Devices::publishBme280();
if (abs(lastTemp - Bme::data.temp) > 0.2) {
lastTemp = Bme::data.temp;
Display::tDisplaySensor.restart();
Display::displayTask.activate(Display::tDisplaySensor);
}
}, &ts);