/* IR MODULE Copyright (C) 2016-2018 by Xose Pérez Copyright (C) 2017-2018 by François Déchery Module key prefix: ir */ #if IR_SUPPORT #include #include bool _ir_enabled = true; IRrecv * _ir_recv; decode_results _ir_results; unsigned long _ir_last_toggle = 0; // ----------------------------------------------------------------------------- // PRIVATE // ----------------------------------------------------------------------------- void _irProcessCode(unsigned long code, unsigned char type) { // Check valid code static unsigned long last_code = 0; static unsigned long last_time = 0; if (code == 0xFFFFFFFF) return; if (type == 0xFF) return; if ((last_code == code) && (millis() - last_time < IR_DEBOUNCE)) return; last_code = code; last_time = millis(); DEBUG_MSG_P(PSTR("[IR] Received 0x%08X (%d)\n"), code, type); #if IR_BUTTON_SET > 0 boolean found = false; for (unsigned char i = 0; i < IR_BUTTON_COUNT ; i++) { uint32_t button_code = pgm_read_dword(&IR_BUTTON[i][0]); if (code == button_code) { unsigned long button_mode = pgm_read_dword(&IR_BUTTON[i][1]); unsigned long button_value = pgm_read_dword(&IR_BUTTON[i][2]); if (button_mode == IR_BUTTON_MODE_STATE) { relayStatus(0, button_value); } if (button_mode == IR_BUTTON_MODE_TOGGLE) { relayToggle(button_value); } #if LIGHT_PROVIDER != LIGHT_PROVIDER_NONE if (button_mode == IR_BUTTON_MODE_BRIGHTER) { lightBrightnessStep(button_value ? 1 : -1); nice_delay(150); //debounce } if (button_mode == IR_BUTTON_MODE_RGB) { lightColor(button_value); } /* #if LIGHT_PROVIDER == LIGHT_PROVIDER_FASTLED if (button_mode == IR_BUTTON_MODE_EFFECT) { _buttonAnimMode(button_value); } #endif */ /* if (button_mode == IR_BUTTON_MODE_HSV) { lightColor(button_value); } */ lightUpdate(true, true); #endif found = true; break; } } if (!found) { DEBUG_MSG_P(PSTR("[IR] Ignoring code\n")); } #endif #if MQTT_SUPPORT char buffer[16]; snprintf_P(buffer, sizeof(buffer), "0x%08X", code); mqttSend(MQTT_TOPIC_IR, buffer); #endif } bool _irKeyCheck(const char * key) { return (strncmp(key, "ir", 2) == 0); } // ----------------------------------------------------------------------------- // PUBLIC API // ----------------------------------------------------------------------------- void irSetup() { _ir_enabled = (getSetting("irEnabled", 1).toInt() == 1); if (_ir_enabled) { _ir_recv = new IRrecv(getSetting("irGPIO", IR_RECEIVER_PIN).toInt()); _ir_recv->enableIRIn(); // Register loop espurnaRegisterLoop(irLoop); } // Key Check settingsRegisterKeyCheck(_irKeyCheck); } void irLoop() { if (_ir_recv->decode(&_ir_results)) { _irProcessCode(_ir_results.value, _ir_results.decode_type); _ir_recv->resume(); // Receive the next value } } #endif // IR_SUPPORT