domotic/components/eventsManager/eventsManager.c
2025-05-21 20:56:47 +02:00

126 lines
3.8 KiB
C

#include <stdio.h>
#include <string.h>
#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);
}
}