From 74526fa07da473d4bbc0b1befc4c9d206e1f8ce1 Mon Sep 17 00:00:00 2001 From: Kai Vogelgesang Date: Sun, 29 Aug 2021 12:48:13 +0200 Subject: [PATCH] Implement sync (e.g. after reset) --- microcontroller/ctrl.py | 17 +++++++++++++++++ microcontroller/test.ino | 33 ++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/microcontroller/ctrl.py b/microcontroller/ctrl.py index 64c0de7..1894780 100644 --- a/microcontroller/ctrl.py +++ b/microcontroller/ctrl.py @@ -23,6 +23,17 @@ with serial.Serial("/dev/ttyUSB0", 115200) as ser: FPS = 20 FRAME_TIME = 1 / FPS t = 0 + + def sync(): + # wait for sync + while True: + b = ser.readline() + if b.strip() == b"Sync.": + return + + sync() + + print("initial sync.") while True: @@ -38,6 +49,12 @@ with serial.Serial("/dev/ttyUSB0", 115200) as ser: ser.write(payload) ser.flush() + + response = ser.readline() + if response.strip() != b"Ack.": + print(f"received bad response: {response!r}") + sync() + continue t += FRAME_TIME t %= 1 diff --git a/microcontroller/test.ino b/microcontroller/test.ino index 59b576e..bbb044b 100644 --- a/microcontroller/test.ino +++ b/microcontroller/test.ino @@ -1,4 +1,7 @@ unsigned long tic_loop = 0; +unsigned long time_since_last_sync; +const unsigned long SYNC_TIMEOUT = 1000; + const unsigned int FRAME_TIME = 20; // 20 ms -> 50 FPS const size_t UNIVERSE_SIZE = 512; @@ -15,7 +18,8 @@ void setup() // spin until serial is up } Serial.println(); - Serial.println("Init."); + Serial.println("Sync."); + time_since_last_sync = millis(); Serial1.begin(250000, SERIAL_8N2); // DMX } @@ -38,19 +42,30 @@ void send_packet() bool update_buffer() { + unsigned long now = millis(); size_t n = Serial.available(); if (!n) + { + // nothing available to read + if (now - time_since_last_sync > SYNC_TIMEOUT) + { + // re-sync + bytes_read = 0; + Serial.println("Sync."); + time_since_last_sync = now; + } + return false; + } + time_since_last_sync = now; + int bytes_received = Serial.read(channels_buffer + bytes_read, std::min(n, UNIVERSE_SIZE - bytes_read)); bytes_read += bytes_received; - // Serial.printf("rx n=%d rec=%d total=%d\n", n, bytes_received, bytes_read); - if (bytes_read == UNIVERSE_SIZE) { bytes_read = 0; - // Serial.println(); - // Serial.println("Updated."); + Serial.println("Ack."); return true; } else @@ -63,18 +78,10 @@ void send_dmx_header() { Serial1.flush(); Serial1.begin(90000, SERIAL_8N2); - /* - while (Serial1.available()) - Serial1.read(); - */ // send the break as a "slow" byte Serial1.write(0); // switch back to the original baud rate Serial1.flush(); Serial1.begin(250000, SERIAL_8N2); - /* - while (Serial1.available()) - Serial1.read(); - */ Serial1.write(0); // Start-Byte } \ No newline at end of file