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_ diff --git a/src/IRRecv.cpp b/src/IRRecv.cpp index 77838d5..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; @@ -46,7 +44,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; } @@ -91,7 +93,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)) { @@ -115,11 +117,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; @@ -127,9 +130,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); - //dump_item(item,rx_size); uint32_t rx_data; uint8_t found_timing = 0; for (uint8_t timing : _preferred) { @@ -139,7 +139,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 + // 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++) { if (!inPrefVector(timing)) { @@ -153,12 +156,21 @@ uint32_t IRRecv::read(char* &timingGroup, bool preferredOnly) } 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::setDumpUnknown(bool dump) {_dump_unknown = dump;} + uint8_t timingGroupElement(const char* tag) { uint8_t counter = 0; @@ -198,7 +210,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..2a72ced 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 { @@ -16,6 +17,7 @@ class IRRecv int8_t available(); uint32_t read(char* &timingGroup, bool preferredOnly=false); void setMargin(uint16_t margin_us); + void setDumpUnknown(bool dump); bool inPrefVector(uint8_t element); int setPreferred(const char* timing_group); int setPreferred(String timing_group); @@ -35,5 +37,6 @@ class IRRecv std::vector _preferred; RingbufHandle_t _rb = NULL; bool _active = false; + bool _dump_unknown = false; }; #endif // _IRRECV_H_ diff --git a/src/IRSend.cpp b/src/IRSend.cpp index 2756b82..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; @@ -44,7 +42,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; }