#!/usr/bin/env python import redis import time from serial import Serial, SerialException import sys max_height = 5 max_width = 8 max_framerate = 40 wait_time = None def update_framerate(): global wait_time new_framerate = int(r.hget('config', 'cur_framerate')) if new_framerate >= max_framerate or new_framerate == 0: wait_time = 1.0 / max_framerate else: wait_time = 1.0 / new_framerate def send(r, s): print(r.llen('new')) data = r.rpop('new') if data is not None and len(data) > 0: print(len(data)) now = time.time() end = now + wait_time a = bytes([ord('*')]) + bytearray(data) + bytes([ord('#')]) s.write(a) time.sleep(end - now) def serialConfigure(port_name, baudrate=9600): ''' We use a very low baudrate by default because the USB port on the teensy enforce this value: http://www.pjrc.com/teensy/td_serial.html ''' ser = Serial() ser.port = port_name ser.baudrate = baudrate ser.timeout = 5 try: ser.open() except SerialException as e: sys.stderr.write("Could not open serial port %s: %s\n" % (ser.portstr, e)) return ledsPerStrip = max_height * max_width print(ledsPerStrip) ser.write(ledsPerStrip.to_bytes(4, byteorder='little')) data = ser.read(4) print(data, int.from_bytes(data, byteorder='little')) ser.timeout = 1 return ser def serialDataConfigure(port_name, baudrate=115200): ser = Serial() ser.port = port_name ser.baudrate = baudrate try: ser.open() except SerialException as e: sys.stderr.write("Could not open serial port %s: %s\n" % (ser.portstr, e)) return ser.timeout = 1 return ser if __name__ == "__main__": r = redis.Redis() r.hset('config', 'height', max_height) r.hset('config', 'width', max_width) r.hset('config', 'imgsize', max_height * max_width * 24) r.hset('config', 'max_framerate', max_framerate) r.hset('config', 'cur_framerate', max_framerate) s = serialConfigure('/dev/ttyACM0') # s_data = serialDataConfigure('/dev/ttyUSB0') wait_time = 1.0 / max_framerate while True: while r.llen('new') > 0: send(r, s) time.sleep(1) update_framerate()