#include #include #include "eventsManager.h" #include "esp_log.h" #include "mqtt_client.h" EventGroupHandle_t domotic_event_group; QueueHandle_t ihm_queue; extern esp_mqtt_client_handle_t client; static const char *TAG = "evtMgr"; void startEvtManager(){ domotic_event_group = xEventGroupCreate(); ihm_queue = xQueueCreate(10,sizeof(xIHMEvent_t *)); } QueueHandle_t getIHMQueueHandle(){ return ihm_queue; } void send_event(domo_events evt, void* pDatas) { ESP_LOGE(TAG,"On est dans l'event handler %i", evt); xIHMEvent_t *ihmEvt = malloc(sizeof(xIHMEvent_t)); if (!ihmEvt) { ESP_LOGE(TAG, "malloc failed for event struct"); return; } switch (evt) { case EVT_WIFI_CONNECTED: { xEventGroupSetBits(domotic_event_group, WIFI_CONNECTED_BIT); ESP_LOGI(TAG, "connected to AP SSID"); bool *wifiStatus = malloc(sizeof(bool)); if (!wifiStatus) { ESP_LOGE(TAG, "malloc failed for wifiStatus"); free(ihmEvt); return; } *wifiStatus = true; ihmEvt->eEventType = IHM_EVT_WIFI_STATUS; ihmEvt->pvData = wifiStatus; ihmEvt->bNeedToFreeData = true; break; } case EVT_TIME_SETTED: const char *msg = (const char *)pDatas; char *msg_copy = malloc(strlen(msg) + 1); if (!msg_copy) { ESP_LOGE(TAG, "malloc failed for message string"); free(ihmEvt); return; } strcpy(msg_copy, msg); ihmEvt->eEventType = IHM_EVT_TIME_SETTED; ihmEvt->pvData = msg_copy; ihmEvt->bNeedToFreeData = true; break; case EVT_BTN_VOLET: esp_mqtt_client_publish(client, "volets", pDatas, 0, 0, 0); free(ihmEvt); // rien à envoyer à l'IHM return; case EVT_PUISSANCE_RECUE: ESP_LOGE(TAG, "Puissance recue %i", *(int*)pDatas); int *data = malloc(sizeof(int)); if (!data) { ESP_LOGE(TAG, "malloc failed for puissance_5mn"); free(ihmEvt); return; } *data = *(int *)pDatas; ihmEvt->eEventType = IHM_EVT_PUISSANCE_EMISE; ihmEvt->pvData = data; ihmEvt->bNeedToFreeData = true; break; case EVT_ETAT_MACHINE: const char *msg2 = (const char *)pDatas; char *msg_copy2 = malloc(strlen(msg2) + 1); if (!msg_copy2) { ESP_LOGE(TAG, "malloc failed for message string"); free(ihmEvt); return; } strcpy(msg_copy2, msg2); ihmEvt->eEventType = IHM_EVT_ETAT_MACHINE; ihmEvt->pvData = msg_copy2; ihmEvt->bNeedToFreeData = true; break; case EVT_HAUTEUR_CUVE: { float *data = malloc(sizeof(float)); if (!data) { ESP_LOGE(TAG, "malloc failed for hauteur_cuve"); free(ihmEvt); return; } *data = *(float *)pDatas; ESP_LOGE(TAG, "EVENT_HANDLER -> On a recu %f", *data); ihmEvt->eEventType = IHM_EVT_HAUTEUR_CUVE; ihmEvt->pvData = data; ihmEvt->bNeedToFreeData = true; break; } default: ESP_LOGE(TAG, "Unhandled event type"); free(ihmEvt); return; } ESP_LOGE(TAG, "Envoi d'un evt %i a l'IHM", ihmEvt->eEventType); if (ihmEvt && xQueueSendToFront(ihm_queue, &ihmEvt, pdMS_TO_TICKS(10)) != pdPASS) { ESP_LOGE(TAG, "La queue est pleine"); if (ihmEvt->bNeedToFreeData && ihmEvt->pvData) { free(ihmEvt->pvData); } free(ihmEvt); } }