From 0c1c47d5787626380f5ceeb6d1d2ae44c44a0b6e Mon Sep 17 00:00:00 2001 From: Oskar Date: Tue, 30 Mar 2021 23:07:10 +0200 Subject: [PATCH] Add microcontroller-friendly version --- klock4_uc.c | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 klock4_uc.c diff --git a/klock4_uc.c b/klock4_uc.c new file mode 100644 index 0000000..a13c48c --- /dev/null +++ b/klock4_uc.c @@ -0,0 +1,154 @@ +#include +#include +#include +#include +#include +#include +#include + +#define ROWS 10 +#define COLS 11 + +const unsigned char TEXT[] = "\ +ESXISTXFUNF\ +ZEHNZWANZIG\ +DREIVIERTEL\ +VORGESTNACH\ +HALBXELFUNF\ +EINSXLEZWEI\ +DREIXTXVIER\ +SECHSXXACHT\ +SIEBENZWOLF\ +ZEHNEUNXUHR"; + +typedef struct {uint8_t start; uint16_t len;} word_t; + +#define ES ((word_t) {.start= 0, .len=2}) +#define IST ((word_t) {.start= 3, .len=3}) +#define FUNF_PRE ((word_t) {.start= 7, .len=4}) +#define ZEHN_PRE ((word_t) {.start= 11, .len=4}) +#define ZWANZIG ((word_t) {.start= 15, .len=7}) +#define VIERTEL ((word_t) {.start= 26, .len=7}) +#define VOR ((word_t) {.start= 33, .len=3}) +#define NACH ((word_t) {.start= 40, .len=4}) +#define HALB ((word_t) {.start= 44, .len=4}) +#define ELF ((word_t) {.start= 49, .len=3}) +#define FUNF_UHR ((word_t) {.start= 51, .len=4}) +#define EINS ((word_t) {.start= 55, .len=4}) +#define ZWEI ((word_t) {.start= 62, .len=4}) +#define DREI ((word_t) {.start= 66, .len=4}) +#define VIER ((word_t) {.start= 73, .len=4}) +#define SECHS ((word_t) {.start= 77, .len=5}) +#define ACHT ((word_t) {.start= 84, .len=4}) +#define SIEBEN ((word_t) {.start= 88, .len=6}) +#define ZWOLF ((word_t) {.start= 94, .len=5}) +#define ZEHN_UHR ((word_t) {.start= 99, .len=4}) +#define NEUN ((word_t) {.start=102, .len=4}) +#define UHR ((word_t) {.start=107, .len=3}) + +word_t HOURS[] = { + ZWOLF, EINS, ZWEI, DREI, VIER, FUNF_UHR, + SECHS, SIEBEN, ACHT, NEUN, ZEHN_UHR, ELF +}; +word_t PARTS[] = { + UHR, FUNF_PRE, ZEHN_PRE, VIERTEL, + ZWANZIG, FUNF_PRE, HALB +}; + + +uint8_t active[ROWS*COLS] = {0}; + +void set(word_t word) { + for (unsigned int i = word.start; i < word.start + word.len; i++) + active[i] = 1; +} + +void reset(void) { + memset(&active, 0, sizeof(active)); + set(ES); + set(IST); +} + + +void settime(time_t ts) { + + unsigned int second = ts % 60; + + unsigned int minute = (ts / 60) % 60; + float fminute = (float) minute + (float) second / 60; + minute = 5 * (unsigned int) roundf(fminute / 5); + + unsigned int daylight_savings = 1; + unsigned int hour = (ts / (60*60) + 1 + daylight_savings) % 12; + + //printf("%02d:%02d\n", hour, minute); + + int before = 0; + + if (minute >= 25) { + hour = (hour+1) % 12; + before = 1; + minute = 60-minute; + if (minute == 35) { + minute = 25; + before = 0; + } + } + + //printf("%02d %s %02d\n", minute, before ? "vor" : "nach", hour); + + if (minute == 25) + before = !before; + + reset(); + + if (minute != 0 && minute != 30) + set(before ? VOR : NACH); + + set(HOURS[hour]); + set(PARTS[minute/5]); + + if (minute/5 == 5) + set(HALB); // '5 before half' requires additional set + +} + + +void dump() { + + const char WHITE[] = "\033[1;37m"; + const char GRAY[] = "\033[0;30m"; + + for (int i = 0; i < ROWS*COLS; i++) { + + int col = i % COLS; + if (col == 0) + printf("\n "); + + const char* color = active[i] ? WHITE : GRAY; + + printf(" %s%c", color, TEXT[i]); + + } + + #define RESET_COLORS "\033[0m" + printf(RESET_COLORS "\n"); + +} + +int main() { + + time_t ts = time(NULL); + + while (1) { + printf("\033c"); + ts = time(NULL); + settime(ts); + dump(); + + sleep(5); + }; + + return 0; + +}