Merge remote-tracking branch 'origin/master'

This commit is contained in:
Patrick Haßel 2025-01-18 21:24:46 +01:00
commit 9c49004fda
4 changed files with 121 additions and 2 deletions

View File

@ -11,6 +11,7 @@
#include "display.h"
#include "mode/Power/Power.h"
#include "mode/Energy/Energy.h"
#include "mode/Timer/Timer.h"
ModeId currentModeId = NONE;
@ -119,6 +120,9 @@ void loadNewMode() {
case ENERGY:
mode = new Energy(display);
break;
case TIMER:
mode = new Timer2(display);
break;
default:
Serial.print("No mode loaded.\n");
display.clear();

View File

@ -26,12 +26,11 @@ enum ModeId {
MATRIX,
POWER,
ENERGY,
TIMER,
};
class Mode {
private:
struct Timer {
microseconds_t interval;
microseconds_t rest;

115
src/mode/Timer/Timer.h Normal file
View File

@ -0,0 +1,115 @@
#ifndef MODE_TIMER_H
#define MODE_TIMER_H
#include "mode/Mode.h"
class Timer2 final : public Mode {
const unsigned long targetMillis = millis() + 6 * 60 * 1000;
uint16_t days = 0;
uint16_t hours = 0;
uint16_t minutes = 0;
uint16_t seconds = 0;
unsigned long diffSeconds = 0;
public:
explicit Timer2(Display& display) : Mode(display) {
//
}
const char *getName() override {
return "Timer";
}
protected:
void step(microseconds_t microseconds) override {
const auto now = millis();
diffSeconds = now >= targetMillis ? 0 : (targetMillis - now) / 1000;
days = diffSeconds / (24 * 60 * 60);
hours = diffSeconds / (60 * 60) % 24;
minutes = diffSeconds / 60 % 60;
seconds = diffSeconds % 60;
markDirty();
}
void draw(Display& display) override {
display.clear();
if (diffSeconds == 0) {
drawNoTime(display);
return;
}
uint8_t x = 0;
if (days > 0) {
drawDay(display, days, &x);
x += display.print(x, 1, 10, WHITE, true);
} else {
x += 2;
}
drawHour(display, days, hours, &x);
x += display.print(x, 1, 10, WHITE, true);
draw2Digit(display, minutes, &x);
if (days <= 0) {
x += display.print(x, 1, 10, WHITE, true);
draw2Digit(display, seconds, &x);
}
}
private:
static void drawNoTime(Display& display) {
uint8_t x = 2;
x += display.print(x, 1, SYMBOL_DASH, WHITE, true);
x++;
x += display.print(x, 1, SYMBOL_DASH, WHITE, true);
x += display.print(x, 1, 10, WHITE, true);
x += display.print(x, 1, SYMBOL_DASH, WHITE, true);
x++;
x += display.print(x, 1, SYMBOL_DASH, WHITE, true);
x += display.print(x, 1, 10, WHITE, true);
x += display.print(x, 1, SYMBOL_DASH, WHITE, true);
x++;
display.print(x, 1, SYMBOL_DASH, WHITE, true);
}
static void drawDay(Display& display, int days, uint8_t *x) {
if (days >= 100) {
*x += display.print(*x, 1, days / 100, WHITE, true) + 1;
} else {
*x += DISPLAY_CHAR_WIDTH + 1;
}
if (days >= 10) {
*x += display.print(*x, 1, days / 10 % 10, WHITE, true) + 1;
} else {
*x += DISPLAY_CHAR_WIDTH + 1;
}
*x += display.print(*x, 1, days % 10, WHITE, true);
}
static void drawHour(Display& display, int days, int hours, uint8_t *x) {
if (days > 0 || hours >= 10) {
*x += display.print(*x, 1, hours / 10, WHITE, true) + 1;
} else {
*x += DISPLAY_CHAR_WIDTH + 1;
}
*x += display.print(*x, 1, hours % 10, WHITE, true);
}
static void draw2Digit(Display& display, int value, uint8_t *x) {
*x += display.print(*x, 1, value / 10, WHITE, true) + 1;
*x += display.print(*x, 1, value % 10, WHITE, true);
}
};
#endif

View File

@ -114,6 +114,7 @@ void web_index() {
server.sendContent(R"(<a onclick="get('/mode?mode=13');">MATRIX</a><br>)");
server.sendContent(R"(<a onclick="get('/mode?mode=14');">POWER</a><br>)");
server.sendContent(R"(<a onclick="get('/mode?mode=15');">ENERGY</a><br>)");
server.sendContent(R"(<a onclick="get('/mode?mode=16');">TIMER</a><br>)");
server.sendContent(R"(</p>)");
server.sendContent(R"(<p>)");