#include "send.h" #include "mqtt.h" #include "esp_log.h" #include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "config.h" #ifdef ENABLE_SEND #define QUEUE_SIZE 3 static QueueHandle_t dataQueue = NULL; static bool queueReady = false; void sendTask(void *pvParameters) { uint8_t aliveCnt = 0; DisplayData data; char txt[50]; ESP_LOGI("DISPnSND", "SendTask starting. Core:%d",xPortGetCoreID()); // Create the data input queue, now that all is setup dataQueue = xQueueCreate( QUEUE_SIZE, sizeof( DisplayData ) ); if(dataQueue == NULL) { ESP_LOGE("DISPnSND","Error creating the queue"); } ESP_LOGI("DISPnSND", "Data input queue ready."); queueReady = true; while( 1 ) { if( xQueueReceive(dataQueue,&data, 1000 / portTICK_PERIOD_MS) == pdTRUE ) { switch( data.type ) { case type_VPP: sprintf(txt," %d",data.iData); sprintf(txt,"%d",data.iData); sendMQTTMessage("homeEnergyMeter/waterHeater/totalEnergy", txt); aliveCnt++; break; case type_TempA: sprintf(txt,"%.2f",data.dData); sendMQTTMessage("homeEnergyMeter/internal/temp", txt); break; case type_TempB: sprintf(txt,"%.2f",data.dData); sendMQTTMessage("homeEnergyMeter/waterHeater/temp", txt); break; case type_kWh: sprintf(txt,"%.5f",data.dData); sendMQTTMessage("homeEnergyMeter/electricityMeter/kWh", txt); sprintf(txt,"%d",data.iData); sendMQTTMessage("homeEnergyMeter/electricityMeter/pulses", txt); break; default: break; } } } vTaskDelete(NULL); } void addDataToQueue(int data_type, double dData_in, int iData_in) { DisplayData d; d.type = data_type; d.dData = dData_in; d.iData = iData_in; if( queueReady == true && dataQueue != NULL ) { if( xQueueSend(dataQueue, &d, 0) != pdPASS ) { ESP_LOGE("DISPnSND","Queue full"); } } else { ESP_LOGE("DISPnSND","Queue not ready."); } } void initSend() { xTaskCreate(sendTask, "Send-Task", 1024*10, NULL, 2, NULL); } #endif