Timer
This commit is contained in:
parent
71b99cca5e
commit
374fcee02f
@ -11,6 +11,7 @@
|
|||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "mode/Power/Power.h"
|
#include "mode/Power/Power.h"
|
||||||
#include "mode/Energy/Energy.h"
|
#include "mode/Energy/Energy.h"
|
||||||
|
#include "mode/Timer/Timer.h"
|
||||||
|
|
||||||
ModeId currentModeId = NONE;
|
ModeId currentModeId = NONE;
|
||||||
|
|
||||||
@ -119,6 +120,9 @@ void loadNewMode() {
|
|||||||
case ENERGY:
|
case ENERGY:
|
||||||
mode = new Energy(display);
|
mode = new Energy(display);
|
||||||
break;
|
break;
|
||||||
|
case TIMER:
|
||||||
|
mode = new Timer2(display);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Serial.print("No mode loaded.\n");
|
Serial.print("No mode loaded.\n");
|
||||||
display.clear();
|
display.clear();
|
||||||
|
|||||||
@ -26,12 +26,11 @@ enum ModeId {
|
|||||||
MATRIX,
|
MATRIX,
|
||||||
POWER,
|
POWER,
|
||||||
ENERGY,
|
ENERGY,
|
||||||
|
TIMER,
|
||||||
};
|
};
|
||||||
|
|
||||||
class Mode {
|
class Mode {
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
struct Timer {
|
struct Timer {
|
||||||
microseconds_t interval;
|
microseconds_t interval;
|
||||||
microseconds_t rest;
|
microseconds_t rest;
|
||||||
|
|||||||
115
src/mode/Timer/Timer.h
Normal file
115
src/mode/Timer/Timer.h
Normal 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
|
||||||
@ -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=13');">MATRIX</a><br>)");
|
||||||
server.sendContent(R"(<a onclick="get('/mode?mode=14');">POWER</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=15');">ENERGY</a><br>)");
|
||||||
|
server.sendContent(R"(<a onclick="get('/mode?mode=16');">TIMER</a><br>)");
|
||||||
server.sendContent(R"(</p>)");
|
server.sendContent(R"(</p>)");
|
||||||
|
|
||||||
server.sendContent(R"(<p>)");
|
server.sendContent(R"(<p>)");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user