| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- /* IR protocols example
- This example code is in the Public Domain (or CC0 licensed, at your option.)
- Unless required by applicable law or agreed to in writing, this
- software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- CONDITIONS OF ANY KIND, either express or implied.
- */
- #include <stdio.h>
- #include <string.h>
- #include "sdkconfig.h"
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "esp_log.h"
- #include "driver/rmt.h"
- #include "ir_tools.h"
- static const char *TAG = "example";
- static rmt_channel_t example_tx_channel = RMT_CHANNEL_0;
- static rmt_channel_t example_rx_channel = RMT_CHANNEL_1;
- /**
- * @brief RMT Receive Task
- *
- */
- static void example_ir_rx_task(void *arg)
- {
- uint32_t addr = 0;
- uint32_t cmd = 0;
- uint32_t length = 0;
- bool repeat = false;
- RingbufHandle_t rb = NULL;
- rmt_item32_t *items = NULL;
- rmt_config_t rmt_rx_config = RMT_DEFAULT_CONFIG_RX(CONFIG_EXAMPLE_RMT_RX_GPIO, example_rx_channel);
- rmt_config(&rmt_rx_config);
- rmt_driver_install(example_rx_channel, 1000, 0);
- ir_parser_config_t ir_parser_config = IR_PARSER_DEFAULT_CONFIG((ir_dev_t)example_rx_channel);
- ir_parser_config.flags |= IR_TOOLS_FLAGS_PROTO_EXT; // Using extended IR protocols (both NEC and RC5 have extended version)
- ir_parser_t *ir_parser = NULL;
- #if CONFIG_EXAMPLE_IR_PROTOCOL_NEC
- ir_parser = ir_parser_rmt_new_nec(&ir_parser_config);
- #elif CONFIG_EXAMPLE_IR_PROTOCOL_RC5
- ir_parser = ir_parser_rmt_new_rc5(&ir_parser_config);
- #endif
- //get RMT RX ringbuffer
- rmt_get_ringbuf_handle(example_rx_channel, &rb);
- // Start receive
- rmt_rx_start(example_rx_channel, true);
- while (rb) {
- items = (rmt_item32_t *) xRingbufferReceive(rb, &length, 1000);
- if (items) {
- length /= 4; // one RMT = 4 Bytes
- if (ir_parser->input(ir_parser, items, length) == ESP_OK) {
- if (ir_parser->get_scan_code(ir_parser, &addr, &cmd, &repeat) == ESP_OK) {
- ESP_LOGI(TAG, "Scan Code %s --- addr: 0x%04x cmd: 0x%04x", repeat ? "(repeat)" : "", addr, cmd);
- }
- }
- //after parsing the data, return spaces to ringbuffer.
- vRingbufferReturnItem(rb, (void *) items);
- } else {
- break;
- }
- }
- ir_parser->del(ir_parser);
- rmt_driver_uninstall(example_rx_channel);
- vTaskDelete(NULL);
- }
- /**
- * @brief RMT Transmit Task
- *
- */
- static void example_ir_tx_task(void *arg)
- {
- uint32_t addr = 0x10;
- uint32_t cmd = 0x20;
- rmt_item32_t *items = NULL;
- uint32_t length = 0;
- ir_builder_t *ir_builder = NULL;
- rmt_config_t rmt_tx_config = RMT_DEFAULT_CONFIG_TX(CONFIG_EXAMPLE_RMT_TX_GPIO, example_tx_channel);
- rmt_tx_config.tx_config.carrier_en = true;
- rmt_config(&rmt_tx_config);
- rmt_driver_install(example_tx_channel, 0, 0);
- ir_builder_config_t ir_builder_config = IR_BUILDER_DEFAULT_CONFIG((ir_dev_t)example_tx_channel);
- ir_builder_config.flags |= IR_TOOLS_FLAGS_PROTO_EXT; // Using extended IR protocols (both NEC and RC5 have extended version)
- #if CONFIG_EXAMPLE_IR_PROTOCOL_NEC
- ir_builder = ir_builder_rmt_new_nec(&ir_builder_config);
- #elif CONFIG_EXAMPLE_IR_PROTOCOL_RC5
- ir_builder = ir_builder_rmt_new_rc5(&ir_builder_config);
- #endif
- while (1) {
- vTaskDelay(pdMS_TO_TICKS(2000));
- ESP_LOGI(TAG, "Send command 0x%x to address 0x%x", cmd, addr);
- // Send new key code
- ESP_ERROR_CHECK(ir_builder->build_frame(ir_builder, addr, cmd));
- ESP_ERROR_CHECK(ir_builder->get_result(ir_builder, &items, &length));
- //To send data according to the waveform items.
- rmt_write_items(example_tx_channel, items, length, false);
- // Send repeat code
- vTaskDelay(pdMS_TO_TICKS(ir_builder->repeat_period_ms));
- ESP_ERROR_CHECK(ir_builder->build_repeat_frame(ir_builder));
- ESP_ERROR_CHECK(ir_builder->get_result(ir_builder, &items, &length));
- rmt_write_items(example_tx_channel, items, length, false);
- cmd++;
- }
- ir_builder->del(ir_builder);
- rmt_driver_uninstall(example_tx_channel);
- vTaskDelete(NULL);
- }
- void app_main(void)
- {
- xTaskCreate(example_ir_rx_task, "ir_rx_task", 2048, NULL, 10, NULL);
- xTaskCreate(example_ir_tx_task, "ir_tx_task", 2048, NULL, 10, NULL);
- }
|