From 781354a02fae0ad80c5ef688226bffa6e1daf2d1 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Fri, 29 Jan 2021 18:17:00 +0100 Subject: [PATCH] Optimized the code and especially string literals to get a smaller RAM footprint --- src/app/webApi.cpp | 96 +++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/src/app/webApi.cpp b/src/app/webApi.cpp index bb68299..f0413d1 100644 --- a/src/app/webApi.cpp +++ b/src/app/webApi.cpp @@ -19,17 +19,17 @@ boolean viewByUIDApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc, if(pSE == NULL) { - sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"failed\", \"message\" : \"expected UID parameter\" }"); + sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"failed\",\"message\":\"expected UID parameter\"}"); } else if(strlen(pSE->getString()) > 0) { if(p->getScreenManager().displayView(atoi(pSE->getString()))) - sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"ViewUID\" : \"%d\" }", p->getScreenManager().getCurrentViewUID()); + sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"ViewUID\":\"%d\"}", p->getScreenManager().getCurrentViewUID()); else - sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"failed\", \"message\" : \"%s\" }", p->getScreenManager().getErrorMessage()); + sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"failed\",\"message\":\"%s\"}", p->getScreenManager().getErrorMessage()); } else - sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"failed\", \"message\" : \"UID parameter empty\" }"); + sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"failed\",\"message\":\"UID parameter empty\"}"); wc->print(buffer); return true; } @@ -42,9 +42,9 @@ boolean nextViewApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc, p->getScreenManager().displayNextView(); if(p->getScreenManager().getError() == OK) - sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"ViewUID\" : \"%d\" }", p->getScreenManager().getCurrentViewUID()); + sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"ViewUID\":\"%d\"}", p->getScreenManager().getCurrentViewUID()); else - sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"failed\", \"message\" : \"%s\" }", p->getScreenManager().getErrorMessage()); + sprintf(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"failed\",\"message\":\"%s\"}", p->getScreenManager().getErrorMessage()); wc->print(buffer); return true; } @@ -55,9 +55,9 @@ boolean reloadViewApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc char buffer[200]; if(p->getScreenManager().init()) - strcpy(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"message\" : \"config reloaded\" }"); + strcpy(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"message\":\"config reloaded\"}"); else - strcpy(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"failed\", \"message\" : \"unable to reload config\" }"); + strcpy(buffer, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"failed\",\"message\":\"unable to reload config\"}"); wc->print(buffer); return true; @@ -83,14 +83,14 @@ boolean rtcSetTimeApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc DictionaryHelper::StringEntity *pSE = HRD.getParams("datetime"); if(pSE == NULL) { - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"failed\", \"message\" : \"expected datetime parameter\" }"); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"failed\",\"message\":\"expected datetime parameter\"}"); } else if(strlen(pSE->getString()) > 0) { Dictionary *dictio = pSE->split('_'); if(dictio == NULL) { - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"failed\", \"message\" : \"datetime format error\" }"); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"failed\",\"message\":\"datetime format error\"}"); wc->print(buffer); return true; } @@ -98,7 +98,7 @@ boolean rtcSetTimeApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc { if(dictio->count() != 6) { - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"error\", \"message\" : \"datetime format error\" }"); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"error\",\"message\":\"datetime format error\"}"); } else { @@ -111,7 +111,7 @@ boolean rtcSetTimeApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc atoi(dictio->getAt(5)->getString()) )); DateTime d = p->getRtcManager().getDateTime(); - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"date\" : \"%d/%d/%d\", \"time\" : \"%d:%d:%d\" }", d.day(), d.month(), d.year(), d.hour(), d.minute(), d.second()); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"date\":\"%d/%d/%d\",\"time\":\"%d:%d:%d\"}", d.day(), d.month(), d.year(), d.hour(), d.minute(), d.second()); } wc->print(buffer); @@ -177,7 +177,7 @@ boolean espRestartApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc SAB *sab = (SAB*)pData; char buffer[200]; - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"message\" : \"module %s in 10 seconds\" }",strstr(HRD.httpResource,"reset") == NULL ? "restarting" : "resetting"); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"message\":\"module %s in 10 seconds\"}",strstr(HRD.httpResource,"reset") == NULL ? "restarting" : "resetting"); wc->print(buffer); sab->getTaskSchedulerManager().addTask(sab->getTaskSchedulerManager().findFreeTaskId(), TaskSchedulerManagerHelper::Schedule::scheduleBuilder() @@ -199,9 +199,9 @@ boolean sdCardSizeApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc char buffer[200]; double size = p->getSdCardManager().getSize(GBYTE); if(size == 0.0) - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"card\" : \"not present\", \"size\" : \"0\" }"); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"card\":\"not present\",\"size\":\"0\"}"); else - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"card\" : \"present\", \"size\" : \"%.2f\", \"unit\" : \"GByte\" }",size); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"card\":\"present\",\"size\":\"%.2f\",\"unit\":\"GByte\"}",size); wc->print(buffer); return true; @@ -271,7 +271,7 @@ boolean powerInfoApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc, char buffer[300]; PowerManager::PowerInfo pi = p->getPowerManager().getPowerInfo(); - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"power type\" : \"%s\", \"level\" : \"%u\", \"unit\" : \"%%\" }", pi.powerType == PowerManager::USB ? "USB" : "BAT", pi.level); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"power type\":\"%s\",\"level\":\"%u\",\"unit\":\"%%\"}", pi.powerType == PowerManager::USB ? "USB" : "BAT", pi.level); wc->print(buffer); return true; @@ -318,52 +318,52 @@ boolean ioGetLevelApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc if(HRD.getParams.count() == 0)//We send every IO state { - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"P0\" : \"%d\", \"P1\" : \"%d\", \"P2\" : \"%d\", \"P3\" : \"%d\", \"P4\" : \"%d\", \"P5\" : \"%d\", \"P6\" : \"%d\", \"P7\" : \"%d\" }",ioState[0],ioState[1],ioState[2],ioState[3],ioState[4],ioState[5],ioState[6],ioState[7]); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"P0\":\"%d\",\"P1\":\"%d\",\"P2\":\"%d\",\"P3\":\"%d\",\"P4\":\"%d\",\"P5\":\"%d\",\"P6\":\"%d\",\"P7\":\"%d\"}",ioState[0],ioState[1],ioState[2],ioState[3],ioState[4],ioState[5],ioState[6],ioState[7]); } else { - strcpy(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\""); + strcpy(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\""); if(HRD.getParams("P0") != NULL) { - sprintf(helperBuffer,", \"P0\" : \"%d\"",ioState[0]); + sprintf(helperBuffer,",\"P0\":\"%d\"",ioState[0]); strcat(buffer,helperBuffer); } if(HRD.getParams("P1") != NULL) { - sprintf(helperBuffer,", \"P1\" : \"%d\"",ioState[1]); + sprintf(helperBuffer,",\"P1\":\"%d\"",ioState[1]); strcat(buffer,helperBuffer); } if(HRD.getParams("P2") != NULL) { - sprintf(helperBuffer,", \"P2\" : \"%d\"",ioState[2]); + sprintf(helperBuffer,",\"P2\":\"%d\"",ioState[2]); strcat(buffer,helperBuffer); } if(HRD.getParams("P3") != NULL) { - sprintf(helperBuffer,", \"P3\" : \"%d\"",ioState[3]); + sprintf(helperBuffer,",\"P3\":\"%d\"",ioState[3]); strcat(buffer,helperBuffer); } if(HRD.getParams("P4") != NULL) { - sprintf(helperBuffer,", \"P4\" : \"%d\"",ioState[4]); + sprintf(helperBuffer,",\"P4\":\"%d\"",ioState[4]); strcat(buffer,helperBuffer); } if(HRD.getParams("P5") != NULL) { - sprintf(helperBuffer,", \"P5\" : \"%d\"",ioState[5]); + sprintf(helperBuffer,",\"P5\":\"%d\"",ioState[5]); strcat(buffer,helperBuffer); } if(HRD.getParams("P6") != NULL) { - sprintf(helperBuffer,", \"P6\" : \"%d\"",ioState[6]); + sprintf(helperBuffer,",\"P6\":\"%d\"",ioState[6]); strcat(buffer,helperBuffer); } if(HRD.getParams("P7") != NULL) { - sprintf(helperBuffer,", \"P7\" : \"%d\"",ioState[7]); + sprintf(helperBuffer,",\"P7\":\"%d\"",ioState[7]); strcat(buffer,helperBuffer); } - strcat(buffer," }"); + strcat(buffer,"}"); } wc->print(buffer); @@ -410,7 +410,7 @@ boolean ioSetLevelApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc } p->getIoManager().getPcf().digitalReadAll(ioState);//We retrieve the IO state - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"P0\" : \"%d\", \"P1\" : \"%d\", \"P2\" : \"%d\", \"P3\" : \"%d\", \"P4\" : \"%d\", \"P5\" : \"%d\", \"P6\" : \"%d\", \"P7\" : \"%d\" }",ioState[0],ioState[1],ioState[2],ioState[3],ioState[4],ioState[5],ioState[6],ioState[7]); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"P0\":\"%d\",\"P1\":\"%d\",\"P2\":\"%d\",\"P3\":\"%d\",\"P4\":\"%d\",\"P5\":\"%d\",\"P6\":\"%d\",\"P7\":\"%d\"}",ioState[0],ioState[1],ioState[2],ioState[3],ioState[4],ioState[5],ioState[6],ioState[7]); wc->print(buffer); return true; @@ -422,54 +422,55 @@ boolean ioGetModeApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc, boolean ioMode[8] = {0}; char buffer[300] = ""; char helperBuffer[20] = ""; + const char * const IN = "IN", * const OUT = "OUT"; p->getIoManager().getPcf().getPinModeAll(ioMode);//We retrieve the IO modes aka INPUT or OUTPUT if(HRD.getParams.count() == 0)//We send every IO mode { - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"P0\" : \"%s\", \"P1\" : \"%s\", \"P2\" : \"%s\", \"P3\" : \"%s\", \"P4\" : \"%s\", \"P5\" : \"%s\", \"P6\" : \"%s\", \"P7\" : \"%s\" }",ioMode[0] ? "OUT":"IN",ioMode[1] ? "OUT":"IN",ioMode[2] ? "OUT":"IN",ioMode[3] ? "OUT":"IN",ioMode[4] ? "OUT":"IN",ioMode[5] ? "OUT":"IN",ioMode[6] ? "OUT":"IN",ioMode[7] ? "OUT":"IN"); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"P0\":\"%s\",\"P1\":\"%s\",\"P2\":\"%s\",\"P3\":\"%s\",\"P4\":\"%s\",\"P5\":\"%s\",\"P6\":\"%s\",\"P7\":\"%s\"}",ioMode[0] ? OUT:IN,ioMode[1] ? OUT:IN,ioMode[2] ? OUT:IN,ioMode[3] ? OUT:IN,ioMode[4] ? OUT:IN,ioMode[5] ? OUT:IN,ioMode[6] ? OUT:IN,ioMode[7] ? OUT:IN); } else { - strcpy(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\""); + strcpy(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\""); if(HRD.getParams("P0") != NULL) { - sprintf(helperBuffer,", \"P0\" : \"%s\"",ioMode[0] ? "OUT":"IN"); + sprintf(helperBuffer,",\"P0\":\"%s\"",ioMode[0] ? OUT:IN); strcat(buffer,helperBuffer); } if(HRD.getParams("P1") != NULL) { - sprintf(helperBuffer,", \"P1\" : \"%s\"",ioMode[1] ? "OUT":"IN"); + sprintf(helperBuffer,",\"P1\":\"%s\"",ioMode[1] ? OUT:IN); strcat(buffer,helperBuffer); } if(HRD.getParams("P2") != NULL) { - sprintf(helperBuffer,", \"P2\" : \"%s\"",ioMode[2] ? "OUT":"IN"); + sprintf(helperBuffer,",\"P2\":\"%s\"",ioMode[2] ? OUT:IN); strcat(buffer,helperBuffer); } if(HRD.getParams("P3") != NULL) { - sprintf(helperBuffer,", \"P3\" : \"%s\"",ioMode[3] ? "OUT":"IN"); + sprintf(helperBuffer,",\"P3\":\"%s\"",ioMode[3] ? OUT:IN); strcat(buffer,helperBuffer); } if(HRD.getParams("P4") != NULL) { - sprintf(helperBuffer,", \"P4\" : \"%s\"",ioMode[4] ? "OUT":"IN"); + sprintf(helperBuffer,",\"P4\":\"%s\"",ioMode[4] ? OUT:IN); strcat(buffer,helperBuffer); } if(HRD.getParams("P5") != NULL) { - sprintf(helperBuffer,", \"P5\" : \"%s\"",ioMode[5] ? "OUT":"IN"); + sprintf(helperBuffer,",\"P5\":\"%s\"",ioMode[5] ? OUT:IN); strcat(buffer,helperBuffer); } if(HRD.getParams("P6") != NULL) { - sprintf(helperBuffer,", \"P6\" : \"%s\"",ioMode[6] ? "OUT":"IN"); + sprintf(helperBuffer,",\"P6\":\"%s\"",ioMode[6] ? OUT:IN); strcat(buffer,helperBuffer); } if(HRD.getParams("P7") != NULL) { - sprintf(helperBuffer,", \"P7\" : \"%s\"",ioMode[7] ? "OUT":"IN"); + sprintf(helperBuffer,",\"P7\":\"%s\"",ioMode[7] ? OUT:IN); strcat(buffer,helperBuffer); } strcat(buffer," }"); @@ -483,43 +484,44 @@ boolean ioSetModeApi(WEBServer::HttpRequestData &HRD, WiFiClient *wc, { SAB *p = (SAB *)pData; char buffer[300] = ""; + const char * const IN = "IN", * const OUT = "OUT"; boolean ioMode[8] = {0}; if(HRD.getParams("P0") != NULL) { - p->getIoManager().getPcf().pinMode(PCF8574::P0,strcmp(HRD.getParams("P0")->getString(), "IN") == 0 ? INPUT:OUTPUT); + p->getIoManager().getPcf().pinMode(PCF8574::P0,strcmp(HRD.getParams("P0")->getString(), IN) == 0 ? INPUT:OUTPUT); } if(HRD.getParams("P1") != NULL) { - p->getIoManager().getPcf().pinMode(PCF8574::P1,strcmp(HRD.getParams("P1")->getString(), "IN") == 0 ? INPUT:OUTPUT); + p->getIoManager().getPcf().pinMode(PCF8574::P1,strcmp(HRD.getParams("P1")->getString(), IN) == 0 ? INPUT:OUTPUT); } if(HRD.getParams("P2") != NULL) { - p->getIoManager().getPcf().pinMode(PCF8574::P2,strcmp(HRD.getParams("P2")->getString(), "IN") == 0 ? INPUT:OUTPUT); + p->getIoManager().getPcf().pinMode(PCF8574::P2,strcmp(HRD.getParams("P2")->getString(), IN) == 0 ? INPUT:OUTPUT); } if(HRD.getParams("P3") != NULL) { - p->getIoManager().getPcf().pinMode(PCF8574::P3,strcmp(HRD.getParams("P3")->getString(), "IN") == 0 ? INPUT:OUTPUT); + p->getIoManager().getPcf().pinMode(PCF8574::P3,strcmp(HRD.getParams("P3")->getString(), IN) == 0 ? INPUT:OUTPUT); } if(HRD.getParams("P4") != NULL) { - p->getIoManager().getPcf().pinMode(PCF8574::P4,strcmp(HRD.getParams("P4")->getString(), "IN") == 0 ? INPUT:OUTPUT); + p->getIoManager().getPcf().pinMode(PCF8574::P4,strcmp(HRD.getParams("P4")->getString(), IN) == 0 ? INPUT:OUTPUT); } if(HRD.getParams("P5") != NULL) { - p->getIoManager().getPcf().pinMode(PCF8574::P5,strcmp(HRD.getParams("P5")->getString(), "IN") == 0 ? INPUT:OUTPUT); + p->getIoManager().getPcf().pinMode(PCF8574::P5,strcmp(HRD.getParams("P5")->getString(), IN) == 0 ? INPUT:OUTPUT); } if(HRD.getParams("P6") != NULL) { - p->getIoManager().getPcf().pinMode(PCF8574::P6,strcmp(HRD.getParams("P6")->getString(), "IN") == 0 ? INPUT:OUTPUT); + p->getIoManager().getPcf().pinMode(PCF8574::P6,strcmp(HRD.getParams("P6")->getString(), IN) == 0 ? INPUT:OUTPUT); } if(HRD.getParams("P7") != NULL) { - p->getIoManager().getPcf().pinMode(PCF8574::P7,strcmp(HRD.getParams("P7")->getString(), "IN") == 0 ? INPUT:OUTPUT); + p->getIoManager().getPcf().pinMode(PCF8574::P7,strcmp(HRD.getParams("P7")->getString(), IN) == 0 ? INPUT:OUTPUT); } p->getIoManager().getPcf().getPinModeAll(ioMode);//We retrieve the IO modes aka INPUT or OUTPUT - sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{ \"status\" : \"ok\", \"P0\" : \"%s\", \"P1\" : \"%s\", \"P2\" : \"%s\", \"P3\" : \"%s\", \"P4\" : \"%s\", \"P5\" : \"%s\", \"P6\" : \"%s\", \"P7\" : \"%s\" }",ioMode[0] ? "OUT":"IN",ioMode[1] ? "OUT":"IN",ioMode[2] ? "OUT":"IN",ioMode[3] ? "OUT":"IN",ioMode[4] ? "OUT":"IN",ioMode[5] ? "OUT":"IN",ioMode[6] ? "OUT":"IN",ioMode[7] ? "OUT":"IN"); + sprintf(buffer,"HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{\"status\":\"ok\",\"P0\":\"%s\",\"P1\":\"%s\",\"P2\":\"%s\",\"P3\":\"%s\",\"P4\":\"%s\",\"P5\":\"%s\",\"P6\":\"%s\",\"P7\":\"%s\"}",ioMode[0] ? OUT:IN,ioMode[1] ? OUT:IN,ioMode[2] ? OUT:IN,ioMode[3] ? OUT:IN,ioMode[4] ? OUT:IN,ioMode[5] ? OUT:IN,ioMode[6] ? OUT:IN,ioMode[7] ? OUT:IN); wc->print(buffer); return true;