70 lines
1.6 KiB
Python
70 lines
1.6 KiB
Python
import importlib
|
|
import time
|
|
import os
|
|
import sys
|
|
import traceback
|
|
|
|
import serial
|
|
import scene
|
|
|
|
start_addr = 1
|
|
|
|
with serial.Serial("/dev/ttyUSB0", 500000) as ser:
|
|
|
|
payload = bytearray(512)
|
|
|
|
FPS = 50
|
|
if len(sys.argv) > 1:
|
|
FPS = int(sys.argv[1])
|
|
|
|
FRAME_TIME = 1 / FPS
|
|
t = 0
|
|
|
|
def sync():
|
|
# wait for sync
|
|
while True:
|
|
b = ser.readline()
|
|
if b.strip() == b"Sync.":
|
|
return
|
|
|
|
sync()
|
|
|
|
print("initial sync.")
|
|
|
|
last_edit_timestamp = os.stat(scene.__file__).st_mtime_ns
|
|
while True:
|
|
|
|
loop_start = time.time()
|
|
|
|
try:
|
|
timestamp = os.stat(scene.__file__).st_mtime_ns
|
|
if timestamp > last_edit_timestamp:
|
|
print("[importlib.reload]")
|
|
importlib.reload(scene)
|
|
last_edit_timestamp = timestamp
|
|
scene.display(t, payload)
|
|
except Exception:
|
|
traceback.print_exc()
|
|
|
|
ser.write(payload)
|
|
ser.flush()
|
|
|
|
response = ser.readline()
|
|
if response.strip() != b"Ack.":
|
|
print(f"received bad response: {response!r}")
|
|
sync()
|
|
continue
|
|
|
|
t += FRAME_TIME
|
|
t %= 1
|
|
|
|
loop_time = time.time() - loop_start
|
|
if loop_time < FRAME_TIME:
|
|
time.sleep(FRAME_TIME - loop_time)
|
|
else:
|
|
print("loop took too long!")
|
|
|
|
print(f"loop time: {1000 * loop_time:0.2f}ms busy, {1000 * (time.time() - loop_start):0.2f}ms total")
|
|
|
|
# print(ser.read_all())
|