122 lines
3.0 KiB
C
122 lines
3.0 KiB
C
#include <stdio.h>
|
|
#include <cJSON.h>
|
|
#include <esp_log.h>
|
|
#include "washingMachineState.h"
|
|
#include "eventsManager.h"
|
|
#include <time.h>
|
|
|
|
#define TAG "WMS"
|
|
|
|
WashingMachineState wms;
|
|
bool stateOn; // Indique si la machine est en route
|
|
|
|
WashingMachineState traiteMessage(char* message){
|
|
|
|
cJSON *root = cJSON_Parse(message);
|
|
char* json = cJSON_PrintUnformatted(root);
|
|
ESP_LOGE(TAG, "%s", json);
|
|
|
|
bool state = cJSON_IsTrue(cJSON_GetObjectItem(root, "state"));
|
|
double timestamp = cJSON_GetNumberValue(cJSON_GetObjectItem(root, "timestamp"));
|
|
bool ack = cJSON_HasObjectItem(root,"ack") && cJSON_GetNumberValue(cJSON_GetObjectItem(root,"ack"));
|
|
|
|
//char dateStr[80] ;
|
|
//timestampToDate(timestamp,dateStr,80);
|
|
|
|
wms.etat = state?LAVEUSE_LAVAGE:LAVEUSE_ARRET;
|
|
wms.depuis = timestamp;
|
|
wms.ack = ack;
|
|
|
|
if(wms.etat==LAVEUSE_LAVAGE){
|
|
stateOn=true;
|
|
}
|
|
if(wms.etat==LAVEUSE_ARRET && stateOn){
|
|
//Fin détectée !
|
|
stateOn=false;
|
|
send_event(EVT_FIN_MACHINE, NULL);
|
|
}
|
|
|
|
cJSON_Delete(root);
|
|
|
|
return wms;
|
|
}
|
|
|
|
void timestampToDate(double timestamp, char* dateStr, size_t dateStrSize)
|
|
{
|
|
time_t ts = timestamp;
|
|
struct tm *pTime = localtime(&ts);
|
|
|
|
strftime(dateStr, dateStrSize, "%d/%m/%Y %H:%M:%S", pTime);
|
|
//printf("Date and french time : %s\n", dateStr);
|
|
}
|
|
|
|
WashingMachineState getEtatMachine(){
|
|
return wms;
|
|
}
|
|
|
|
char *duree_depuis_timestamp_formatee(time_t timestamp)
|
|
{
|
|
time_t maintenant = time(NULL);
|
|
long diff_minutes = (maintenant - timestamp) / 60;
|
|
|
|
if (diff_minutes < 0)
|
|
diff_minutes = 0; // sécurité si timestamp futur
|
|
|
|
char *resultat = malloc(32);
|
|
if (!resultat)
|
|
return NULL;
|
|
|
|
if (diff_minutes < 60) {
|
|
snprintf(resultat, 32, "%ldmn", diff_minutes);
|
|
} else {
|
|
long heures = diff_minutes / 60;
|
|
long minutes = diff_minutes % 60;
|
|
snprintf(resultat, 32, "%ldh%02ld", heures, minutes);
|
|
}
|
|
|
|
return resultat;
|
|
}
|
|
|
|
void getEtatMachineStr(WashingMachineState wms, char* etat, size_t etatSize)
|
|
{
|
|
char* etatStr;
|
|
switch (wms.etat)
|
|
{
|
|
case LAVEUSE_ARRET:
|
|
/* code */
|
|
etatStr="Machine arretée";
|
|
break;
|
|
|
|
case LAVEUSE_LAVAGE:
|
|
/* code */
|
|
etatStr="Machine en route";
|
|
break;
|
|
|
|
default:
|
|
etatStr="Etat inconnu";
|
|
break;
|
|
}
|
|
|
|
char dateStr[30];
|
|
timestampToDate(wms.depuis,dateStr,30);
|
|
|
|
//Si la machine est en route on ajoute la durée en heures/minutes depuis le départ
|
|
if(wms.etat==LAVEUSE_LAVAGE){
|
|
char *duree = duree_depuis_timestamp_formatee(wms.depuis);
|
|
if (duree) {
|
|
printf("Durée : %s\n", duree);
|
|
snprintf(etat,etatSize,"%s depuis %s\n (%s)", etatStr, duree, dateStr);
|
|
free(duree);
|
|
}
|
|
}else{
|
|
snprintf(etat,etatSize,"%s depuis %s", etatStr, dateStr);
|
|
}
|
|
|
|
ESP_LOGE(TAG,"%s",etat);
|
|
|
|
}
|
|
|
|
void acknoledge(){
|
|
wms.ack=true;
|
|
}
|