#include #include #include #include #include #include const unsigned char TEXT[] = "\ ESXISTXFÜNF\ ZEHNZWANZIG\ DREIVIERTEL\ VORGESTNACH\ HALBXELFÜNF\ EINSXLEZWEI\ DREIXTXVIER\ SECHSXXACHT\ SIEBENZWÖLF\ ZEHNEUNXUHR"; typedef unsigned long long uint64; typedef unsigned __int128 uint128; #define ES_IST ((uint128) 0b11 << 0 | 0b111 << 3 ) #define FÜNF_PRE ((uint128) 0b1111 << 7 ) #define FÜNFZEHN ((uint128) 0b11111111 << 7 ) #define ZEHN_PRE ((uint128) 0b1111 << 11 ) #define ZWANZIG ((uint128) 0b1111111 << 15 ) #define DREIVIERTEL ((uint128) 0b11111111111 << 22 ) #define VIERTEL ((uint128) 0b1111111 << 26 ) #define VOR ((uint128) 0b111 << 33 ) #define NACH ((uint128) 0b1111 << 40 ) #define HALB ((uint128) 0b1111 << 44 ) #define ELF ((uint128) 0b111 << 49 ) #define FÜNF_UHR ((uint128) 0b1111 << 51 ) #define EINS ((uint128) 0b1111 << 55 ) #define ZWEI ((uint128) 0b1111 << 62 ) #define DREI ((uint128) 0b1111 << 66 ) #define VIER ((uint128) 0b1111 << 73 ) #define SECHS ((uint128) 0b11111 << 77 ) #define ACHT ((uint128) 0b1111 << 84 ) #define SIEBEN ((uint128) 0b111111 << 88 ) #define ZWÖLF ((uint128) 0b11111 << 94 ) #define ZEHN_UHR ((uint128) 0b1111 << 99 ) #define NEUN ((uint128) 0b1111 << 102) #define UHR ((uint128) 0b111 << 107) #define STELLE ((uint128) 0b11 << 38 | 0b11 << 49 | 0b11 << 60) #define GESTELLT ((uint128) 0b1111 << 36 | 0b11 << 49 | 0b1 << 60 | 0b1 << 71) uint128 HOURS[] = { ZWÖLF, EINS, ZWEI, DREI, VIER, FÜNF_UHR, SECHS, SIEBEN, ACHT, NEUN, ZEHN_UHR, ELF }; uint128 PARTS[] = { UHR, FÜNF_PRE, ZEHN_PRE, VIERTEL, ZWANZIG, FÜNF_PRE | HALB, HALB }; uint128 active = 0; void print128(uint128 n) { printf("0x%016llx%016llx\n", (uint64) (n >> 64), (uint64) n & 0xFFFFFFFFFFFFFFFF); } void set(uint128 seg) { active |= seg; } void reset(void) { active = 0; set(ES_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 hour = (ts / (60*60) + 1) % 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 ? (uint128) VOR : (uint128) NACH); set((uint128) HOURS[hour]); set((uint128) PARTS[minute/5]); } void dump() { const int ROWS = 10; const int COLS = 11; const char WHITE[] = "\033[1;37m"; const char GRAY[] = "\033[0;30m"; uint128 buffer = active; int ci = 0; for (int bi = 0; bi < sizeof(TEXT); bi++) { // utf8 tail byte if (TEXT[bi] >> 6 == 0b10) { putc(TEXT[bi], stdout); continue; } int col = ci % COLS; int row = ci / COLS; if (col == 0) printf("\n "); const char* color = (buffer & (uint128) 1) ? WHITE : GRAY; printf(" %s%c", color, TEXT[bi]); buffer = buffer >> 1; ci++; } #define RESET_COLORS "\033[0m" printf(RESET_COLORS "\n"); } int main(int argc, char* argv[]) { int demo = 0; int live = 0; if (argc > 1) { if (strncmp(argv[1], "demo", 5) == 0) demo = 1; else if (strncmp(argv[1], "live", 5) == 0) live = 1; else active = atol(argv[1]); } time_t ts = time(NULL); while (1) { printf("\033c"); if (demo) printf("DEMO Mode!\n"); ts = demo ? ts + 5 * 60 : time(NULL); settime(ts); dump(); if (!live) return 0; sleep(5); }; return 0; }