37 lines
1012 B
Python
37 lines
1012 B
Python
|
# x-run: cat _junk/logs.txt | python3 %
|
||
|
|
||
|
from base64 import b64decode
|
||
|
from sys import stdout, stdin, stderr
|
||
|
from json import loads
|
||
|
|
||
|
canvas = bytearray(125000)
|
||
|
|
||
|
last_update: int = 0
|
||
|
last_frame: int = 0
|
||
|
|
||
|
n_frames = 0
|
||
|
|
||
|
for line in stdin:
|
||
|
_, data = line.strip().split(" ", 1)
|
||
|
event, data = loads(data)
|
||
|
|
||
|
if event == "full_state":
|
||
|
buffer = b64decode(data["full_state"].encode() + b"=")
|
||
|
last_update = data["timestamp"]
|
||
|
canvas[:] = buffer
|
||
|
elif event == "batched_bit_toggles":
|
||
|
bits_on, bits_off, timestamp = data
|
||
|
if timestamp >= last_update:
|
||
|
for ndx in bits_on:
|
||
|
byte, bit = divmod(ndx, 8)
|
||
|
canvas[byte] |= (1 << bit)
|
||
|
for ndx in bits_off:
|
||
|
byte, bit = divmod(ndx, 8)
|
||
|
canvas[byte] &= 0xFF ^ (1 << bit)
|
||
|
last_update = timestamp
|
||
|
|
||
|
if (last_update - last_frame) > 6_000:
|
||
|
stdout.buffer.write(canvas)
|
||
|
stdout.buffer.flush()
|
||
|
last_frame = last_update
|