Add hot reload example

This commit is contained in:
Kai Vogelgesang 2022-12-21 16:53:06 +01:00
parent 6f6e0fd665
commit 0d13c7604f
Signed by: kai
GPG Key ID: 3FC8578CC818A9EB
4 changed files with 115 additions and 15 deletions

View File

@ -1,4 +1,5 @@
.vscode
.mypy_cache
venv
build
build
__pycache__

View File

@ -5,24 +5,25 @@ import colorsys
import sys
channels = [
192, # pan
0, # tilt
134, # dimmer
255, # R
0x88, # G
0, # B
0, # W
1, # movement speed
0, # RST
255, # dimmer
0, # R
0, # G
0, # B
0, # W
0, # A
0, # UV
0, # Strobe
0, # function
0, # function speed
]
start_addr = 10
start_addr = 1
with serial.Serial("/dev/ttyUSB0", 500000) as ser:
payload = bytearray(512)
FPS = 30
FPS = 50
if len(sys.argv) > 1:
FPS = int(sys.argv[1])
@ -46,9 +47,9 @@ with serial.Serial("/dev/ttyUSB0", 500000) as ser:
r, g, b = colorsys.hls_to_rgb(t, 0.5, 1)
channels[3] = int(255 * r)
channels[4] = int(255 * g)
channels[5] = int(255 * b)
channels[1] = int(255 * r)
channels[2] = int(255 * g)
channels[3] = int(255 * b)
payload[(start_addr - 1) : (start_addr - 1 + len(channels))] = channels

View File

@ -0,0 +1,69 @@
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())

29
microcontroller/scene.py Normal file
View File

@ -0,0 +1,29 @@
import colorsys
channels = [
255, # dimmer
0, # R
0, # G
0, # B
0, # W
0, # A
0, # UV
0, # Strobe
0, # function
0, # function speed
]
start_addr = 1
def display(t, payload):
r, g, b = colorsys.hls_to_rgb(t, 0.5, 1)
#channels[1] = int(255 * r)
#channels[2] = int(255 * g)
#channels[3] = int(255 * b)
channels[4] = 0
channels[5] = 0
channels[6] = 255
channels[7] = 0
payload[(start_addr - 1) : (start_addr - 1 + len(channels))] = channels