From b8e7c6ee7ae8f44112b31bed62fe1248d8468d5e Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 11:09:21 +0200 Subject: [PATCH 01/37] Update platformio.ini --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index 1ff5e92ce..5d991fe38 100644 --- a/platformio.ini +++ b/platformio.ini @@ -20,6 +20,7 @@ default_envs = tbeam ;default_envs = pca10059_diy_eink ;default_envs = meshtastic-diy-v1 ;default_envs = meshtastic-diy-v1.1 +;default_envs = m5stack-coreink extra_configs = variants/*/platformio.ini From 1f7fee8e2ad6bc2f54fb6d96f8056688411a864f Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 11:10:49 +0200 Subject: [PATCH 02/37] Create platformio.ini --- variants/m5stack_coreink/platformio.ini | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 variants/m5stack_coreink/platformio.ini diff --git a/variants/m5stack_coreink/platformio.ini b/variants/m5stack_coreink/platformio.ini new file mode 100644 index 000000000..d23ee79c2 --- /dev/null +++ b/variants/m5stack_coreink/platformio.ini @@ -0,0 +1,14 @@ +[env:m5stack-coreink] +extends = esp32_base +board = m5stack-coreink +build_flags = + ${esp32_base.build_flags} -D PRIVATE_HW -I variants/m5stack_coreink + ;-D RADIOLIB_VERBOSE + -Ofast + -D__MCUXPRESSO +lib_deps = + ${esp32_base.lib_deps} + zinggjm/GxEPD2@^1.4.5 +board_build.f_cpu = 240000000L +upload_protocol = esptool +upload_port = /dev/ttyACM* From a7fbe024e4900979c9864051b21fc10d08dff1bd Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 11:12:45 +0200 Subject: [PATCH 03/37] Create variant.h --- variants/m5stack_coreink/variant.h | 44 ++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 variants/m5stack_coreink/variant.h diff --git a/variants/m5stack_coreink/variant.h b/variants/m5stack_coreink/variant.h new file mode 100644 index 000000000..f52b1bf1f --- /dev/null +++ b/variants/m5stack_coreink/variant.h @@ -0,0 +1,44 @@ +#define I2C_SDA 32 //-1 +#define I2C_SCL 33 //-1 + +//#define LED_PIN 10 + +#define BUTTON_NEED_PULLUP +#define BUTTON_PIN 5 + +//Wheel +// Down 37 +// Push 38 +// Up 39 + +// Top Physical Button 5 + +#undef RF95_SCK +#undef RF95_MISO +#undef RF95_MOSI +#undef RF95_NSS +#define USE_RF95 + +#define RF95_SCK 18 //13 +#define RF95_MISO 34 //26 +#define RF95_MOSI 23 //25 +#define RF95_NSS 14 +#define LORA_DIO0 25 //32 now moved from ext port +#define LORA_RESET 26 //33 now moved from ext port +#define LORA_DIO1 RADIOLIB_NC +#define LORA_DIO2 RADIOLIB_NC + +#define NO_GPS +// This board has no GPS for now +#undef GPS_RX_PIN +#undef GPS_TX_PIN + +#define HAS_EINK +//https://docs.m5stack.com/en/core/coreink +#define PIN_EINK_EN -1 +#define PIN_EINK_CS 9 // EPD_CS +#define PIN_EINK_BUSY 4 // EPD_BUSY +#define PIN_EINK_DC 15 // EPD_D/C +#define PIN_EINK_RES -1 // Connected to GPIO0 but no needed !!!! maybe causing issue ? +#define PIN_EINK_SCLK 18 // EPD_SCLK +#define PIN_EINK_MOSI 23 // EPD_MOSI From b9f25eb85cee2712da5ff20ab17a92677e079e32 Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 11:21:09 +0200 Subject: [PATCH 04/37] Update EInkDisplay2.cpp --- src/graphics/EInkDisplay2.cpp | 44 +++++++++++++---------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/src/graphics/EInkDisplay2.cpp b/src/graphics/EInkDisplay2.cpp index 073b313cd..71606d448 100644 --- a/src/graphics/EInkDisplay2.cpp +++ b/src/graphics/EInkDisplay2.cpp @@ -31,6 +31,11 @@ //4.2 inch 300x400 - GxEPD2_420_M01 #define TECHO_DISPLAY_MODEL GxEPD2_420_M01 +#elif defined(PRIVATE_HW) +//M5Stack CoreInk +//1.54 inch 200x200 - GxEPD2_154_M09 +#define TECHO_DISPLAY_MODEL GxEPD2_154_M09 + #endif GxEPD2_BW *adafruitDisplay; @@ -58,6 +63,12 @@ EInkDisplay::EInkDisplay(uint8_t address, int sda, int scl) //GxEPD2_420_M01 setGeometry(GEOMETRY_RAWMODE, 300, 400); + #elif defined(PRIVATE_HW) + + //M5Stack_CoreInk 200x200 + //1.54 inch 200x200 - GxEPD2_154_M09 + setGeometry(GEOMETRY_RAWMODE, 200, 200); + #endif // setGeometry(GEOMETRY_RAWMODE, 128, 64); // old resolution // setGeometry(GEOMETRY_128_64); // We originally used this because I wasn't sure if rawmode worked - it does @@ -108,7 +119,7 @@ bool EInkDisplay::forceDisplay(uint32_t msecLimit) // 4.2 inch 300x400 - GxEPD2_420_M01 //adafruitDisplay->nextPage(); - #elif defined(PCA10059) + #elif defined(PCA10059) || defined(PRIVATE_HW) adafruitDisplay->nextPage(); #endif @@ -180,40 +191,15 @@ bool EInkDisplay::connect() adafruitDisplay->init(115200, true, 10, false, SPI1, SPISettings(4000000, MSBFIRST, SPI_MODE0)); //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates - //RAK14000 2.13 inch b/w 250x122 does not support partial updates adafruitDisplay->setRotation(3); //For 1.54, 2.9 and 4.2 //adafruitDisplay->setRotation(1); - - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); + //adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); } else { (void)adafruitDisplay; } } -#elif defined(PCA10059) +#elif defined(PCA10059) || defined(PRIVATE_HW) { auto lowLevel = new TECHO_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY); adafruitDisplay = new GxEPD2_BW(*lowLevel); @@ -221,6 +207,8 @@ bool EInkDisplay::connect() adafruitDisplay->setRotation(3); adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); } +#elif defined(PRIVATE_HW) + adafruitDisplay->setRotation(0); #endif From b34b26518b03c498fc4a3dba86c9faa21f624e5c Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 11:28:18 +0200 Subject: [PATCH 05/37] Update EInkDisplay2.cpp --- src/graphics/EInkDisplay2.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/graphics/EInkDisplay2.cpp b/src/graphics/EInkDisplay2.cpp index 71606d448..ba5ecc702 100644 --- a/src/graphics/EInkDisplay2.cpp +++ b/src/graphics/EInkDisplay2.cpp @@ -199,7 +199,7 @@ bool EInkDisplay::connect() (void)adafruitDisplay; } } -#elif defined(PCA10059) || defined(PRIVATE_HW) +#elif defined(PCA10059) { auto lowLevel = new TECHO_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY); adafruitDisplay = new GxEPD2_BW(*lowLevel); @@ -208,7 +208,12 @@ bool EInkDisplay::connect() adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); } #elif defined(PRIVATE_HW) - adafruitDisplay->setRotation(0); + auto lowLevel = new TECHO_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY); + adafruitDisplay = new GxEPD2_BW(*lowLevel); + adafruitDisplay->init(115200, true, 10, false, SPI, SPISettings(4000000, MSBFIRST, SPI_MODE0)); + adafruitDisplay->setRotation(0); + adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); + #endif From 71a43a97cc34ffbf2ae645fc4dc786bab9c559ce Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Wed, 1 Jun 2022 06:06:40 -0500 Subject: [PATCH 06/37] Bump to 13 --- version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.properties b/version.properties index 562db32e6..bfae41f27 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 1 minor = 3 -build = 12 +build = 13 From e8afd4fb4b9f73f381301a0468c12f5cb3f51264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Wed, 1 Jun 2022 17:09:57 +0200 Subject: [PATCH 07/37] If we get an unreadable buffer, don't try to process it. --- src/mesh/ProtobufModule.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mesh/ProtobufModule.h b/src/mesh/ProtobufModule.h index 4e411c2a4..6d307d921 100644 --- a/src/mesh/ProtobufModule.h +++ b/src/mesh/ProtobufModule.h @@ -77,10 +77,13 @@ template class ProtobufModule : protected SinglePortModule T *decoded = NULL; if (mp.which_payloadVariant == MeshPacket_decoded_tag && mp.decoded.portnum == ourPortNum) { memset(&scratch, 0, sizeof(scratch)); - if (pb_decode_from_bytes(p.payload.bytes, p.payload.size, fields, &scratch)) + if (pb_decode_from_bytes(p.payload.bytes, p.payload.size, fields, &scratch)) { decoded = &scratch; - else + } else { DEBUG_MSG("Error decoding protobuf module!\n"); + // if we can't decode it, nobody can process it! + return ProcessMessage::STOP; + } } return handleReceivedProtobuf(mp, decoded) ? ProcessMessage::STOP : ProcessMessage::CONTINUE; From fe8bfdb7625be48d08c18a472be85426998ad1cd Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 17:48:31 +0200 Subject: [PATCH 08/37] Update variant.h --- variants/m5stack_coreink/variant.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/variants/m5stack_coreink/variant.h b/variants/m5stack_coreink/variant.h index f52b1bf1f..b7894741e 100644 --- a/variants/m5stack_coreink/variant.h +++ b/variants/m5stack_coreink/variant.h @@ -1,8 +1,11 @@ -#define I2C_SDA 32 //-1 -#define I2C_SCL 33 //-1 +#define I2C_SDA 21 //-1 +#define I2C_SCL 22 //-1 //#define LED_PIN 10 +// PCF8563 RTC Module +#define PCF8563_RTC 0x51 + #define BUTTON_NEED_PULLUP #define BUTTON_PIN 5 From f33e6a0e6639185c437c43a81f73bdb3c185557f Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 17:49:10 +0200 Subject: [PATCH 09/37] Update platformio.ini --- variants/m5stack_coreink/platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/m5stack_coreink/platformio.ini b/variants/m5stack_coreink/platformio.ini index d23ee79c2..a8f01edea 100644 --- a/variants/m5stack_coreink/platformio.ini +++ b/variants/m5stack_coreink/platformio.ini @@ -9,6 +9,7 @@ build_flags = lib_deps = ${esp32_base.lib_deps} zinggjm/GxEPD2@^1.4.5 + lewisxhe/PCF8563_Library@^0.0.1 board_build.f_cpu = 240000000L upload_protocol = esptool upload_port = /dev/ttyACM* From 95f091041b45d1533723fbe97ad707edf3c17f1c Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 17:53:19 +0200 Subject: [PATCH 10/37] Update variant.h --- variants/m5stack_coreink/variant.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/m5stack_coreink/variant.h b/variants/m5stack_coreink/variant.h index b7894741e..17339fe83 100644 --- a/variants/m5stack_coreink/variant.h +++ b/variants/m5stack_coreink/variant.h @@ -1,7 +1,7 @@ #define I2C_SDA 21 //-1 #define I2C_SCL 22 //-1 -//#define LED_PIN 10 +#define LED_PIN 10 // PCF8563 RTC Module #define PCF8563_RTC 0x51 From c7a9ce7f49ef4edd1a6403079e89873861b92c6a Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 18:08:13 +0200 Subject: [PATCH 11/37] Update variant.h --- variants/m5stack_coreink/variant.h | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/m5stack_coreink/variant.h b/variants/m5stack_coreink/variant.h index 17339fe83..c0276485f 100644 --- a/variants/m5stack_coreink/variant.h +++ b/variants/m5stack_coreink/variant.h @@ -38,6 +38,7 @@ #define HAS_EINK //https://docs.m5stack.com/en/core/coreink +//https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/schematic/Core/coreink/coreink_sch.pdf #define PIN_EINK_EN -1 #define PIN_EINK_CS 9 // EPD_CS #define PIN_EINK_BUSY 4 // EPD_BUSY From 5828e6f423d53e60f0598a0f4c88c6546221653e Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 18:08:40 +0200 Subject: [PATCH 12/37] Update variant.h --- variants/m5stack_coreink/variant.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/m5stack_coreink/variant.h b/variants/m5stack_coreink/variant.h index c0276485f..16f0bc6cf 100644 --- a/variants/m5stack_coreink/variant.h +++ b/variants/m5stack_coreink/variant.h @@ -1,7 +1,7 @@ #define I2C_SDA 21 //-1 #define I2C_SCL 22 //-1 -#define LED_PIN 10 +//#define LED_PIN 10 // PCF8563 RTC Module #define PCF8563_RTC 0x51 From 0d09767efdba4a77271b44794bb15bc51d3a0935 Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 18:11:06 +0200 Subject: [PATCH 13/37] Update variant.h --- variants/m5stack_coreink/variant.h | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/m5stack_coreink/variant.h b/variants/m5stack_coreink/variant.h index 16f0bc6cf..ff9eda6f4 100644 --- a/variants/m5stack_coreink/variant.h +++ b/variants/m5stack_coreink/variant.h @@ -3,6 +3,7 @@ //#define LED_PIN 10 +#include "pcf8563.h" // PCF8563 RTC Module #define PCF8563_RTC 0x51 From 9512ea45de18575cc27d8ae99d7d0a818cf61856 Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 19:27:38 +0200 Subject: [PATCH 14/37] Update EInkDisplay2.cpp --- src/graphics/EInkDisplay2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/EInkDisplay2.cpp b/src/graphics/EInkDisplay2.cpp index ba5ecc702..20abc8947 100644 --- a/src/graphics/EInkDisplay2.cpp +++ b/src/graphics/EInkDisplay2.cpp @@ -192,7 +192,7 @@ bool EInkDisplay::connect() //RAK14000 2.13 inch b/w 250x122 does not support partial updates adafruitDisplay->setRotation(3); - //For 1.54, 2.9 and 4.2 + //For 1.54, 2.9 and 4.2 with Partial Updates //adafruitDisplay->setRotation(1); //adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); } else { From 4e813b098a52ba73d2bc1a48a87f6bd39e263276 Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 20:30:21 +0200 Subject: [PATCH 15/37] Update platformio.ini --- variants/m5stack_coreink/platformio.ini | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/variants/m5stack_coreink/platformio.ini b/variants/m5stack_coreink/platformio.ini index a8f01edea..a6a35d80e 100644 --- a/variants/m5stack_coreink/platformio.ini +++ b/variants/m5stack_coreink/platformio.ini @@ -2,10 +2,13 @@ extends = esp32_base board = m5stack-coreink build_flags = - ${esp32_base.build_flags} -D PRIVATE_HW -I variants/m5stack_coreink + ${esp32_base.build_flags} -D M5_COREINK -I variants/m5stack_coreink ;-D RADIOLIB_VERBOSE -Ofast -D__MCUXPRESSO + -DEPD_HEIGHT=200 + -DEPD_WIDTH=200 + -DM5STACK lib_deps = ${esp32_base.lib_deps} zinggjm/GxEPD2@^1.4.5 From c7dfd245e399122dda1a9014484de2b4c20b4667 Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 20:31:39 +0200 Subject: [PATCH 16/37] Update EInkDisplay2.cpp --- src/graphics/EInkDisplay2.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/graphics/EInkDisplay2.cpp b/src/graphics/EInkDisplay2.cpp index 20abc8947..eac336290 100644 --- a/src/graphics/EInkDisplay2.cpp +++ b/src/graphics/EInkDisplay2.cpp @@ -31,7 +31,7 @@ //4.2 inch 300x400 - GxEPD2_420_M01 #define TECHO_DISPLAY_MODEL GxEPD2_420_M01 -#elif defined(PRIVATE_HW) +#elif defined(M5_COREINK) //M5Stack CoreInk //1.54 inch 200x200 - GxEPD2_154_M09 #define TECHO_DISPLAY_MODEL GxEPD2_154_M09 @@ -63,12 +63,13 @@ EInkDisplay::EInkDisplay(uint8_t address, int sda, int scl) //GxEPD2_420_M01 setGeometry(GEOMETRY_RAWMODE, 300, 400); - #elif defined(PRIVATE_HW) + #elif defined(M5_COREINK) //M5Stack_CoreInk 200x200 //1.54 inch 200x200 - GxEPD2_154_M09 - setGeometry(GEOMETRY_RAWMODE, 200, 200); - + //setGeometry(GEOMETRY_RAWMODE, 200, 200); + setGeometry(GEOMETRY_RAWMODE, EPD_HEIGHT, EPD_WIDTH); + #endif // setGeometry(GEOMETRY_RAWMODE, 128, 64); // old resolution // setGeometry(GEOMETRY_128_64); // We originally used this because I wasn't sure if rawmode worked - it does @@ -119,7 +120,7 @@ bool EInkDisplay::forceDisplay(uint32_t msecLimit) // 4.2 inch 300x400 - GxEPD2_420_M01 //adafruitDisplay->nextPage(); - #elif defined(PCA10059) || defined(PRIVATE_HW) + #elif defined(PCA10059) || defined(M5_COREINK) adafruitDisplay->nextPage(); #endif @@ -192,7 +193,7 @@ bool EInkDisplay::connect() //RAK14000 2.13 inch b/w 250x122 does not support partial updates adafruitDisplay->setRotation(3); - //For 1.54, 2.9 and 4.2 with Partial Updates + //For 1.54, 2.9 and 4.2 //adafruitDisplay->setRotation(1); //adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); } else { @@ -207,13 +208,12 @@ bool EInkDisplay::connect() adafruitDisplay->setRotation(3); adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); } -#elif defined(PRIVATE_HW) +#elif defined(M5_COREINK) auto lowLevel = new TECHO_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY); adafruitDisplay = new GxEPD2_BW(*lowLevel); adafruitDisplay->init(115200, true, 10, false, SPI, SPISettings(4000000, MSBFIRST, SPI_MODE0)); adafruitDisplay->setRotation(0); - adafruitDisplay->setPartialWindow(0, 0, displayWidth, displayHeight); - + adafruitDisplay->setPartialWindow(0, 0, EPD_WIDTH, EPD_HEIGHT); #endif From 48ee995e0d3ac03872e51b1537faf9f887e2ca47 Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Wed, 1 Jun 2022 20:33:51 +0200 Subject: [PATCH 17/37] Update EInkDisplay2.cpp --- src/graphics/EInkDisplay2.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/graphics/EInkDisplay2.cpp b/src/graphics/EInkDisplay2.cpp index eac336290..ef6bac4cf 100644 --- a/src/graphics/EInkDisplay2.cpp +++ b/src/graphics/EInkDisplay2.cpp @@ -67,7 +67,6 @@ EInkDisplay::EInkDisplay(uint8_t address, int sda, int scl) //M5Stack_CoreInk 200x200 //1.54 inch 200x200 - GxEPD2_154_M09 - //setGeometry(GEOMETRY_RAWMODE, 200, 200); setGeometry(GEOMETRY_RAWMODE, EPD_HEIGHT, EPD_WIDTH); #endif From 5aef58e87f39f47f747c67694c7150f823a97f15 Mon Sep 17 00:00:00 2001 From: mc-hamster Date: Fri, 3 Jun 2022 01:07:08 +0000 Subject: [PATCH 18/37] [create-pull-request] automated change --- protobufs | 2 +- src/mesh/generated/deviceonly.pb.h | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/protobufs b/protobufs index 695b24211..62141e9d6 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 695b2421130a6efd9ad7cdecfe2d4420404f0f97 +Subproject commit 62141e9d6889b3c088eca125e658b15b9d438beb diff --git a/src/mesh/generated/deviceonly.pb.h b/src/mesh/generated/deviceonly.pb.h index 95e298fa0..6da17270e 100644 --- a/src/mesh/generated/deviceonly.pb.h +++ b/src/mesh/generated/deviceonly.pb.h @@ -44,7 +44,7 @@ typedef struct _DeviceState { User owner; /* TODO: REPLACE */ pb_size_t node_db_count; - NodeInfo node_db[64]; + NodeInfo node_db[80]; /* Received packets saved for delivery to the phone */ pb_size_t receive_queue_count; MeshPacket receive_queue[1]; @@ -92,10 +92,10 @@ extern "C" { #endif /* Initializer values for message structs */ -#define DeviceState_init_default {false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default}, false, MeshPacket_init_default, 0, 0, 0} +#define DeviceState_init_default {false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default}, false, MeshPacket_init_default, 0, 0, 0} #define ChannelFile_init_default {0, {Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default}} #define OEMStore_init_default {0, 0, {0, {0}}, _ScreenFonts_MIN, ""} -#define DeviceState_init_zero {false, MyNodeInfo_init_zero, false, User_init_zero, 0, {NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero}, 0, {MeshPacket_init_zero}, false, MeshPacket_init_zero, 0, 0, 0} +#define DeviceState_init_zero {false, MyNodeInfo_init_zero, false, User_init_zero, 0, {NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero}, 0, {MeshPacket_init_zero}, false, MeshPacket_init_zero, 0, 0, 0} #define ChannelFile_init_zero {0, {Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero}} #define OEMStore_init_zero {0, 0, {0, {0}}, _ScreenFonts_MIN, ""} @@ -159,7 +159,7 @@ extern const pb_msgdesc_t OEMStore_msg; /* Maximum encoded size of messages (where known) */ #define ChannelFile_size 624 -#define DeviceState_size 19184 +#define DeviceState_size 23728 #define OEMStore_size 2106 #ifdef __cplusplus From db28a1562e158cb2e2b20e3220d78035afd7d6d1 Mon Sep 17 00:00:00 2001 From: Mark Trevor Birss Date: Fri, 3 Jun 2022 14:21:27 +0200 Subject: [PATCH 19/37] Update EInkDisplay2.cpp Fix E-Ink not powering up bug at startup --- src/graphics/EInkDisplay2.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/graphics/EInkDisplay2.cpp b/src/graphics/EInkDisplay2.cpp index ef6bac4cf..7c002d928 100644 --- a/src/graphics/EInkDisplay2.cpp +++ b/src/graphics/EInkDisplay2.cpp @@ -210,7 +210,8 @@ bool EInkDisplay::connect() #elif defined(M5_COREINK) auto lowLevel = new TECHO_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY); adafruitDisplay = new GxEPD2_BW(*lowLevel); - adafruitDisplay->init(115200, true, 10, false, SPI, SPISettings(4000000, MSBFIRST, SPI_MODE0)); + delay(100); + adafruitDisplay->init(115200, true, 20, false, SPI, SPISettings(4000000, MSBFIRST, SPI_MODE0)); adafruitDisplay->setRotation(0); adafruitDisplay->setPartialWindow(0, 0, EPD_WIDTH, EPD_HEIGHT); #endif From 9821a0535b8a58547893cda642942ab97088d083 Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 3 Jun 2022 14:32:32 -0700 Subject: [PATCH 20/37] Bump to 1.3.14 --- version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.properties b/version.properties index bfae41f27..4c91bb78e 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 1 minor = 3 -build = 13 +build = 14 From 2e1b89579138f8feff682ea2abf7a25be2a1ad8a Mon Sep 17 00:00:00 2001 From: mc-hamster Date: Sat, 4 Jun 2022 01:47:29 +0000 Subject: [PATCH 21/37] [create-pull-request] automated change --- protobufs | 2 +- src/mesh/generated/portnums.pb.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/protobufs b/protobufs index 62141e9d6..33b3ab5fd 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 62141e9d6889b3c088eca125e658b15b9d438beb +Subproject commit 33b3ab5fde6b6ef158e3b111bf240d1d59c152ef diff --git a/src/mesh/generated/portnums.pb.h b/src/mesh/generated/portnums.pb.h index b4fd37382..cc8466f88 100644 --- a/src/mesh/generated/portnums.pb.h +++ b/src/mesh/generated/portnums.pb.h @@ -48,6 +48,8 @@ typedef enum _PortNum { PortNum_ADMIN_APP = 6, /* Compressed TEXT_MESSAGE payloads. */ PortNum_TEXT_MESSAGE_COMPRESSED_APP = 7, + /* Waypoint payloads. */ + PortNum_WAYPOINT_APP = 8, /* Provides a 'ping' service that replies to any packet it receives. Also serves as a small example module. */ PortNum_REPLY_APP = 32, From 432d06741e0de76f20d02c5caa73b798341ff16a Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 3 Jun 2022 18:49:18 -0700 Subject: [PATCH 22/37] Update version.properties --- version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.properties b/version.properties index 4c91bb78e..e903aec4a 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 1 minor = 3 -build = 14 +build = 15 From 40ded630d040509eacff031317847aab1bd87b1f Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 3 Jun 2022 20:38:13 -0700 Subject: [PATCH 23/37] Change default screen on to 10 minutes --- src/PowerFSM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 1bfc58694..0804d62dc 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -335,7 +335,7 @@ void PowerFSM_setup() powerFSM.add_timed_transition(&stateON, &stateDARK, config.display.screen_on_secs ? config.display.screen_on_secs - : 60 * 1000, + : 60 * 1000 * 10, NULL, "Screen-on timeout"); // On most boards we use light-sleep to be our main state, but on NRF52 we just stay in DARK From 80e08f6de9bcb8ec00f904d21a2915fac9c5dd8d Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 3 Jun 2022 21:51:47 -0700 Subject: [PATCH 24/37] Disabled the unset welcome screen --- src/configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configuration.h b/src/configuration.h index 1f4864f8a..aae49d98d 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -144,7 +144,7 @@ along with this program. If not, see . //#define DISABLE_NTP // Disable the welcome screen and allow -//#define DISABLE_WELCOME_UNSET +#define DISABLE_WELCOME_UNSET // ----------------------------------------------------------------------------- // OLED & Input From df9e9bc223c97eea13bc5c0cc3d1d8049817a357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sat, 4 Jun 2022 10:37:24 +0200 Subject: [PATCH 25/37] Bugfix for nRF Crypto 90% done, includes heavy debug code, do not merge for now. --- src/esp32/ESP32CryptoEngine.cpp | 6 +-- src/mesh/CryptoEngine.cpp | 74 ++++++++++++++++++++++++++++++++- src/mesh/CryptoEngine.h | 2 + src/nrf52/NRF52CryptoEngine.cpp | 22 ++++++---- 4 files changed, 92 insertions(+), 12 deletions(-) diff --git a/src/esp32/ESP32CryptoEngine.cpp b/src/esp32/ESP32CryptoEngine.cpp index d7eaa46bf..e80d59661 100644 --- a/src/esp32/ESP32CryptoEngine.cpp +++ b/src/esp32/ESP32CryptoEngine.cpp @@ -49,12 +49,13 @@ class ESP32CryptoEngine : public CryptoEngine */ virtual void encrypt(uint32_t fromNode, uint64_t packetId, size_t numBytes, uint8_t *bytes) override { + hexDump("before", bytes, numBytes, 16); if (key.length > 0) { uint8_t stream_block[16]; static uint8_t scratch[MAX_BLOCKSIZE]; size_t nc_off = 0; - // DEBUG_MSG("ESP32 crypt fr=%x, num=%x, numBytes=%d!\n", fromNode, (uint32_t) packetId, numBytes); + DEBUG_MSG("ESP32 crypt fr=%x, num=%x, numBytes=%d!\n", fromNode, (uint32_t) packetId, numBytes); initNonce(fromNode, packetId); assert(numBytes <= MAX_BLOCKSIZE); memcpy(scratch, bytes, numBytes); @@ -64,12 +65,11 @@ class ESP32CryptoEngine : public CryptoEngine auto res = mbedtls_aes_crypt_ctr(&aes, numBytes, &nc_off, nonce, stream_block, scratch, bytes); assert(!res); } + hexDump("after", bytes, numBytes, 16); } virtual void decrypt(uint32_t fromNode, uint64_t packetId, size_t numBytes, uint8_t *bytes) override { - // DEBUG_MSG("ESP32 decrypt!\n"); - // For CTR, the implementation is the same encrypt(fromNode, packetId, numBytes, bytes); } diff --git a/src/mesh/CryptoEngine.cpp b/src/mesh/CryptoEngine.cpp index 971080b23..8a5ea795d 100644 --- a/src/mesh/CryptoEngine.cpp +++ b/src/mesh/CryptoEngine.cpp @@ -3,7 +3,7 @@ void CryptoEngine::setKey(const CryptoKey &k) { - DEBUG_MSG("Installing AES%d key!\n", k.length * 8); + DEBUG_MSG("Using AES%d key!\n", k.length * 8); /* for(uint8_t i = 0; i < k.length; i++) DEBUG_MSG("%02x ", k.bytes[i]); DEBUG_MSG("\n"); */ @@ -26,6 +26,78 @@ void CryptoEngine::decrypt(uint32_t fromNode, uint64_t packetId, size_t numBytes DEBUG_MSG("WARNING: noop decryption!\n"); } +// Usage: +// hexDump(desc, addr, len, perLine); +// desc: if non-NULL, printed as a description before hex dump. +// addr: the address to start dumping from. +// len: the number of bytes to dump. +// perLine: number of bytes on each output line. + +void CryptoEngine::hexDump (const char * desc, const void * addr, const int len, int perLine) +{ + // Silently ignore silly per-line values. + + if (perLine < 4 || perLine > 64) perLine = 16; + + int i; + unsigned char buff[perLine+1]; + const unsigned char * pc = (const unsigned char *)addr; + + // Output description if given. + + if (desc != NULL) DEBUG_MSG ("%s:\n", desc); + + // Length checks. + + if (len == 0) { + DEBUG_MSG(" ZERO LENGTH\n"); + return; + } + if (len < 0) { + DEBUG_MSG(" NEGATIVE LENGTH: %d\n", len); + return; + } + + // Process every byte in the data. + + for (i = 0; i < len; i++) { + // Multiple of perLine means new or first line (with line offset). + + if ((i % perLine) == 0) { + // Only print previous-line ASCII buffer for lines beyond first. + + if (i != 0) DEBUG_MSG (" %s\n", buff); + + // Output the offset of current line. + + DEBUG_MSG (" %04x ", i); + } + + // Now the hex code for the specific character. + + DEBUG_MSG (" %02x", pc[i]); + + // And buffer a printable ASCII character for later. + + if ((pc[i] < 0x20) || (pc[i] > 0x7e)) // isprint() may be better. + buff[i % perLine] = '.'; + else + buff[i % perLine] = pc[i]; + buff[(i % perLine) + 1] = '\0'; + } + + // Pad out last line if not exactly perLine characters. + + while ((i % perLine) != 0) { + DEBUG_MSG (" "); + i++; + } + + // And print the final ASCII buffer. + + DEBUG_MSG (" %s\n", buff); +} + /** * Init our 128 bit nonce for a new packet */ diff --git a/src/mesh/CryptoEngine.h b/src/mesh/CryptoEngine.h index 1dda7ce31..39b30a727 100644 --- a/src/mesh/CryptoEngine.h +++ b/src/mesh/CryptoEngine.h @@ -56,6 +56,8 @@ class CryptoEngine * a 32 bit block counter (starts at zero) */ void initNonce(uint32_t fromNode, uint64_t packetId); + + void hexDump(const char * desc, const void * addr, const int len, int perLine); }; extern CryptoEngine *crypto; diff --git a/src/nrf52/NRF52CryptoEngine.cpp b/src/nrf52/NRF52CryptoEngine.cpp index b508ed554..287defdda 100644 --- a/src/nrf52/NRF52CryptoEngine.cpp +++ b/src/nrf52/NRF52CryptoEngine.cpp @@ -16,48 +16,54 @@ class NRF52CryptoEngine : public CryptoEngine */ virtual void encrypt(uint32_t fromNode, uint64_t packetId, size_t numBytes, uint8_t *bytes) override { -// DEBUG_MSG("NRF52 encrypt!\n"); - + hexDump("before", bytes, numBytes, 16); if (key.length > 16) { + DEBUG_MSG("Software encrypt fr=%x, num=%x, numBytes=%d!\n", fromNode, (uint32_t) packetId, numBytes); AES_ctx ctx; initNonce(fromNode, packetId); AES_init_ctx_iv(&ctx, key.bytes, nonce); AES_CTR_xcrypt_buffer(&ctx, bytes, numBytes); } else if (key.length > 0) { + DEBUG_MSG("nRF52 encrypt fr=%x, num=%x, numBytes=%d!\n", fromNode, (uint32_t) packetId, numBytes); nRFCrypto.begin(); nRFCrypto_AES ctx; uint8_t myLen = ctx.blockLen(numBytes); + DEBUG_MSG("nRF52 encBuf myLen=%d!\n", myLen); char encBuf[myLen] = {0}; - memcpy(encBuf, bytes, numBytes); initNonce(fromNode, packetId); ctx.begin(); - ctx.Process(encBuf, numBytes, nonce, key.bytes, key.length, (char*)bytes, ctx.encryptFlag, ctx.ctrMode); + ctx.Process((char*)bytes, numBytes, nonce, key.bytes, key.length, encBuf, ctx.encryptFlag, ctx.ctrMode); ctx.end(); nRFCrypto.end(); + memcpy(bytes, encBuf, numBytes); } + hexDump("after", bytes, numBytes, 16); } virtual void decrypt(uint32_t fromNode, uint64_t packetId, size_t numBytes, uint8_t *bytes) override { -// DEBUG_MSG("NRF52 decrypt!\n"); - + hexDump("before", bytes, numBytes, 16); if (key.length > 16) { + DEBUG_MSG("Software decrypt fr=%x, num=%x, numBytes=%d!\n", fromNode, (uint32_t) packetId, numBytes); AES_ctx ctx; initNonce(fromNode, packetId); AES_init_ctx_iv(&ctx, key.bytes, nonce); AES_CTR_xcrypt_buffer(&ctx, bytes, numBytes); } else if (key.length > 0) { + DEBUG_MSG("nRF52 decrypt fr=%x, num=%x, numBytes=%d!\n", fromNode, (uint32_t) packetId, numBytes); nRFCrypto.begin(); nRFCrypto_AES ctx; uint8_t myLen = ctx.blockLen(numBytes); + DEBUG_MSG("nRF52 decBuf myLen=%d!\n", myLen); char decBuf[myLen] = {0}; - memcpy(decBuf, bytes, numBytes); initNonce(fromNode, packetId); ctx.begin(); - ctx.Process(decBuf, numBytes, nonce, key.bytes, key.length, (char*)bytes, ctx.decryptFlag, ctx.ctrMode); + ctx.Process((char*)bytes, numBytes, nonce, key.bytes, key.length, decBuf, ctx.decryptFlag, ctx.ctrMode); ctx.end(); nRFCrypto.end(); + memcpy(bytes, decBuf, numBytes); } + hexDump("after", bytes, numBytes, 16); } private: From 4ab831c10386005a3012713a07994b9b396d032d Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sat, 4 Jun 2022 07:28:58 -0500 Subject: [PATCH 26/37] Fix nagging bool linter warnings (#1491) --- src/SerialConsole.cpp | 5 ++--- src/modules/AdminModule.cpp | 8 -------- src/modules/Telemetry/Sensor/DHTSensor.cpp | 3 ++- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/SerialConsole.cpp b/src/SerialConsole.cpp index 76926bb4e..2d001192b 100644 --- a/src/SerialConsole.cpp +++ b/src/SerialConsole.cpp @@ -45,9 +45,8 @@ SerialConsole::SerialConsole() : StreamAPI(&Port), RedirectablePrint(&Port) bool SerialConsole::checkIsConnected() { uint32_t now = millis(); - return (now - lastContactMsec) < config.power.phone_timeout_secs - ? config.power.phone_timeout_secs - : default_phone_timeout_secs * 1000UL; + uint32_t timeout = (config.power.phone_timeout_secs > 0 ? config.power.phone_timeout_secs : default_phone_timeout_secs )* 1000UL; + return (now - lastContactMsec) < timeout; } /** diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index 222f1bcde..c9b533af6 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -17,14 +17,6 @@ AdminModule *adminModule; /// a change. static const char *secretReserved = "sekrit"; -/// If buf is !empty, change it to secret -static void hideSecret(char *buf) -{ - if (*buf) { - strcpy(buf, secretReserved); - } -} - /// If buf is the reserved secret word, replace the buffer with currentVal static void writeSecret(char *buf, const char *currentVal) { diff --git a/src/modules/Telemetry/Sensor/DHTSensor.cpp b/src/modules/Telemetry/Sensor/DHTSensor.cpp index 5ccb8b0e1..e10a46bfd 100644 --- a/src/modules/Telemetry/Sensor/DHTSensor.cpp +++ b/src/modules/Telemetry/Sensor/DHTSensor.cpp @@ -9,7 +9,8 @@ DHTSensor::DHTSensor() : TelemetrySensor{} {} int32_t DHTSensor::runOnce() { - if (TelemetrySensorType_DHT11 || TelemetrySensorType_DHT12) { + if (moduleConfig.telemetry.environment_sensor_type == TelemetrySensorType_DHT11 || + moduleConfig.telemetry.environment_sensor_type == TelemetrySensorType_DHT12) { dht = new DHT(moduleConfig.telemetry.environment_sensor_pin, DHT11); } else { dht = new DHT(moduleConfig.telemetry.environment_sensor_pin, DHT22); From eafbef0c2f2b2a65f01afb05fc5360a964c12686 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sun, 5 Jun 2022 09:50:06 -0500 Subject: [PATCH 27/37] Scan for i2c sensors in environmental telemetry if enabled (#1492) * Scan for i2c sensors in environmental telemetry if enabled * Update TelemetrySensor.h * Added surpression. * Remove suppression and fix real bug * Interrogate BME sensor id registers --- .vscode/settings.json | 3 +- src/configuration.h | 8 ++ src/debug/i2cScan.h | 22 ++++ src/main.cpp | 2 + src/main.h | 4 + .../Telemetry/EnvironmentTelemetry.cpp | 104 ++++++++---------- src/modules/Telemetry/Sensor/BME280Sensor.cpp | 23 ++-- src/modules/Telemetry/Sensor/BME280Sensor.h | 2 - src/modules/Telemetry/Sensor/BME680Sensor.cpp | 19 ++-- src/modules/Telemetry/Sensor/BME680Sensor.h | 2 - src/modules/Telemetry/Sensor/DHTSensor.cpp | 5 +- src/modules/Telemetry/Sensor/DHTSensor.h | 2 - src/modules/Telemetry/Sensor/DallasSensor.cpp | 5 +- src/modules/Telemetry/Sensor/DallasSensor.h | 2 - .../Telemetry/Sensor/MCP9808Sensor.cpp | 20 ++-- src/modules/Telemetry/Sensor/MCP9808Sensor.h | 2 - .../Telemetry/Sensor/TelemetrySensor.h | 6 + 17 files changed, 133 insertions(+), 98 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index c2bc7b28c..21bf462ee 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -51,7 +51,8 @@ "iterator": "cpp", "shared_mutex": "cpp", "iostream": "cpp", - "esp_nimble_hci.h": "c" + "esp_nimble_hci.h": "c", + "map": "cpp" }, "cSpell.words": [ "Blox", diff --git a/src/configuration.h b/src/configuration.h index aae49d98d..35d226e29 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -25,6 +25,7 @@ along with this program. If not, see . #pragma once #include + #ifdef RV3028_RTC #include "Melopero_RV3028.h" #endif @@ -170,6 +171,13 @@ along with this program. If not, see . // The older M5 Faces I2C Keyboard #define FACESKB_ADDR 0x88 +// ----------------------------------------------------------------------------- +// SENSOR +// ----------------------------------------------------------------------------- +#define BME_ADDR 0x76 +#define BME_ADDR_ALTERNATE 0x77 +#define MCP9808_ADDR 0x18 + // ----------------------------------------------------------------------------- // GPS // ----------------------------------------------------------------------------- diff --git a/src/debug/i2cScan.h b/src/debug/i2cScan.h index ba5636ea9..206cdbfe9 100644 --- a/src/debug/i2cScan.h +++ b/src/debug/i2cScan.h @@ -1,6 +1,7 @@ #include "../configuration.h" #include "../main.h" #include +#include "mesh/generated/telemetry.pb.h" #ifndef NO_WIRE uint8_t oled_probe(byte addr) @@ -104,6 +105,27 @@ void scanI2Cdevice(void) DEBUG_MSG("axp192 PMU found\n"); } #endif + if (addr == BME_ADDR || addr == BME_ADDR_ALTERNATE) { + Wire.beginTransmission(addr); + Wire.write(0xD0); // GET_ID + Wire.endTransmission(); + delay(20); + Wire.requestFrom((int)addr, 1); + if (Wire.available()) { + r = Wire.read(); + } + if (r == 0x61) { + DEBUG_MSG("BME-680 sensor found at address 0x%x\n", (uint8_t)addr); + nodeTelemetrySensorsMap[TelemetrySensorType_BME680] = addr; + } else if (r == 0x60) { + DEBUG_MSG("BME-280 sensor found at address 0x%x\n", (uint8_t)addr); + nodeTelemetrySensorsMap[TelemetrySensorType_BME280] = addr; + } + } + if (addr == MCP9808_ADDR) { + nodeTelemetrySensorsMap[TelemetrySensorType_MCP9808] = addr; + DEBUG_MSG("MCP9808 sensor found at address 0x%x\n", (uint8_t)addr); + } } else if (err == 4) { DEBUG_MSG("Unknow error at address 0x%x\n", addr); } diff --git a/src/main.cpp b/src/main.cpp index 8068a9fc2..4dd16c896 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -89,6 +89,8 @@ bool eink_found = true; uint32_t serialSinceMsec; bool axp192_found; +// Array map of sensor types (as array index) and i2c address as value we'll find in the i2c scan +uint8_t nodeTelemetrySensorsMap[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; Router *router = NULL; // Users of router don't care what sort of subclass implements that API diff --git a/src/main.h b/src/main.h index bb262a58b..0f7a7779e 100644 --- a/src/main.h +++ b/src/main.h @@ -1,9 +1,11 @@ #pragma once +#include #include "GPSStatus.h" #include "NodeStatus.h" #include "PowerStatus.h" #include "graphics/Screen.h" +#include "mesh/generated/telemetry.pb.h" extern uint8_t screen_found; extern uint8_t screen_model; @@ -17,6 +19,8 @@ extern bool axp192_found; extern bool isCharging; extern bool isUSBPowered; +extern uint8_t nodeTelemetrySensorsMap[10]; + // Global Screen singleton. extern graphics::Screen *screen; // extern Observable newPowerStatus; //TODO: move this to main-esp32.cpp somehow or a helper class diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 534819d86..a0f1f1467 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -45,10 +45,12 @@ MCP9808Sensor mcp9808Sensor; int32_t EnvironmentTelemetryModule::runOnce() { #ifndef PORTDUINO + int32_t result = INT32_MAX; /* Uncomment the preferences below if you want to use the module without having to configure it from the PythonAPI or WebUI. */ + /* moduleConfig.telemetry.environment_measurement_enabled = 1; moduleConfig.telemetry.environment_screen_enabled = 1; @@ -62,7 +64,7 @@ int32_t EnvironmentTelemetryModule::runOnce() if (!(moduleConfig.telemetry.environment_measurement_enabled || moduleConfig.telemetry.environment_screen_enabled)) { // If this module is not enabled, and the user doesn't want the display screen don't waste any OSThread time on it - return (INT32_MAX); + return result; } if (firstTime) { @@ -73,32 +75,33 @@ int32_t EnvironmentTelemetryModule::runOnce() DEBUG_MSG("Environment Telemetry: Initializing\n"); // it's possible to have this module enabled, only for displaying values on the screen. // therefore, we should only enable the sensor loop if measurement is also enabled + switch (moduleConfig.telemetry.environment_sensor_type) { - - case TelemetrySensorType_DHT11: - case TelemetrySensorType_DHT12: - case TelemetrySensorType_DHT21: - case TelemetrySensorType_DHT22: - return dhtSensor.runOnce(); - case TelemetrySensorType_DS18B20: - return dallasSensor.runOnce(); - case TelemetrySensorType_BME280: - return bme280Sensor.runOnce(); - case TelemetrySensorType_BME680: - return bme680Sensor.runOnce(); - case TelemetrySensorType_MCP9808: - return mcp9808Sensor.runOnce(); - default: - DEBUG_MSG("Environment Telemetry: Invalid sensor type selected; Disabling module"); - return (INT32_MAX); + case TelemetrySensorType_DHT11: + case TelemetrySensorType_DHT12: + case TelemetrySensorType_DHT21: + case TelemetrySensorType_DHT22: + result = dhtSensor.runOnce(); + break; + case TelemetrySensorType_DS18B20: + result = dallasSensor.runOnce(); + break; + default: + DEBUG_MSG("Environment Telemetry: No sensor type specified; Checking for detected i2c sensors\n"); break; } + if (hasSensor(TelemetrySensorType_BME680)) + result = bme680Sensor.runOnce(); + if (hasSensor(TelemetrySensorType_BME280)) + result = bme280Sensor.runOnce(); + if (hasSensor(TelemetrySensorType_MCP9808)) + result = mcp9808Sensor.runOnce(); } - return (INT32_MAX); + return result; } else { // if we somehow got to a second run of this module with measurement disabled, then just wait forever if (!moduleConfig.telemetry.environment_measurement_enabled) - return (INT32_MAX); + return result; // this is not the first time OSThread library has called this function // so just do what we intend to do on the interval if (sensor_read_error_count > moduleConfig.telemetry.environment_read_error_count_threshold) { @@ -114,7 +117,7 @@ int32_t EnvironmentTelemetryModule::runOnce() DEBUG_MSG("Environment Telemetry: DISABLED; The telemetry_module_environment_read_error_count_threshold has " "been exceed: %d. Reads will not be retried until after device reset\n", moduleConfig.telemetry.environment_read_error_count_threshold); - return (INT32_MAX); + return result; } else if (sensor_read_error_count > 0) { DEBUG_MSG("Environment Telemetry: There have been %d sensor read failures. Will retry %d more times\n", @@ -124,23 +127,7 @@ int32_t EnvironmentTelemetryModule::runOnce() if (!sendOurTelemetry()) { // if we failed to read the sensor, then try again // as soon as we can according to the maximum polling frequency - - switch (moduleConfig.telemetry.environment_sensor_type) { - case TelemetrySensorType_DHT11: - case TelemetrySensorType_DHT12: - case TelemetrySensorType_DHT21: - case TelemetrySensorType_DHT22: - return (DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); - case TelemetrySensorType_DS18B20: - return (DS18B20_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); - case TelemetrySensorType_BME280: - case TelemetrySensorType_BME680: - return (BME_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); - case TelemetrySensorType_MCP9808: - return (MCP_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); - default: - return (DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); - } + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } } return getIntervalOrDefaultMs(moduleConfig.telemetry.environment_update_interval); @@ -245,29 +232,26 @@ bool EnvironmentTelemetryModule::sendOurTelemetry(NodeNum dest, bool wantReplies DEBUG_MSG("Environment Telemetry: Read data\n"); switch (moduleConfig.telemetry.environment_sensor_type) { - case TelemetrySensorType_DS18B20: - if (!dallasSensor.getMeasurement(&m)) - sensor_read_error_count++; - break; - case TelemetrySensorType_DHT11: - case TelemetrySensorType_DHT12: - case TelemetrySensorType_DHT21: - case TelemetrySensorType_DHT22: - if (!dhtSensor.getMeasurement(&m)) - sensor_read_error_count++; - break; - case TelemetrySensorType_BME280: - bme280Sensor.getMeasurement(&m); - break; - case TelemetrySensorType_BME680: - bme680Sensor.getMeasurement(&m); - break; - case TelemetrySensorType_MCP9808: - mcp9808Sensor.getMeasurement(&m); - break; - default: - DEBUG_MSG("Environment Telemetry: No external sensor type selected; Only sending internal metrics\n"); + case TelemetrySensorType_DS18B20: + if (!dallasSensor.getMeasurement(&m)) + sensor_read_error_count++; + break; + case TelemetrySensorType_DHT11: + case TelemetrySensorType_DHT12: + case TelemetrySensorType_DHT21: + case TelemetrySensorType_DHT22: + if (!dhtSensor.getMeasurement(&m)) + sensor_read_error_count++; + break; + default: + DEBUG_MSG("Environment Telemetry: No specified sensor type; Trying any detected i2c sensors\n"); } + if (hasSensor(TelemetrySensorType_BME280)) + bme280Sensor.getMeasurement(&m); + if (hasSensor(TelemetrySensorType_BME680)) + bme680Sensor.getMeasurement(&m); + if (hasSensor(TelemetrySensorType_MCP9808)) + mcp9808Sensor.getMeasurement(&m); DEBUG_MSG("Telemetry->time: %i\n", m.time); DEBUG_MSG("Telemetry->barometric_pressure: %f\n", m.variant.environment_metrics.barometric_pressure); diff --git a/src/modules/Telemetry/Sensor/BME280Sensor.cpp b/src/modules/Telemetry/Sensor/BME280Sensor.cpp index fee3e2663..9ffcd29f5 100644 --- a/src/modules/Telemetry/Sensor/BME280Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME280Sensor.cpp @@ -4,23 +4,28 @@ #include "BME280Sensor.h" #include -BME280Sensor::BME280Sensor() : TelemetrySensor {} { +BME280Sensor::BME280Sensor() : TelemetrySensor {} +{ } int32_t BME280Sensor::runOnce() { unsigned bme280Status; - // Default i2c address for BME280 - bme280Status = bme280.begin(0x76); - if (!bme280Status) { - DEBUG_MSG("Could not find a valid BME280 sensor, check wiring, address, sensor ID!"); - // TODO more verbose diagnostics - } else { - DEBUG_MSG("Telemetry: Opened BME280 on default i2c bus"); + DEBUG_MSG("Init sensor: TelemetrySensorType_BME280\n"); + if (!hasSensor(TelemetrySensorType_BME280)) { + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } - return BME_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + bme280Status = bme280.begin(nodeTelemetrySensorsMap[TelemetrySensorType_BME280]); + if (!bme280Status) { + DEBUG_MSG("Could not connect to any detected BME-280 sensor.\nRemoving from nodeTelemetrySensorsMap.\n"); + nodeTelemetrySensorsMap[TelemetrySensorType_BME280] = 0; + } else { + DEBUG_MSG("Opened BME280 on default i2c bus\n"); + } + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } bool BME280Sensor::getMeasurement(Telemetry *measurement) { + DEBUG_MSG("BME280Sensor::getMeasurement\n"); measurement->variant.environment_metrics.temperature = bme280.readTemperature(); measurement->variant.environment_metrics.relative_humidity = bme280.readHumidity(); measurement->variant.environment_metrics.barometric_pressure = bme280.readPressure() / 100.0F; diff --git a/src/modules/Telemetry/Sensor/BME280Sensor.h b/src/modules/Telemetry/Sensor/BME280Sensor.h index 420c859c2..661903fda 100644 --- a/src/modules/Telemetry/Sensor/BME280Sensor.h +++ b/src/modules/Telemetry/Sensor/BME280Sensor.h @@ -2,8 +2,6 @@ #include "TelemetrySensor.h" #include -#define BME_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 - class BME280Sensor : virtual public TelemetrySensor { private: Adafruit_BME280 bme280; diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.cpp b/src/modules/Telemetry/Sensor/BME680Sensor.cpp index 1e57302b6..ae7641f7b 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME680Sensor.cpp @@ -4,18 +4,22 @@ #include "BME680Sensor.h" #include -BME680Sensor::BME680Sensor() : TelemetrySensor {} { +BME680Sensor::BME680Sensor() : TelemetrySensor {} +{ } int32_t BME680Sensor::runOnce() { unsigned bme680Status; - // Default i2c address for BME680 - bme680Status = bme680.begin(0x76); + DEBUG_MSG("Init sensor: TelemetrySensorType_BME680\n"); + if (!hasSensor(TelemetrySensorType_BME680)) { + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + } + bme680Status = bme680.begin(nodeTelemetrySensorsMap[TelemetrySensorType_BME680]); if (!bme680Status) { - DEBUG_MSG("Could not find a valid BME680 sensor, check wiring, address, sensor ID!"); - // TODO more verbose TelemetrySensor + DEBUG_MSG("Could not connect to any detected BME-680 sensor.\nRemoving from nodeTelemetrySensorsMap.\n"); + nodeTelemetrySensorsMap[TelemetrySensorType_BME680] = 0; } else { - DEBUG_MSG("Telemetry: Opened BME680 on default i2c bus"); + DEBUG_MSG("Opened BME680 on default i2c bus\n"); // Set up oversampling and filter initialization bme680.setTemperatureOversampling(BME680_OS_8X); bme680.setHumidityOversampling(BME680_OS_2X); @@ -23,10 +27,11 @@ int32_t BME680Sensor::runOnce() { bme680.setIIRFilterSize(BME680_FILTER_SIZE_3); bme680.setGasHeater(320, 150); // 320*C for 150 ms } - return (BME_680_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } bool BME680Sensor::getMeasurement(Telemetry *measurement) { + DEBUG_MSG("BME680Sensor::getMeasurement\n"); measurement->variant.environment_metrics.temperature = bme680.readTemperature(); measurement->variant.environment_metrics.relative_humidity = bme680.readHumidity(); measurement->variant.environment_metrics.barometric_pressure = bme680.readPressure() / 100.0F; diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.h b/src/modules/Telemetry/Sensor/BME680Sensor.h index d502cd69c..0f546a479 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.h +++ b/src/modules/Telemetry/Sensor/BME680Sensor.h @@ -2,8 +2,6 @@ #include "TelemetrySensor.h" #include -#define BME_680_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 - class BME680Sensor : virtual public TelemetrySensor { private: Adafruit_BME680 bme680; diff --git a/src/modules/Telemetry/Sensor/DHTSensor.cpp b/src/modules/Telemetry/Sensor/DHTSensor.cpp index e10a46bfd..9e65bf068 100644 --- a/src/modules/Telemetry/Sensor/DHTSensor.cpp +++ b/src/modules/Telemetry/Sensor/DHTSensor.cpp @@ -18,13 +18,14 @@ int32_t DHTSensor::runOnce() dht->begin(); dht->read(); - DEBUG_MSG("Telemetry: Opened DHT11/DHT12 on pin: %d\n", moduleConfig.telemetry.environment_sensor_pin); + DEBUG_MSG("Opened DHT11/DHT12 on pin: %d\n", moduleConfig.telemetry.environment_sensor_pin); - return (DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } bool DHTSensor::getMeasurement(Telemetry *measurement) { + DEBUG_MSG("DHTSensor::getMeasurement\n"); if (!dht->read(true)) { DEBUG_MSG("Telemetry: FAILED TO READ DATA\n"); return false; diff --git a/src/modules/Telemetry/Sensor/DHTSensor.h b/src/modules/Telemetry/Sensor/DHTSensor.h index 4e062d1d1..d0410778d 100644 --- a/src/modules/Telemetry/Sensor/DHTSensor.h +++ b/src/modules/Telemetry/Sensor/DHTSensor.h @@ -2,8 +2,6 @@ #include "TelemetrySensor.h" #include -#define DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 - class DHTSensor : virtual public TelemetrySensor { private: DHT *dht = NULL; diff --git a/src/modules/Telemetry/Sensor/DallasSensor.cpp b/src/modules/Telemetry/Sensor/DallasSensor.cpp index 23fc57cfb..ab91ef1c0 100644 --- a/src/modules/Telemetry/Sensor/DallasSensor.cpp +++ b/src/modules/Telemetry/Sensor/DallasSensor.cpp @@ -15,12 +15,13 @@ int32_t DallasSensor::runOnce() ds18b20->begin(); ds18b20->setResolution(12); ds18b20->requestTemperatures(); - DEBUG_MSG("Telemetry: Opened DS18B20 on pin: %d\n", moduleConfig.telemetry.environment_sensor_pin); - return (DS18B20_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); + DEBUG_MSG("Opened DS18B20 on pin: %d\n", moduleConfig.telemetry.environment_sensor_pin); + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } bool DallasSensor::getMeasurement(Telemetry *measurement) { + DEBUG_MSG("DallasSensor::getMeasurement\n"); if (ds18b20->isConversionComplete()) { measurement->variant.environment_metrics.temperature = ds18b20->getTempC(); measurement->variant.environment_metrics.relative_humidity = 0; diff --git a/src/modules/Telemetry/Sensor/DallasSensor.h b/src/modules/Telemetry/Sensor/DallasSensor.h index c07825b09..0ee165f7b 100644 --- a/src/modules/Telemetry/Sensor/DallasSensor.h +++ b/src/modules/Telemetry/Sensor/DallasSensor.h @@ -3,8 +3,6 @@ #include #include -#define DS18B20_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 - class DallasSensor : virtual public TelemetrySensor { private: OneWire *oneWire = NULL; diff --git a/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp b/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp index eaeaba34c..25392b460 100644 --- a/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp +++ b/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp @@ -4,25 +4,31 @@ #include "MCP9808Sensor.h" #include -MCP9808Sensor::MCP9808Sensor() : TelemetrySensor {} { +MCP9808Sensor::MCP9808Sensor() : TelemetrySensor {} +{ } int32_t MCP9808Sensor::runOnce() { unsigned mcp9808Status; - // Default i2c address for MCP9808 - mcp9808Status = mcp9808.begin(0x18); + DEBUG_MSG("Init sensor: TelemetrySensorType_MCP9808\n"); + if (!hasSensor(TelemetrySensorType_MCP9808)) { + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + } + + mcp9808Status = mcp9808.begin(nodeTelemetrySensorsMap[TelemetrySensorType_MCP9808]); if (!mcp9808Status) { - DEBUG_MSG("Could not find a valid MCP9808 sensor, check wiring, address, sensor ID!"); + DEBUG_MSG("Could not connect to detected MCP9808 sensor.\n Removing from nodeTelemetrySensorsMap.\n"); + nodeTelemetrySensorsMap[TelemetrySensorType_MCP9808] = 0; } else { - DEBUG_MSG("TelemetrySensor: Opened MCP9808 on default i2c bus"); + DEBUG_MSG("TelemetrySensor: Opened MCP9808 on default i2c bus\n"); // Reduce resolution from 0.0625 degrees (precision) to 0.125 degrees (high). mcp9808.setResolution(2); } - return (MCP_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); + return (DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); } bool MCP9808Sensor::getMeasurement(Telemetry *measurement) { + DEBUG_MSG("MCP9808Sensor::getMeasurement\n"); measurement->variant.environment_metrics.temperature = mcp9808.readTempC(); - return true; } \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/MCP9808Sensor.h b/src/modules/Telemetry/Sensor/MCP9808Sensor.h index f7190e95b..8991477a3 100644 --- a/src/modules/Telemetry/Sensor/MCP9808Sensor.h +++ b/src/modules/Telemetry/Sensor/MCP9808Sensor.h @@ -2,8 +2,6 @@ #include "TelemetrySensor.h" #include -#define MCP_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 - class MCP9808Sensor : virtual public TelemetrySensor { private: Adafruit_MCP9808 mcp9808; diff --git a/src/modules/Telemetry/Sensor/TelemetrySensor.h b/src/modules/Telemetry/Sensor/TelemetrySensor.h index d2f38cf60..c9146cc89 100644 --- a/src/modules/Telemetry/Sensor/TelemetrySensor.h +++ b/src/modules/Telemetry/Sensor/TelemetrySensor.h @@ -1,8 +1,14 @@ #pragma once #include "../mesh/generated/telemetry.pb.h" #include "NodeDB.h" +#include "main.h" + #define DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 +inline bool hasSensor(TelemetrySensorType sensorType) { + return sensorType < sizeof(nodeTelemetrySensorsMap) && nodeTelemetrySensorsMap[sensorType] > 0; +} + class TelemetrySensor { protected: From ebf132ad2111dae10f48edaa901b1915a8fa62c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 6 Jun 2022 18:48:22 +0200 Subject: [PATCH 28/37] Bug-1493 --- src/Power.cpp | 4 ++++ src/shutdown.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Power.cpp b/src/Power.cpp index feb7930ad..20b875137 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -211,8 +211,12 @@ void Power::shutdown() { #ifdef TBEAM_V10 DEBUG_MSG("Shutting down\n"); + axp.setChgLEDMode(AXP20X_LED_OFF); axp.shutdown(); #elif NRF52_SERIES + playBeep(); + ledOff(PIN_LED1); + ledOff(PIN_LED2); doDeepSleep(DELAY_FOREVER); #endif } diff --git a/src/shutdown.h b/src/shutdown.h index 3b703331d..57cd1b691 100644 --- a/src/shutdown.h +++ b/src/shutdown.h @@ -30,7 +30,7 @@ void powerCommandsCheck() DEBUG_MSG("Shutting down from admin command\n"); #ifdef TBEAM_V10 if (axp192_found == true) { - // setLed(false); //TODO: FIXME: this is not working + playShutdownMelody(); power->shutdown(); } #elif NRF52_SERIES From c831242f25dc0ca05c0e13cd6221d64abb67d2a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 6 Jun 2022 19:14:30 +0200 Subject: [PATCH 29/37] fix nrf build --- src/Power.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Power.cpp b/src/Power.cpp index 20b875137..6d95e2e09 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -5,6 +5,7 @@ #include "main.h" #include "sleep.h" #include "utils.h" +#include "buzz/buzz.h" #ifdef TBEAM_V10 // FIXME. nasty hack cleanup how we load axp192 From 97899aed26b06c230b0da7cee7ae5679c2100939 Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Mon, 6 Jun 2022 22:10:18 -0700 Subject: [PATCH 30/37] 1.3.16 --- version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.properties b/version.properties index e903aec4a..fd7f6e0d4 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 1 minor = 3 -build = 15 +build = 16 From 9e87be4f224bd6844f864b6ef9a7f2e8b8c7f606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nerijus=20Bend=C5=BEi=C5=ABnas?= Date: Tue, 7 Jun 2022 12:26:01 +0300 Subject: [PATCH 31/37] Correctly print script name in platformio-custom.py --- bin/platformio-custom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/platformio-custom.py b/bin/platformio-custom.py index 4672dbc96..234b6ef05 100644 --- a/bin/platformio-custom.py +++ b/bin/platformio-custom.py @@ -17,7 +17,7 @@ Import("projenv") prefsLoc = projenv["PROJECT_DIR"] + "/version.properties" verObj = readProps(prefsLoc) -print("Using meshtastic platform-custom.py, firmare version " + verObj['long']) +print("Using meshtastic platformio-custom.py, firmare version " + verObj['long']) # print("path is" + ','.join(sys.path)) # General options that are passed to the C and C++ compilers From e8e72d2e08e7872a5f891796de5c61d1ed314093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nerijus=20Bend=C5=BEi=C5=ABnas?= Date: Tue, 7 Jun 2022 20:55:05 +0300 Subject: [PATCH 32/37] Compile when FSCom is not defined (NodeDB.cpp) --- src/mesh/NodeDB.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 47b9d0bc9..ce3d4d04c 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -308,12 +308,12 @@ static const char *channelfile = "/prefs/channels.proto"; /** Load a protobuf from a file, return true for success */ bool loadProto(const char *filename, size_t protoSize, size_t objSize, const pb_msgdesc_t *fields, void *dest_struct) { + bool okay = false; #ifdef FSCom // static DeviceState scratch; We no longer read into a tempbuf because this structure is 15KB of valuable RAM auto f = FSCom.open(filename); - bool okay = false; if (f) { DEBUG_MSG("Loading %s\n", filename); pb_istream_t stream = {&readcb, &f, protoSize}; @@ -367,12 +367,12 @@ void NodeDB::loadFromDisk() /** Save a protobuf from a file, return true for success */ bool saveProto(const char *filename, size_t protoSize, size_t objSize, const pb_msgdesc_t *fields, const void *dest_struct) { + bool okay = false; #ifdef FSCom // static DeviceState scratch; We no longer read into a tempbuf because this structure is 15KB of valuable RAM String filenameTmp = filename; filenameTmp += ".tmp"; auto f = FSCom.open(filenameTmp.c_str(), FILE_O_WRITE); - bool okay = false; if (f) { DEBUG_MSG("Saving %s\n", filename); pb_ostream_t stream = {&writecb, &f, protoSize}; From 3fd756900ae18eb5068f70edca7a438b7c48e756 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Fri, 10 Jun 2022 12:04:04 -0500 Subject: [PATCH 33/37] Refactoring some of the i2c boilerplate (#1498) * Refactoring some of the i2c boilerplate * Default value * Debug statement --- .../Telemetry/EnvironmentTelemetry.cpp | 22 +++++------ src/modules/Telemetry/Sensor/BME280Sensor.cpp | 23 +++++------ src/modules/Telemetry/Sensor/BME280Sensor.h | 5 ++- src/modules/Telemetry/Sensor/BME680Sensor.cpp | 38 +++++++++---------- src/modules/Telemetry/Sensor/BME680Sensor.h | 5 ++- src/modules/Telemetry/Sensor/DHTSensor.cpp | 15 +++++--- src/modules/Telemetry/Sensor/DHTSensor.h | 5 ++- src/modules/Telemetry/Sensor/DallasSensor.cpp | 15 +++++--- src/modules/Telemetry/Sensor/DallasSensor.h | 5 ++- .../Telemetry/Sensor/MCP9808Sensor.cpp | 27 ++++++------- src/modules/Telemetry/Sensor/MCP9808Sensor.h | 5 ++- .../Telemetry/Sensor/TelemetrySensor.cpp | 4 ++ .../Telemetry/Sensor/TelemetrySensor.h | 33 +++++++++++++--- 13 files changed, 119 insertions(+), 83 deletions(-) create mode 100644 src/modules/Telemetry/Sensor/TelemetrySensor.cpp diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index a0f1f1467..c9ae2e3f7 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -90,11 +90,11 @@ int32_t EnvironmentTelemetryModule::runOnce() DEBUG_MSG("Environment Telemetry: No sensor type specified; Checking for detected i2c sensors\n"); break; } - if (hasSensor(TelemetrySensorType_BME680)) + if (bme680Sensor.hasSensor()) result = bme680Sensor.runOnce(); - if (hasSensor(TelemetrySensorType_BME280)) + if (bme280Sensor.hasSensor()) result = bme280Sensor.runOnce(); - if (hasSensor(TelemetrySensorType_MCP9808)) + if (mcp9808Sensor.hasSensor()) result = mcp9808Sensor.runOnce(); } return result; @@ -233,25 +233,25 @@ bool EnvironmentTelemetryModule::sendOurTelemetry(NodeNum dest, bool wantReplies switch (moduleConfig.telemetry.environment_sensor_type) { case TelemetrySensorType_DS18B20: - if (!dallasSensor.getMeasurement(&m)) + if (!dallasSensor.getMetrics(&m)) sensor_read_error_count++; break; case TelemetrySensorType_DHT11: case TelemetrySensorType_DHT12: case TelemetrySensorType_DHT21: case TelemetrySensorType_DHT22: - if (!dhtSensor.getMeasurement(&m)) + if (!dhtSensor.getMetrics(&m)) sensor_read_error_count++; break; default: DEBUG_MSG("Environment Telemetry: No specified sensor type; Trying any detected i2c sensors\n"); } - if (hasSensor(TelemetrySensorType_BME280)) - bme280Sensor.getMeasurement(&m); - if (hasSensor(TelemetrySensorType_BME680)) - bme680Sensor.getMeasurement(&m); - if (hasSensor(TelemetrySensorType_MCP9808)) - mcp9808Sensor.getMeasurement(&m); + if (bme280Sensor.hasSensor()) + bme280Sensor.getMetrics(&m); + if (bme680Sensor.hasSensor()) + bme680Sensor.getMetrics(&m); + if (mcp9808Sensor.hasSensor()) + mcp9808Sensor.getMetrics(&m); DEBUG_MSG("Telemetry->time: %i\n", m.time); DEBUG_MSG("Telemetry->barometric_pressure: %f\n", m.variant.environment_metrics.barometric_pressure); diff --git a/src/modules/Telemetry/Sensor/BME280Sensor.cpp b/src/modules/Telemetry/Sensor/BME280Sensor.cpp index 9ffcd29f5..65689b4f0 100644 --- a/src/modules/Telemetry/Sensor/BME280Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME280Sensor.cpp @@ -3,29 +3,26 @@ #include "TelemetrySensor.h" #include "BME280Sensor.h" #include +#include -BME280Sensor::BME280Sensor() : TelemetrySensor {} +BME280Sensor::BME280Sensor() : + TelemetrySensor(TelemetrySensorType_BME280, "BME280") { } int32_t BME280Sensor::runOnce() { - unsigned bme280Status; DEBUG_MSG("Init sensor: TelemetrySensorType_BME280\n"); - if (!hasSensor(TelemetrySensorType_BME280)) { + if (!hasSensor()) { return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } - bme280Status = bme280.begin(nodeTelemetrySensorsMap[TelemetrySensorType_BME280]); - if (!bme280Status) { - DEBUG_MSG("Could not connect to any detected BME-280 sensor.\nRemoving from nodeTelemetrySensorsMap.\n"); - nodeTelemetrySensorsMap[TelemetrySensorType_BME280] = 0; - } else { - DEBUG_MSG("Opened BME280 on default i2c bus\n"); - } - return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + status = bme280.begin(nodeTelemetrySensorsMap[TelemetrySensorType_BME280]); + return initI2CSensor(); } -bool BME280Sensor::getMeasurement(Telemetry *measurement) { - DEBUG_MSG("BME280Sensor::getMeasurement\n"); +void BME280Sensor::setup() { } + +bool BME280Sensor::getMetrics(Telemetry *measurement) { + DEBUG_MSG("BME280Sensor::getMetrics\n"); measurement->variant.environment_metrics.temperature = bme280.readTemperature(); measurement->variant.environment_metrics.relative_humidity = bme280.readHumidity(); measurement->variant.environment_metrics.barometric_pressure = bme280.readPressure() / 100.0F; diff --git a/src/modules/Telemetry/Sensor/BME280Sensor.h b/src/modules/Telemetry/Sensor/BME280Sensor.h index 661903fda..166796a37 100644 --- a/src/modules/Telemetry/Sensor/BME280Sensor.h +++ b/src/modules/Telemetry/Sensor/BME280Sensor.h @@ -6,8 +6,11 @@ class BME280Sensor : virtual public TelemetrySensor { private: Adafruit_BME280 bme280; +protected: + virtual void setup() override; + public: BME280Sensor(); virtual int32_t runOnce() override; - virtual bool getMeasurement(Telemetry *measurement) override; + virtual bool getMetrics(Telemetry *measurement) override; }; \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.cpp b/src/modules/Telemetry/Sensor/BME680Sensor.cpp index ae7641f7b..c12a1fbc0 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME680Sensor.cpp @@ -4,34 +4,32 @@ #include "BME680Sensor.h" #include -BME680Sensor::BME680Sensor() : TelemetrySensor {} +BME680Sensor::BME680Sensor() : + TelemetrySensor(TelemetrySensorType_BME680, "BME680") { } int32_t BME680Sensor::runOnce() { - unsigned bme680Status; - DEBUG_MSG("Init sensor: TelemetrySensorType_BME680\n"); - if (!hasSensor(TelemetrySensorType_BME680)) { + DEBUG_MSG("runOnce: TelemetrySensorType_BME680\n"); + if (!hasSensor()) { return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } - bme680Status = bme680.begin(nodeTelemetrySensorsMap[TelemetrySensorType_BME680]); - if (!bme680Status) { - DEBUG_MSG("Could not connect to any detected BME-680 sensor.\nRemoving from nodeTelemetrySensorsMap.\n"); - nodeTelemetrySensorsMap[TelemetrySensorType_BME680] = 0; - } else { - DEBUG_MSG("Opened BME680 on default i2c bus\n"); - // Set up oversampling and filter initialization - bme680.setTemperatureOversampling(BME680_OS_8X); - bme680.setHumidityOversampling(BME680_OS_2X); - bme680.setPressureOversampling(BME680_OS_4X); - bme680.setIIRFilterSize(BME680_FILTER_SIZE_3); - bme680.setGasHeater(320, 150); // 320*C for 150 ms - } - return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + status = bme680.begin(nodeTelemetrySensorsMap[TelemetrySensorType_BME680]); + return initI2CSensor(); } -bool BME680Sensor::getMeasurement(Telemetry *measurement) { - DEBUG_MSG("BME680Sensor::getMeasurement\n"); +void BME680Sensor::setup() +{ + // Set up oversampling and filter initialization + bme680.setTemperatureOversampling(BME680_OS_8X); + bme680.setHumidityOversampling(BME680_OS_2X); + bme680.setPressureOversampling(BME680_OS_4X); + bme680.setIIRFilterSize(BME680_FILTER_SIZE_3); + bme680.setGasHeater(320, 150); // 320*C for 150 ms +} + +bool BME680Sensor::getMetrics(Telemetry *measurement) { + measurement->variant.environment_metrics.temperature = bme680.readTemperature(); measurement->variant.environment_metrics.relative_humidity = bme680.readHumidity(); measurement->variant.environment_metrics.barometric_pressure = bme680.readPressure() / 100.0F; diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.h b/src/modules/Telemetry/Sensor/BME680Sensor.h index 0f546a479..a3c37203d 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.h +++ b/src/modules/Telemetry/Sensor/BME680Sensor.h @@ -6,8 +6,11 @@ class BME680Sensor : virtual public TelemetrySensor { private: Adafruit_BME680 bme680; +protected: + virtual void setup() override; + public: BME680Sensor(); virtual int32_t runOnce() override; - virtual bool getMeasurement(Telemetry *measurement) override; + virtual bool getMetrics(Telemetry *measurement) override; }; \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/DHTSensor.cpp b/src/modules/Telemetry/Sensor/DHTSensor.cpp index 9e65bf068..999db7761 100644 --- a/src/modules/Telemetry/Sensor/DHTSensor.cpp +++ b/src/modules/Telemetry/Sensor/DHTSensor.cpp @@ -5,10 +5,12 @@ #include "configuration.h" #include -DHTSensor::DHTSensor() : TelemetrySensor{} {} - -int32_t DHTSensor::runOnce() +DHTSensor::DHTSensor() : + TelemetrySensor(TelemetrySensorType_NotSet, "DHT") { +} + +int32_t DHTSensor::runOnce() { if (moduleConfig.telemetry.environment_sensor_type == TelemetrySensorType_DHT11 || moduleConfig.telemetry.environment_sensor_type == TelemetrySensorType_DHT12) { dht = new DHT(moduleConfig.telemetry.environment_sensor_pin, DHT11); @@ -23,9 +25,10 @@ int32_t DHTSensor::runOnce() return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } -bool DHTSensor::getMeasurement(Telemetry *measurement) -{ - DEBUG_MSG("DHTSensor::getMeasurement\n"); +void DHTSensor::setup() { } + +bool DHTSensor::getMetrics(Telemetry *measurement) { + DEBUG_MSG("DHTSensor::getMetrics\n"); if (!dht->read(true)) { DEBUG_MSG("Telemetry: FAILED TO READ DATA\n"); return false; diff --git a/src/modules/Telemetry/Sensor/DHTSensor.h b/src/modules/Telemetry/Sensor/DHTSensor.h index d0410778d..cb26e66e7 100644 --- a/src/modules/Telemetry/Sensor/DHTSensor.h +++ b/src/modules/Telemetry/Sensor/DHTSensor.h @@ -6,8 +6,11 @@ class DHTSensor : virtual public TelemetrySensor { private: DHT *dht = NULL; +protected: + virtual void setup() override; + public: DHTSensor(); virtual int32_t runOnce() override; - virtual bool getMeasurement(Telemetry *measurement) override; + virtual bool getMetrics(Telemetry *measurement) override; }; \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/DallasSensor.cpp b/src/modules/Telemetry/Sensor/DallasSensor.cpp index ab91ef1c0..61852de4d 100644 --- a/src/modules/Telemetry/Sensor/DallasSensor.cpp +++ b/src/modules/Telemetry/Sensor/DallasSensor.cpp @@ -6,10 +6,12 @@ #include #include -DallasSensor::DallasSensor() : TelemetrySensor{} {} - -int32_t DallasSensor::runOnce() +DallasSensor::DallasSensor() : + TelemetrySensor(TelemetrySensorType_DS18B20, "DS18B20") { +} + +int32_t DallasSensor::runOnce() { oneWire = new OneWire(moduleConfig.telemetry.environment_sensor_pin); ds18b20 = new DS18B20(oneWire); ds18b20->begin(); @@ -19,9 +21,10 @@ int32_t DallasSensor::runOnce() return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } -bool DallasSensor::getMeasurement(Telemetry *measurement) -{ - DEBUG_MSG("DallasSensor::getMeasurement\n"); +void DallasSensor::setup() {} + +bool DallasSensor::getMetrics(Telemetry *measurement){ + DEBUG_MSG("DallasSensor::getMetrics\n"); if (ds18b20->isConversionComplete()) { measurement->variant.environment_metrics.temperature = ds18b20->getTempC(); measurement->variant.environment_metrics.relative_humidity = 0; diff --git a/src/modules/Telemetry/Sensor/DallasSensor.h b/src/modules/Telemetry/Sensor/DallasSensor.h index 0ee165f7b..c33da3c1c 100644 --- a/src/modules/Telemetry/Sensor/DallasSensor.h +++ b/src/modules/Telemetry/Sensor/DallasSensor.h @@ -8,8 +8,11 @@ private: OneWire *oneWire = NULL; DS18B20 *ds18b20 = NULL; +protected: + virtual void setup() override; + public: DallasSensor(); virtual int32_t runOnce() override; - virtual bool getMeasurement(Telemetry *measurement) override; + virtual bool getMetrics(Telemetry *measurement) override; }; \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp b/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp index 25392b460..664416d60 100644 --- a/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp +++ b/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp @@ -4,31 +4,26 @@ #include "MCP9808Sensor.h" #include -MCP9808Sensor::MCP9808Sensor() : TelemetrySensor {} +MCP9808Sensor::MCP9808Sensor() : + TelemetrySensor(TelemetrySensorType_MCP9808, "MCP9808") { } int32_t MCP9808Sensor::runOnce() { - unsigned mcp9808Status; DEBUG_MSG("Init sensor: TelemetrySensorType_MCP9808\n"); - if (!hasSensor(TelemetrySensorType_MCP9808)) { + if (!hasSensor()) { return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } - - mcp9808Status = mcp9808.begin(nodeTelemetrySensorsMap[TelemetrySensorType_MCP9808]); - if (!mcp9808Status) { - DEBUG_MSG("Could not connect to detected MCP9808 sensor.\n Removing from nodeTelemetrySensorsMap.\n"); - nodeTelemetrySensorsMap[TelemetrySensorType_MCP9808] = 0; - } else { - DEBUG_MSG("TelemetrySensor: Opened MCP9808 on default i2c bus\n"); - // Reduce resolution from 0.0625 degrees (precision) to 0.125 degrees (high). - mcp9808.setResolution(2); - } - return (DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); + status = mcp9808.begin(nodeTelemetrySensorsMap[TelemetrySensorType_MCP9808]); + return initI2CSensor(); } -bool MCP9808Sensor::getMeasurement(Telemetry *measurement) { - DEBUG_MSG("MCP9808Sensor::getMeasurement\n"); +void MCP9808Sensor::setup() { + mcp9808.setResolution(2); +} + +bool MCP9808Sensor::getMetrics(Telemetry *measurement) { + DEBUG_MSG("MCP9808Sensor::getMetrics\n"); measurement->variant.environment_metrics.temperature = mcp9808.readTempC(); return true; } \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/MCP9808Sensor.h b/src/modules/Telemetry/Sensor/MCP9808Sensor.h index 8991477a3..81f50b886 100644 --- a/src/modules/Telemetry/Sensor/MCP9808Sensor.h +++ b/src/modules/Telemetry/Sensor/MCP9808Sensor.h @@ -6,8 +6,11 @@ class MCP9808Sensor : virtual public TelemetrySensor { private: Adafruit_MCP9808 mcp9808; +protected: + virtual void setup() override; + public: MCP9808Sensor(); virtual int32_t runOnce() override; - virtual bool getMeasurement(Telemetry *measurement) override; + virtual bool getMetrics(Telemetry *measurement) override; }; \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/TelemetrySensor.cpp b/src/modules/Telemetry/Sensor/TelemetrySensor.cpp new file mode 100644 index 000000000..e811d7182 --- /dev/null +++ b/src/modules/Telemetry/Sensor/TelemetrySensor.cpp @@ -0,0 +1,4 @@ +#include "TelemetrySensor.h" +#include "../mesh/generated/telemetry.pb.h" +#include "NodeDB.h" +#include "main.h" diff --git a/src/modules/Telemetry/Sensor/TelemetrySensor.h b/src/modules/Telemetry/Sensor/TelemetrySensor.h index c9146cc89..12bf17e56 100644 --- a/src/modules/Telemetry/Sensor/TelemetrySensor.h +++ b/src/modules/Telemetry/Sensor/TelemetrySensor.h @@ -5,16 +5,37 @@ #define DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 -inline bool hasSensor(TelemetrySensorType sensorType) { - return sensorType < sizeof(nodeTelemetrySensorsMap) && nodeTelemetrySensorsMap[sensorType] > 0; -} - class TelemetrySensor { protected: - TelemetrySensor() {} + TelemetrySensor(TelemetrySensorType sensorType, const char *sensorName) + { + this->sensorName = sensorName; + this->sensorType = sensorType; + this->status = 0; + } + + const char *sensorName; + TelemetrySensorType sensorType; + unsigned status; + + int32_t initI2CSensor() { + if (!status) { + DEBUG_MSG("Could not connect to detected %s sensor.\n Removing from nodeTelemetrySensorsMap.\n", sensorName); + nodeTelemetrySensorsMap[sensorType] = 0; + } else { + DEBUG_MSG("Opened %s sensor on default i2c bus\n", sensorName); + setup(); + } + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + } + virtual void setup(); public: + bool hasSensor() { + return sensorType < sizeof(nodeTelemetrySensorsMap) && nodeTelemetrySensorsMap[sensorType] > 0; + } + virtual int32_t runOnce() = 0; - virtual bool getMeasurement(Telemetry *measurement) = 0; + virtual bool getMetrics(Telemetry *measurement) = 0; }; From 90957e6994a606d413820676029571bcecd76611 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sat, 11 Jun 2022 16:44:56 -0500 Subject: [PATCH 34/37] INA260 + INA219 sensor support (#1501) * INA219 + INA260 support in telemetry * Protobuf update * Fixes + debug statement * Fix size * Fix conversion from mv * Added getRegisterValue for i2cscan --- platformio.ini | 3 +- protobufs | 2 +- src/configuration.h | 2 + src/debug/i2cScan.h | 55 ++++++++++++------- src/main.cpp | 3 +- src/main.h | 2 +- src/mesh/generated/config.pb.h | 12 +--- src/mesh/generated/localonly.pb.h | 2 +- src/mesh/generated/telemetry.pb.h | 38 +++++++------ .../Telemetry/EnvironmentTelemetry.cpp | 14 +++++ src/modules/Telemetry/Sensor/BME280Sensor.cpp | 4 +- src/modules/Telemetry/Sensor/BME680Sensor.cpp | 5 +- src/modules/Telemetry/Sensor/INA219Sensor.cpp | 30 ++++++++++ src/modules/Telemetry/Sensor/INA219Sensor.h | 17 ++++++ src/modules/Telemetry/Sensor/INA260Sensor.cpp | 30 ++++++++++ src/modules/Telemetry/Sensor/INA260Sensor.h | 17 ++++++ .../Telemetry/Sensor/MCP9808Sensor.cpp | 4 +- 17 files changed, 182 insertions(+), 58 deletions(-) create mode 100644 src/modules/Telemetry/Sensor/INA219Sensor.cpp create mode 100644 src/modules/Telemetry/Sensor/INA219Sensor.h create mode 100644 src/modules/Telemetry/Sensor/INA260Sensor.cpp create mode 100644 src/modules/Telemetry/Sensor/INA260Sensor.h diff --git a/platformio.ini b/platformio.ini index 5d991fe38..6628cdb99 100644 --- a/platformio.ini +++ b/platformio.ini @@ -84,7 +84,8 @@ lib_deps = adafruit/Adafruit BME280 Library@^2.2.2 adafruit/Adafruit BME680 Library@^2.0.1 adafruit/Adafruit MCP9808 Library@^2.0.0 - + adafruit/Adafruit INA260 Library@^1.5.0 + adafruit/Adafruit INA219@^1.2.0 ; Common settings for ESP targes, mixin with extends = esp32_base [esp32_base] extends = arduino_base diff --git a/protobufs b/protobufs index 33b3ab5fd..dbd4219a8 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 33b3ab5fde6b6ef158e3b111bf240d1d59c152ef +Subproject commit dbd4219a862b26b5c6fa6569bd8faa42ab8852a5 diff --git a/src/configuration.h b/src/configuration.h index 35d226e29..f0d44a3e9 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -177,6 +177,8 @@ along with this program. If not, see . #define BME_ADDR 0x76 #define BME_ADDR_ALTERNATE 0x77 #define MCP9808_ADDR 0x18 +#define INA_ADDR 0x40 +#define INA_ADDR_ALTERNATE 0x41 // ----------------------------------------------------------------------------- // GPS diff --git a/src/debug/i2cScan.h b/src/debug/i2cScan.h index 206cdbfe9..c4ab6a41e 100644 --- a/src/debug/i2cScan.h +++ b/src/debug/i2cScan.h @@ -4,6 +4,24 @@ #include "mesh/generated/telemetry.pb.h" #ifndef NO_WIRE +uint16_t getRegisterValue(uint8_t address, uint8_t reg, uint8_t length) { + uint16_t value = 0x00; + Wire.beginTransmission(address); + Wire.write(reg); + Wire.endTransmission(); + delay(20); + Wire.requestFrom((int)address, length); + DEBUG_MSG("Wire.available() = %d\n", Wire.available()); + if (Wire.available() == 2) { + // Read MSB, then LSB + value = (uint16_t)Wire.read() << 8; + value |= Wire.read(); + } else if (Wire.available()) { + value = Wire.read(); + } + return value; +} + uint8_t oled_probe(byte addr) { uint8_t r = 0; @@ -35,7 +53,7 @@ uint8_t oled_probe(byte addr) void scanI2Cdevice(void) { byte err, addr; - uint8_t r = 0x00; + uint16_t registerValue = 0x00; int nDevices = 0; for (addr = 1; addr < 127; addr++) { Wire.beginTransmission(addr); @@ -75,15 +93,8 @@ void scanI2Cdevice(void) if (addr == CARDKB_ADDR) { cardkb_found = addr; // Do we have the RAK14006 instead? - Wire.beginTransmission(addr); - Wire.write(0x04); // SENSOR_GET_VERSION - Wire.endTransmission(); - delay(20); - Wire.requestFrom((int)addr, 1); - if (Wire.available()) { - r = Wire.read(); - } - if (r == 0x02) { // KEYPAD_VERSION + registerValue = getRegisterValue(addr, 0x04, 1); + if (registerValue == 0x02) { // KEYPAD_VERSION DEBUG_MSG("RAK14004 found\n"); kb_model = 0x02; } else { @@ -106,22 +117,26 @@ void scanI2Cdevice(void) } #endif if (addr == BME_ADDR || addr == BME_ADDR_ALTERNATE) { - Wire.beginTransmission(addr); - Wire.write(0xD0); // GET_ID - Wire.endTransmission(); - delay(20); - Wire.requestFrom((int)addr, 1); - if (Wire.available()) { - r = Wire.read(); - } - if (r == 0x61) { + registerValue = getRegisterValue(addr, 0xD0, 1); // GET_ID + if (registerValue == 0x61) { DEBUG_MSG("BME-680 sensor found at address 0x%x\n", (uint8_t)addr); nodeTelemetrySensorsMap[TelemetrySensorType_BME680] = addr; - } else if (r == 0x60) { + } else if (registerValue == 0x60) { DEBUG_MSG("BME-280 sensor found at address 0x%x\n", (uint8_t)addr); nodeTelemetrySensorsMap[TelemetrySensorType_BME280] = addr; } } + if (addr == INA_ADDR || addr == INA_ADDR_ALTERNATE) { + registerValue = getRegisterValue(addr, 0xFE, 2); + DEBUG_MSG("Register MFG_UID: 0x%x\n", registerValue); + if (registerValue == 0x5449) { + DEBUG_MSG("INA260 sensor found at address 0x%x\n", (uint8_t)addr); + nodeTelemetrySensorsMap[TelemetrySensorType_INA260] = addr; + } else { // Assume INA219 if INA260 ID is not found + DEBUG_MSG("INA219 sensor found at address 0x%x\n", (uint8_t)addr); + nodeTelemetrySensorsMap[TelemetrySensorType_INA219] = addr; + } + } if (addr == MCP9808_ADDR) { nodeTelemetrySensorsMap[TelemetrySensorType_MCP9808] = addr; DEBUG_MSG("MCP9808 sensor found at address 0x%x\n", (uint8_t)addr); diff --git a/src/main.cpp b/src/main.cpp index 4dd16c896..f7938c71f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -89,8 +89,9 @@ bool eink_found = true; uint32_t serialSinceMsec; bool axp192_found; + // Array map of sensor types (as array index) and i2c address as value we'll find in the i2c scan -uint8_t nodeTelemetrySensorsMap[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +uint8_t nodeTelemetrySensorsMap[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; Router *router = NULL; // Users of router don't care what sort of subclass implements that API diff --git a/src/main.h b/src/main.h index 0f7a7779e..cc17adb09 100644 --- a/src/main.h +++ b/src/main.h @@ -19,7 +19,7 @@ extern bool axp192_found; extern bool isCharging; extern bool isUSBPowered; -extern uint8_t nodeTelemetrySensorsMap[10]; +extern uint8_t nodeTelemetrySensorsMap[12]; // Global Screen singleton. extern graphics::Screen *screen; diff --git a/src/mesh/generated/config.pb.h b/src/mesh/generated/config.pb.h index c48d38e6c..3c137cb02 100644 --- a/src/mesh/generated/config.pb.h +++ b/src/mesh/generated/config.pb.h @@ -120,8 +120,6 @@ typedef struct _Config_PositionConfig { bool gps_disabled; uint32_t gps_update_interval; uint32_t gps_attempt_time; - bool gps_accept_2d; - uint32_t gps_max_dop; uint32_t position_flags; } Config_PositionConfig; @@ -194,14 +192,14 @@ extern "C" { /* Initializer values for message structs */ #define Config_init_default {0, {Config_DeviceConfig_init_default}} #define Config_DeviceConfig_init_default {_Config_DeviceConfig_Role_MIN, 0, 0, 0, ""} -#define Config_PositionConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0} +#define Config_PositionConfig_init_default {0, 0, 0, 0, 0, 0, 0} #define Config_PowerConfig_init_default {_Config_PowerConfig_ChargeCurrent_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #define Config_WiFiConfig_init_default {"", "", 0, 0} #define Config_DisplayConfig_init_default {0, _Config_DisplayConfig_GpsCoordinateFormat_MIN, 0} #define Config_LoRaConfig_init_default {0, _Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, _Config_LoRaConfig_RegionCode_MIN, 0, 0, 0, {0, 0, 0}} #define Config_init_zero {0, {Config_DeviceConfig_init_zero}} #define Config_DeviceConfig_init_zero {_Config_DeviceConfig_Role_MIN, 0, 0, 0, ""} -#define Config_PositionConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0} +#define Config_PositionConfig_init_zero {0, 0, 0, 0, 0, 0, 0} #define Config_PowerConfig_init_zero {_Config_PowerConfig_ChargeCurrent_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #define Config_WiFiConfig_init_zero {"", "", 0, 0} #define Config_DisplayConfig_init_zero {0, _Config_DisplayConfig_GpsCoordinateFormat_MIN, 0} @@ -232,8 +230,6 @@ extern "C" { #define Config_PositionConfig_gps_disabled_tag 5 #define Config_PositionConfig_gps_update_interval_tag 6 #define Config_PositionConfig_gps_attempt_time_tag 7 -#define Config_PositionConfig_gps_accept_2d_tag 8 -#define Config_PositionConfig_gps_max_dop_tag 9 #define Config_PositionConfig_position_flags_tag 10 #define Config_PowerConfig_charge_current_tag 1 #define Config_PowerConfig_is_low_power_tag 2 @@ -291,8 +287,6 @@ X(a, STATIC, SINGULAR, BOOL, fixed_position, 3) \ X(a, STATIC, SINGULAR, BOOL, gps_disabled, 5) \ X(a, STATIC, SINGULAR, UINT32, gps_update_interval, 6) \ X(a, STATIC, SINGULAR, UINT32, gps_attempt_time, 7) \ -X(a, STATIC, SINGULAR, BOOL, gps_accept_2d, 8) \ -X(a, STATIC, SINGULAR, UINT32, gps_max_dop, 9) \ X(a, STATIC, SINGULAR, UINT32, position_flags, 10) #define Config_PositionConfig_CALLBACK NULL #define Config_PositionConfig_DEFAULT NULL @@ -363,7 +357,7 @@ extern const pb_msgdesc_t Config_LoRaConfig_msg; #define Config_DeviceConfig_size 42 #define Config_DisplayConfig_size 14 #define Config_LoRaConfig_size 67 -#define Config_PositionConfig_size 38 +#define Config_PositionConfig_size 30 #define Config_PowerConfig_size 55 #define Config_WiFiConfig_size 103 #define Config_size 105 diff --git a/src/mesh/generated/localonly.pb.h b/src/mesh/generated/localonly.pb.h index c03d97611..fccc904e4 100644 --- a/src/mesh/generated/localonly.pb.h +++ b/src/mesh/generated/localonly.pb.h @@ -126,7 +126,7 @@ extern const pb_msgdesc_t LocalModuleConfig_msg; #define LocalModuleConfig_fields &LocalModuleConfig_msg /* Maximum encoded size of messages (where known) */ -#define LocalConfig_size 331 +#define LocalConfig_size 323 #define LocalModuleConfig_size 282 #ifdef __cplusplus diff --git a/src/mesh/generated/telemetry.pb.h b/src/mesh/generated/telemetry.pb.h index 6c9db655c..b7857e2ae 100644 --- a/src/mesh/generated/telemetry.pb.h +++ b/src/mesh/generated/telemetry.pb.h @@ -12,26 +12,30 @@ /* Enum definitions */ /* TODO: REPLACE */ typedef enum _TelemetrySensorType { - /* No external telemetry sensor */ + /* No external telemetry sensor explicitly set */ TelemetrySensorType_NotSet = 0, - /* TODO: REPLACE */ + /* Moderate accuracy temperature */ TelemetrySensorType_DHT11 = 1, - /* TODO: REPLACE */ + /* High accuracy temperature */ TelemetrySensorType_DS18B20 = 2, - /* TODO: REPLACE */ + /* Moderate accuracy temperature and humidity */ TelemetrySensorType_DHT12 = 3, - /* TODO: REPLACE */ + /* Moderate accuracy temperature and humidity */ TelemetrySensorType_DHT21 = 4, - /* TODO: REPLACE */ + /* Moderate accuracy temperature and humidity */ TelemetrySensorType_DHT22 = 5, - /* TODO: REPLACE */ + /* High accuracy temperature, pressure, humidity */ TelemetrySensorType_BME280 = 6, - /* TODO: REPLACE */ + /* High accuracy temperature, pressure, humidity, and air resistance */ TelemetrySensorType_BME680 = 7, - /* TODO: REPLACE */ + /* Very high accuracy temperature */ TelemetrySensorType_MCP9808 = 8, - /* TODO: REPLACE */ - TelemetrySensorType_SHTC3 = 9 + /* Moderate accuracy temperature and humidity */ + TelemetrySensorType_SHTC3 = 9, + /* Moderate accuracy current and voltage */ + TelemetrySensorType_INA260 = 10, + /* Moderate accuracy current and voltage */ + TelemetrySensorType_INA219 = 11 } TelemetrySensorType; /* Struct definitions */ @@ -65,10 +69,10 @@ typedef struct _EnvironmentMetrics { /* Types of Measurements the telemetry module is equipped to handle */ typedef struct _Telemetry { - /* This is usually not sent over the mesh (to save space), but it is sent - from the phone so that the local device can set its RTC If it is sent over - the mesh (because there are devices on the mesh without GPS), it will only - be sent by devices which has a hardware GPS clock (IE Mobile Phone). + /* This is usually not sent over the mesh (to save space), but it is sent + from the phone so that the local device can set its RTC If it is sent over + the mesh (because there are devices on the mesh without GPS), it will only + be sent by devices which has a hardware GPS clock (IE Mobile Phone). seconds since 1970 */ uint32_t time; /* Key native device metrics such as battery level */ @@ -82,8 +86,8 @@ typedef struct _Telemetry { /* Helper constants for enums */ #define _TelemetrySensorType_MIN TelemetrySensorType_NotSet -#define _TelemetrySensorType_MAX TelemetrySensorType_SHTC3 -#define _TelemetrySensorType_ARRAYSIZE ((TelemetrySensorType)(TelemetrySensorType_SHTC3+1)) +#define _TelemetrySensorType_MAX TelemetrySensorType_INA219 +#define _TelemetrySensorType_ARRAYSIZE ((TelemetrySensorType)(TelemetrySensorType_INA219+1)) #ifdef __cplusplus diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index c9ae2e3f7..ffa4fce0a 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -16,12 +16,17 @@ #include "Sensor/DHTSensor.h" #include "Sensor/DallasSensor.h" #include "Sensor/MCP9808Sensor.h" +#include "Sensor/INA260Sensor.h" +#include "Sensor/INA219Sensor.h" + BME280Sensor bme280Sensor; BME680Sensor bme680Sensor; DHTSensor dhtSensor; DallasSensor dallasSensor; MCP9808Sensor mcp9808Sensor; +INA260Sensor ina260Sensor; +INA219Sensor ina219Sensor; #define FAILED_STATE_SENSOR_READ_MULTIPLIER 10 #define DISPLAY_RECEIVEID_MEASUREMENTS_ON_SCREEN true @@ -50,6 +55,7 @@ int32_t EnvironmentTelemetryModule::runOnce() Uncomment the preferences below if you want to use the module without having to configure it from the PythonAPI or WebUI. */ + moduleConfig.telemetry.environment_measurement_enabled = 1; /* moduleConfig.telemetry.environment_measurement_enabled = 1; @@ -96,6 +102,10 @@ int32_t EnvironmentTelemetryModule::runOnce() result = bme280Sensor.runOnce(); if (mcp9808Sensor.hasSensor()) result = mcp9808Sensor.runOnce(); + if (ina260Sensor.hasSensor()) + result = ina260Sensor.runOnce(); + if (ina219Sensor.hasSensor()) + result = ina219Sensor.runOnce(); } return result; } else { @@ -252,6 +262,10 @@ bool EnvironmentTelemetryModule::sendOurTelemetry(NodeNum dest, bool wantReplies bme680Sensor.getMetrics(&m); if (mcp9808Sensor.hasSensor()) mcp9808Sensor.getMetrics(&m); + if (ina219Sensor.hasSensor()) + ina219Sensor.getMetrics(&m); + if (ina260Sensor.hasSensor()) + ina260Sensor.getMetrics(&m); DEBUG_MSG("Telemetry->time: %i\n", m.time); DEBUG_MSG("Telemetry->barometric_pressure: %f\n", m.variant.environment_metrics.barometric_pressure); diff --git a/src/modules/Telemetry/Sensor/BME280Sensor.cpp b/src/modules/Telemetry/Sensor/BME280Sensor.cpp index 65689b4f0..15ec18007 100644 --- a/src/modules/Telemetry/Sensor/BME280Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME280Sensor.cpp @@ -11,11 +11,11 @@ BME280Sensor::BME280Sensor() : } int32_t BME280Sensor::runOnce() { - DEBUG_MSG("Init sensor: TelemetrySensorType_BME280\n"); + DEBUG_MSG("Init sensor: %s\n", sensorName); if (!hasSensor()) { return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } - status = bme280.begin(nodeTelemetrySensorsMap[TelemetrySensorType_BME280]); + status = bme280.begin(nodeTelemetrySensorsMap[sensorType]); return initI2CSensor(); } diff --git a/src/modules/Telemetry/Sensor/BME680Sensor.cpp b/src/modules/Telemetry/Sensor/BME680Sensor.cpp index c12a1fbc0..474c376dd 100644 --- a/src/modules/Telemetry/Sensor/BME680Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME680Sensor.cpp @@ -10,11 +10,11 @@ BME680Sensor::BME680Sensor() : } int32_t BME680Sensor::runOnce() { - DEBUG_MSG("runOnce: TelemetrySensorType_BME680\n"); + DEBUG_MSG("Init sensor: %s\n", sensorName); if (!hasSensor()) { return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } - status = bme680.begin(nodeTelemetrySensorsMap[TelemetrySensorType_BME680]); + status = bme680.begin(nodeTelemetrySensorsMap[sensorType]); return initI2CSensor(); } @@ -29,7 +29,6 @@ void BME680Sensor::setup() } bool BME680Sensor::getMetrics(Telemetry *measurement) { - measurement->variant.environment_metrics.temperature = bme680.readTemperature(); measurement->variant.environment_metrics.relative_humidity = bme680.readHumidity(); measurement->variant.environment_metrics.barometric_pressure = bme680.readPressure() / 100.0F; diff --git a/src/modules/Telemetry/Sensor/INA219Sensor.cpp b/src/modules/Telemetry/Sensor/INA219Sensor.cpp new file mode 100644 index 000000000..3e280c526 --- /dev/null +++ b/src/modules/Telemetry/Sensor/INA219Sensor.cpp @@ -0,0 +1,30 @@ +#include "../mesh/generated/telemetry.pb.h" +#include "configuration.h" +#include "TelemetrySensor.h" +#include "INA219Sensor.h" +#include + +INA219Sensor::INA219Sensor() : + TelemetrySensor(TelemetrySensorType_INA219, "INA219") +{ +} + +int32_t INA219Sensor::runOnce() { + DEBUG_MSG("Init sensor: %s\n", sensorName); + if (!hasSensor()) { + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + } + ina219 = Adafruit_INA219(nodeTelemetrySensorsMap[sensorType]); + status = ina219.begin(); + return initI2CSensor(); +} + +void INA219Sensor::setup() +{ +} + +bool INA219Sensor::getMetrics(Telemetry *measurement) { + measurement->variant.environment_metrics.voltage = ina219.getBusVoltage_V(); + measurement->variant.environment_metrics.current = ina219.getCurrent_mA(); + return true; +} \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/INA219Sensor.h b/src/modules/Telemetry/Sensor/INA219Sensor.h new file mode 100644 index 000000000..7e0a3c17e --- /dev/null +++ b/src/modules/Telemetry/Sensor/INA219Sensor.h @@ -0,0 +1,17 @@ +#include "../mesh/generated/telemetry.pb.h" +#include "TelemetrySensor.h" +#include + + +class INA219Sensor : virtual public TelemetrySensor { +private: + Adafruit_INA219 ina219; + +protected: + virtual void setup() override; + +public: + INA219Sensor(); + virtual int32_t runOnce() override; + virtual bool getMetrics(Telemetry *measurement) override; +}; \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/INA260Sensor.cpp b/src/modules/Telemetry/Sensor/INA260Sensor.cpp new file mode 100644 index 000000000..1c924ad71 --- /dev/null +++ b/src/modules/Telemetry/Sensor/INA260Sensor.cpp @@ -0,0 +1,30 @@ +#include "../mesh/generated/telemetry.pb.h" +#include "configuration.h" +#include "TelemetrySensor.h" +#include "INA260Sensor.h" +#include + +INA260Sensor::INA260Sensor() : + TelemetrySensor(TelemetrySensorType_INA260, "INA260") +{ +} + +int32_t INA260Sensor::runOnce() { + DEBUG_MSG("Init sensor: %s\n", sensorName); + if (!hasSensor()) { + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + } + status = ina260.begin(nodeTelemetrySensorsMap[sensorType]); + return initI2CSensor(); +} + +void INA260Sensor::setup() +{ +} + +bool INA260Sensor::getMetrics(Telemetry *measurement) { + // mV conversion to V + measurement->variant.environment_metrics.voltage = ina260.readBusVoltage() / 1000; + measurement->variant.environment_metrics.current = ina260.readCurrent(); + return true; +} \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/INA260Sensor.h b/src/modules/Telemetry/Sensor/INA260Sensor.h new file mode 100644 index 000000000..789b66c2d --- /dev/null +++ b/src/modules/Telemetry/Sensor/INA260Sensor.h @@ -0,0 +1,17 @@ +#include "../mesh/generated/telemetry.pb.h" +#include "TelemetrySensor.h" +#include + + +class INA260Sensor : virtual public TelemetrySensor { +private: + Adafruit_INA260 ina260 = Adafruit_INA260(); + +protected: + virtual void setup() override; + +public: + INA260Sensor(); + virtual int32_t runOnce() override; + virtual bool getMetrics(Telemetry *measurement) override; +}; \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp b/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp index 664416d60..57092d285 100644 --- a/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp +++ b/src/modules/Telemetry/Sensor/MCP9808Sensor.cpp @@ -10,11 +10,11 @@ MCP9808Sensor::MCP9808Sensor() : } int32_t MCP9808Sensor::runOnce() { - DEBUG_MSG("Init sensor: TelemetrySensorType_MCP9808\n"); + DEBUG_MSG("Init sensor: %s\n", sensorName); if (!hasSensor()) { return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } - status = mcp9808.begin(nodeTelemetrySensorsMap[TelemetrySensorType_MCP9808]); + status = mcp9808.begin(nodeTelemetrySensorsMap[sensorType]); return initI2CSensor(); } From 4458b470aa720da04f96264ad69c52101991f486 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sun, 12 Jun 2022 07:14:33 -0500 Subject: [PATCH 35/37] Don't enable environmental telemetry by default (#1502) * INA219 + INA260 support in telemetry * Protobuf update * Fixes + debug statement * Fix size * Fix conversion from mv * Added getRegisterValue for i2cscan * Accidentally left this in * Removed line --- src/modules/Telemetry/EnvironmentTelemetry.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index ffa4fce0a..b996052f7 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -55,7 +55,6 @@ int32_t EnvironmentTelemetryModule::runOnce() Uncomment the preferences below if you want to use the module without having to configure it from the PythonAPI or WebUI. */ - moduleConfig.telemetry.environment_measurement_enabled = 1; /* moduleConfig.telemetry.environment_measurement_enabled = 1; From 51064335729b03fab2251e8a790749e1122819f1 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sun, 12 Jun 2022 09:44:23 -0500 Subject: [PATCH 36/37] Removed phone_timeout_secs pref references (#1503) --- protobufs | 2 +- src/PowerFSM.cpp | 3 --- src/SerialConsole.cpp | 6 ++++-- src/mesh/NodeDB.h | 1 - src/mesh/generated/config.pb.h | 9 +++------ src/mesh/generated/localonly.pb.h | 2 +- src/mesh/generated/telemetry.pb.h | 8 ++++---- src/modules/AdminModule.cpp | 6 ++---- 8 files changed, 15 insertions(+), 22 deletions(-) diff --git a/protobufs b/protobufs index dbd4219a8..e5b5adc19 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit dbd4219a862b26b5c6fa6569bd8faa42ab8852a5 +Subproject commit e5b5adc196d3593ab15c04101093443ab8b36c9c diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 0804d62dc..82f73147c 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -348,9 +348,6 @@ void PowerFSM_setup() // See: https://github.com/meshtastic/Meshtastic-device/issues/1071 if (isRouter || config.power.is_power_saving) { - - // I don't think this transition is correct, turning off for now - @geeksville - // powerFSM.add_timed_transition(&stateDARK, &stateNB, getPref_phone_timeout_secs() * 1000, NULL, "Phone timeout"); powerFSM.add_timed_transition(&stateNB, &stateLS, config.power.min_wake_secs ? config.power.min_wake_secs : default_min_wake_secs * 1000, diff --git a/src/SerialConsole.cpp b/src/SerialConsole.cpp index 2d001192b..49e7e017a 100644 --- a/src/SerialConsole.cpp +++ b/src/SerialConsole.cpp @@ -4,6 +4,8 @@ #include "configuration.h" #define Port Serial +// Defaulting to the formerly removed phone_timeout_secs value of 15 minutes +#define SERIAL_CONNECTION_TIMEOUT (15 * 60) * 1000UL SerialConsole *console; @@ -41,12 +43,12 @@ SerialConsole::SerialConsole() : StreamAPI(&Port), RedirectablePrint(&Port) emitRebooted(); } + // For the serial port we can't really detect if any client is on the other side, so instead just look for recent messages bool SerialConsole::checkIsConnected() { uint32_t now = millis(); - uint32_t timeout = (config.power.phone_timeout_secs > 0 ? config.power.phone_timeout_secs : default_phone_timeout_secs )* 1000UL; - return (now - lastContactMsec) < timeout; + return (now - lastContactMsec) < SERIAL_CONNECTION_TIMEOUT; } /** diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h index e2ec49a9f..0d6d50ee1 100644 --- a/src/mesh/NodeDB.h +++ b/src/mesh/NodeDB.h @@ -168,7 +168,6 @@ extern NodeDB nodeDB; #define default_mesh_sds_timeout_secs IF_ROUTER(NODE_DELAY_FOREVER, 2 * 60 * 60) #define default_sds_secs 365 * 24 * 60 * 60 #define default_ls_secs IF_ROUTER(24 * 60 * 60, 5 * 60) -#define default_phone_timeout_secs 15 * 60 #define default_min_wake_secs 10 diff --git a/src/mesh/generated/config.pb.h b/src/mesh/generated/config.pb.h index 3c137cb02..e59fda04b 100644 --- a/src/mesh/generated/config.pb.h +++ b/src/mesh/generated/config.pb.h @@ -131,7 +131,6 @@ typedef struct _Config_PowerConfig { bool is_power_saving; float adc_multiplier_override; uint32_t wait_bluetooth_secs; - uint32_t phone_timeout_secs; uint32_t mesh_sds_timeout_secs; uint32_t sds_secs; uint32_t ls_secs; @@ -193,14 +192,14 @@ extern "C" { #define Config_init_default {0, {Config_DeviceConfig_init_default}} #define Config_DeviceConfig_init_default {_Config_DeviceConfig_Role_MIN, 0, 0, 0, ""} #define Config_PositionConfig_init_default {0, 0, 0, 0, 0, 0, 0} -#define Config_PowerConfig_init_default {_Config_PowerConfig_ChargeCurrent_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +#define Config_PowerConfig_init_default {_Config_PowerConfig_ChargeCurrent_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #define Config_WiFiConfig_init_default {"", "", 0, 0} #define Config_DisplayConfig_init_default {0, _Config_DisplayConfig_GpsCoordinateFormat_MIN, 0} #define Config_LoRaConfig_init_default {0, _Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, _Config_LoRaConfig_RegionCode_MIN, 0, 0, 0, {0, 0, 0}} #define Config_init_zero {0, {Config_DeviceConfig_init_zero}} #define Config_DeviceConfig_init_zero {_Config_DeviceConfig_Role_MIN, 0, 0, 0, ""} #define Config_PositionConfig_init_zero {0, 0, 0, 0, 0, 0, 0} -#define Config_PowerConfig_init_zero {_Config_PowerConfig_ChargeCurrent_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +#define Config_PowerConfig_init_zero {_Config_PowerConfig_ChargeCurrent_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #define Config_WiFiConfig_init_zero {"", "", 0, 0} #define Config_DisplayConfig_init_zero {0, _Config_DisplayConfig_GpsCoordinateFormat_MIN, 0} #define Config_LoRaConfig_init_zero {0, _Config_LoRaConfig_ModemPreset_MIN, 0, 0, 0, 0, _Config_LoRaConfig_RegionCode_MIN, 0, 0, 0, {0, 0, 0}} @@ -238,7 +237,6 @@ extern "C" { #define Config_PowerConfig_is_power_saving_tag 5 #define Config_PowerConfig_adc_multiplier_override_tag 6 #define Config_PowerConfig_wait_bluetooth_secs_tag 7 -#define Config_PowerConfig_phone_timeout_secs_tag 8 #define Config_PowerConfig_mesh_sds_timeout_secs_tag 9 #define Config_PowerConfig_sds_secs_tag 10 #define Config_PowerConfig_ls_secs_tag 11 @@ -299,7 +297,6 @@ X(a, STATIC, SINGULAR, UINT32, on_battery_shutdown_after_secs, 4) \ X(a, STATIC, SINGULAR, BOOL, is_power_saving, 5) \ X(a, STATIC, SINGULAR, FLOAT, adc_multiplier_override, 6) \ X(a, STATIC, SINGULAR, UINT32, wait_bluetooth_secs, 7) \ -X(a, STATIC, SINGULAR, UINT32, phone_timeout_secs, 8) \ X(a, STATIC, SINGULAR, UINT32, mesh_sds_timeout_secs, 9) \ X(a, STATIC, SINGULAR, UINT32, sds_secs, 10) \ X(a, STATIC, SINGULAR, UINT32, ls_secs, 11) \ @@ -358,7 +355,7 @@ extern const pb_msgdesc_t Config_LoRaConfig_msg; #define Config_DisplayConfig_size 14 #define Config_LoRaConfig_size 67 #define Config_PositionConfig_size 30 -#define Config_PowerConfig_size 55 +#define Config_PowerConfig_size 49 #define Config_WiFiConfig_size 103 #define Config_size 105 diff --git a/src/mesh/generated/localonly.pb.h b/src/mesh/generated/localonly.pb.h index fccc904e4..df0966414 100644 --- a/src/mesh/generated/localonly.pb.h +++ b/src/mesh/generated/localonly.pb.h @@ -126,7 +126,7 @@ extern const pb_msgdesc_t LocalModuleConfig_msg; #define LocalModuleConfig_fields &LocalModuleConfig_msg /* Maximum encoded size of messages (where known) */ -#define LocalConfig_size 323 +#define LocalConfig_size 317 #define LocalModuleConfig_size 282 #ifdef __cplusplus diff --git a/src/mesh/generated/telemetry.pb.h b/src/mesh/generated/telemetry.pb.h index b7857e2ae..b6d3dc7e6 100644 --- a/src/mesh/generated/telemetry.pb.h +++ b/src/mesh/generated/telemetry.pb.h @@ -69,10 +69,10 @@ typedef struct _EnvironmentMetrics { /* Types of Measurements the telemetry module is equipped to handle */ typedef struct _Telemetry { - /* This is usually not sent over the mesh (to save space), but it is sent - from the phone so that the local device can set its RTC If it is sent over - the mesh (because there are devices on the mesh without GPS), it will only - be sent by devices which has a hardware GPS clock (IE Mobile Phone). + /* This is usually not sent over the mesh (to save space), but it is sent + from the phone so that the local device can set its RTC If it is sent over + the mesh (because there are devices on the mesh without GPS), it will only + be sent by devices which has a hardware GPS clock (IE Mobile Phone). seconds since 1970 */ uint32_t time; /* Key native device metrics such as battery level */ diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index c9b533af6..6d25fd367 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -306,11 +306,10 @@ void AdminModule::handleGetConfig(const MeshPacket &req, const uint32_t configTy break; } - // NOTE: The phone app needs to know the ls_secs & phone_timeout value so it can properly expect sleep behavior. + // NOTE: The phone app needs to know the ls_secs value so it can properly expect sleep behavior. // So even if we internally use 0 to represent 'use default' we still need to send the value we are // using to the app (so that even old phone apps work with new device loads). // r.get_radio_response.preferences.ls_secs = getPref_ls_secs(); - // r.get_radio_response.preferences.phone_timeout_secs = getPref_phone_timeout_secs(); // hideSecret(r.get_radio_response.preferences.wifi_ssid); // hmm - leave public for now, because only minimally private // and useful for users to know current provisioning) hideSecret(r.get_radio_response.preferences.wifi_password); // r.get_config_response.which_payloadVariant = Config_ModuleConfig_telemetry_tag; @@ -363,11 +362,10 @@ void AdminModule::handleGetModuleConfig(const MeshPacket &req, const uint32_t co break; } - // NOTE: The phone app needs to know the ls_secs & phone_timeout value so it can properly expect sleep behavior. + // NOTE: The phone app needs to know the ls_secsvalue so it can properly expect sleep behavior. // So even if we internally use 0 to represent 'use default' we still need to send the value we are // using to the app (so that even old phone apps work with new device loads). // r.get_radio_response.preferences.ls_secs = getPref_ls_secs(); - // r.get_radio_response.preferences.phone_timeout_secs = getPref_phone_timeout_secs(); // hideSecret(r.get_radio_response.preferences.wifi_ssid); // hmm - leave public for now, because only minimally private // and useful for users to know current provisioning) hideSecret(r.get_radio_response.preferences.wifi_password); // r.get_config_response.which_payloadVariant = Config_ModuleConfig_telemetry_tag; From 47ad27f9f68304781c562ed724cd86d2aa19c333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sun, 12 Jun 2022 17:59:16 +0200 Subject: [PATCH 37/37] fix C++ warnings The cast throws errors about ambiguous conversions. There's a prototype of requestFrom(uint8_t address, uint8_t length) so just use that one. --- src/debug/i2cScan.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug/i2cScan.h b/src/debug/i2cScan.h index c4ab6a41e..29d7cdc95 100644 --- a/src/debug/i2cScan.h +++ b/src/debug/i2cScan.h @@ -10,7 +10,7 @@ uint16_t getRegisterValue(uint8_t address, uint8_t reg, uint8_t length) { Wire.write(reg); Wire.endTransmission(); delay(20); - Wire.requestFrom((int)address, length); + Wire.requestFrom(address, length); DEBUG_MSG("Wire.available() = %d\n", Wire.available()); if (Wire.available() == 2) { // Read MSB, then LSB