ir_transmit.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include <string.h>
  2. #include "freertos/FreeRTOS.h"
  3. #include "freertos/task.h"
  4. #include "freertos/queue.h"
  5. #include "esp_log.h"
  6. #include "driver/rmt.h"
  7. #include "toshiba_ir.h"
  8. #include "config.h"
  9. #ifdef IR_TRANSMIT
  10. // RMT values
  11. #define RMT_TX_CHANNEL RMT_CHANNEL_0
  12. #define RMT_TX_GPIO GPIO_NUM_26
  13. // channel clock period = 1 uS
  14. #define RMT_CLK_DIV 80
  15. // Variable that holds the IR protocol transmission. 1 start bit, 72 data bits and one stop bit
  16. rmt_item32_t toshiba_rmt[1 + 72 + 1 + 1];
  17. QueueHandle_t toshibaTxQueue = NULL;
  18. void toshibaTxTask(void *pvParameter)
  19. {
  20. ESP_LOGI("IR_TRANSMIT", "toshibaTxTask() starting.");
  21. uint8_t data[8];
  22. while( true ) {
  23. if( xQueueReceive( toshibaTxQueue, data, 100 ) == pdTRUE ) {
  24. ESP_LOGI("IR_TRANSMIT","Received a TX from MQTT");
  25. uint8_t irPair = 1;
  26. for(uint8_t b=0;b<kToshibaNumberOfBits;b++) {
  27. uint8_t byteNo = b / 8;
  28. uint8_t shiftBits = b % 8;
  29. uint8_t bit_data = (1u << (7-shiftBits)) & data[byteNo];
  30. uint32_t space = bit_data ? kToshibaAcOneSpace : kToshibaAcZeroSpace;
  31. toshiba_rmt[irPair].val = (kToshibaAcBitMark << 0) | (1 << 15) | (space << 16); // Header of IR Transmit
  32. irPair++;
  33. }
  34. ESP_ERROR_CHECK(rmt_write_items(RMT_TX_CHANNEL, &(toshiba_rmt[0]), 1+72+1, true));
  35. }
  36. }
  37. }
  38. void initIrTransmit() {
  39. const esp_err_t uninstRetVal = rmt_driver_uninstall(RMT_TX_CHANNEL);
  40. ESP_LOGI("IR_TRANSMIT","Uninst: %u", uninstRetVal);
  41. rmt_config_t rmt_tx;
  42. memset(&rmt_tx,0,sizeof(rmt_config_t));
  43. rmt_tx.rmt_mode = RMT_MODE_TX;
  44. rmt_tx.channel = RMT_TX_CHANNEL;
  45. rmt_tx.gpio_num = GPIO_IR_TX_DATA;
  46. rmt_tx.mem_block_num = 1;
  47. rmt_tx.clk_div = RMT_CLK_DIV;
  48. rmt_tx.tx_config.loop_en = false;
  49. rmt_tx.tx_config.carrier_duty_percent = 30;
  50. rmt_tx.tx_config.carrier_freq_hz = 38000;
  51. rmt_tx.tx_config.carrier_level = RMT_CARRIER_LEVEL_HIGH;
  52. rmt_tx.tx_config.carrier_en = true;
  53. rmt_tx.tx_config.idle_level = RMT_IDLE_LEVEL_LOW;
  54. rmt_tx.tx_config.idle_output_en = true;
  55. rmt_tx.flags = 0;
  56. ESP_LOGI("IR_TRANSMIT","Install driver....");
  57. ESP_ERROR_CHECK( rmt_config(&rmt_tx) );
  58. const esp_err_t retVal = rmt_driver_install(rmt_tx.channel, 0, 0);
  59. if( retVal != ESP_OK ) {
  60. ESP_LOGE("IR_TRANSMIT","Error on driver install %u",retVal);
  61. return;
  62. }
  63. //ESP_ERROR_CHECK( rmt_driver_install(rmt_tx.channel, 0, 0) );
  64. // Init the ir data field
  65. toshiba_rmt[0].val = (kToshibaAcHdrMark << 0) | (1 << 15) | (kToshibaAcHdrSpace << 16); // Header of IR Transmit
  66. toshiba_rmt[73].val = (kToshibaAcBitMark << 0) | (1 << 15) | (kToshibaAcZeroSpace << 16); // Header of IR Transmit
  67. toshiba_rmt[74].val = (1 << 16); // End marker
  68. // 0x47503FC
  69. // 0x1FE823A
  70. for(int i=1;i<73;i++) {
  71. toshiba_rmt[i].val = (kToshibaAcBitMark << 0) | (1 << 15) | (kToshibaAcZeroSpace << 16); // Header of IR Transmit
  72. }
  73. toshibaTxQueue = xQueueCreate( 5, kPanasonicNumberOfBytes );
  74. xTaskCreatePinnedToCore(toshibaTxTask, "toshibaTxTask", 1024*10, NULL, 2, NULL,0);
  75. ESP_LOGI("IR_TRANSMIT","Init done.");
  76. }
  77. #endif