#include "protocol.h" #include #include #include #include unsigned long startTime, stopTime, usedTime; char trattamento[10] = { 0,0,0,0,0,0,0,0,0,0 }; #define UARTBUFFSIZE 128 struct _UartBuffer { uint8_t buffer[UARTBUFFSIZE]; uint16_t length; }; typedef struct _UartBuffer UartBuffer; UartBuffer rxBuffer, txBuffer; extern int getRemainingTime(void); extern int sendConsumedTime(uint32_t timeConsumed, const char* treatment); extern int checkNodeRedConnection(void); extern int getWifiConn(void); extern void setWiFi(); extern HardwareSerial comSerial; void UartBufferInit(); extern uint8_t RXData; extern bool isEnabled; extern int timeRem; void PCmd_TIME(UartBuffer* _response); void PCmd_STOP(UartBuffer* _response); void PCmd_STOPNGO(UartBuffer* _response); void PCmd_WMNGR(UartBuffer* _response); void PCmd_START(UartBuffer* response, char* _command); void PCmd_CONS(UartBuffer* response, char* _command); void PCmd_CONN(UartBuffer* _response); void PCmd_sendACKCNN(); void PCmd_sendACK(); void PCmdClear(UartBuffer* command) { memset(command, 0, sizeof(UartBuffer)); } uint8_t PCmdCheckSumOk(UartBuffer command) { uint8_t csum = 0; uint16_t i = 1; for (i = 1; i < command.length - 2; i++) { csum = (csum + command.buffer[i]) % 256;// prima era 0xFF; } if ((csum == 0) || (csum == 2) || (csum == 3)) csum += 10; return (command.buffer[command.length - 2] == csum); } uint8_t PCmdIsValid(UartBuffer command) { if ((command.length > 0) && (command.buffer[0] == 2) && (command.buffer[command.length - 1] == 3)) { return PCmdCheckSumOk(command); } return 0; } void PCmdFillEnd(UartBuffer* command) { uint8_t len = 1; uint8_t csum = 0; uint8_t* p = &command->buffer[1]; while (*p) { csum = (csum + *p) % 256;//prima era 0xFF; len++; p++; } if ((csum == 0) || (csum == 2) || (csum == 3)) csum += 10; *p = csum; p++; *p = 0x03; command->length = len + 2; } void PCmdFillNack(UartBuffer* command) { PCmdClear(command); command->buffer[0] = 0x02; command->buffer[1] = 0x15; command->buffer[2] = 0x15; command->buffer[3] = 0x03; command->length = 4; } void PCmdFillAck(UartBuffer* command) { PCmdClear(command); command->buffer[0] = 0x02; command->buffer[1] = 0x06; command->buffer[2] = 0x06; command->buffer[3] = 0x03; command->length = 4; } uint8_t PCmdReqResp(UartBuffer request, UartBuffer* response) { if (PCmdIsValid(request)) { // char* s_cmd = ext_string(&request.buffer[1], request.length-3); char* s_cmd = (char*)malloc(request.length - 3 + 1); memset(s_cmd, 0, request.length - 3 + 1); memcpy(s_cmd, &request.buffer[2], request.length - 4); //in origine era [1] e [-4] if (strncmp(s_cmd, "AL", 2) == 0) { // ## alive //PCmdFillAck(response); PCmd_sendACK(); } else if (strncmp(s_cmd, "TIME", 4) == 0) { // PCmd_TIME(response); } else if (strncmp(s_cmd, "STOP", 4) == 0) { // PCmd_STOP(response); } else if (strncmp(s_cmd, "START", 5) == 0) { // PCmd_START(response, s_cmd); } else if (strncmp(s_cmd, "CONS", 4) == 0) { // PCmd_CONS(response, s_cmd); } else if (strncmp(s_cmd, "STONGO", 6) == 0) { // STOP'N'GO PCmd_STOPNGO(response); } else if (strncmp(s_cmd, "WMNGR", 5) == 0) { // PCmd_WMNGR(response); } else if (strncmp(s_cmd, "CONN", 4) == 0) { // PCmd_CONN(response); } else { PCmdFillNack(response); } free(s_cmd); } else { PCmdFillNack(response); } return 0; } void UartTransmit(UartBuffer command) { comSerial.write(command.buffer, command.length); /* for (int j =0;jbuffer[0] = 0x02; j = sprintf((char*)&(_response->buffer[2]), "TME:%lu:%d/", timeRem, isEnabled); _response->buffer[1] = j; //dimensione del solo payload PCmdFillEnd(_response); //UartTransmit(txBuffer); } void PCmd_START(UartBuffer* response, char* _command) { startTime = millis(); Serial.println("START"); // uint8_t result = 1; char* token; char delimiters[3] = "/:"; // get the first token token = strtok(_command, delimiters); // walk through other tokens while (token != NULL) { if (strcmp(token, "START") == 0) { token = strtok(NULL, delimiters); strcpy((char*)trattamento, token); //trattamento=atoi(token); } token = strtok(NULL, delimiters); } Serial.print("trattamento: "); Serial.println(trattamento); /* if (result){ PCmdFillAck(response); } else PCmdFillNack(response); */ } void PCmd_CONS(UartBuffer* response, char* _command) { // startTime=millis(); // uint8_t result = 1; char* token; char delimiters[3] = "/:"; // get the first token token = strtok(_command, delimiters); // walk through other tokens while (token != NULL) { if (strcmp(token, "CONS") == 0) { token = strtok(NULL, delimiters); usedTime = atol(token); token = strtok(NULL, delimiters); strcpy((char*)trattamento, token); } token = strtok(NULL, delimiters); } Serial.print("CONS-> "); Serial.print(" Tempo consumato: "); Serial.print(usedTime); Serial.print(" Trattamento: "); Serial.println(trattamento); if (sendConsumedTime(usedTime, trattamento) == 0) { PCmd_sendACKCNN(); } } void PCmd_CONN(UartBuffer* _response) { /* extern const char* username; extern const char* devicePassword; extern const char* serverURL_getRemaining; */ _response = &txBuffer; int connection = 0; int j; UartTxBufferClear(); PCmdClear(_response); _response->buffer[0] = 0x02; if (getWifiConn() == 0) { connection = 1; if (checkNodeRedConnection()) { connection = 2; } } j = sprintf((char*)&(_response->buffer[2]), "CNN:%d/", connection); _response->buffer[1] = j; //dimensione del solo payload PCmdFillEnd(_response); //UartTransmit(txBuffer); } void PCmd_WMNGR(UartBuffer* _response) { Serial.println("WiFi MANAGER"); setWiFi(); } void PCmd_refreshCONN(int connection) { /* extern const char* username; extern const char* devicePassword; extern const char* serverURL_getRemaining; */ UartBuffer* _response = &txBuffer; int j; UartTxBufferClear(); PCmdClear(_response); _response->buffer[0] = 0x02; j = sprintf((char*)&(_response->buffer[2]), "CNN:%d/", connection); _response->buffer[1] = j; //dimensione del solo payload PCmdFillEnd(_response); UartTransmit(txBuffer); } void PCmd_sendACKCNN() { /* extern const char* username; extern const char* devicePassword; extern const char* serverURL_getRemaining; */ UartBuffer* _response = &txBuffer; int j; UartTxBufferClear(); PCmdClear(_response); _response->buffer[0] = 0x02; j = sprintf((char*)&(_response->buffer[2]), "ACKCNN/"); _response->buffer[1] = j; //dimensione del solo payload PCmdFillEnd(_response); UartTransmit(txBuffer); } void PCmd_sendACK() { /* extern const char* username; extern const char* devicePassword; extern const char* serverURL_getRemaining; */ UartBuffer* _response = &txBuffer; int j; UartTxBufferClear(); PCmdClear(_response); _response->buffer[0] = 0x02; j = sprintf((char*)&(_response->buffer[2]), "ACK/"); _response->buffer[1] = j; //dimensione del solo payload PCmdFillEnd(_response); UartTransmit(txBuffer); }