From 11f3591d840dcdb223714cf164ab8b0440901ec6 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Fri, 28 Oct 2022 14:42:59 +0200 Subject: [PATCH 01/13] add static check --- .drone.yml | 5 +++++ gateway/platformio.ini | 7 +++++++ libraries/RF24 | 1 - 3 files changed, 12 insertions(+), 1 deletion(-) delete mode 160000 libraries/RF24 diff --git a/.drone.yml b/.drone.yml index 293b48f..b24ff98 100644 --- a/.drone.yml +++ b/.drone.yml @@ -8,6 +8,11 @@ platform: arch: arm steps: +- name: static check + commands: + - cd gateway + - pio check -e pro-mini + - name: native tests commands: - cd gateway diff --git a/gateway/platformio.ini b/gateway/platformio.ini index 7c9ead9..69c5ca1 100644 --- a/gateway/platformio.ini +++ b/gateway/platformio.ini @@ -8,6 +8,9 @@ ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html +[platformio] +default_envs = pro-mini + [env:pro-mini] platform = atmelavr board = miniatmega328 @@ -21,6 +24,10 @@ lib_deps = adafruit/DHT sensor library@1.3.10 build_flags = -D DHT_SENSOR=0 upload_port = /dev/ttyUSB0 +check_tool = cppcheck +check_flags = --enable=all +check_skip_packages = yes +check_severity = medium, high [env:native] platform = native diff --git a/libraries/RF24 b/libraries/RF24 deleted file mode 160000 index cb04b38..0000000 --- a/libraries/RF24 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cb04b381f9b68cf60cac7ecb18346fb3291a80a6 From e3e13c2536f9f0fd1f60e1d62305194bb1181c0c Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Fri, 28 Oct 2022 14:43:16 +0200 Subject: [PATCH 02/13] upgrade json library --- gateway/platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gateway/platformio.ini b/gateway/platformio.ini index 69c5ca1..cbb7355 100644 --- a/gateway/platformio.ini +++ b/gateway/platformio.ini @@ -19,7 +19,7 @@ lib_extra_dirs = ../libraries lib_deps = sui77/rc-switch@^2.6.3 - bblanchon/ArduinoJson@6.16.1 + bblanchon/ArduinoJson@6.19.4 adafruit/Adafruit Unified Sensor@^1.1.4 adafruit/DHT sensor library@1.3.10 build_flags = -D DHT_SENSOR=0 @@ -41,7 +41,7 @@ lib_extra_dirs = ../libraries lib_deps = sui77/rc-switch@^2.6.3 - bblanchon/ArduinoJson@6.16.1 + bblanchon/ArduinoJson@6.19.4 platform_packages = platformio/tool-simavr From c8710a1cc9095f8f44f33d2b11ed7b8afda0065a Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Sat, 29 Oct 2022 13:09:23 +0200 Subject: [PATCH 03/13] return error as json and reduce json documents --- gateway/src/gateway.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index 49228f4..04fd607 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -49,7 +49,7 @@ void readRcSwitch() { unsigned long value = mySwitch.getReceivedValue(); mySwitch.resetAvailable(); - StaticJsonDocument<200> jsonDoc; + StaticJsonDocument<128> jsonDoc; Protocol* p = findProtocol(mySwitch.getReceivedProtocol()); p->toJson(value, jsonDoc); delete p; @@ -61,7 +61,6 @@ void readRcSwitch() { } void runJsonCommands(const char* cmd) { - String origCmd = String(cmd); StaticJsonDocument<512> jsonArray; DeserializationError err = deserializeJson(jsonArray, cmd); if (err == DeserializationError::Ok) { @@ -77,9 +76,13 @@ void runJsonCommands(const char* cmd) { } } } else { - Serial.print(err.c_str()); - Serial.print(": "); - Serial.println(origCmd); + StaticJsonDocument<128> jsonError; + JsonObject error = jsonError.createNestedObject("error"); + error["message"] = err.c_str(); + error["original_cmd"] = cmd; + serializeJson(jsonError, Serial); + Serial.println(); + } } @@ -95,7 +98,7 @@ void readCommand() { if (cmd.endsWith(",")) { cmd = cmd.substring(0, cmd.lastIndexOf(',')); } - char buffer[cmd.length()+2]; + char buffer[cmd.length()+3]; sprintf(buffer, "[%s]", cmd.c_str()); runJsonCommands(buffer); } From e75fdac7301448bb67f737a34c544c8434768db1 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Fri, 20 Jan 2023 14:01:17 +0100 Subject: [PATCH 04/13] don't build & test on production --- .drone.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index b24ff98..ede9512 100644 --- a/.drone.yml +++ b/.drone.yml @@ -12,16 +12,28 @@ steps: commands: - cd gateway - pio check -e pro-mini + when: + target: + exclude: + - production - name: native tests commands: - cd gateway - pio test -e native + when: + target: + exclude: + - production - name: embedded tests commands: - cd gateway - LD_LIBRARY_PATH=~/.platformio/packages/tool-simavr/lib/ pio test -e embedded --without-uploading + when: + target: + exclude: + - production - name: upload firmware commands: @@ -31,8 +43,8 @@ steps: - 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 - service ser2net start when: - branch: - - gateway + target: + - production trigger: branch: From a588f56e383875d9021573b7fe11fd2f47b141da Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Sat, 21 Jan 2023 16:12:59 +0100 Subject: [PATCH 05/13] fix: change board to actual pro mini --- gateway/platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gateway/platformio.ini b/gateway/platformio.ini index cbb7355..52c39a9 100644 --- a/gateway/platformio.ini +++ b/gateway/platformio.ini @@ -13,7 +13,7 @@ default_envs = pro-mini [env:pro-mini] platform = atmelavr -board = miniatmega328 +board = pro16MHzatmega328 framework = arduino lib_extra_dirs = ../libraries From 69554f441a040e17db5727449a839ca1da600f73 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Sat, 21 Jan 2023 19:18:23 +0100 Subject: [PATCH 06/13] 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 07/13] 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 08/13] 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 09/13] 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 10/13] 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"); } From 624f26c7516cf2e2222e6ecdfcf683141ec81e00 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Mon, 23 Jan 2023 12:24:44 +0100 Subject: [PATCH 11/13] update testing --- gateway/platformio.ini | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gateway/platformio.ini b/gateway/platformio.ini index 474b439..c8c78f0 100644 --- a/gateway/platformio.ini +++ b/gateway/platformio.ini @@ -33,11 +33,16 @@ check_severity = medium, high [env:native] platform = native test_filter = test_native +lib_extra_dirs = + ../libraries +lib_deps = + bblanchon/ArduinoJson@6.19.4 +build_flags = -std=c++11 [env:embedded] platform = atmelavr framework = arduino -board = miniatmega328 +board = pro16MHzatmega328 lib_extra_dirs = ../libraries lib_deps = From 37fc2ab103c1a16bb34100eccb737200113f90a0 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Sun, 22 Jan 2023 16:44:01 +0100 Subject: [PATCH 12/13] move sensor_builder tests into native --- gateway/platformio.ini | 4 ++-- gateway/src/gateway.cpp | 2 +- gateway/test/embedded/test_dummy/dummy.cpp | 18 ++++++++++++++++++ .../test_decoder}/decoder.cpp | 0 .../test_sensor_builder}/sensor_builder.cpp | 6 ++---- 5 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 gateway/test/embedded/test_dummy/dummy.cpp rename gateway/test/{test_native => native/test_decoder}/decoder.cpp (100%) rename gateway/test/{test_embedded => native/test_sensor_builder}/sensor_builder.cpp (98%) diff --git a/gateway/platformio.ini b/gateway/platformio.ini index c8c78f0..75e972a 100644 --- a/gateway/platformio.ini +++ b/gateway/platformio.ini @@ -32,7 +32,7 @@ check_severity = medium, high [env:native] platform = native -test_filter = test_native +test_filter = native/* lib_extra_dirs = ../libraries lib_deps = @@ -59,4 +59,4 @@ test_testing_command = -f 16000000L ${platformio.build_dir}/${this.__env__}/firmware.elf -test_filter = test_embedded +test_filter = embedded/* diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index fafb287..a8936d7 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -10,7 +10,7 @@ #define RECEIVE_PIN 2 -RCSwitch mySwitch = RCSwitch(); +RCSwitch mySwitch; SerialReader<200> serialReader; void setup() { diff --git a/gateway/test/embedded/test_dummy/dummy.cpp b/gateway/test/embedded/test_dummy/dummy.cpp new file mode 100644 index 0000000..352dc1e --- /dev/null +++ b/gateway/test/embedded/test_dummy/dummy.cpp @@ -0,0 +1,18 @@ +#include +#include + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + +void setup() { + UNITY_BEGIN(); + UNITY_END(); +} + +void loop() { +} diff --git a/gateway/test/test_native/decoder.cpp b/gateway/test/native/test_decoder/decoder.cpp similarity index 100% rename from gateway/test/test_native/decoder.cpp rename to gateway/test/native/test_decoder/decoder.cpp diff --git a/gateway/test/test_embedded/sensor_builder.cpp b/gateway/test/native/test_sensor_builder/sensor_builder.cpp similarity index 98% rename from gateway/test/test_embedded/sensor_builder.cpp rename to gateway/test/native/test_sensor_builder/sensor_builder.cpp index 8ca3ca3..db130f0 100644 --- a/gateway/test/test_embedded/sensor_builder.cpp +++ b/gateway/test/native/test_sensor_builder/sensor_builder.cpp @@ -1,4 +1,3 @@ -#include #include #include "TinyComponent.h" @@ -98,7 +97,7 @@ void test_oil_sensor_with_voltage(void) { TEST_ASSERT_EQUAL(2.847, diagnostic["voltage"]); } -void setup() { +int main(int argc, char **argv) { UNITY_BEGIN(); RUN_TEST(test_unknown_sensor_type); RUN_TEST(test_max_temp); @@ -110,7 +109,6 @@ void setup() { RUN_TEST(test_oil_sensor); RUN_TEST(test_oil_sensor_with_voltage); UNITY_END(); -} -void loop() { + return 0; } From 65b9ce8dc182961b40d09432e956ce7e47fcb73f Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Mon, 23 Jan 2023 15:00:59 +0100 Subject: [PATCH 13/13] remove embedded test from pipeline --- .drone.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.drone.yml b/.drone.yml index 553ff69..6694831 100644 --- a/.drone.yml +++ b/.drone.yml @@ -26,15 +26,6 @@ steps: exclude: - production -- name: embedded tests - commands: - - cd gateway - - LD_LIBRARY_PATH=~/.platformio/packages/tool-simavr/lib/ pio test -e embedded --without-uploading - when: - target: - exclude: - - production - - name: upload firmware commands: - cd gateway