127 lines
3.8 KiB
C++
127 lines
3.8 KiB
C++
/*
|
|
* Infrared sensor support for generic 24 key RGB remote
|
|
*/
|
|
|
|
IRrecv* irrecv;
|
|
//change pin in NpbWrapper.h
|
|
|
|
decode_results results;
|
|
|
|
unsigned long irCheckedTime = 0;
|
|
uint32_t lastValidCode = 0;
|
|
uint16_t irTimesRepeated = 0;
|
|
|
|
|
|
//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); return;
|
|
}
|
|
else if (lastValidCode == IR24_DARKER)
|
|
{
|
|
relativeChange(&bri, -10, 5); return;
|
|
}
|
|
else if (lastValidCode == IR24_ON && irTimesRepeated > 7)
|
|
{
|
|
nightlightActive = true;
|
|
nightlightStartTime = millis();
|
|
}
|
|
return;
|
|
}
|
|
lastValidCode = 0; irTimesRepeated = 0;
|
|
|
|
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();
|
|
}
|
|
//irrecv.disableIRIn();
|
|
}
|
|
|
|
void handleIR()
|
|
{
|
|
if (irEnabled && millis() - irCheckedTime > 120)
|
|
{
|
|
irCheckedTime = millis();
|
|
if (irEnabled)
|
|
{
|
|
if (irrecv == NULL)
|
|
{
|
|
initIR(); return;
|
|
}
|
|
|
|
if (irrecv->decode(&results))
|
|
{
|
|
DEBUG_PRINTLN("IR recv");
|
|
#ifdef DEBUG
|
|
Serial.println((uint32_t)results.value, HEX);
|
|
#endif
|
|
decodeIr(results.value);
|
|
irrecv->resume();
|
|
}
|
|
} else if (irrecv != NULL)
|
|
{
|
|
delete irrecv; irrecv = NULL;
|
|
}
|
|
}
|
|
}
|