From 69554f441a040e17db5727449a839ca1da600f73 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Sat, 21 Jan 2023 19:18:23 +0100 Subject: [PATCH 1/5] use private serial reader library array is no longer needed: - reduce json from 512 to 100 - no need for trailing comma - no need to use [] --- gateway/platformio.ini | 1 + gateway/src/gateway.cpp | 45 +++++++++++++++++------------------------ 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/gateway/platformio.ini b/gateway/platformio.ini index 52c39a9..474b439 100644 --- a/gateway/platformio.ini +++ b/gateway/platformio.ini @@ -22,6 +22,7 @@ lib_deps = bblanchon/ArduinoJson@6.19.4 adafruit/Adafruit Unified Sensor@^1.1.4 adafruit/DHT sensor library@1.3.10 + https://git.hodos.ro/arduino/lib_serial-reader.git@^1.0.0 build_flags = -D DHT_SENSOR=0 upload_port = /dev/ttyUSB0 check_tool = cppcheck diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index 04fd607..8038689 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -3,6 +3,7 @@ #include "Dht.h" #include "Protocol_1.h" #include "Protocol_2.h" +#include #define RESET_PIN 10 #define SEND_PIN 11 @@ -10,6 +11,7 @@ RCSwitch mySwitch = RCSwitch(); +SerialReader<100> serialReader; void setup() { digitalWrite(RESET_PIN, HIGH); @@ -60,47 +62,38 @@ void readRcSwitch() { } } -void runJsonCommands(const char* cmd) { - StaticJsonDocument<512> jsonArray; - DeserializationError err = deserializeJson(jsonArray, cmd); +void runJsonCommand(const char* cmd) { + StaticJsonDocument<100> jsonDoc; + DeserializationError err = deserializeJson(jsonDoc, cmd); if (err == DeserializationError::Ok) { - JsonArray array = jsonArray.as(); - for (JsonVariant jsonDoc : array) { - if (jsonDoc.containsKey("rcSwitch")) { - JsonObjectConst rcSwitch = jsonDoc["rcSwitch"]; - Protocol* p = findProtocol(rcSwitch["protocol"]); - p->fromJson(rcSwitch, mySwitch); - delete p; - serializeJson(jsonDoc, Serial); - Serial.println(); - } + if (jsonDoc.containsKey("rcSwitch")) { + JsonObjectConst rcSwitch = jsonDoc["rcSwitch"]; + Protocol* p = findProtocol(rcSwitch["protocol"]); + p->fromJson(rcSwitch, mySwitch); + delete p; + serializeJson(jsonDoc, Serial); + Serial.println(); } } else { - StaticJsonDocument<128> jsonError; + StaticJsonDocument<150> jsonError; JsonObject error = jsonError.createNestedObject("error"); - error["message"] = err.c_str(); - error["original_cmd"] = cmd; + error["msg"] = err.c_str(); + error["orig_cmd"] = cmd; serializeJson(jsonError, Serial); Serial.println(); - } } void readCommand() { - if (Serial.available() > 0) { - String cmd = Serial.readStringUntil('\n'); - if (cmd == "reset") { + if (serialReader.readLine(Serial) > 0) { + const char* cmd = serialReader.getBuffer(); + if (strcmp("reset", cmd) == 0) { Serial.println("resetting..."); delay(200); digitalWrite(RESET_PIN, LOW); Serial.println("resetting failed"); } - if (cmd.endsWith(",")) { - cmd = cmd.substring(0, cmd.lastIndexOf(',')); - } - char buffer[cmd.length()+3]; - sprintf(buffer, "[%s]", cmd.c_str()); - runJsonCommands(buffer); + runJsonCommand(cmd); } } From c508092b5c100983c7db5d93b4a7499fef30ed45 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Sat, 21 Jan 2023 19:19:33 +0100 Subject: [PATCH 2/5] extract error handling to reduce stack mem usage --- gateway/src/gateway.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index 8038689..082922e 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -62,6 +62,15 @@ void readRcSwitch() { } } +void handleJsonError(DeserializationError err, const char* cmd) { + StaticJsonDocument<150> jsonError; + JsonObject error = jsonError.createNestedObject("error"); + error["msg"] = err.c_str(); + error["orig_cmd"] = cmd; + serializeJson(jsonError, Serial); + Serial.println(); +} + void runJsonCommand(const char* cmd) { StaticJsonDocument<100> jsonDoc; DeserializationError err = deserializeJson(jsonDoc, cmd); @@ -75,12 +84,7 @@ void runJsonCommand(const char* cmd) { Serial.println(); } } else { - StaticJsonDocument<150> jsonError; - JsonObject error = jsonError.createNestedObject("error"); - error["msg"] = err.c_str(); - error["orig_cmd"] = cmd; - serializeJson(jsonError, Serial); - Serial.println(); + handleJsonError(err, cmd); } } From c61880db57f6343597d5e718427d3b737d81a77d Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Sat, 21 Jan 2023 21:21:15 +0100 Subject: [PATCH 3/5] echo needs to display '\n' --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index ede9512..553ff69 100644 --- a/.drone.yml +++ b/.drone.yml @@ -40,7 +40,7 @@ steps: - cd gateway - service ser2net stop - pio run -e pro-mini - - echo -n 'reset' > /dev/ttyUSB0; sleep 1s; avrdude -patmega328p -carduino -P/dev/ttyUSB0 -b115200 -D -Uflash:w:.pio/build/pro-mini/firmware.hex:i -v + - echo 'reset' > /dev/ttyUSB0; sleep 1s; avrdude -patmega328p -carduino -P/dev/ttyUSB0 -b115200 -D -Uflash:w:.pio/build/pro-mini/firmware.hex:i -v - service ser2net start when: target: From ed755abb14f2c86cef17a7ae0562e398d7eebf3f Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Sun, 22 Jan 2023 14:49:27 +0100 Subject: [PATCH 4/5] more json optimization: - reduce allocated size using correct const/not const char* - double buffer size for input serial --- gateway/src/gateway.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index 082922e..7bc2d31 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -11,7 +11,7 @@ RCSwitch mySwitch = RCSwitch(); -SerialReader<100> serialReader; +SerialReader<200> serialReader; void setup() { digitalWrite(RESET_PIN, HIGH); @@ -63,7 +63,7 @@ void readRcSwitch() { } void handleJsonError(DeserializationError err, const char* cmd) { - StaticJsonDocument<150> jsonError; + StaticJsonDocument<50> jsonError; JsonObject error = jsonError.createNestedObject("error"); error["msg"] = err.c_str(); error["orig_cmd"] = cmd; @@ -71,8 +71,8 @@ void handleJsonError(DeserializationError err, const char* cmd) { Serial.println(); } -void runJsonCommand(const char* cmd) { - StaticJsonDocument<100> jsonDoc; +void runJsonCommand(char* cmd) { + StaticJsonDocument<50> jsonDoc; DeserializationError err = deserializeJson(jsonDoc, cmd); if (err == DeserializationError::Ok) { if (jsonDoc.containsKey("rcSwitch")) { @@ -90,7 +90,7 @@ void runJsonCommand(const char* cmd) { void readCommand() { if (serialReader.readLine(Serial) > 0) { - const char* cmd = serialReader.getBuffer(); + char* cmd = serialReader.getBuffer(); if (strcmp("reset", cmd) == 0) { Serial.println("resetting..."); delay(200); From 41ad1b4348f1e4aa4a6e50a33e73a4c28f9b6736 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Sun, 22 Jan 2023 16:44:01 +0100 Subject: [PATCH 5/5] increase reset time - compensates for old timeout in serial reading --- gateway/src/gateway.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index 7bc2d31..fafb287 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -93,7 +93,7 @@ void readCommand() { char* cmd = serialReader.getBuffer(); if (strcmp("reset", cmd) == 0) { Serial.println("resetting..."); - delay(200); + delay(1200); digitalWrite(RESET_PIN, LOW); Serial.println("resetting failed"); }