#include #include #include #include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "driver/gpio.h" #include "esp_sleep.h" #include "esp_log.h" #include "driver/uart.h" #include "driver/rtc_io.h" #include "esp_intr_alloc.h" #include "esp_attr.h" #include "driver/timer.h" #include #include "esp_intr_alloc.h" #include "receiver.h" #include "rxTimer.h" #include "toshiba_ir.h" #include "wifi.h" #include "mqtt.h" #ifdef IR_RECEIVER uint32_t dataArr[1000]; uint32_t dataArrIdx = 0; uint8_t bitReverse(uint8_t b) { b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; b = (b & 0xCC) >> 2 | (b & 0x33) << 2; b = (b & 0xAA) >> 1 | (b & 0x55) << 1; return b; } void receiverTask(void *pvParameter) { ESP_LOGI("RX", "Receiver task starting."); uint32_t width; while (1) { // Here we receive every individual pulse that has been detected by the isr-pulse-rx-function: timer_tg0_isr while( xQueueReceive( rxQueue, &width, 100 ) == pdTRUE ) { //ESP_LOGI("D", "%u", width); // Debug to show every received pulse as a separate log line // Receive the Toshiba IR // Send the pulse to the receiver that tries to interpret the pulse union ToshibaProtocolU* data = (union ToshibaProtocolU*)nextPulseToshiba_ir(width); if( data != NULL ) { char mqtt_s[100]; sprintf(mqtt_s,"A %02X%02X%02X%02X%02X%02X%02X%02X",data->raw[0],data->raw[1],data->raw[2],data->raw[3],data->raw[4],data->raw[5],data->raw[6],data->raw[7]); sprintf(mqtt_s,"B %02X%02X%02X%02X%02X%02X%02X%02X",data->raw[8],data->raw[9],data->raw[10],data->raw[11],data->raw[12],data->raw[13],data->raw[14],data->raw[15]); sprintf(mqtt_s,"C %02X%02X%02X",data->raw[16],data->raw[17],data->raw[18]); //ESP_LOGI("TOSHIBA","MQTT: %s", mqtt_s); #ifdef MQTT_ENABLED sendMQTTMessage("hall/ac/ir_cmd_rx", mqtt_s); #endif ESP_LOGI("TOSHIBA", "Data A: %02X%02X%02X%02X%02X%02X%02X%02X",data->raw[0],data->raw[1],data->raw[2],data->raw[3],data->raw[4],data->raw[5],data->raw[6],data->raw[7]); ESP_LOGI("TOSHIBA", "Data B: %02X%02X%02X%02X%02X%02X%02X%02X",data->raw[8],data->raw[9],data->raw[10],data->raw[11],data->raw[12],data->raw[13],data->raw[14],data->raw[15]); ESP_LOGI("TOSHIBA", "Data C: %02X%02X%02X",data->raw[16],data->raw[17],data->raw[18]); const uint8_t tempBits = data->raw[6] & 0x1F; float setTemp = 16.0f + (tempBits>>1); if( tempBits & 0x01 ) setTemp += 0.5f; //ESP_LOGI("TOSHIBA", "Temp: %.1f", setTemp ); const uint8_t fan = data->raw[8]>>4; const uint8_t power = data->raw[5]&0x01; ESP_LOGI("TOSHIBA","Power:%u Temp:%.1f Fan:%u",power,setTemp,fan); #ifdef WIFI_ENABLED //sendUDPMessage(dataStr, true); #endif } } } vTaskDelete(NULL); } void initReceiver() { gpio_pad_select_gpio(GPIO_IR_RX_DATA); gpio_set_direction(GPIO_IR_RX_DATA, GPIO_MODE_INPUT); gpio_pad_select_gpio(GPIO_IR_TX_DATA); gpio_set_direction(GPIO_IR_TX_DATA, GPIO_MODE_OUTPUT); gpio_set_level(GPIO_IR_TX_DATA, 0); Toshiba_ir_ResetDecoder(); ESP_LOGI("RX", "Receiver has been initialized."); xTaskCreatePinnedToCore(&receiverTask, "receiverTask", 8192, NULL, tskIDLE_PRIORITY + 5, NULL, 0); } #endif