From f8e262b87e2c0e084e2c8b4daf0828937758a530 Mon Sep 17 00:00:00 2001 From: Florian Moesch Date: Tue, 26 Nov 2019 17:49:56 +0100 Subject: [PATCH 1/2] rewrite adalight parser --- wled00/wled04_file.ino | 91 ++++++++++++++++++++++++++++++------------ 1 file changed, 65 insertions(+), 26 deletions(-) diff --git a/wled00/wled04_file.ino b/wled00/wled04_file.ino index 384e5c2d..98cb4583 100644 --- a/wled00/wled04_file.ino +++ b/wled00/wled04_file.ino @@ -1,38 +1,77 @@ /* * Utility for SPIFFS filesystem & Serial console */ +enum class AdaState { + Header_A, + Header_d, + Header_a, + Header_CountHi, + Header_CountLo, + Header_CountCheck, + Data_Red, + Data_Green, + Data_Blue +}; + void handleSerial() { - if (Serial.available() > 0) //support for Adalight protocol to high-speed control LEDs over serial + static auto state = AdaState::Header_A; + static unsigned int count = 0; + static unsigned int pixel = 0; + static byte check = 0x00; + static byte red = 0x00; + static byte green = 0x00; + static byte blue = 0x00; + while (Serial.available() > 0) { - if (!Serial.find("Ada")) return; - + byte next = Serial.read(); + switch (state) { + case AdaState::Header_A: + if (next == 'A') state = AdaState::Header_d; + break; + case AdaState::Header_d: + if (next == 'd') state = AdaState::Header_a; + else state = AdaState::Header_A; + break; + case AdaState::Header_a: + if (next == 'a') state = AdaState::Header_CountHi; + else state = AdaState::Header_A; + break; + case AdaState::Header_CountHi: + pixel = 0; + count = next * 0x100; + check = next; + state = AdaState::Header_CountLo; + break; + case AdaState::Header_CountLo: + count += next + 1; + check = check ^ next ^ 0x55; + state = AdaState::Header_CountCheck; + break; + case AdaState::Header_CountCheck: + if (check == next) state = AdaState::Data_Red; + else state = AdaState::Header_A; + break; + case AdaState::Data_Red: + red = next; + state = AdaState::Data_Green; + break; + case AdaState::Data_Green: + green = next; + state = AdaState::Data_Blue; + break; + case AdaState::Data_Blue: + blue = next; + setRealtimePixel(pixel++, red, green, blue, 0); + if (--count > 0) state = AdaState::Data_Red; + else state = AdaState::Header_A; + break; + } + if (!realtimeActive && bri == 0) strip.setBrightness(briLast); arlsLock(realtimeTimeoutMs); - + yield(); - byte hi = Serial.read(); - byte ledc = Serial.read(); - byte chk = Serial.read(); - if(chk != (hi ^ ledc ^ 0x55)) return; - if (ledCount < ledc) ledc = ledCount; - - byte sc[3]; int t =-1; int to = 0; - for (int i=0; i < ledc; i++) - { - for (byte j=0; j<3; j++) - { - while (Serial.peek()<0) //no data yet available - { - yield(); - to++; - if (to>15) {strip.show(); return;} //unexpected end of transmission - } - to = 0; - sc[j] = Serial.read(); - } - setRealtimePixel(i,sc[0],sc[1],sc[2],0); - } strip.show(); } } From 2e5f6a3507151bfb29d6de9e94e30eca5a60ee2e Mon Sep 17 00:00:00 2001 From: cschwinne Date: Thu, 28 Nov 2019 19:25:04 +0100 Subject: [PATCH 2/2] Improved adalight show() handling --- wled00/wled04_file.ino | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/wled00/wled04_file.ino b/wled00/wled04_file.ino index 98cb4583..378e953a 100644 --- a/wled00/wled04_file.ino +++ b/wled00/wled04_file.ino @@ -16,12 +16,13 @@ enum class AdaState { void handleSerial() { static auto state = AdaState::Header_A; - static unsigned int count = 0; - static unsigned int pixel = 0; + static uint16_t count = 0; + static uint16_t pixel = 0; static byte check = 0x00; static byte red = 0x00; static byte green = 0x00; - static byte blue = 0x00; + static bool changed = false; + while (Serial.available() > 0) { byte next = Serial.read(); @@ -61,18 +62,23 @@ void handleSerial() state = AdaState::Data_Blue; break; case AdaState::Data_Blue: - blue = next; + byte blue = next; + changed = true; setRealtimePixel(pixel++, red, green, blue, 0); if (--count > 0) state = AdaState::Data_Red; else state = AdaState::Header_A; break; } + } + if (changed) + { if (!realtimeActive && bri == 0) strip.setBrightness(briLast); arlsLock(realtimeTimeoutMs); yield(); strip.show(); + changed = false; } }