From f9a34ff31aab52544ac8effa9710fa5c65821994 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Thu, 27 Oct 2022 17:22:35 +0200 Subject: [PATCH 1/6] extract decoder for easy testing --- gateway/include/Protocol_1.h | 42 +---------------------------------- gateway/include/decoder.h | 38 +++++++++++++++++++++++++++++++ gateway/platformio.ini | 3 +++ gateway/test/test_decoder.cpp | 36 ++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 41 deletions(-) create mode 100644 gateway/include/decoder.h create mode 100644 gateway/test/test_decoder.cpp diff --git a/gateway/include/Protocol_1.h b/gateway/include/Protocol_1.h index ee77167..70d7817 100644 --- a/gateway/include/Protocol_1.h +++ b/gateway/include/Protocol_1.h @@ -1,9 +1,6 @@ #pragma once #include "Protocol.h" - -#define RC_STATE(value) value & 0x1 -#define RC_DEVICE(value) (value >> 1) & 0x1F -#define RC_GROUP(value) (value >> 6) & 0x1F +#include "Decoder.h" class Protocol_1 : public Protocol { @@ -29,41 +26,4 @@ public: rcSwitch["channel"] = decoder.device; rcSwitch["raw_value"] = value; } - -private: - struct Decoder { - bool state; - char group; - byte device; - - void decode(unsigned long value) { - value = value >> 2; - unsigned long res = 0; - for (int i = 0; i < 12; i++) { - res |= ((value & 1) ^ 1) << i; - value = value >> 2; - } - - state = RC_STATE(res); - group = RC_GROUP(res); - switch (RC_DEVICE(res)) { - case 0b10000: - device = 1; - break; - case 0b01000: - device = 2; - break; - case 0b00100: - device = 3; - break; - case 0b00010: - device = 4; - break; - case 0b00001: - device = 5; - break; - } - } - }; }; - diff --git a/gateway/include/decoder.h b/gateway/include/decoder.h new file mode 100644 index 0000000..37e9eac --- /dev/null +++ b/gateway/include/decoder.h @@ -0,0 +1,38 @@ +#define RC_STATE(value) value & 0x1 +#define RC_DEVICE(value) (value >> 1) & 0x1F +#define RC_GROUP(value) (value >> 6) & 0x1F + +struct Decoder { + bool state; + char group; + unsigned char device; + + void decode(unsigned long value) { + value = value >> 2; + unsigned long res = 0; + for (int i = 0; i < 12; i++) { + res |= ((value & 1) ^ 1) << i; + value = value >> 2; + } + + state = RC_STATE(res); + group = RC_GROUP(res); + switch (RC_DEVICE(res)) { + case 0b10000: + device = 1; + break; + case 0b01000: + device = 2; + break; + case 0b00100: + device = 3; + break; + case 0b00010: + device = 4; + break; + case 0b00001: + device = 5; + break; + } + } +}; diff --git a/gateway/platformio.ini b/gateway/platformio.ini index 5d8e537..2afa12c 100644 --- a/gateway/platformio.ini +++ b/gateway/platformio.ini @@ -21,3 +21,6 @@ lib_deps = adafruit/DHT sensor library@1.3.10 build_flags = -D DHT_SENSOR=0 upload_port = /dev/ttyUSB0 + +[env:native] +platform = native diff --git a/gateway/test/test_decoder.cpp b/gateway/test/test_decoder.cpp new file mode 100644 index 0000000..32ba2d7 --- /dev/null +++ b/gateway/test/test_decoder.cpp @@ -0,0 +1,36 @@ +#include +#include "Decoder.h" + + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + +void test_1_2_on(void) { + Decoder d; + d.decode(5574993); + TEST_ASSERT_EQUAL(true, d.state); + TEST_ASSERT_EQUAL(1, d.group); + TEST_ASSERT_EQUAL(2, d.device); +} + +void test_1_1_off(void) { + Decoder d; + d.decode(5571924); + TEST_ASSERT_EQUAL(false, d.state); + TEST_ASSERT_EQUAL(1, d.group); + TEST_ASSERT_EQUAL(1, d.device); +} + +int main(int argc, char **argv) { + UNITY_BEGIN(); + RUN_TEST(test_1_2_on); + RUN_TEST(test_1_1_off); + UNITY_END(); + + return 0; +} From 7a10b9e770adfbe485b4fd2e997c2cb5405613e6 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Thu, 27 Oct 2022 20:41:09 +0200 Subject: [PATCH 2/6] fix value construction in tiny --- libraries/Tiny/Tiny.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/Tiny/Tiny.h b/libraries/Tiny/Tiny.h index 5bfc8e0..3597e4c 100644 --- a/libraries/Tiny/Tiny.h +++ b/libraries/Tiny/Tiny.h @@ -2,27 +2,27 @@ #define ID(value) (value & 0x1F) #define VCC(value) ((value & 0x1FFF) << 5) -#define TEMP(value) (((unsigned long)value & 0x2FF) << 18) -#define HUMIDITY(value) (((unsigned long)value & 0x2FF) << 18) -#define VALUE(value) (((unsigned long)value & 0x2FF) << 18) +#define TEMP(value) (((unsigned long)value & 0x3FF) << 18) +#define HUMIDITY(value) (((unsigned long)value & 0x3FF) << 18) +#define VALUE(value) (((unsigned long)value & 0x3FF) << 18) #define STATE(value) ((value & 0x1) << 27) #define TYPE(value) (((unsigned long)value & 0xF) << 28) #define GET_TYPE(value) (((unsigned long)value >> 28) & 0xF) #define GET_STATE(value) ((value >> 27) & 0x1) -#define GET_TEMP(value) (((unsigned long)value >> 18) & 0x2FF) -#define GET_HUMIDITY(value) (((unsigned long)value >> 18) & 0x2FF) -#define GET_VALUE(value) (((unsigned long)value >> 18) & 0x2FF) +#define GET_TEMP(value) (((unsigned long)value >> 18) & 0x3FF) +#define GET_HUMIDITY(value) (((unsigned long)value >> 18) & 0x3FF) +#define GET_VALUE(value) (((unsigned long)value >> 18) & 0x3FF) #define GET_VCC(value) (((unsigned long)value >> 5) & 0x1FFF) -enum SensorType { +enum SensorType : unsigned short { GENERIC = 4, HUMIDITY = 5, TEMPERATURE = 6, CONTACT = 7 }; -enum SensorId : int { +enum SensorId : unsigned short { WINDOW1 = 1, WINDOW2 = 2, WATER_SENSOR = 3, From f9ae76aadf9b11a8eab282133b18d86d1de9bef4 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Thu, 27 Oct 2022 21:22:17 +0200 Subject: [PATCH 3/6] add embedded tests for building sensor --- .drone.yml | 18 ++++- gateway/include/Protocol_1.h | 4 +- gateway/include/Protocol_2.h | 33 +------- gateway/include/{decoder.h => RcDecoder.h} | 2 +- gateway/include/TinyComponent.h | 32 ++++++++ gateway/platformio.ini | 23 ++++++ gateway/test/test_embedded/sensor_builder.cpp | 76 +++++++++++++++++++ .../decoder.cpp} | 5 +- 8 files changed, 153 insertions(+), 40 deletions(-) rename gateway/include/{decoder.h => RcDecoder.h} (97%) create mode 100644 gateway/include/TinyComponent.h create mode 100644 gateway/test/test_embedded/sensor_builder.cpp rename gateway/test/{test_decoder.cpp => test_native/decoder.cpp} (91%) diff --git a/.drone.yml b/.drone.yml index 8fe9ac6..e8d7926 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,24 +1,38 @@ --- kind: pipeline type: exec -name: upload gateway firmare +name: gateway pipeline platform: os: linux arch: arm steps: -- name: upload +- name: native tests + commands: + - cd gateway + - pio test -e native + +- name: embedded tests + commands: + - cd gateway + - pio test -e embedded --without-uploading + +- name: upload firmware commands: - 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 - service ser2net start + when: + target: + - production trigger: branch: - gateway + - gw/* node: host: homebox diff --git a/gateway/include/Protocol_1.h b/gateway/include/Protocol_1.h index 70d7817..f05e7f8 100644 --- a/gateway/include/Protocol_1.h +++ b/gateway/include/Protocol_1.h @@ -1,6 +1,6 @@ #pragma once #include "Protocol.h" -#include "Decoder.h" +#include "RcDecoder.h" class Protocol_1 : public Protocol { @@ -19,7 +19,7 @@ public: void toJson(unsigned long value, JsonDocument& jsonDoc) override { JsonObject rcSwitch = jsonDoc.createNestedObject("rcSwitch"); rcSwitch["protocol"] = protocol; - Decoder decoder; + RcDecoder decoder; decoder.decode(value); rcSwitch["state"] = decoder.state; rcSwitch["group"] = String(decoder.group, BIN); diff --git a/gateway/include/Protocol_2.h b/gateway/include/Protocol_2.h index 0e32a85..589154e 100644 --- a/gateway/include/Protocol_2.h +++ b/gateway/include/Protocol_2.h @@ -1,6 +1,6 @@ #pragma once #include "Protocol.h" -#include "Tiny.h" +#include "TinyComponent.h" class Protocol_2 : public Protocol { @@ -33,35 +33,4 @@ public: } } -private: - bool buildSensorJson(unsigned long value, JsonDocument& jsonDoc) { - JsonObject sensor = jsonDoc.createNestedObject("sensor"); - sensor["id"] = ID(value); - - float voltage = (float)GET_VCC(value) / 1000; - if (voltage != 0) { - JsonObject diagnostic = sensor.createNestedObject("diagnostic"); - diagnostic["voltage"] = voltage; - } - - switch (GET_TYPE(value)) { - case SensorType::GENERIC: - sensor["value"] = GET_VALUE(value); - break; - case SensorType::TEMPERATURE: - sensor["temperature"] = (float)GET_TEMP(value) / 10; - break; - case SensorType::HUMIDITY: - sensor["humidity"] = (float)GET_HUMIDITY(value) / 10; - break; - case SensorType::CONTACT: - sensor["state"] = GET_STATE(value) ? "on" : "off"; - break; - default: - return false; - } - - return true; - } - }; \ No newline at end of file diff --git a/gateway/include/decoder.h b/gateway/include/RcDecoder.h similarity index 97% rename from gateway/include/decoder.h rename to gateway/include/RcDecoder.h index 37e9eac..e43e564 100644 --- a/gateway/include/decoder.h +++ b/gateway/include/RcDecoder.h @@ -2,7 +2,7 @@ #define RC_DEVICE(value) (value >> 1) & 0x1F #define RC_GROUP(value) (value >> 6) & 0x1F -struct Decoder { +struct RcDecoder { bool state; char group; unsigned char device; diff --git a/gateway/include/TinyComponent.h b/gateway/include/TinyComponent.h new file mode 100644 index 0000000..beb5c12 --- /dev/null +++ b/gateway/include/TinyComponent.h @@ -0,0 +1,32 @@ +#include +#include "Tiny.h" + +bool buildSensorJson(unsigned long value, JsonDocument& jsonDoc) { + JsonObject sensor = jsonDoc.createNestedObject("sensor"); + sensor["id"] = ID(value); + + float voltage = (float)GET_VCC(value) / 1000; + if (voltage != 0) { + JsonObject diagnostic = sensor.createNestedObject("diagnostic"); + diagnostic["voltage"] = voltage; + } + + switch (GET_TYPE(value)) { + case SensorType::GENERIC: + sensor["value"] = GET_VALUE(value); + break; + case SensorType::TEMPERATURE: + sensor["temperature"] = (float)GET_TEMP(value) / 10; + break; + case SensorType::HUMIDITY: + sensor["humidity"] = (float)GET_HUMIDITY(value) / 10; + break; + case SensorType::CONTACT: + sensor["state"] = GET_STATE(value) ? "on" : "off"; + break; + default: + return false; + } + + return true; +} diff --git a/gateway/platformio.ini b/gateway/platformio.ini index 2afa12c..7c9ead9 100644 --- a/gateway/platformio.ini +++ b/gateway/platformio.ini @@ -24,3 +24,26 @@ upload_port = /dev/ttyUSB0 [env:native] platform = native +test_filter = test_native + +[env:embedded] +platform = atmelavr +framework = arduino +board = miniatmega328 +lib_extra_dirs = + ../libraries +lib_deps = + sui77/rc-switch@^2.6.3 + bblanchon/ArduinoJson@6.16.1 + +platform_packages = + platformio/tool-simavr +test_speed = 9600 +test_testing_command = + ${platformio.packages_dir}/tool-simavr/bin/simavr + -m + atmega328p + -f + 16000000L + ${platformio.build_dir}/${this.__env__}/firmware.elf +test_filter = test_embedded diff --git a/gateway/test/test_embedded/sensor_builder.cpp b/gateway/test/test_embedded/sensor_builder.cpp new file mode 100644 index 0000000..a5ea9a2 --- /dev/null +++ b/gateway/test/test_embedded/sensor_builder.cpp @@ -0,0 +1,76 @@ +#include +#include +#include "TinyComponent.h" + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + +void test_unknown_sensor_type(void) { + StaticJsonDocument<200> jsonDoc; + unsigned long value = ID(SensorId::TEMP_SENSOR) | TYPE(0); + TEST_ASSERT_EQUAL(false, buildSensorJson(value, jsonDoc)); +} + +void test_temp_sensor(void) { + StaticJsonDocument<200> jsonDoc; + unsigned long value = ID(SensorId::TEMP_SENSOR) | TEMP(210) | TYPE(SensorType::TEMPERATURE); + TEST_ASSERT_EQUAL(true, buildSensorJson(value, jsonDoc)); + + JsonObject sensor = jsonDoc["sensor"]; + TEST_ASSERT_EQUAL(SensorId::TEMP_SENSOR, sensor["id"]); + TEST_ASSERT_EQUAL(21, sensor["temperature"]); +} + +void test_temp_sensor_with_voltage(void) { + StaticJsonDocument<200> jsonDoc; + unsigned long value = ID(SensorId::TEMP_SENSOR) | TEMP(320) | TYPE(SensorType::TEMPERATURE) | VCC(2847L); + TEST_ASSERT_EQUAL(true, buildSensorJson(value, jsonDoc)); + + JsonObject sensor = jsonDoc["sensor"]; + TEST_ASSERT_EQUAL(SensorId::TEMP_SENSOR, sensor["id"]); + TEST_ASSERT_EQUAL(32, sensor["temperature"]); + + JsonObject diagnostic = sensor["diagnostic"]; + TEST_ASSERT_EQUAL(2.847, diagnostic["voltage"]); +} + +void test_oil_sensor(void) { + StaticJsonDocument<200> jsonDoc; + unsigned long value = ID(SensorId::OIL_SENSOR) | VALUE(150) | TYPE(SensorType::GENERIC); + TEST_ASSERT_EQUAL(true, buildSensorJson(value, jsonDoc)); + + JsonObject sensor = jsonDoc["sensor"]; + TEST_ASSERT_EQUAL(SensorId::OIL_SENSOR, sensor["id"]); + TEST_ASSERT_EQUAL(150, sensor["value"]); +} + +void test_oil_sensor_with_voltage(void) { + StaticJsonDocument<200> jsonDoc; + unsigned long value = ID(SensorId::OIL_SENSOR) | TEMP(200) | TYPE(SensorType::GENERIC) | VCC(2847L); + TEST_ASSERT_EQUAL(true, buildSensorJson(value, jsonDoc)); + + JsonObject sensor = jsonDoc["sensor"]; + TEST_ASSERT_EQUAL(SensorId::OIL_SENSOR, sensor["id"]); + TEST_ASSERT_EQUAL(200, sensor["value"]); + + JsonObject diagnostic = sensor["diagnostic"]; + TEST_ASSERT_EQUAL(2.847, diagnostic["voltage"]); +} + +void setup() { + UNITY_BEGIN(); + RUN_TEST(test_unknown_sensor_type); + RUN_TEST(test_temp_sensor); + RUN_TEST(test_temp_sensor_with_voltage); + RUN_TEST(test_oil_sensor); + RUN_TEST(test_oil_sensor_with_voltage); + UNITY_END(); +} + +void loop() { +} diff --git a/gateway/test/test_decoder.cpp b/gateway/test/test_native/decoder.cpp similarity index 91% rename from gateway/test/test_decoder.cpp rename to gateway/test/test_native/decoder.cpp index 32ba2d7..dea0636 100644 --- a/gateway/test/test_decoder.cpp +++ b/gateway/test/test_native/decoder.cpp @@ -1,6 +1,7 @@ #include -#include "Decoder.h" +#include "RcDecoder.h" +RcDecoder d; void setUp(void) { // set stuff up here @@ -11,7 +12,6 @@ void tearDown(void) { } void test_1_2_on(void) { - Decoder d; d.decode(5574993); TEST_ASSERT_EQUAL(true, d.state); TEST_ASSERT_EQUAL(1, d.group); @@ -19,7 +19,6 @@ void test_1_2_on(void) { } void test_1_1_off(void) { - Decoder d; d.decode(5571924); TEST_ASSERT_EQUAL(false, d.state); TEST_ASSERT_EQUAL(1, d.group); From 4ec9b50b1c9a129bd2b2326e566a91d359f0a330 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Thu, 27 Oct 2022 22:03:00 +0200 Subject: [PATCH 4/6] fix lib path for simavr in pipeline --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index e8d7926..41e3d5c 100644 --- a/.drone.yml +++ b/.drone.yml @@ -16,7 +16,7 @@ steps: - name: embedded tests commands: - cd gateway - - pio test -e embedded --without-uploading + - LD_LIBRARY_PATH=~/.platformio/packages/tool-simavr/lib/ pio test -e embedded --without-uploading - name: upload firmware commands: From 5284ce9b410b15da957ac652384602c3b175b309 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Fri, 28 Oct 2022 08:47:27 +0200 Subject: [PATCH 5/6] define masks for tiny components --- libraries/Tiny/Tiny.h | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/libraries/Tiny/Tiny.h b/libraries/Tiny/Tiny.h index 3597e4c..1a9b750 100644 --- a/libraries/Tiny/Tiny.h +++ b/libraries/Tiny/Tiny.h @@ -1,19 +1,25 @@ #pragma once -#define ID(value) (value & 0x1F) -#define VCC(value) ((value & 0x1FFF) << 5) -#define TEMP(value) (((unsigned long)value & 0x3FF) << 18) -#define HUMIDITY(value) (((unsigned long)value & 0x3FF) << 18) -#define VALUE(value) (((unsigned long)value & 0x3FF) << 18) -#define STATE(value) ((value & 0x1) << 27) -#define TYPE(value) (((unsigned long)value & 0xF) << 28) +#define MASK_ID 0x1F +#define MASK_VCC 0x1FFF +#define MASK_VALUE 0x3FF +#define MASK_STATE 0x1 +#define MASK_TYPE 0xF -#define GET_TYPE(value) (((unsigned long)value >> 28) & 0xF) -#define GET_STATE(value) ((value >> 27) & 0x1) -#define GET_TEMP(value) (((unsigned long)value >> 18) & 0x3FF) -#define GET_HUMIDITY(value) (((unsigned long)value >> 18) & 0x3FF) -#define GET_VALUE(value) (((unsigned long)value >> 18) & 0x3FF) -#define GET_VCC(value) (((unsigned long)value >> 5) & 0x1FFF) +#define ID(value) (value & 0x1F) +#define VCC(value) ((value & MASK_VCC) << 5) +#define TEMP(value) (((unsigned long)value & MASK_VALUE) << 18) +#define HUMIDITY(value) (((unsigned long)value & MASK_VALUE) << 18) +#define VALUE(value) (((unsigned long)value & MASK_VALUE) << 18) +#define STATE(value) ((value & MASK_STATE) << 27) +#define TYPE(value) (((unsigned long)value & MASK_TYPE) << 28) + +#define GET_TYPE(value) (((unsigned long)value >> 28) & MASK_TYPE) +#define GET_STATE(value) ((value >> 27) & MASK_STATE) +#define GET_TEMP(value) (((unsigned long)value >> 18) & MASK_VALUE) +#define GET_HUMIDITY(value) (((unsigned long)value >> 18) & MASK_VALUE) +#define GET_VALUE(value) (((unsigned long)value >> 18) & MASK_VALUE) +#define GET_VCC(value) (((unsigned long)value >> 5) & MASK_VCC) enum SensorType : unsigned short { GENERIC = 4, From 55325825316e18ee7a707bbcf4269358b13f0871 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Fri, 28 Oct 2022 08:59:37 +0200 Subject: [PATCH 6/6] test max values --- .drone.yml | 4 +- gateway/test/test_embedded/sensor_builder.cpp | 42 ++++++++++++++++++- libraries/Tiny/Tiny.h | 2 +- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/.drone.yml b/.drone.yml index 41e3d5c..293b48f 100644 --- a/.drone.yml +++ b/.drone.yml @@ -26,8 +26,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: - target: - - production + branch: + - gateway trigger: branch: diff --git a/gateway/test/test_embedded/sensor_builder.cpp b/gateway/test/test_embedded/sensor_builder.cpp index a5ea9a2..8ca3ca3 100644 --- a/gateway/test/test_embedded/sensor_builder.cpp +++ b/gateway/test/test_embedded/sensor_builder.cpp @@ -12,10 +12,46 @@ void tearDown(void) { void test_unknown_sensor_type(void) { StaticJsonDocument<200> jsonDoc; - unsigned long value = ID(SensorId::TEMP_SENSOR) | TYPE(0); + unsigned long value = TYPE(0); TEST_ASSERT_EQUAL(false, buildSensorJson(value, jsonDoc)); } +void test_max_temp(void) { + StaticJsonDocument<200> jsonDoc; + unsigned long value = TEMP(1023) | TYPE(SensorType::TEMPERATURE); + TEST_ASSERT_EQUAL(true, buildSensorJson(value, jsonDoc)); + + JsonObject sensor = jsonDoc["sensor"]; + TEST_ASSERT_EQUAL(102.3, sensor["temperature"]); +} + +void test_overflow_value(void) { + StaticJsonDocument<200> jsonDoc; + unsigned long value = VALUE(1024) | TYPE(SensorType::GENERIC); + TEST_ASSERT_EQUAL(true, buildSensorJson(value, jsonDoc)); + + JsonObject sensor = jsonDoc["sensor"]; + TEST_ASSERT_EQUAL(0, sensor["value"]); +} + +void test_max_voltage(void) { + StaticJsonDocument<200> jsonDoc; + unsigned long value = VCC(8191) | TYPE(SensorType::GENERIC); + TEST_ASSERT_EQUAL(true, buildSensorJson(value, jsonDoc)); + + JsonObject diagnostic = jsonDoc["sensor"]["diagnostic"]; + TEST_ASSERT_EQUAL(8.191, diagnostic["voltage"]); +} + +void test_overflow_voltage(void) { + StaticJsonDocument<200> jsonDoc; + unsigned long value = VCC(8192) | TYPE(SensorType::GENERIC); + TEST_ASSERT_EQUAL(true, buildSensorJson(value, jsonDoc)); + + JsonObject diagnostic = jsonDoc["sensor"]["diagnostic"]; + TEST_ASSERT_EQUAL(0, diagnostic["voltage"]); +} + void test_temp_sensor(void) { StaticJsonDocument<200> jsonDoc; unsigned long value = ID(SensorId::TEMP_SENSOR) | TEMP(210) | TYPE(SensorType::TEMPERATURE); @@ -65,6 +101,10 @@ void test_oil_sensor_with_voltage(void) { void setup() { UNITY_BEGIN(); RUN_TEST(test_unknown_sensor_type); + RUN_TEST(test_max_temp); + RUN_TEST(test_overflow_value); + RUN_TEST(test_max_voltage); + RUN_TEST(test_overflow_voltage); RUN_TEST(test_temp_sensor); RUN_TEST(test_temp_sensor_with_voltage); RUN_TEST(test_oil_sensor); diff --git a/libraries/Tiny/Tiny.h b/libraries/Tiny/Tiny.h index 1a9b750..653be12 100644 --- a/libraries/Tiny/Tiny.h +++ b/libraries/Tiny/Tiny.h @@ -7,7 +7,7 @@ #define MASK_TYPE 0xF #define ID(value) (value & 0x1F) -#define VCC(value) ((value & MASK_VCC) << 5) +#define VCC(value) (((unsigned long)value & MASK_VCC) << 5) #define TEMP(value) (((unsigned long)value & MASK_VALUE) << 18) #define HUMIDITY(value) (((unsigned long)value & MASK_VALUE) << 18) #define VALUE(value) (((unsigned long)value & MASK_VALUE) << 18)