import sched from threading import Thread import json from redis import Redis from control.walle import WallE from control.camera import Camera INTERVAL_TICK = 0.05 # 20/s INTERVAL_IMAGE = 0.05 # 20/s class EventListener(Thread): def __init__(self): super(EventListener, self).__init__() self.dbcon = Redis() self.pubsub = self.dbcon.pubsub() self.pubsub.subscribe(['move', 'look']) def run(self) -> None: for item in self.pubsub.listen(): 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 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() camera = Camera() walle = WallE() walle.setup() def walle_tick(): scheduler.enter(INTERVAL_TICK, 1, walle_tick) walle.tick() def camera_image(): scheduler.enter(INTERVAL_IMAGE, 1, camera_image) image = camera.get_image() redisdb.publish('image', image) scheduler.enter(INTERVAL_TICK, 1, walle_tick) scheduler.enter(INTERVAL_IMAGE, 1, camera_image) if __name__ == '__main__': redisdb = Redis() event_listener = EventListener() event_listener.start() scheduler.run()