// ihm_gateway.c #include "ihm_gateway.h" #include "ihm.h" #include #include #include "platform_detect.h" #include "cJSON.h" #include "esp_log.h" #include "washingMachineState.h" static const char *TAG = "IHM_GW"; static QueueHandle_t xIHMEventQueue = NULL; QueueHandle_t getIHMQueueHandle(void) { return xIHMEventQueue; } void ihm_gateway_init(void) { if (!xIHMEventQueue) { xIHMEventQueue = xQueueCreate(32, sizeof(xIHMEvent_t *)); } } void ihm_gateway_post_event(xIHMEvent_t *evt) { if (!xIHMEventQueue) return; if (platform_is_pc()) { xQueueSend(xIHMEventQueue, &evt, 0); // non bloquant sur PC } else { xQueueSend(xIHMEventQueue, &evt, portMAX_DELAY); // bloquant ESP32 } } extern lv_subject_t wifiStatus; void ihm_gateway_process_queue(void) { if (!xIHMEventQueue) return; xIHMEvent_t *evt = NULL; #if CONFIG_IDF_TARGET_LINUX while (xQueueReceive(xIHMEventQueue, &evt, pdMS_TO_TICKS(0)) == pdTRUE) #else while (xQueueReceive(xIHMEventQueue, &evt, pdMS_TO_TICKS(10)) == pdTRUE) #endif { if (!evt) return; UBaseType_t pending = uxQueueMessagesWaiting(xIHMEventQueue); ESP_LOGE(TAG,"Evt recu %d. La queue comporte %d éléments à traiter", evt->eEventType, pending); lv_async_call(traiteEvt, evt); } } void traiteEvt(void *arg) { xIHMEvent_t *evt = (xIHMEvent_t *)arg; switch (evt->eEventType) { case IHM_EVT_WIFI_STATUS: lv_subject_set_int(&wifiStatus, *(bool *)evt->pvData); break; case IHM_EVT_TIME_SETTED: draw_time(evt->pvData); break; case IHM_EVT_OTA_STARTED: app_ota_display(); break; case IHM_EVT_HUMID_TEMP: draw_temp((char *)evt->pvData); break; case IHM_EVT_PUISSANCE_EMISE: { int val = *(int *)evt->pvData; // if(val == 0) lv_chart_set_next_value(myChart, ser, LV_CHART_POINT_NONE); // else lv_chart_set_next_value(myChart, ser, val); break; } case IHM_EVT_ETAT_MACHINE: { char *etatMachine = evt->pvData; WashingMachineState wms = traiteMessage(etatMachine); char etat[80]; getEtatMachineStr(wms, etat,80); ESP_LOGE(TAG,"Etat machine : %s", etat); // lv_label_set_text(lblEtatMachine, etatFormate); break; } case IHM_EVT_HAUTEUR_CUVE: { float hauteur = *(float *)evt->pvData; // lv_label_set_text_fmt(lblHauteurCuve, "%.0f cm", hauteur); break; } default: ESP_LOGE(TAG, "Evt inconnu"); break; } // Nettoyage mémoire sécurisé if (evt->bNeedToFreeData && evt->pvData) free(evt->pvData); free(evt); ESP_LOGV(TAG, "Evt traité"); }