diff --git a/components/services/infrared.c b/components/services/infrared.c index 444fa78b..623e11ae 100644 --- a/components/services/infrared.c +++ b/components/services/infrared.c @@ -66,17 +66,6 @@ struct ir_parser_s { * - ESP_FAIL: Get scan code failed because some error occurred */ esp_err_t (*get_scan_code)(ir_parser_t *parser, uint32_t *address, uint32_t *command, bool *repeat); - - /** - * @brief Free resources used by IR parser - * - * @param[in] parser: Handle of IR parser - * - * @return - * - ESP_OK: Free resource successfully - * - ESP_FAIL: Free resources fail failed because some error occurred - */ - esp_err_t (*del)(ir_parser_t *parser); }; typedef struct { @@ -251,7 +240,6 @@ static esp_err_t nec_parser_get_scan_code(ir_parser_t *parser, uint32_t *address uint32_t cmd = 0; bool logic_value = false; nec_parser_t *nec_parser = __containerof(parser, nec_parser_t, parent); - RMT_CHECK(address && command && repeat, "address, command and repeat can't be null", out, ESP_ERR_INVALID_ARG); if (nec_parser->repeat) { if (nec_parse_repeat_frame(nec_parser)) { *address = nec_parser->last_address; @@ -281,19 +269,9 @@ static esp_err_t nec_parser_get_scan_code(ir_parser_t *parser, uint32_t *address ret = ESP_OK; } } -out: return ret; } -/**************************************************************************************** - * - */ -static esp_err_t nec_parser_del(ir_parser_t *parser) { - nec_parser_t *nec_parser = __containerof(parser, nec_parser_t, parent); - free(nec_parser); - return ESP_OK; -} - /**************************************************************************************** * */ @@ -321,7 +299,6 @@ ir_parser_t *ir_parser_rmt_new_nec(const ir_parser_config_t *config) { nec_parser->margin_ticks = (uint32_t)(ratio * config->margin_us); nec_parser->parent.input = nec_parser_input; nec_parser->parent.get_scan_code = nec_parser_get_scan_code; - nec_parser->parent.del = nec_parser_del; return &nec_parser->parent; err: return ret; @@ -396,7 +373,6 @@ static esp_err_t rc5_parser_get_scan_code(ir_parser_t *parser, uint32_t *address bool t = false; bool exchange = false; rc5_parser_t *rc5_parser = __containerof(parser, rc5_parser_t, parent); - RMT_CHECK(address && command && repeat, "address, command and repeat can't be null", out, ESP_ERR_INVALID_ARG); for (int i = 0; i < rc5_parser->buffer_len; i++) { if (rc5_duration_one_unit(rc5_parser, rc5_parser->buffer[i].duration0)) { parse_result <<= 1; @@ -445,15 +421,6 @@ out: return ret; } -/**************************************************************************************** - * - */ -static esp_err_t rc5_parser_del(ir_parser_t *parser) { - rc5_parser_t *rc5_parser = __containerof(parser, rc5_parser_t, parent); - free(rc5_parser); - return ESP_OK; -} - /**************************************************************************************** * */ @@ -471,7 +438,6 @@ ir_parser_t *ir_parser_rmt_new_rc5(const ir_parser_config_t *config) { rc5_parser->margin_ticks = (uint32_t)(ratio * config->margin_us); rc5_parser->parent.input = rc5_parser_input; rc5_parser->parent.get_scan_code = rc5_parser_get_scan_code; - rc5_parser->parent.del = rc5_parser_del; return &rc5_parser->parent; err: return ret; @@ -488,16 +454,24 @@ void infrared_receive(RingbufHandle_t rb, infrared_handler handler) { if (item) { uint32_t addr, cmd; bool repeat = false; + bool decoded = false; rx_size /= 4; // one RMT = 4 Bytes if (ir_parser->input(ir_parser, item, rx_size) == ESP_OK) { if (ir_parser->get_scan_code(ir_parser, &addr, &cmd, &repeat) == ESP_OK) { + decoded = true; handler(addr, cmd); ESP_LOGI(TAG, "Scan Code %s --- addr: 0x%04x cmd: 0x%04x", repeat ? "(repeat)" : "", addr, cmd); } } + // if we have not decoded data but lenght is reasonnable, dump it + if (!decoded && rx_size > RC5_MAX_FRAME_RMT_WORDS) { + ESP_LOGI(TAG, "can't decode IR signal of len %d", rx_size); + ESP_LOG_BUFFER_HEX(TAG, item, rx_size * 4); + } + // after parsing the data, return spaces to ringbuffer. vRingbufferReturnItem(rb, (void*) item); }