kopia lustrzana https://github.com/Aircoookie/WLED
				
				
				
			
		
			
				
	
	
		
			156 wiersze
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			156 wiersze
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
/*
 | 
						|
 * Infrared sensor support for generic 24 key RGB remote
 | 
						|
 */
 | 
						|
 | 
						|
#if defined(WLED_DISABLE_INFRARED) || defined(ARDUINO_ARCH_ESP32)
 | 
						|
void handleIR(){}
 | 
						|
#else
 | 
						|
 | 
						|
IRrecv* irrecv;
 | 
						|
//change pin in NpbWrapper.h
 | 
						|
 | 
						|
decode_results results;
 | 
						|
 | 
						|
unsigned long irCheckedTime = 0;
 | 
						|
uint32_t lastValidCode = 0;
 | 
						|
uint16_t irTimesRepeated = 0;
 | 
						|
 | 
						|
 | 
						|
//Add what your custom IR codes should trigger here. Guide: https://github.com/Aircoookie/WLED/wiki/Infrared-Control
 | 
						|
//IR codes themselves can be defined directly after "case" or in "ir_codes.h"
 | 
						|
bool decodeIRCustom(uint32_t code)
 | 
						|
{
 | 
						|
  switch (code)
 | 
						|
  {
 | 
						|
    //just examples, feel free to modify or remove
 | 
						|
    case IRCUSTOM_ONOFF : toggleOnOff(); break;
 | 
						|
    case IRCUSTOM_MACRO1 : applyMacro(1); break;
 | 
						|
 | 
						|
    default: return false;
 | 
						|
  }
 | 
						|
  if (code != IRCUSTOM_MACRO1) colorUpdated(2); //don't update color again if we apply macro, it already does it
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//relatively change brightness, minumum A=5
 | 
						|
void relativeChange(byte* property, int8_t amount, byte lowerBoundary =0)
 | 
						|
{
 | 
						|
  int16_t new_val = (int16_t) *property + amount;
 | 
						|
  if (new_val > 0xFF) new_val = 0xFF;
 | 
						|
  else if (new_val < lowerBoundary) new_val = lowerBoundary;
 | 
						|
  *property = new_val;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void decodeIR(uint32_t code)
 | 
						|
{
 | 
						|
  if (code == 0xFFFFFFFF) //repeated code, continue brightness up/down
 | 
						|
  {
 | 
						|
    irTimesRepeated++;
 | 
						|
    if (lastValidCode == IR24_BRIGHTER)
 | 
						|
    { 
 | 
						|
      relativeChange(&bri, 10); colorUpdated(2);
 | 
						|
    }
 | 
						|
    else if (lastValidCode == IR24_DARKER)
 | 
						|
    {
 | 
						|
      relativeChange(&bri, -10, 5); colorUpdated(2);
 | 
						|
    }
 | 
						|
    else if (lastValidCode == IR24_ON && irTimesRepeated > 7)
 | 
						|
    {
 | 
						|
      nightlightActive = true;
 | 
						|
      nightlightStartTime = millis();
 | 
						|
      colorUpdated(2);
 | 
						|
    }
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  lastValidCode = 0; irTimesRepeated = 0;
 | 
						|
 | 
						|
  if (decodeIRCustom(code)) return;
 | 
						|
  if      (code > 0xFFFFFF) return; //invalid code
 | 
						|
  else if (code > 0xFF0000) decodeIR44(code); //is in 44-key remote range
 | 
						|
  else if (code > 0xF70000 && code < 0xF80000) decodeIR24(code); //is in 24-key remote range
 | 
						|
  //code <= 0xF70000 also invalid
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void decodeIR24(uint32_t code)
 | 
						|
{
 | 
						|
  switch (code) {
 | 
						|
    case IR24_BRIGHTER  : relativeChange(&bri, 10);         break;
 | 
						|
    case IR24_DARKER    : relativeChange(&bri, -10, 5);     break;
 | 
						|
    case IR24_OFF       : briLast = bri; bri = 0;           break;
 | 
						|
    case IR24_ON        : bri = briLast;                    break;
 | 
						|
    case IR24_RED       : colorFromUint32(COLOR_RED);       break;
 | 
						|
    case IR24_REDDISH   : colorFromUint32(COLOR_REDDISH);   break;
 | 
						|
    case IR24_ORANGE    : colorFromUint32(COLOR_ORANGE);    break;
 | 
						|
    case IR24_YELLOWISH : colorFromUint32(COLOR_YELLOWISH); break;
 | 
						|
    case IR24_YELLOW    : colorFromUint32(COLOR_YELLOW);    break;
 | 
						|
    case IR24_GREEN     : colorFromUint32(COLOR_GREEN);     break;
 | 
						|
    case IR24_GREENISH  : colorFromUint32(COLOR_GREENISH);  break;
 | 
						|
    case IR24_TURQUOISE : colorFromUint32(COLOR_TURQUOISE); break;
 | 
						|
    case IR24_CYAN      : colorFromUint32(COLOR_CYAN);      break;
 | 
						|
    case IR24_AQUA      : colorFromUint32(COLOR_AQUA);      break;
 | 
						|
    case IR24_BLUE      : colorFromUint32(COLOR_BLUE);      break;
 | 
						|
    case IR24_DEEPBLUE  : colorFromUint32(COLOR_DEEPBLUE);  break;
 | 
						|
    case IR24_PURPLE    : colorFromUint32(COLOR_PURPLE);    break;
 | 
						|
    case IR24_MAGENTA   : colorFromUint32(COLOR_MAGENTA);   break;
 | 
						|
    case IR24_PINK      : colorFromUint32(COLOR_PINK);      break;
 | 
						|
    case IR24_WHITE     : colorFromUint32(COLOR_WHITE);           effectCurrent = 0;  break;
 | 
						|
    case IR24_FLASH     : if (!applyPreset(1)) effectCurrent = FX_MODE_COLORTWINKLE;  break;
 | 
						|
    case IR24_STROBE    : if (!applyPreset(2)) effectCurrent = FX_MODE_RAINBOW_CYCLE; break;
 | 
						|
    case IR24_FADE      : if (!applyPreset(3)) effectCurrent = FX_MODE_BREATH;        break;
 | 
						|
    case IR24_SMOOTH    : if (!applyPreset(4)) effectCurrent = FX_MODE_RAINBOW;       break;
 | 
						|
    default: return;
 | 
						|
  }
 | 
						|
  lastValidCode = code;
 | 
						|
  colorUpdated(2); //for notifier, IR is considered a button input
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void decodeIR44(uint32_t code)
 | 
						|
{
 | 
						|
  //not implemented for now
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void initIR()
 | 
						|
{
 | 
						|
  if (irEnabled)
 | 
						|
  {
 | 
						|
    irrecv = new IRrecv(IR_PIN);
 | 
						|
    irrecv->enableIRIn();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void handleIR()
 | 
						|
{
 | 
						|
  if (irEnabled && millis() - irCheckedTime > 120)
 | 
						|
  {
 | 
						|
    irCheckedTime = millis();
 | 
						|
    if (irEnabled)
 | 
						|
    {
 | 
						|
      if (irrecv == NULL)
 | 
						|
      { 
 | 
						|
        initIR(); return;
 | 
						|
      }
 | 
						|
      
 | 
						|
      if (irrecv->decode(&results))
 | 
						|
      {
 | 
						|
        Serial.print("IR recv\r\n0x");
 | 
						|
        Serial.println((uint32_t)results.value, HEX);
 | 
						|
        Serial.println();
 | 
						|
        decodeIR(results.value);
 | 
						|
        irrecv->resume();
 | 
						|
      }
 | 
						|
    } else if (irrecv != NULL)
 | 
						|
    {
 | 
						|
      irrecv->disableIRIn();
 | 
						|
      delete irrecv; irrecv = NULL;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |