Increased minimum space in buffer for audio write When not playing audio, decrease update rate Decreased priority of other tasks
76 lines
1.9 KiB
Python
76 lines
1.9 KiB
Python
import sched
|
|
import time
|
|
from threading import Thread
|
|
import json
|
|
|
|
from redis import Redis
|
|
|
|
from control.walle import WallE
|
|
from control.audio import AudioSystem
|
|
|
|
INTERVAL_TICK = 0.025 # 40/s
|
|
|
|
|
|
class EventListener(Thread):
|
|
def __init__(self):
|
|
super(EventListener, self).__init__()
|
|
self.keep_running = True
|
|
self.dbcon = Redis()
|
|
self.pubsub = self.dbcon.pubsub()
|
|
self.pubsub.subscribe(['move', 'look'])
|
|
|
|
def run(self) -> None:
|
|
while self.keep_running:
|
|
item = self.pubsub.get_message()
|
|
if not item:
|
|
time.sleep(0.01)
|
|
continue
|
|
channel = item['channel'].decode()
|
|
data = item['data']
|
|
if not isinstance(data, bytes):
|
|
print(f"Channel {channel} got message that is not bytes {data}")
|
|
continue
|
|
try:
|
|
self.handle_message(channel, data)
|
|
except ValueError:
|
|
pass # todo
|
|
self.pubsub.close()
|
|
|
|
def stop(self):
|
|
self.keep_running = False
|
|
|
|
def handle_message(self, channel: str, data: bytes):
|
|
data_dict = json.loads(data.decode())
|
|
if channel == 'move':
|
|
walle.set_movement(data_dict['angle'], data_dict['force'])
|
|
elif channel == 'look':
|
|
walle.set_eye_velocity(data_dict['angle'], data_dict['force'])
|
|
else:
|
|
print(f'Unknown channel {channel}')
|
|
|
|
|
|
scheduler = sched.scheduler()
|
|
audio = AudioSystem(scheduler, 'sounds.json')
|
|
walle = WallE()
|
|
walle.setup()
|
|
|
|
|
|
def walle_tick():
|
|
scheduler.enter(INTERVAL_TICK, 3, walle_tick)
|
|
walle.tick()
|
|
|
|
|
|
scheduler.enter(INTERVAL_TICK, 3, walle_tick)
|
|
|
|
audio.queue_sound('walle.boot')
|
|
|
|
if __name__ == '__main__':
|
|
redisdb = Redis()
|
|
event_listener = EventListener()
|
|
event_listener.start()
|
|
try:
|
|
scheduler.run()
|
|
except KeyboardInterrupt:
|
|
event_listener.stop()
|
|
raise
|