From f8e262b87e2c0e084e2c8b4daf0828937758a530 Mon Sep 17 00:00:00 2001 From: Florian Moesch Date: Tue, 26 Nov 2019 17:49:56 +0100 Subject: [PATCH] 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 384e5c2da..98cb45838 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(); } }