Initial commit, C WASM version working

This commit is contained in:
Oskar Winkels 2021-03-16 01:01:32 +01:00
commit a5b5842d94
Signed by: o.winkels
GPG Key ID: E7484A06E99DAEF1
5 changed files with 522 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
klock4
html_out/

View File

@ -0,0 +1,38 @@
<!DOCTYTPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>klock4 WASM version</title>
<style>
body {
background: #222;
font-size: 5.5vmin;
color: #444;
}
em {
font-style: normal;
color: #fff;
}
</style>
</head>
<body>
<code class="emscripten" id="output"></code>
<script type='text/javascript'>
var Module = {
preRun: [],
postRun: [],
print: (function() {
var element = document.getElementById('output');
return function(text) {
if (text == "clear")
element.innerHTML = "";
else
element.innerHTML += '&nbsp;' + text + "<br>";
};
})()
};
</script>
{{{ SCRIPT }}}
</body>
</html>

181
klock4.c Normal file
View File

@ -0,0 +1,181 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
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;
}

136
klock4.py Normal file
View File

@ -0,0 +1,136 @@
TEXT = """\
ESXISTXFÜNF\
ZEHNZWANZIG\
DREIVIERTEL\
VORGESTNACH\
HALBXELFÜNF\
EINSXLEZWEI\
DREIXTXVIER\
SECHSXXACHT\
SIEBENZWÖLF\
ZEHNEUNXUHR\
"""
SEGMENTS = {
'ES IST': [(0, 2), (3, 3)],
'FÜNF_PRE': [(7, 4)],
'FÜNFZEHN': [(7, 8)],
'ZEHN_PRE': [(11, 4)],
'ZWANZIG': [(15, 7)],
'DREIVIERTEL': [(22, 11)],
'VIERTEL': [(26, 7)],
'VOR': [(33, 3)],
'NACH': [(40, 4)],
'HALB': [(44, 4)],
'ELF': [(49, 3)],
'FÜNF_UHR': [(51, 4)],
'EINS': [(55, 4)],
'ZWEI': [(62, 4)],
'DREI': [(66, 4)],
'VIER': [(73, 4)],
'SECHS': [(77, 5)],
'ACHT': [(84, 4)],
'SIEBEN': [(88, 6)],
'ZWÖLF': [(94, 5)],
'ZEHN_UHR': [(99, 4)],
'NEUN': [(102, 4)],
'UHR': [(107, 3)],
'STELLE': [(38, 2), (49, 2), (60, 2)],
'GESTELLT': [(36, 4), (49, 2), (60, 1), (71, 1)],
}
HOURS = ['ZWÖLF', 'EINS', 'ZWEI', 'DREI', 'VIER', 'FÜNF_UHR', 'SECHS', 'SIEBEN', 'ACHT', 'NEUN', 'ZEHN_UHR', 'ELF' ]
PARTS = [['UHR'], ['FÜNF_PRE'], ['ZEHN_PRE'], ['VIERTEL'], ['ZWANZIG'], ['FÜNF_PRE', 'HALB'], ['HALB']]
active = [False] * len(TEXT)
def set(segment, val=True):
for word in segment:
idx, len = word
active[idx:idx+len] = [val for _ in range(len)]
def reset():
global active
set([(0, len(TEXT))], False)
set(SEGMENTS['ES IST'])
def settime(time):
reset()
hour = time.hour % 12
minute = 5 * round((time.minute + time.second/60) / 5)
before = False
if minute >= 25:
hour = (hour + 1) % 12
before = True
minute = (60-minute)
if minute == 35:
minute = 25
before = False
print(minute, 'vor' if before else 'nach', hour)
# 25 before 6 -> 5 after half 6
# 25 after 6 -> 5 before half 6
if minute == 25:
before = not before
if not minute in [0, 30]:
set(SEGMENTS['VOR' if before else 'NACH'])
set(SEGMENTS[HOURS[hour]])
for part in PARTS[minute//5]:
set(SEGMENTS[part])
def dump():
COLS = 11
RESET = '\033[0m'
WHITE = '\033[1;37m'
GRAY = '\033[0;30m'
for i, char in enumerate(TEXT):
col = i % COLS
row = i // COLS
if (col == 0):
print('\n ', end='')
color = (WHITE if active[i] else GRAY) if i==0 or active[i] != active[i-1] else ''
print(f' {color}{char} ', end='')
print(RESET+'\n')
def live():
import time
from datetime import datetime
while True:
print('\033c', end='')
now = datetime.now()
print(now)
settime(now)
dump()
time.sleep(1)
def demo():
import time
import datetime
t = datetime.datetime.now()
while True:
print('\033c', end='')
print(t)
settime(t)
dump()
time.sleep(1)
t += datetime.timedelta(minutes=1)
if __name__ == '__main__':
import sys
if len(sys.argv) > 1 and sys.argv[1] == 'demo':
demo()
else:
live()

165
klock4_wasm.c Normal file
View File

@ -0,0 +1,165 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <emscripten.h>
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_PRE[] = "<em>";
const char WHITE_PST[] = "</em>";
const char GRAY_PRE[] = "";
const char GRAY_PST[] = "";
uint128 buffer = active;
int ci = 0;
for (int bi = 0; bi < sizeof(TEXT); bi++) {
int col = ci % COLS;
int row = ci / COLS;
if (col == 0)
printf("\n ");
const char* color_pre = (buffer & (uint128) 1) ? WHITE_PRE : GRAY_PRE;
const char* color_pst = (buffer & (uint128) 1) ? WHITE_PST : GRAY_PST;
printf(" %s%c", color_pre, TEXT[bi]);
if (TEXT[bi] >> 5 == 0b110)
putc(TEXT[++bi], stdout);
printf("%s", color_pst);
buffer = buffer >> 1;
ci++;
}
}
void render(void) {
printf("clear\n");
time_t ts = time(NULL);
settime(ts);
dump();
}
int main(int argc, char* argv[]) {
emscripten_set_main_loop(render, 1, 1);
return 0;
}