kopia lustrzana https://github.com/Aircoookie/WLED
				
				
				
			rewrite adalight parser
							rodzic
							
								
									ce89a92d0d
								
							
						
					
					
						commit
						f8e262b87e
					
				| 
						 | 
				
			
			@ -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();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue