diff --git a/v2/backend/arduino/VideoDisplayTeensy31/VideoDisplayTeensy31.ino b/v2/backend/arduino/VideoDisplayTeensy31/VideoDisplayTeensy31.ino index 5502fea..f4bb94d 100644 --- a/v2/backend/arduino/VideoDisplayTeensy31/VideoDisplayTeensy31.ino +++ b/v2/backend/arduino/VideoDisplayTeensy31/VideoDisplayTeensy31.ino @@ -71,6 +71,11 @@ const int config = WS2811_800kHz; // color config is on the PC side OctoWS2811 leds; +// Required for soft reboot +#define RESTART_ADDR 0xE000ED0C +#define READ_RESTART() (*(volatile uint32_t *)RESTART_ADDR) +#define WRITE_RESTART(val) ((*(volatile uint32_t *)RESTART_ADDR) = (val)) + void setup() { pinMode(13, OUTPUT); digitalWrite(13, HIGH); @@ -96,7 +101,11 @@ void loop() { digitalWrite(13, HIGH); leds.show(); digitalWrite(13, LOW); - } else if (startChar >= 0) { + } + else if (startChar == '!') { + WRITE_RESTART(0x5FA0004); + } + else if (startChar >= 0) { // discard unknown characters } } diff --git a/v2/backend/forwarding/forward.py b/v2/backend/forwarding/forward.py index dd65664..2e99c40 100755 --- a/v2/backend/forwarding/forward.py +++ b/v2/backend/forwarding/forward.py @@ -3,6 +3,7 @@ import redis import time from serial import Serial, SerialException +from serial.tools import list_ports import sys import os @@ -11,13 +12,17 @@ max_width = 20 max_framerate = 40 # Use dummy to test the Processing code without have access to actual hardware -serialDevice = 'dummy' +# serialDevice = 'dummy' # OSX serial device for teensy (not the same everywhere but gives a good indications what it might look like) -#serialDevice = '/dev/tty.usbmodem807701' +# serialDevice = '/dev/tty.usbmodem807701' # Linux Serial device -#serialDevice = '/dev/ttyACM0' +# serialDevice = '/dev/ttyACM0' + +# Automatically find the first serial port used, works on Linux. TODO: test on other OSes +# Required if you want to reboot the teensy +serialDevice = 'auto' wait_time = None @@ -44,6 +49,23 @@ def send(r, s): time.sleep(end - now) +def reboot(port_name): + ser = Serial() + ser.port = port_name + ser.open() + # Send reboot command + ser.write(ord('!').to_bytes(4, byteorder='little')) + ser.close() + time.sleep(3) + + +def find_serial(): + for path, name, details in list_ports.comports(): + if details != 'n/a': + return path + raise Exception('No open ports found.') + + def serialConfigure(port_name, baudrate=9600): ''' We use a very low baudrate by default because the USB port on the teensy @@ -54,6 +76,13 @@ def serialConfigure(port_name, baudrate=9600): time.sleep(1) ser = 'dummyMode' return ser + elif port_name == 'auto': + print("Auto detected, search for open port") + port_name = find_serial() + print("Port found: ", port_name, ' reboot.') + reboot(port_name) + port_name = find_serial() + print("Done, new port: ", port_name) ser = Serial() ser.port = port_name diff --git a/v2/backend/forwarding/softReset.py b/v2/backend/forwarding/softReset.py new file mode 100755 index 0000000..d627090 --- /dev/null +++ b/v2/backend/forwarding/softReset.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from serial import Serial, SerialException +import sys + +# OSX serial device for teensy (not the same everywhere but gives a good indications what it might look like) +# serialDevice = '/dev/tty.usbmodem807701' + +# Linux Serial device +serialDevice = '/dev/ttyACM1' + +if __name__ == "__main__": + ser = Serial() + ser.port = serialDevice + try: + ser.open() + ser.timeout = 1 + ser.write(ord('!').to_bytes(4, byteorder='little')) + except SerialException as e: + sys.stderr.write("Could not open serial port %s: %s\n" % (ser.portstr, e))