From aad95e9292505301b9644ee6d10a87030739c45d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Sun, 26 Dec 2021 13:58:31 +0100 Subject: [PATCH] Clock --- src/main.cpp | 7 ++- src/mode/Clock/Clock.h | 131 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 8f58182..57b4a09 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,10 +4,12 @@ #include "display/Display.h" #include "mode/Pong/Pong.h" #include "mode/Test/Border.h" +#include "mode/Clock/Clock.h" enum ModeId { NONE, BORDER, + CLOCK, GAME_OF_LIFE_BLACK_WHITE, GAME_OF_LIFE_WHITE_FADE, GAME_OF_LIFE_COLOR_FADE, @@ -17,7 +19,7 @@ enum ModeId { Display display(32, 8); -ModeId newModeId = GAME_OF_LIFE_COLOR_FADE; +ModeId newModeId = GAME_OF_LIFE_WHITE_FADE; ModeId currentModeId = NONE; @@ -132,6 +134,9 @@ void loadNewMode() { case BORDER: mode = new Border(&display); break; + case CLOCK: + mode = new Clock(&display); + break; case GAME_OF_LIFE_BLACK_WHITE: mode = new GameOfLife(&display, BLACK_WHITE); break; diff --git a/src/mode/Clock/Clock.h b/src/mode/Clock/Clock.h index b56c8ed..862c5f4 100644 --- a/src/mode/Clock/Clock.h +++ b/src/mode/Clock/Clock.h @@ -3,8 +3,139 @@ #include "mode/Mode.h" +#define X true +#define _ false + class Clock : public Mode { +private: + + bool SYMBOLS[11][35] = { + { + X, X, X, + X, _, X, + X, _, X, + X, _, X, + X, X, X, + }, + { + _, _, X, + _, X, X, + _, _, X, + _, _, X, + _, _, X, + }, + { + X, X, X, + _, _, X, + X, X, X, + X, _, _, + X, X, X, + }, + { + X, X, X, + _, _, X, + _, X, X, + _, _, X, + X, X, X, + }, + { + X, _, X, + X, _, X, + X, X, X, + _, _, X, + _, _, X, + }, + { + X, X, X, + X, _, _, + X, X, X, + _, _, X, + X, X, X, + }, + { + X, X, X, + X, _, _, + X, X, X, + X, _, X, + X, X, X, + }, + { + X, X, X, + _, _, X, + _, X, _, + X, _, _, + X, _, _, + }, + { + X, X, X, + X, _, X, + X, X, X, + X, _, X, + X, X, X, + }, + { + X, X, X, + X, _, X, + X, X, X, + _, _, X, + X, X, X, + }, + { + _, _, _, + _, X, _, + _, _, _, + _, X, _, + _, _, _, + }, + }; + +public: + + explicit Clock(Display *display) : + Mode(display) { + // nothing + } + + ~Clock() override = default; + + const char *getName() override { + return "Clock"; + } + + void step(millis_t dt) override { + tm time{}; + getLocalTime(&time); + display->clear(); + uint8_t x = 0; + print(&x, time.tm_hour / 10); + x++; + print(&x, time.tm_hour % 10); + print(&x, 10); + print(&x, time.tm_min / 10); + x++; + print(&x, time.tm_min % 10); + print(&x, 10); + print(&x, time.tm_sec / 10); + x++; + print(&x, time.tm_sec % 10); + } + + void print(uint8_t *pos, uint8_t index) { + if (index > 10) { + Serial.printf("Cannot print symbol #%u.", index); + return; + } + bool *symbolBit = SYMBOLS[index]; + for (uint8_t y = 0; y < 5; ++y) { + for (uint8_t x = 0; x < 3; ++x) { + uint8_t value = *(symbolBit++) ? 255 : 0; + display->set(*pos + x, y, value, value, value); + } + } + *pos += 3; + } + }; #endif