From 49df0d9c75d5fbafd8655fe39fd38868536996a3 Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Fri, 1 Oct 2021 14:50:39 -0700 Subject: [PATCH 01/12] fix compilation errors due to newer core/idf versions --- src/IRRecv.cpp | 5 ++--- src/IRRecv.h | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/IRRecv.cpp b/src/IRRecv.cpp index 77838d5..2a18b6e 100644 --- a/src/IRRecv.cpp +++ b/src/IRRecv.cpp @@ -46,7 +46,7 @@ int8_t IRRecv::available() { if (!_active) return -1; UBaseType_t waiting; - vRingbufferGetInfo(_rb, NULL, NULL, NULL, &waiting); + vRingbufferGetInfo(_rb, NULL, NULL, NULL, NULL, &waiting); return waiting; } @@ -115,7 +115,7 @@ uint32_t IRRecv::rx_parse_items(rmt_item32_t* item, int item_num, uint8_t timing void dump_item(rmt_item32_t* item, size_t sz) { for (int x=0; x 0x7f00 || item[x].duration0 > 0x7f00) break; } } @@ -198,7 +198,6 @@ void IRRecv::stop() _rx_pin = GPIO_NUM_MAX; _timing = {}; _active = false; - vRingbufferDelete(_rb); } bool IRRecv::active() {return _active;} diff --git a/src/IRRecv.h b/src/IRRecv.h index 5fcf857..41fbfed 100644 --- a/src/IRRecv.h +++ b/src/IRRecv.h @@ -4,6 +4,7 @@ #include "IR32.h" #include "Arduino.h" #include "driver/rmt.h" +#include class IRRecv { From 7ef56a56c227d82d7182afaf4d912e076b94f6e0 Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Fri, 1 Oct 2021 14:51:25 -0700 Subject: [PATCH 02/12] rmt_set_pin is depricated, use rmt_set_gpio --- src/IRSend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IRSend.cpp b/src/IRSend.cpp index 2756b82..6875f1d 100644 --- a/src/IRSend.cpp +++ b/src/IRSend.cpp @@ -44,7 +44,7 @@ bool IRSend::startRMT(uint8_t timing) rmt_tx.tx_config.idle_output_en = RMT_TX_IDLE_EN; if (rmt_config(&rmt_tx) != ESP_OK) return false; if (rmt_driver_install(rmt_tx.channel, 0, 0) != ESP_OK) return false; - if (rmt_set_pin(_channel, RMT_MODE_TX, _tx_pin) != ESP_OK) return false; + if (rmt_set_gpio(_channel, RMT_MODE_TX, _tx_pin, timing_groups[timing].invert) != ESP_OK) return false; _timing = timing; return true; } From e9ae6617cf120b3e1281afe93c04a998196e321a Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Fri, 1 Oct 2021 14:51:51 -0700 Subject: [PATCH 03/12] add arris dcx3200 cable set top box --- src/IR32.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/IR32.h b/src/IR32.h index d2cff1d..5c7c82f 100644 --- a/src/IR32.h +++ b/src/IR32.h @@ -28,6 +28,7 @@ typedef struct { {"NEC", 38000, 33, 32, 0, 9000, 4500, 560, 1690, 560, 560, 560}, {"samsung", 38000, 33, 32, 0, 4500, 4450, 560, 1600, 560, 560, 8950}, {"LG", 38000, 33, 28, 0, 8500, 4250, 560, 1600, 560, 560, 800}, - {"LG32", 38000, 33, 32, 0, 4500, 4500, 500, 1750, 500, 560, 8950} + {"LG32", 38000, 33, 32, 0, 4500, 4500, 500, 1750, 500, 560, 8950}, + {"ARRIS", 38000, 33, 16, 0, 9000, 4500, 550, 2250, 550, 4500, 5000} // arris dcx3200 cable set top box from spectrum }; #endif // _IR32_H_ From 55ebdedf143908e2f593f0d8f503eb96f97e86ce Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Fri, 1 Oct 2021 16:32:08 -0700 Subject: [PATCH 04/12] add dump flag to allow programatic dumping of timing --- src/IRRecv.cpp | 16 ++++++++++++---- src/IRRecv.h | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/IRRecv.cpp b/src/IRRecv.cpp index 2a18b6e..fa8aca9 100644 --- a/src/IRRecv.cpp +++ b/src/IRRecv.cpp @@ -115,11 +115,12 @@ uint32_t IRRecv::rx_parse_items(rmt_item32_t* item, int item_num, uint8_t timing void dump_item(rmt_item32_t* item, size_t sz) { for (int x=0; x 0x7f00 || item[x].duration0 > 0x7f00) break; } } - + uint32_t IRRecv::read(char* &timingGroup, bool preferredOnly) { if (!available()) return 0; @@ -129,7 +130,9 @@ uint32_t IRRecv::read(char* &timingGroup, bool preferredOnly) if (!item) return 0; //after parsing the data, clear space in the ringbuffer. vRingbufferReturnItem(_rb, (void*) item); - //dump_item(item,rx_size); + if (_dump) { + dump_item(item,rx_size); + } uint32_t rx_data; uint8_t found_timing = 0; for (uint8_t timing : _preferred) { @@ -139,7 +142,10 @@ uint32_t IRRecv::read(char* &timingGroup, bool preferredOnly) break; } } - if (!rx_data) { + // if we did not parse the item from the prefered list then + // check the non-prefered items as well, but only if + // preferedOnly is not set. + if (!rx_data && !preferredOnly) { uint8_t groupCount = sizeof(timing_groups)/sizeof(timing_groups[0]); for (uint8_t timing = 0; timing < groupCount; timing++) { if (!inPrefVector(timing)) { @@ -159,6 +165,8 @@ uint32_t IRRecv::read(char* &timingGroup, bool preferredOnly) void IRRecv::setMargin(uint16_t margin_us) {_margin_us = margin_us;} +void IRRecv::setDump(bool dump) {_dump = dump;} + uint8_t timingGroupElement(const char* tag) { uint8_t counter = 0; diff --git a/src/IRRecv.h b/src/IRRecv.h index 41fbfed..e1f40bc 100644 --- a/src/IRRecv.h +++ b/src/IRRecv.h @@ -17,6 +17,7 @@ class IRRecv int8_t available(); uint32_t read(char* &timingGroup, bool preferredOnly=false); void setMargin(uint16_t margin_us); + void setDump(bool dump); bool inPrefVector(uint8_t element); int setPreferred(const char* timing_group); int setPreferred(String timing_group); @@ -36,5 +37,6 @@ class IRRecv std::vector _preferred; RingbufHandle_t _rb = NULL; bool _active = false; + bool _dump = false; }; #endif // _IRRECV_H_ From c8f7dfee62f030dbbbb197c7cd7e47796ad8a39e Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Fri, 1 Oct 2021 16:33:41 -0700 Subject: [PATCH 05/12] return ring buffer AFTER parsing to avoid race condition --- src/IRRecv.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IRRecv.cpp b/src/IRRecv.cpp index fa8aca9..35e4f64 100644 --- a/src/IRRecv.cpp +++ b/src/IRRecv.cpp @@ -128,8 +128,6 @@ uint32_t IRRecv::read(char* &timingGroup, bool preferredOnly) size_t rx_size = 0; rmt_item32_t* item = (rmt_item32_t*) xRingbufferReceive(_rb, &rx_size, RMT_RX_BUF_WAIT); if (!item) return 0; - //after parsing the data, clear space in the ringbuffer. - vRingbufferReturnItem(_rb, (void*) item); if (_dump) { dump_item(item,rx_size); } @@ -157,6 +155,8 @@ uint32_t IRRecv::read(char* &timingGroup, bool preferredOnly) } } } + //after parsing the data, clear space in the ringbuffer. + vRingbufferReturnItem(_rb, (void*) item); if (found_timing) { timingGroup = (char*) timing_groups[found_timing].tag; } From a84df9a6dbc04c9d28ae52e5734f7e4ab98d050a Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Sat, 2 Oct 2021 05:37:02 -0700 Subject: [PATCH 06/12] move non-verbose of unparsed item logging to after al parsing attempts to reduce log spam add flag setDumpUnknown() to dump item if it was not decoded --- src/IRRecv.cpp | 18 ++++++++++-------- src/IRRecv.h | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/IRRecv.cpp b/src/IRRecv.cpp index 35e4f64..fb92e12 100644 --- a/src/IRRecv.cpp +++ b/src/IRRecv.cpp @@ -91,7 +91,7 @@ uint32_t IRRecv::rx_parse_items(rmt_item32_t* item, int item_num, uint8_t timing { int w_len = item_num; if(w_len < timing_groups[timing].bit_length + 2) { - log_w("Item length was only %d bit", w_len); + log_v("Item length was only %d bit", w_len); return 0; } if(!rx_header_if(item++, timing)) { @@ -128,9 +128,6 @@ uint32_t IRRecv::read(char* &timingGroup, bool preferredOnly) size_t rx_size = 0; rmt_item32_t* item = (rmt_item32_t*) xRingbufferReceive(_rb, &rx_size, RMT_RX_BUF_WAIT); if (!item) return 0; - if (_dump) { - dump_item(item,rx_size); - } uint32_t rx_data; uint8_t found_timing = 0; for (uint8_t timing : _preferred) { @@ -142,7 +139,7 @@ uint32_t IRRecv::read(char* &timingGroup, bool preferredOnly) } // if we did not parse the item from the prefered list then // check the non-prefered items as well, but only if - // preferedOnly is not set. + // preferredOnly is not set. if (!rx_data && !preferredOnly) { uint8_t groupCount = sizeof(timing_groups)/sizeof(timing_groups[0]); for (uint8_t timing = 0; timing < groupCount; timing++) { @@ -155,17 +152,22 @@ uint32_t IRRecv::read(char* &timingGroup, bool preferredOnly) } } } - //after parsing the data, clear space in the ringbuffer. - vRingbufferReturnItem(_rb, (void*) item); if (found_timing) { timingGroup = (char*) timing_groups[found_timing].tag; + } else { + log_w("read() item with length %u not parsed!", rx_size / 4); + if (_dump_unknown) { + dump_item(item,rx_size); + } } + //after parsing the data, clear space in the ringbuffer. + vRingbufferReturnItem(_rb, (void*) item); return rx_data; } void IRRecv::setMargin(uint16_t margin_us) {_margin_us = margin_us;} -void IRRecv::setDump(bool dump) {_dump = dump;} +void IRRecv::setDumpUnknown(bool dump) {_dump_unknown = dump;} uint8_t timingGroupElement(const char* tag) { diff --git a/src/IRRecv.h b/src/IRRecv.h index e1f40bc..2a72ced 100644 --- a/src/IRRecv.h +++ b/src/IRRecv.h @@ -17,7 +17,7 @@ class IRRecv int8_t available(); uint32_t read(char* &timingGroup, bool preferredOnly=false); void setMargin(uint16_t margin_us); - void setDump(bool dump); + void setDumpUnknown(bool dump); bool inPrefVector(uint8_t element); int setPreferred(const char* timing_group); int setPreferred(String timing_group); @@ -37,6 +37,6 @@ class IRRecv std::vector _preferred; RingbufHandle_t _rb = NULL; bool _active = false; - bool _dump = false; + bool _dump_unknown = false; }; #endif // _IRRECV_H_ From e90d050ccb95a7190cb2122f78bb7e90e32cf4d2 Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Sat, 2 Oct 2021 05:56:44 -0700 Subject: [PATCH 07/12] don't use invert for gpio config. --- src/IRSend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IRSend.cpp b/src/IRSend.cpp index 6875f1d..5ad224d 100644 --- a/src/IRSend.cpp +++ b/src/IRSend.cpp @@ -44,7 +44,7 @@ bool IRSend::startRMT(uint8_t timing) rmt_tx.tx_config.idle_output_en = RMT_TX_IDLE_EN; if (rmt_config(&rmt_tx) != ESP_OK) return false; if (rmt_driver_install(rmt_tx.channel, 0, 0) != ESP_OK) return false; - if (rmt_set_gpio(_channel, RMT_MODE_TX, _tx_pin, timing_groups[timing].invert) != ESP_OK) return false; + if (rmt_set_gpio(_channel, RMT_MODE_TX, _tx_pin, false) != ESP_OK) return false; _timing = timing; return true; } From b69c81cf7f7ad61ae7f20f641ba570b062fac338 Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Sun, 17 Oct 2021 05:53:52 -0700 Subject: [PATCH 08/12] need to set the rmt source clock for some hardware --- src/IRRecv.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/IRRecv.cpp b/src/IRRecv.cpp index fb92e12..eb7aa63 100644 --- a/src/IRRecv.cpp +++ b/src/IRRecv.cpp @@ -31,6 +31,7 @@ bool IRRecv::start(gpio_num_t rx_pin) rmt_rx.rx_config.idle_threshold = RMT_IDLE_TIMEOUT; if (rmt_config(&rmt_rx) != ESP_OK) return false; + if (rmt_set_source_clk(_channel, RMT_BASECLK_APB) != ESP_OK) return false; if (rmt_driver_install(_channel, RMT_RX_BUF_SIZE, 0) != ESP_OK) return false; _rb = NULL; rmt_get_ringbuf_handle(_channel, &_rb); From 4547ae5c4a11516cae204a9f59d3e9c185a036fd Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Sun, 17 Oct 2021 06:03:39 -0700 Subject: [PATCH 09/12] add #if for rmt_set_pin vs rmt_set_gpio based on IDF version --- src/IRSend.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/IRSend.cpp b/src/IRSend.cpp index 5ad224d..8941288 100644 --- a/src/IRSend.cpp +++ b/src/IRSend.cpp @@ -44,7 +44,11 @@ bool IRSend::startRMT(uint8_t timing) rmt_tx.tx_config.idle_output_en = RMT_TX_IDLE_EN; if (rmt_config(&rmt_tx) != ESP_OK) return false; if (rmt_driver_install(rmt_tx.channel, 0, 0) != ESP_OK) return false; +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4,4,0) // versions after 4.3.X changed `rmt_set_pin` to `rmt_set_gpio` if (rmt_set_gpio(_channel, RMT_MODE_TX, _tx_pin, false) != ESP_OK) return false; +#else + if (rmt_set_pin(_channel, RMT_MODE_TX, _tx_pin) != ESP_OK) return false; +#endif _timing = timing; return true; } From d648729d9b333d9ed8e7b369f9f454071a11bba4 Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Sun, 17 Oct 2021 06:12:59 -0700 Subject: [PATCH 10/12] #if for vRingbufferGetInfo() change in IDF 4+ --- src/IRRecv.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/IRRecv.cpp b/src/IRRecv.cpp index eb7aa63..3a77759 100644 --- a/src/IRRecv.cpp +++ b/src/IRRecv.cpp @@ -47,7 +47,11 @@ int8_t IRRecv::available() { if (!_active) return -1; UBaseType_t waiting; +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4,0,0) // versions 4+ added an extra arg to vRingbufferGetInfo vRingbufferGetInfo(_rb, NULL, NULL, NULL, NULL, &waiting); +#else + vRingbufferGetInfo(_rb, NULL, NULL, NULL, &waiting); +#endif return waiting; } From 7f440d283d3ecac7386ecc8d9d59892bc99ee215 Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Mon, 18 Oct 2021 11:03:47 -0700 Subject: [PATCH 11/12] Correct fix for source clk. Turns out flags field was not set. --- src/IRRecv.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/IRRecv.cpp b/src/IRRecv.cpp index 3a77759..d773f03 100644 --- a/src/IRRecv.cpp +++ b/src/IRRecv.cpp @@ -20,9 +20,7 @@ IRRecv::IRRecv(rmt_channel_t channel) bool IRRecv::start(gpio_num_t rx_pin) { - rmt_config_t rmt_rx; - rmt_rx.channel = _channel; - rmt_rx.gpio_num = rx_pin; + rmt_config_t rmt_rx = RMT_DEFAULT_CONFIG_RX(rx_pin, _channel); rmt_rx.clk_div = RMT_CLK_DIV; rmt_rx.mem_block_num = 1; rmt_rx.rmt_mode = RMT_MODE_RX; @@ -31,7 +29,6 @@ bool IRRecv::start(gpio_num_t rx_pin) rmt_rx.rx_config.idle_threshold = RMT_IDLE_TIMEOUT; if (rmt_config(&rmt_rx) != ESP_OK) return false; - if (rmt_set_source_clk(_channel, RMT_BASECLK_APB) != ESP_OK) return false; if (rmt_driver_install(_channel, RMT_RX_BUF_SIZE, 0) != ESP_OK) return false; _rb = NULL; rmt_get_ringbuf_handle(_channel, &_rb); From 00004c1124046039692cf7e7cc1b15d0c87e4435 Mon Sep 17 00:00:00 2001 From: Christopher Liebman Date: Mon, 18 Oct 2021 11:06:35 -0700 Subject: [PATCH 12/12] apply initialization change to TX as well --- src/IRSend.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/IRSend.cpp b/src/IRSend.cpp index 8941288..42a032b 100644 --- a/src/IRSend.cpp +++ b/src/IRSend.cpp @@ -29,9 +29,7 @@ uint8_t findGroup(const char* timingGroup) bool IRSend::startRMT(uint8_t timing) { - rmt_config_t rmt_tx; - rmt_tx.channel = _channel; - rmt_tx.gpio_num = _tx_pin; + rmt_config_t rmt_tx = RMT_DEFAULT_CONFIG_TX(_tx_pin, _channel); rmt_tx.clk_div = RMT_CLK_DIV; rmt_tx.mem_block_num = 1; rmt_tx.rmt_mode = RMT_MODE_TX;