// ihm_gateway.c #include "ihm_gateway.h" #include "ihm.h" #include #include #include "platform_detect.h" #include "cJSON.h" #include "esp_log.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; cJSON *root = cJSON_Parse(etatMachine); bool enRoute = cJSON_GetObjectItem(root, "state")->valueint; int timestamp = cJSON_GetObjectItem(root, "timestamp")->valueint; time_t rawtime = (time_t)timestamp; struct tm *heure_locale = localtime(&rawtime); char heureFormattee[50]; strftime(heureFormattee, sizeof(heureFormattee), "%d/%m/%Y %H:%M:%S", heure_locale); char etatFormate[90]; snprintf(etatFormate, sizeof(etatFormate), enRoute ? "Machine en route depuis %s" : "Machine : Arrêt détecté depuis %s", heureFormattee); // lv_label_set_text(lblEtatMachine, etatFormate); cJSON_Delete(root); break; } 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_LOGE("MeteoFrance", "------------------------------------- Set des subjects J --------------------------------"); meteo_event_payload_t *datas = (meteo_event_payload_t *) evt->pvData; draw_meteo(datas); // Prévisions des 3 prochains jours //lv_subject_set_pointer(&forecastD1Subj, &dailyDatas[0]); //lv_subject_set_pointer(&forecastD2Subj, &dailyDatas[1]); //lv_subject_set_pointer(&forecastD3Subj, &dailyDatas[2]); ESP_LOGE("MeteoFrance", "------------------------------------- Set des subjects H--------------------------------"); // Prévisions des 3 prochains jours //ESP_LOGV("MeteoFrance", "Pointeur %lli", datas[0].datetime); //lv_subject_set_pointer(&forecastH1Subj, &datas[0]); //lv_subject_set_pointer(&forecastH2Subj, &datas[1]); // lv_subject_set_pointer(&forecastH3Subj, &datas[2]); //lv_subject_set_int(&meteoStatus, 0); //display_unlock("weather_data_retreived"); ESP_LOGE(TAG, "------------------------------------- Fin Set des subjects --------------------------------"); 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é"); }