diff --git a/src/driver/drv_ir.cpp b/src/driver/drv_ir.cpp index 31ec0d98d..dedbf8a9c 100644 --- a/src/driver/drv_ir.cpp +++ b/src/driver/drv_ir.cpp @@ -857,10 +857,11 @@ extern "C" void DRV_IR_RunFrame(){ break; } - // we should include repeat here? - // e.g. on/off button should not toggle on repeats, but up/down probably should eat them. uint32_t counter_in = ir_counter; - EventHandlers_FireEvent2(tgType,ourReceiver->decodedIRData.address,ourReceiver->decodedIRData.command); + // 2025.08.09 - include repeats, this should work also + // with older scripts + EventHandlers_FireEvent3(tgType, ourReceiver->decodedIRData.address, + ourReceiver->decodedIRData.command, repeats); uint32_t counter_dur = ((ir_counter - counter_in)*50)/1000; ADDLOG_DEBUG(LOG_FEATURE_IR, (char *)"IR fire event took %dms", counter_dur); } diff --git a/src/selftest/selftest_cmd_generic.c b/src/selftest/selftest_cmd_generic.c index 9f992ce71..83abb6d93 100644 --- a/src/selftest/selftest_cmd_generic.c +++ b/src/selftest/selftest_cmd_generic.c @@ -98,6 +98,36 @@ void Test_Events() { SELFTEST_ASSERT(EVENT_ParseEventName("UnknownEvent") == CMD_EVENT_NONE); SELFTEST_ASSERT(EVENT_ParseEventName("") == CMD_EVENT_NONE); SELFTEST_ASSERT(EVENT_ParseEventName(" ") == CMD_EVENT_NONE); + + CMD_ExecuteCommand("setchannel 20 0", 0); + SELFTEST_ASSERT_CHANNEL(20, 0); + CMD_ExecuteCommand("addEventHandler2 IR_RC6 0x11 0x23 addChannel 20 1", 0); + // FireEvent 3 will call addEventHandler2 + // (it assumes that third argument is 'any') + // So if we want RC6 events for 0x20 0x20 with ANY repeats (press or hold) + // then both press and release calls event + EventHandlers_FireEvent3(CMD_EVENT_IR_RC6, 0x11, 0x23, 0); + SELFTEST_ASSERT_CHANNEL(20, 1); + EventHandlers_FireEvent3(CMD_EVENT_IR_RC6, 0x11, 0x23, 0); + SELFTEST_ASSERT_CHANNEL(20, 2); + EventHandlers_FireEvent3(CMD_EVENT_IR_RC6, 0x11, 0x23, 0); + SELFTEST_ASSERT_CHANNEL(20, 3); + + CMD_ExecuteCommand("setchannel 10 0", 0); + SELFTEST_ASSERT_CHANNEL(10, 0); + CMD_ExecuteCommand("addEventHandler3 IR_RC6 0x10 0x10 1 addChannel 10 1", 0); + EventHandlers_FireEvent3(CMD_EVENT_IR_RC6, 0x10, 0x10, 0); + SELFTEST_ASSERT_CHANNEL(10, 0); + EventHandlers_FireEvent3(CMD_EVENT_IR_RC6, 0x10, 0x10, 1); + SELFTEST_ASSERT_CHANNEL(10, 1); + EventHandlers_FireEvent3(CMD_EVENT_IR_RC6, 0x10, 0x10, 1); + SELFTEST_ASSERT_CHANNEL(10, 2); + EventHandlers_FireEvent3(CMD_EVENT_IR_RC6, 0x10, 0x10, 0); + SELFTEST_ASSERT_CHANNEL(10, 2); + EventHandlers_FireEvent2(CMD_EVENT_IR_RC6, 0x10, 0x10); + SELFTEST_ASSERT_CHANNEL(10, 3); + EventHandlers_FireEvent2(CMD_EVENT_IR_RC6, 0x10, 0x10); + SELFTEST_ASSERT_CHANNEL(10, 4); } void Test_UART() {