From 65197a8e485c3c81f459ce4b1fe98b68e98598e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Sat, 12 Nov 2022 11:03:29 +0100 Subject: [PATCH] - Add new Compass Sensor - speed up I2C Scanning - make adding sensors less error prone --- platformio.ini | 1 + protobufs | 2 +- src/configuration.h | 1 + src/detect/i2cScan.h | 102 ++++++++++++++++-------------- src/main.cpp | 6 +- src/main.h | 2 +- src/mesh/generated/telemetry.pb.h | 16 +++-- 7 files changed, 71 insertions(+), 59 deletions(-) diff --git a/platformio.ini b/platformio.ini index 68492f520..618c7cddb 100644 --- a/platformio.ini +++ b/platformio.ini @@ -69,6 +69,7 @@ lib_deps = ${env.lib_deps} ; Portduino is using meshtastic fork for now jgromes/RadioLib@5.4.1 + mprograms/QMC5883LCompass@^1.1.1 https://github.com/meshtastic/SparkFun_ATECCX08a_Arduino_Library.git#52b5282639d08a8cbd4b748363089eed6102dc76 build_flags = ${env.build_flags} -Os diff --git a/protobufs b/protobufs index c82c15aac..f7d11572b 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit c82c15aac71b9134d96c03dbe319916739cc8314 +Subproject commit f7d11572b436d1078222ba27892ac73b7a9842ba diff --git a/src/configuration.h b/src/configuration.h index 4b157611d..e68bd8d16 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -110,6 +110,7 @@ along with this program. If not, see . #define INA_ADDR_ALTERNATE 0x41 #define QMC6310_ADDR 0x1C #define QMI8658_ADDR 0x6B +#define QMC5883L_ADDR 0x1E #define SHTC3_ADDR 0x70 #define LPS22HB_ADDR 0x5C #define LPS22HB_ADDR_ALT 0x5D diff --git a/src/detect/i2cScan.h b/src/detect/i2cScan.h index 6fc9d67d3..0b8f59c14 100644 --- a/src/detect/i2cScan.h +++ b/src/detect/i2cScan.h @@ -90,12 +90,14 @@ uint8_t oled_probe(byte addr) return o_probe; } -void scanI2Cdevice(void) +void scanI2Cdevice(bool partial) { byte err, addr; uint16_t registerValue = 0x00; int nDevices = 0; for (addr = 1; addr < 127; addr++) { + if (partial && addr != SSD1306_ADDRESS && addr != ST7567_ADDRESS && addr != XPOWERS_AXP192_AXP2101_ADDRESS) + continue; Wire.beginTransmission(addr); err = Wire.endTransmission(); if (err == 0) { @@ -106,16 +108,16 @@ void scanI2Cdevice(void) if (addr == SSD1306_ADDRESS) { screen_found = addr; screen_model = oled_probe(addr); - if (screen_model == 1){ + if (screen_model == 1) { DEBUG_MSG("ssd1306 display found\n"); - } else if (screen_model == 2){ + } else if (screen_model == 2) { DEBUG_MSG("sh1106 display found\n"); } else { DEBUG_MSG("unknown display found\n"); } } #ifndef ARCH_PORTDUINO - if (addr == ATECC608B_ADDR){ + if (addr == ATECC608B_ADDR) { keystore_found = addr; if (atecc.begin(keystore_found) == true) { DEBUG_MSG("ATECC608B initialized\n"); @@ -163,50 +165,56 @@ void scanI2Cdevice(void) DEBUG_MSG("axp192/axp2101 PMU found\n"); } #endif - if (addr == BME_ADDR || addr == BME_ADDR_ALTERNATE) { - 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 (registerValue == 0x60) { - DEBUG_MSG("BME-280 sensor found at address 0x%x\n", (uint8_t)addr); - nodeTelemetrySensorsMap[TelemetrySensorType_BME280] = addr; - } else { - DEBUG_MSG("BMP-280 sensor found at address 0x%x\n", (uint8_t)addr); - nodeTelemetrySensorsMap[TelemetrySensorType_BMP280] = addr; + if (addr == BME_ADDR || addr == BME_ADDR_ALTERNATE) { + 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 (registerValue == 0x60) { + DEBUG_MSG("BME-280 sensor found at address 0x%x\n", (uint8_t)addr); + nodeTelemetrySensorsMap[TelemetrySensorType_BME280] = addr; + } else { + DEBUG_MSG("BMP-280 sensor found at address 0x%x\n", (uint8_t)addr); + nodeTelemetrySensorsMap[TelemetrySensorType_BMP280] = 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 == 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\n"); + } + if (addr == SHTC3_ADDR) { + DEBUG_MSG("SHTC3 sensor found\n"); + nodeTelemetrySensorsMap[TelemetrySensorType_SHTC3] = addr; + } + if (addr == LPS22HB_ADDR || addr == LPS22HB_ADDR_ALT) { + DEBUG_MSG("LPS22HB sensor found\n"); + nodeTelemetrySensorsMap[TelemetrySensorType_LPS22] = addr; + } + + // High rate sensors, will be processed internally + if (addr == QMC6310_ADDR) { + DEBUG_MSG("QMC6310 Highrate 3-Axis magnetic sensor found\n"); + nodeTelemetrySensorsMap[TelemetrySensorType_QMC6310] = addr; + } + if (addr == QMI8658_ADDR) { + DEBUG_MSG("QMI8658 Highrate 6-Axis inertial measurement sensor found\n"); + nodeTelemetrySensorsMap[TelemetrySensorType_QMI8658] = addr; + } + if (addr == QMC5883L_ADDR) { + DEBUG_MSG("QMC5883L Highrate 3-Axis magnetic sensor found\n"); + nodeTelemetrySensorsMap[TelemetrySensorType_QMC5883L] = addr; } - } - if (addr == MCP9808_ADDR) { - nodeTelemetrySensorsMap[TelemetrySensorType_MCP9808] = addr; - DEBUG_MSG("MCP9808 sensor found at address 0x%x\n", (uint8_t)addr); - } - if (addr == QMC6310_ADDR) { - DEBUG_MSG("QMC6310 3-Axis magnetic sensor found at address 0x%x\n", (uint8_t)addr); - nodeTelemetrySensorsMap[TelemetrySensorType_QMC6310] = addr; - } - if (addr == QMI8658_ADDR) { - DEBUG_MSG("QMI8658 6-Axis inertial measurement sensor found at address 0x%x\n", (uint8_t)addr); - nodeTelemetrySensorsMap[TelemetrySensorType_QMI8658] = addr; - } - if (addr == SHTC3_ADDR) { - DEBUG_MSG("SHTC3 sensor found at address 0x%x\n", (uint8_t)addr); - nodeTelemetrySensorsMap[TelemetrySensorType_SHTC3] = addr; - } - if (addr == LPS22HB_ADDR || addr == LPS22HB_ADDR_ALT) { - DEBUG_MSG("LPS22HB sensor found at address 0x%x\n", (uint8_t)addr); - nodeTelemetrySensorsMap[TelemetrySensorType_LPS22] = addr; - } } else if (err == 4) { DEBUG_MSG("Unknow error at address 0x%x\n", addr); } @@ -218,5 +226,5 @@ void scanI2Cdevice(void) DEBUG_MSG("%i I2C devices found\n",nDevices); } #else -void scanI2Cdevice(void) {} +void scanI2Cdevice(bool partial) {} #endif diff --git a/src/main.cpp b/src/main.cpp index 0f2e575c1..1e95b08ad 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -100,7 +100,7 @@ uint32_t serialSinceMsec; bool pmu_found; // Array map of sensor types (as array index) and i2c address as value we'll find in the i2c scan -uint8_t nodeTelemetrySensorsMap[TelemetrySensorType_QMI8658+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +uint8_t nodeTelemetrySensorsMap[_TelemetrySensorType_MAX + 1] = { 0 }; // one is enough, missing elements will be initialized to 0 anyway. Router *router = NULL; // Users of router don't care what sort of subclass implements that API @@ -245,7 +245,7 @@ void setup() #endif // We need to scan here to decide if we have a screen for nodeDB.init() - scanI2Cdevice(); + scanI2Cdevice(true); #ifdef RAK4630 // scanEInkDevice(); #endif @@ -290,7 +290,7 @@ void setup() * Repeat the scanning for I2C devices after power initialization or look for 'latecomers'. * Boards with an PMU need to be powered on to correctly scan to the device address, such as t-beam-s3-core */ - scanI2Cdevice(); + scanI2Cdevice(false); // fixed screen override? if (config.display.oled != Config_DisplayConfig_OledType_OLED_AUTO) diff --git a/src/main.h b/src/main.h index 3744c8acd..b7b41c250 100644 --- a/src/main.h +++ b/src/main.h @@ -26,7 +26,7 @@ extern bool isUSBPowered; extern ATECCX08A atecc; #endif -extern uint8_t nodeTelemetrySensorsMap[TelemetrySensorType_QMI8658+1]; +extern uint8_t nodeTelemetrySensorsMap[_TelemetrySensorType_MAX + 1]; extern int TCPPort; // set by Portduino diff --git a/src/mesh/generated/telemetry.pb.h b/src/mesh/generated/telemetry.pb.h index 38f4f9ca8..16e69f442 100644 --- a/src/mesh/generated/telemetry.pb.h +++ b/src/mesh/generated/telemetry.pb.h @@ -33,7 +33,9 @@ typedef enum _TelemetrySensorType { /* 3-Axis magnetic sensor */ TelemetrySensorType_QMC6310 = 9, /* 6-Axis inertial measurement sensor */ - TelemetrySensorType_QMI8658 = 10 + TelemetrySensorType_QMI8658 = 10, + /* 3-Axis magnetic sensor */ + TelemetrySensorType_QMC5883L = 11 } TelemetrySensorType; /* Struct definitions */ @@ -67,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; pb_size_t which_variant; @@ -85,8 +87,8 @@ typedef struct _Telemetry { /* Helper constants for enums */ #define _TelemetrySensorType_MIN TelemetrySensorType_SENSOR_UNSET -#define _TelemetrySensorType_MAX TelemetrySensorType_QMI8658 -#define _TelemetrySensorType_ARRAYSIZE ((TelemetrySensorType)(TelemetrySensorType_QMI8658+1)) +#define _TelemetrySensorType_MAX TelemetrySensorType_QMC5883L +#define _TelemetrySensorType_ARRAYSIZE ((TelemetrySensorType)(TelemetrySensorType_QMC5883L+1)) #ifdef __cplusplus