domotic/components/eventsManager/eventsManager.c
2026-02-24 16:30:24 +01:00

191 lines
6.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <string.h>
#include "eventsManager.h"
#include "esp_log.h"
#include "mqtt_client.h"
#include "obtain_time.h"
#include <time.h>
#include "meteofrance.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 = getIHMQueueHandle();
/* Tache updateTime */
BaseType_t ret2 = xTaskCreate(&updateTime, "updateTimeTask", 3 * 1024, NULL, 5, NULL);
if (ret2 != pdPASS)
{
ESP_LOGE(TAG, "Impossiblke de creer la tache updateTimeTask %i", ret2);
}
/* Tache updateTime - FIN*/
}
void send_event(domo_events evt, void* pDatas) {
ESP_LOGV(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:
struct tm *msg = (struct tm *)pDatas;
struct tm *msg_copy = malloc(sizeof(struct tm));
if (!msg_copy)
{
ESP_LOGE(TAG, "malloc failed for message string");
free(ihmEvt);
return;
}
// Vérifier que msg n'est pas NULL avant de copier
if (msg == NULL)
{
fprintf(stderr, "msg est NULL !\n");
free(msg_copy);
return;
}
*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_TEMP_EXT:
const char *msg3 = (const char *)pDatas;
char *msg_copy3 = malloc(strlen(msg3) + 1);
if (!msg_copy3) {
ESP_LOGE(TAG, "malloc failed for message string");
free(ihmEvt);
return;
}
strcpy(msg_copy3, msg3);
ihmEvt->eEventType = IHM_EVT_TEMP_RECUE;
ihmEvt->pvData = msg_copy3;
ihmEvt->bNeedToFreeData = true;
break;
case EVT_TEMP_INT:
const char *msg4 = (const char *)pDatas;
char *msg_copy4 = malloc(strlen(msg4) + 1);
if (!msg_copy4) {
ESP_LOGE(TAG, "malloc failed for message string");
free(ihmEvt);
return;
}
strcpy(msg_copy4, msg4);
ihmEvt->eEventType = IHM_EVT_HUMID_TEMP;
ihmEvt->pvData = msg_copy4;
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;
}
case EVT_METEO_RECUE:{
meteo_event_payload_t *incoming = (meteo_event_payload_t *) pDatas;
meteo_event_payload_t *payload = malloc(sizeof(meteo_event_payload_t));
if (payload == NULL) {
// gérer lerreur
return;
}
memcpy(payload->daily, incoming->daily, sizeof(incoming->daily));
memcpy(payload->forecast, incoming->forecast, sizeof(incoming->forecast));
ihmEvt->eEventType = IHM_EVT_METEO_RECUE;
ihmEvt->pvData = payload;
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( ihm_queue != NULL && ihmEvt){
if (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);
}
}
}