Ver Fonte

MQTT to RMT TX connected

Thomas Chef há 2 anos atrás
pai
commit
4f76c48d72
8 ficheiros alterados com 42 adições e 43 exclusões
  1. 34 7
      main/ir_transmit.c
  2. 4 1
      main/ir_transmit.h
  3. 3 1
      main/main.c
  4. 1 1
      main/mqtt.c
  5. 0 8
      main/receiver.c
  6. 0 1
      main/receiver.h
  7. 0 23
      main/toshiba_ir.c
  8. 0 1
      main/toshiba_ir.h

+ 34 - 7
main/ir_transmit.c

@@ -16,6 +16,37 @@
 // Variable that holds the IR protocol transmission. 1 start bit, 72 data bits and one stop bit
 rmt_item32_t toshiba_rmt[1 + 72 + 1 + 1];
 
+QueueHandle_t toshibaTxQueue = NULL;
+
+void toshibaTxTask(void *pvParameter)
+{
+	ESP_LOGI("TX", "toshibaTxTask() starting.");
+
+	uint8_t data[8];
+    	
+	while( true ) {
+		if( xQueueReceive( toshibaTxQueue, data, 100 ) == pdTRUE ) {
+			ESP_LOGI("TOSHIBA","Received a TX from MQTT");
+
+			uint8_t irPair = 1;
+			for(uint8_t b=0;b<kToshibaNumberOfBits;b++) {
+				
+				uint8_t byteNo = b / 8;
+				uint8_t shiftBits = b % 8;
+				uint8_t bit_data = (1u << (7-shiftBits)) & data[byteNo];
+				uint32_t space = bit_data ? kToshibaAcOneSpace : kToshibaAcZeroSpace;
+
+				toshiba_rmt[irPair].val = (kToshibaAcBitMark << 0) | (1 << 15) | (space << 16);    // Header of IR Transmit 
+
+				irPair++;
+			}
+
+			ESP_ERROR_CHECK(rmt_write_items(RMT_TX_CHANNEL, &(toshiba_rmt[0]), 1+72+1, true));
+		}
+	}
+}
+
+
 
 void initIrTransmit() {
 
@@ -50,12 +81,8 @@ void initIrTransmit() {
         toshiba_rmt[i].val = (kToshibaAcBitMark << 0) | (1 << 15) | (kToshibaAcZeroSpace << 16);    // Header of IR Transmit
     }
 
+    toshibaTxQueue = xQueueCreate( 5, kToshibaNumberOfBytes );
+	xTaskCreatePinnedToCore(toshibaTxTask, "toshibaTxTask", 1024*10, NULL, 2, NULL,0);
+
 	ESP_LOGI("IR_TX","Init done.");
 }
-
-void sendToshibaIRData() {
-
-    ESP_LOGI("IR_TX","Send test-code");
-    ESP_ERROR_CHECK(rmt_write_items(RMT_TX_CHANNEL, &(toshiba_rmt[0]), 1+72+1, true));
-    ESP_LOGI("IR_TX","Send done....");
-}

+ 4 - 1
main/ir_transmit.h

@@ -1,4 +1,7 @@
+#include "freertos/queue.h"
+
 
 
 void initIrTransmit();
-void sendToshibaIRData();
+
+extern QueueHandle_t toshibaTxQueue;

+ 3 - 1
main/main.c

@@ -57,7 +57,9 @@ initIrTransmit();
 
         vTaskDelayUntil( &vLastWakeTime, 1000 / portTICK_PERIOD_MS );
 
-        sendToshibaIRData();
+        ESP_LOGI("MAIN","Send IR Tx Data");
+        uint8_t data[8];
+        xQueueSend( toshibaTxQueue, &data, 0 );
 
     }
 

+ 1 - 1
main/mqtt.c

@@ -143,7 +143,7 @@ void mqttTask(void *pvParameters) {
     esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, client);
     esp_mqtt_client_start(client);
 
-    vTaskDelete(NULL);
+    ESP_LOGI("TX", "toshibaTxTask() starting.");
 }
 
 

+ 0 - 8
main/receiver.c

@@ -29,7 +29,6 @@
 uint32_t dataArr[1000];
 uint32_t dataArrIdx = 0;
 
-QueueHandle_t toshibaTxQueue = NULL;
 
 
 
@@ -44,12 +43,6 @@ void receiverTask(void *pvParameter)
 
     while (1) {
 
-        while( xQueueReceive( toshibaTxQueue, data, 100 ) == pdTRUE ) {
-
-            ESP_LOGI("TOSHIBA","Received a TX from MQTT");
-            sendToshibaIRCode(data);
-        }
-
         while( xQueueReceive( rxQueue, &width, 100 ) == pdTRUE ) {
 
             //ESP_LOGI("D", "%u", width);
@@ -92,7 +85,6 @@ void initReceiver() {
 
     Toshiba_ir_ResetDecoder();
 
-    toshibaTxQueue = xQueueCreate( 5, kToshibaNumberOfBytes );
             
     ESP_LOGI("RX", "Receiver has been initialized.");
 

+ 0 - 1
main/receiver.h

@@ -6,7 +6,6 @@ void initReceiver();
 extern uint32_t dataArr[1000];
 extern uint32_t dataArrIdx;
 
-extern QueueHandle_t toshibaTxQueue;
 
 
 #endif

+ 0 - 23
main/toshiba_ir.c

@@ -36,29 +36,6 @@ uint8_t xorBytes(const uint8_t * const start, const uint16_t length);
 uint8_t data[kToshibaNumberOfBytes];            // Temp data during rx
 uint8_t dataTransfer[kToshibaNumberOfBytes];    // Send as pointer to receiver
 
-void sendToshibaIRCode(uint8_t *data) {
-
-    gpio_set_level(GPIO_IR_TX_DATA, 1);
-    delayMicroseconds(kToshibaAcHdrMark);
-    gpio_set_level(GPIO_IR_TX_DATA, 0);
-    delayMicroseconds(kToshibaAcHdrSpace);
-
-    for(uint8_t b=0;b<kToshibaNumberOfBits;b++) {
-        const uint8_t byteNo = b / 8;
-        const uint8_t shiftBits = b % 8;
-        gpio_set_level(GPIO_IR_TX_DATA, 1);
-        delayMicroseconds(kToshibaAcBitMark);
-
-        gpio_set_level(GPIO_IR_TX_DATA, 0);
-        const uint8_t bit_data = (1u << (7-shiftBits)) & data[byteNo];
-        delayMicroseconds( bit_data ? kToshibaAcOneSpace : kToshibaAcZeroSpace );
-    }
-    gpio_set_level(GPIO_IR_TX_DATA, 1);
-    delayMicroseconds(kToshibaAcHdrMark);
-    gpio_set_level(GPIO_IR_TX_DATA, 0);
-    delayMicroseconds(kToshibaAcUsualGap);
-}
-
 enum
 {
     UNKNOWN,

+ 0 - 1
main/toshiba_ir.h

@@ -15,7 +15,6 @@ const uint32_t kToshibaAcUsualGap = 7960;  // Others
 void Toshiba_ir_ResetDecoder ();
 
 uint8_t* nextPulseToshiba_ir(uint32_t width);
-void sendToshibaIRCode(uint8_t *data);
 
 #define kToshibaNumberOfBits 72
 #define kToshibaNumberOfBytes (kToshibaNumberOfBits/8)