Old SandTable project

This commit is contained in:
Your Name
2026-08-08 16:11:57 +03:00
commit 59c9f942f0
68 changed files with 2686 additions and 0 deletions
+92
View File
@@ -0,0 +1,92 @@
import sys, time
import divideCoords, writeSerial, playControl
def playTrack(track_name, coords=None):
"""Play a single .thr file, point by point.
`coords` is the starting (theta, r). If not given, we ask the device
for its current position via writeSerial.getPolar() - the firmware
tracks this itself now, so there's no need to keep a copy in the DB
anymore (and nothing here writes position to the DB at all).
Cooperatively checks playControl's command between points, so this can
be paused/stopped/skipped from the web UI while it's running. Returns
the ending (theta, r).
"""
path = "/home/pi/SandTable/media/" + track_name
if coords is None:
coords = writeSerial.getPolar()
if coords is None:
print("Couldn't read starting position from the device, assuming (0, 0)")
coords = [0.0, 0.0]
else:
coords = list(coords)
playControl.set_status(playControl.STATUS_PLAYING, current_track=track_name)
with open(path) as f:
for line in f:
# Cooperative pause: block here (not mid-move) until resumed
while playControl.get_command() == playControl.COMMAND_PAUSE:
playControl.set_status(playControl.STATUS_PAUSED, current_track=track_name)
time.sleep(0.1)
command = playControl.get_command()
if command == playControl.COMMAND_STOP:
playControl.set_status(playControl.STATUS_IDLE)
return coords
if command == playControl.COMMAND_NEXT:
playControl.set_command(playControl.COMMAND_PLAY) # consume the one-shot skip
return coords
playControl.set_status(playControl.STATUS_PLAYING, current_track=track_name)
# If line is comment or line does not contain anything then continue to next line
if '#' in line or len(line) < 4 or "/" in line:
continue
# Getting theta and rho from the line and changing them to float values
th_str, r_str = line.split(' ')
th = float(th_str)
r = float(r_str)
if r > 1.0:
print("R Too big")
# If distance between points is too far (0.03 units), interpolate
if divideCoords.checkDistance(coords, [th, r], 0.01):
split_coords = divideCoords.divideBy(coords, [th, r], 0.03)
if split_coords:
for i in split_coords:
if not writeSerial.sendPolarWithRetry(i[0], i[1]):
print(f"Failed to move to intermediate point {i}, aborting track")
return coords
coords = [i[0], i[1]]
# Writing point to the controller and waiting for the move to
# finish (blocks until COMMAND_POLAR's completion ACK arrives)
if not writeSerial.sendPolarWithRetry(th, r):
print(f"Failed to move to ({th}, {r}), aborting track")
return coords
coords = [th, r]
# Delay just in case
time.sleep(0.1)
return coords
if __name__ == "__main__":
if len(sys.argv) > 1:
name = sys.argv[1]
playControl.init_control_table()
playTrack(name)
playControl.set_status(playControl.STATUS_IDLE)
else:
print("Invalid arguments")