// 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; static xIHMEvent_t *evt = NULL; void ihm_gateway_process_queue(void) { if (!xIHMEventQueue) return; #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_LOGV(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); evt->bNeedToFreeData=false; break; case IHM_EVT_OTA_STARTED: app_ota_display(); break; case IHM_EVT_HUMID_TEMP: draw_temp((char *)evt->pvData); evt->bNeedToFreeData=false; break; case IHM_EVT_TEMP_RECUE: draw_tempExt((char *)evt->pvData); evt->bNeedToFreeData=false; 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_LOGI(TAG,"Etat machine : %s", etat); draw_minuteur(etat); // lv_label_set_text(lblEtatMachine, etatFormate); break; } case IHM_EVT_MACHINE_TERMINEE: { draw_minuteurStop(); } case IHM_EVT_HAUTEUR_CUVE: { float hauteur = *(float *)evt->pvData; // lv_label_set_text_fmt(lblHauteurCuve, "%.0f cm", hauteur); break; } case IHM_EVT_METEO_RECUE:{ //(void *)evt->pvData; // Pointeur sur tableau //(void *)evt->pvData ESP_LOGI(TAG, "Reception evt MF"); // On ne veut liberer la memoire que lorsque l'evenement aura été traité! evt->bNeedToFreeData=false; meteo_event_payload_t *datas = (meteo_event_payload_t *) evt->pvData; for (size_t i = 0; i < 3; i++) { ESP_LOGI(TAG,"Type: %s - Valide : %d - %s", datas->daily[i].type, datas->daily[i].isValid, datas->daily[i].previsions.desc); } for (size_t i = 0; i < 3; i++) { ESP_LOGI(TAG,"Type: %s - Valide : %d - %s - %s - %f", datas->forecast[i].type, datas->forecast[i].isValid, datas->forecast[i].previsions.desc, datas->forecast[i].previsions.icon, datas->forecast[i].previsions.value); } draw_meteo(datas); //lv_subject_set_int(&meteoStatus, 0); //display_unlock("weather_data_retreived"); ESP_LOGI(TAG, "Fin Reception evt MF"); break; } default: ESP_LOGE(TAG, "Evt inconnu"); break; } // Nettoyage mémoire sécurisé if (evt->bNeedToFreeData && evt->pvData){ //ESP_LOGE(TAG, "Libération mémoire"); free(evt->pvData); } free(evt); ESP_LOGV(TAG, "Evt traité"); }