From c02bbad9f386b757aa567a71492cd5153de7d407 Mon Sep 17 00:00:00 2001 From: David <2941290+dhskinner@users.noreply.github.com> Date: Fri, 16 Aug 2024 19:46:33 +1000 Subject: [PATCH 1/9] Update nightly.yml --- .github/workflows/nightly.yml | 37 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index e249823a77..67256c21e2 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -1,19 +1,20 @@ name: Nightly -on: - schedule: - - cron: 0 8 * * 1-5 - workflow_dispatch: {} - -jobs: - trunk_check: - name: Trunk Check Upload - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Trunk Check - uses: trunk-io/trunk-action@782e83f803ca6e369f035d64c6ba2768174ba61b - with: - trunk-token: ${{ secrets.TRUNK_TOKEN }} +on: workflow_dispatch +# on: +# schedule: +# - cron: 0 8 * * 1-5 +# workflow_dispatch: {} +# +# jobs: +# trunk_check: +# name: Trunk Check Upload +# runs-on: ubuntu-latest +# +# steps: +# - name: Checkout +# uses: actions/checkout@v4 +# +# - name: Trunk Check +# uses: trunk-io/trunk-action@782e83f803ca6e369f035d64c6ba2768174ba61b +# with: +# trunk-token: ${{ secrets.TRUNK_TOKEN }} From fc1e60ac584dcceeb3acf38cd6d1af1977a5a7e7 Mon Sep 17 00:00:00 2001 From: David <2941290+dhskinner@users.noreply.github.com> Date: Sat, 17 Aug 2024 16:19:39 +1000 Subject: [PATCH 2/9] Initial upload --- .vscode/extensions.json | 7 ++- platformio.ini | 1 + src/detect/ScanI2C.h | 1 + src/detect/ScanI2CTwoWire.cpp | 15 ++++- src/main.cpp | 1 + .../Telemetry/EnvironmentTelemetry.cpp | 23 +++++++- src/modules/Telemetry/Sensor/BMP3XXSensor.cpp | 58 +++++++++++++++++++ src/modules/Telemetry/Sensor/BMP3XXSensor.h | 31 ++++++++++ 8 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 src/modules/Telemetry/Sensor/BMP3XXSensor.cpp create mode 100644 src/modules/Telemetry/Sensor/BMP3XXSensor.h diff --git a/.vscode/extensions.json b/.vscode/extensions.json index b50c95349d..080e70d08b 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,8 +2,9 @@ // See http://go.microsoft.com/fwlink/?LinkId=827846 // for the documentation about the extensions.json format "recommendations": [ - "ms-vscode.cpptools", - "platformio.platformio-ide", - "trunk.io" + "platformio.platformio-ide" ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] } diff --git a/platformio.ini b/platformio.ini index 4de1ec39fc..414232f619 100644 --- a/platformio.ini +++ b/platformio.ini @@ -130,6 +130,7 @@ lib_deps = adafruit/Adafruit BMP280 Library@^2.6.8 adafruit/Adafruit BMP085 Library@^1.2.4 adafruit/Adafruit BME280 Library@^2.2.2 + adafruit/Adafruit BMP3XX Library@^2.1.5 adafruit/Adafruit MCP9808 Library@^2.0.0 adafruit/Adafruit INA260 Library@^1.5.0 adafruit/Adafruit INA219@^1.2.0 diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h index 711e8bee54..0a5b360dec 100644 --- a/src/detect/ScanI2C.h +++ b/src/detect/ScanI2C.h @@ -24,6 +24,7 @@ class ScanI2C BME_280, BMP_280, BMP_085, + BMP_3XX, INA260, INA219, INA3221, diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp index 1183d0ddc1..76ca42b7f7 100644 --- a/src/detect/ScanI2CTwoWire.cpp +++ b/src/detect/ScanI2CTwoWire.cpp @@ -267,8 +267,19 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) type = BMP_085; break; default: - LOG_INFO("BMP-280 sensor found at address 0x%x\n", (uint8_t)addr.address); - type = BMP_280; + registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x00), 1); // GET_ID + switch(registerValue) { + case 0x50: // BMP-388 should be 0x50 + LOG_INFO("BMP-388 sensor found at address 0x%x\n", (uint8_t)addr.address); + type = BMP_3XX; + break; + case 0x58: // BMP-280 should be 0x58 + default: + LOG_INFO("BMP-280 sensor found at address 0x%x\n", (uint8_t)addr.address); + type = BMP_280; + break; + } + break; } break; #ifndef HAS_NCP5623 diff --git a/src/main.cpp b/src/main.cpp index b73d9803bf..b7d25e7642 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -562,6 +562,7 @@ void setup() SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::BME_680, meshtastic_TelemetrySensorType_BME680) SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::BME_280, meshtastic_TelemetrySensorType_BME280) SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::BMP_280, meshtastic_TelemetrySensorType_BMP280) + SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::BMP_3XX, meshtastic_TelemetrySensorType_BMP3XX) SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::BMP_085, meshtastic_TelemetrySensorType_BMP085) SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::INA260, meshtastic_TelemetrySensorType_INA260) SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::INA219, meshtastic_TelemetrySensorType_INA219) diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 4755a5be5a..51b49a0bc6 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -23,6 +23,7 @@ #include "Sensor/BME680Sensor.h" #include "Sensor/BMP085Sensor.h" #include "Sensor/BMP280Sensor.h" +#include "Sensor/BMP3XXSensor.h" #include "Sensor/DFRobotLarkSensor.h" #include "Sensor/LPS22HBSensor.h" #include "Sensor/MCP9808Sensor.h" @@ -40,6 +41,7 @@ BMP085Sensor bmp085Sensor; BMP280Sensor bmp280Sensor; BME280Sensor bme280Sensor; +BMP3XXSensor bmp3xxSensor; BME680Sensor bme680Sensor; MCP9808Sensor mcp9808Sensor; SHTC3Sensor shtc3Sensor; @@ -107,6 +109,8 @@ int32_t EnvironmentTelemetryModule::runOnce() result = bmp280Sensor.runOnce(); if (bme280Sensor.hasSensor()) result = bme280Sensor.runOnce(); + if (bmp3xxSensor.hasSensor()) + result = bmp3xxSensor.runOnce(); if (bme680Sensor.hasSensor()) result = bme680Sensor.runOnce(); if (mcp9808Sensor.hasSensor()) @@ -327,6 +331,10 @@ bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m valid = valid && bme280Sensor.getMetrics(m); hasSensor = true; } + if (bmp3xxSensor.hasSensor()) { + valid = valid && bmp3xxSensor.getMetrics(m); + hasSensor = true; + } if (bme680Sensor.hasSensor()) { valid = valid && bme680Sensor.getMetrics(m); hasSensor = true; @@ -372,15 +380,21 @@ bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m hasSensor = true; } if (aht10Sensor.hasSensor()) { - if (!bmp280Sensor.hasSensor()) { + if (!bmp280Sensor.hasSensor() && !bmp3xxSensor.hasSensor()) { valid = valid && aht10Sensor.getMetrics(m); hasSensor = true; - } else { + } else if (bmp280Sensor.hasSensor()) { // prefer bmp280 temp if both sensors are present, fetch only humidity meshtastic_Telemetry m_ahtx = meshtastic_Telemetry_init_zero; LOG_INFO("AHTX0+BMP280 module detected: using temp from BMP280 and humy from AHTX0\n"); aht10Sensor.getMetrics(&m_ahtx); m->variant.environment_metrics.relative_humidity = m_ahtx.variant.environment_metrics.relative_humidity; + } else { + // prefer bmp3xx temp if both sensors are present, fetch only humidity + meshtastic_Telemetry m_ahtx = meshtastic_Telemetry_init_zero; + LOG_INFO("AHTX0+BMP3XX module detected: using temp from BMP3XX and humy from AHTX0\n"); + aht10Sensor.getMetrics(&m_ahtx); + m->variant.environment_metrics.relative_humidity = m_ahtx.variant.environment_metrics.relative_humidity; } } @@ -508,6 +522,11 @@ AdminMessageHandleResult EnvironmentTelemetryModule::handleAdminMessageForModule if (result != AdminMessageHandleResult::NOT_HANDLED) return result; } + if (bmp3xxSensor.hasSensor()) { + result = bmp3xxSensor.handleAdminMessage(mp, request, response); + if (result != AdminMessageHandleResult::NOT_HANDLED) + return result; + } if (bme680Sensor.hasSensor()) { result = bme680Sensor.handleAdminMessage(mp, request, response); if (result != AdminMessageHandleResult::NOT_HANDLED) diff --git a/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp b/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp new file mode 100644 index 0000000000..7aec838185 --- /dev/null +++ b/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp @@ -0,0 +1,58 @@ +#include "configuration.h" + +#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR + +#include "../mesh/generated/meshtastic/telemetry.pb.h" +#include "BMP3XXSensor.h" +#include "TelemetrySensor.h" +#include +#include + +BMP3XXSensor::BMP3XXSensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BMP3XX, "BMP3XX"){} + +int32_t BMP3XXSensor::runOnce() +{ + LOG_INFO("Init sensor: %s\n", sensorName); + if (!hasSensor()) + { + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + } + + status = bmp3xx.begin_I2C(nodeTelemetrySensorsMap[sensorType].first, nodeTelemetrySensorsMap[sensorType].second); + + // set up oversampling and filter initialization + bmp3xx.setTemperatureOversampling(BMP3_OVERSAMPLING_4X); + bmp3xx.setPressureOversampling(BMP3_OVERSAMPLING_8X); + bmp3xx.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3); + bmp3xx.setOutputDataRate(BMP3_ODR_25_HZ); + + // take a couple of initial readings to settle the sensor filters + for (int i = 0; i < 3; i++) + { + bmp3xx.performReading(); + } + return initI2CSensor(); +} + +bool BMP3XXSensor::getMetrics(meshtastic_Telemetry *measurement) +{ + if ((int)measurement->which_variant == meshtastic_Telemetry_environment_metrics_tag) + { + bmp3xx.performReading(); + measurement->variant.environment_metrics.temperature = bmp3xx.readTemperature(); + measurement->variant.environment_metrics.barometric_pressure = bmp3xx.readPressure() / 100.0F; + LOG_DEBUG("BMP3XXSensor::getMetrics id: %i temp: %.1f press %.1f\n", measurement->which_variant, measurement->variant.environment_metrics.temperature, measurement->variant.environment_metrics.barometric_pressure); + } + else + { + LOG_DEBUG("BMP3XXSensor::getMetrics id: %i\n", measurement->which_variant); + } + return true; +} + +float BMP3XXSensor::getAltitudeAMSL() +{ + return bmp3xx.readAltitude(SEAL_LEVEL_HPA); +} + +#endif \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/BMP3XXSensor.h b/src/modules/Telemetry/Sensor/BMP3XXSensor.h new file mode 100644 index 0000000000..262d581e97 --- /dev/null +++ b/src/modules/Telemetry/Sensor/BMP3XXSensor.h @@ -0,0 +1,31 @@ +#include "configuration.h" + +#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR + +#ifndef _BMP3XX_SENSOR_H +#define _BMP3XX_SENSOR_H + +#define SEAL_LEVEL_HPA 1013.2f + +#include "../mesh/generated/meshtastic/telemetry.pb.h" +#include "TelemetrySensor.h" +#include + +class BMP3XXSensor : public TelemetrySensor +{ +protected: + Adafruit_BMP3XX bmp3xx; + float pressureHPa = 0.0f; + float temperatureCelcius = 0.0f; + float altitudeAmslMetres = 0.0f; + +public: + BMP3XXSensor(); + virtual int32_t runOnce() override; + virtual bool getMetrics(meshtastic_Telemetry *measurement) override; + virtual float getAltitudeAMSL(); +}; + +#endif + +#endif \ No newline at end of file From 47e1580a62fc0dbd4429a9c3ca9b4e3fc0fe6e8c Mon Sep 17 00:00:00 2001 From: David <2941290+dhskinner@users.noreply.github.com> Date: Sat, 17 Aug 2024 23:01:43 +1000 Subject: [PATCH 3/9] Integration test --- src/modules/Telemetry/EnvironmentTelemetry.cpp | 2 +- src/modules/Telemetry/Sensor/BMP3XXSensor.cpp | 4 ++++ src/modules/Telemetry/Sensor/BMP3XXSensor.h | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 51b49a0bc6..89e3b9d5f2 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -41,7 +41,6 @@ BMP085Sensor bmp085Sensor; BMP280Sensor bmp280Sensor; BME280Sensor bme280Sensor; -BMP3XXSensor bmp3xxSensor; BME680Sensor bme680Sensor; MCP9808Sensor mcp9808Sensor; SHTC3Sensor shtc3Sensor; @@ -56,6 +55,7 @@ AHT10Sensor aht10Sensor; MLX90632Sensor mlx90632Sensor; DFRobotLarkSensor dfRobotLarkSensor; NAU7802Sensor nau7802Sensor; +extern BMP3XXSensor bmp3xxSensor; #ifdef T1000X_SENSOR_EN T1000xSensor t1000xSensor; #endif diff --git a/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp b/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp index 7aec838185..6f0f9fc105 100644 --- a/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp +++ b/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp @@ -10,6 +10,10 @@ BMP3XXSensor::BMP3XXSensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BMP3XX, "BMP3XX"){} +BMP3XXSensor bmp3xxSensor; + +void BMP3XXSensor::setup(){}; + int32_t BMP3XXSensor::runOnce() { LOG_INFO("Init sensor: %s\n", sensorName); diff --git a/src/modules/Telemetry/Sensor/BMP3XXSensor.h b/src/modules/Telemetry/Sensor/BMP3XXSensor.h index 262d581e97..514ee17626 100644 --- a/src/modules/Telemetry/Sensor/BMP3XXSensor.h +++ b/src/modules/Telemetry/Sensor/BMP3XXSensor.h @@ -21,11 +21,14 @@ class BMP3XXSensor : public TelemetrySensor public: BMP3XXSensor(); + virtual void setup() override; virtual int32_t runOnce() override; virtual bool getMetrics(meshtastic_Telemetry *measurement) override; virtual float getAltitudeAMSL(); }; +extern BMP3XXSensor bmp3xxSensor; + #endif #endif \ No newline at end of file From 6d2011c17241c7213814672ccec6b5c2d2f55ff6 Mon Sep 17 00:00:00 2001 From: David <2941290+dhskinner@users.noreply.github.com> Date: Sat, 17 Aug 2024 23:25:55 +1000 Subject: [PATCH 4/9] Revert "Update nightly.yml" This reverts commit 44b975386d042b1810d5f3e1f2796af3ba7c118a. --- .github/workflows/nightly.yml | 37 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 67256c21e2..e249823a77 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -1,20 +1,19 @@ name: Nightly -on: workflow_dispatch -# on: -# schedule: -# - cron: 0 8 * * 1-5 -# workflow_dispatch: {} -# -# jobs: -# trunk_check: -# name: Trunk Check Upload -# runs-on: ubuntu-latest -# -# steps: -# - name: Checkout -# uses: actions/checkout@v4 -# -# - name: Trunk Check -# uses: trunk-io/trunk-action@782e83f803ca6e369f035d64c6ba2768174ba61b -# with: -# trunk-token: ${{ secrets.TRUNK_TOKEN }} +on: + schedule: + - cron: 0 8 * * 1-5 + workflow_dispatch: {} + +jobs: + trunk_check: + name: Trunk Check Upload + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Trunk Check + uses: trunk-io/trunk-action@782e83f803ca6e369f035d64c6ba2768174ba61b + with: + trunk-token: ${{ secrets.TRUNK_TOKEN }} From 28d0cef42760b81825e905b890a52aa977cf2646 Mon Sep 17 00:00:00 2001 From: David <2941290+dhskinner@users.noreply.github.com> Date: Sat, 17 Aug 2024 23:31:37 +1000 Subject: [PATCH 5/9] Undo inadvertent changes to extensions.json --- .vscode/extensions.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 080e70d08b..783791f0ba 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,9 +2,8 @@ // See http://go.microsoft.com/fwlink/?LinkId=827846 // for the documentation about the extensions.json format "recommendations": [ - "platformio.platformio-ide" + "ms-vscode.cpptools", + "platformio.platformio-ide", + "trunk.io" ], - "unwantedRecommendations": [ - "ms-vscode.cpptools-extension-pack" - ] -} +} \ No newline at end of file From db870dc17db36cee31bfbe60ea5f006e9b4bc42f Mon Sep 17 00:00:00 2001 From: David <2941290+dhskinner@users.noreply.github.com> Date: Sat, 17 Aug 2024 23:35:27 +1000 Subject: [PATCH 6/9] Update extensions.json --- .vscode/extensions.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 783791f0ba..b50c95349d 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,8 +2,8 @@ // See http://go.microsoft.com/fwlink/?LinkId=827846 // for the documentation about the extensions.json format "recommendations": [ - "ms-vscode.cpptools", + "ms-vscode.cpptools", "platformio.platformio-ide", "trunk.io" ], -} \ No newline at end of file +} From 644e213b13d0066b8c8b034188d0cfdc099252eb Mon Sep 17 00:00:00 2001 From: David <2941290+dhskinner@users.noreply.github.com> Date: Sat, 31 Aug 2024 18:15:33 +1000 Subject: [PATCH 7/9] Added a singleton wrapper for bmp3xx --- .../Telemetry/EnvironmentTelemetry.cpp | 2 +- src/modules/Telemetry/Sensor/BMP3XXSensor.cpp | 72 ++++++++++++++----- src/modules/Telemetry/Sensor/BMP3XXSensor.h | 50 +++++++++---- 3 files changed, 91 insertions(+), 33 deletions(-) diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 89e3b9d5f2..31cb2f838c 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -55,7 +55,7 @@ AHT10Sensor aht10Sensor; MLX90632Sensor mlx90632Sensor; DFRobotLarkSensor dfRobotLarkSensor; NAU7802Sensor nau7802Sensor; -extern BMP3XXSensor bmp3xxSensor; +BMP3XXSensor bmp3xxSensor; #ifdef T1000X_SENSOR_EN T1000xSensor t1000xSensor; #endif diff --git a/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp b/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp index 6f0f9fc105..feb08d8ffb 100644 --- a/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp +++ b/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp @@ -2,17 +2,11 @@ #if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR -#include "../mesh/generated/meshtastic/telemetry.pb.h" #include "BMP3XXSensor.h" -#include "TelemetrySensor.h" -#include -#include BMP3XXSensor::BMP3XXSensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BMP3XX, "BMP3XX"){} -BMP3XXSensor bmp3xxSensor; - -void BMP3XXSensor::setup(){}; +void BMP3XXSensor::setup() {} int32_t BMP3XXSensor::runOnce() { @@ -22,30 +16,44 @@ int32_t BMP3XXSensor::runOnce() return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } - status = bmp3xx.begin_I2C(nodeTelemetrySensorsMap[sensorType].first, nodeTelemetrySensorsMap[sensorType].second); + // Get a singleton instance and initialise the bmp3xx + if (bmp3xx == nullptr) { + bmp3xx = BMP3XXSingleton::GetInstance(); + } + status = bmp3xx->begin_I2C(nodeTelemetrySensorsMap[sensorType].first, nodeTelemetrySensorsMap[sensorType].second); // set up oversampling and filter initialization - bmp3xx.setTemperatureOversampling(BMP3_OVERSAMPLING_4X); - bmp3xx.setPressureOversampling(BMP3_OVERSAMPLING_8X); - bmp3xx.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3); - bmp3xx.setOutputDataRate(BMP3_ODR_25_HZ); + bmp3xx->setTemperatureOversampling(BMP3_OVERSAMPLING_4X); + bmp3xx->setPressureOversampling(BMP3_OVERSAMPLING_8X); + bmp3xx->setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3); + bmp3xx->setOutputDataRate(BMP3_ODR_25_HZ); // take a couple of initial readings to settle the sensor filters for (int i = 0; i < 3; i++) { - bmp3xx.performReading(); + bmp3xx->performReading(); } return initI2CSensor(); } bool BMP3XXSensor::getMetrics(meshtastic_Telemetry *measurement) { + if (bmp3xx == nullptr) { + bmp3xx = BMP3XXSingleton::GetInstance(); + } if ((int)measurement->which_variant == meshtastic_Telemetry_environment_metrics_tag) { - bmp3xx.performReading(); - measurement->variant.environment_metrics.temperature = bmp3xx.readTemperature(); - measurement->variant.environment_metrics.barometric_pressure = bmp3xx.readPressure() / 100.0F; - LOG_DEBUG("BMP3XXSensor::getMetrics id: %i temp: %.1f press %.1f\n", measurement->which_variant, measurement->variant.environment_metrics.temperature, measurement->variant.environment_metrics.barometric_pressure); + bmp3xx->performReading(); + + measurement->variant.environment_metrics.has_temperature = true; + measurement->variant.environment_metrics.has_barometric_pressure = true; + measurement->variant.environment_metrics.has_relative_humidity = false; + + measurement->variant.environment_metrics.temperature = static_cast(bmp3xx->temperature); + measurement->variant.environment_metrics.barometric_pressure = static_cast(bmp3xx->pressure) / 100.0F; + measurement->variant.environment_metrics.relative_humidity = 0.0f; + + LOG_DEBUG("BMP3XXSensor::getMetrics id: %i temp: %.1f press %.1f\n", measurement->which_variant, measurement->variant.environment_metrics.temperature, measurement->variant.environment_metrics.barometric_pressure); } else { @@ -54,9 +62,35 @@ bool BMP3XXSensor::getMetrics(meshtastic_Telemetry *measurement) return true; } -float BMP3XXSensor::getAltitudeAMSL() +// Get a singleton wrapper for an Adafruit_bmp3xx +BMP3XXSingleton *BMP3XXSingleton::GetInstance() +{ + std::lock_guard lock(mutex_); + if (pinstance_ == nullptr) + { + pinstance_ = new BMP3XXSingleton(); + } + return pinstance_; +} + +BMP3XXSingleton::BMP3XXSingleton(){} + +BMP3XXSingleton::~BMP3XXSingleton(){} + +BMP3XXSingleton* BMP3XXSingleton::pinstance_{nullptr}; + +std::mutex BMP3XXSingleton::mutex_; + +bool BMP3XXSingleton::performReading() { - return bmp3xx.readAltitude(SEAL_LEVEL_HPA); + bool result = Adafruit_BMP3XX::performReading(); + if (result) { + double atmospheric = this->pressure / 100.0; + altitudeAmslMetres = 44330.0 * (1.0 - pow(atmospheric / SEAL_LEVEL_HPA, 0.1903)); + } else { + altitudeAmslMetres = 0.0; + } + return result; } #endif \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/BMP3XXSensor.h b/src/modules/Telemetry/Sensor/BMP3XXSensor.h index 514ee17626..04e8f9783b 100644 --- a/src/modules/Telemetry/Sensor/BMP3XXSensor.h +++ b/src/modules/Telemetry/Sensor/BMP3XXSensor.h @@ -7,27 +7,51 @@ #define SEAL_LEVEL_HPA 1013.2f -#include "../mesh/generated/meshtastic/telemetry.pb.h" -#include "TelemetrySensor.h" +#include +#include #include +#include "TelemetrySensor.h" -class BMP3XXSensor : public TelemetrySensor +// Singleton wrapper for the Adafruit_BMP3XX class +class BMP3XXSingleton : public Adafruit_BMP3XX { +private: + static BMP3XXSingleton * pinstance_; + static std::mutex mutex_; + protected: - Adafruit_BMP3XX bmp3xx; - float pressureHPa = 0.0f; - float temperatureCelcius = 0.0f; - float altitudeAmslMetres = 0.0f; + BMP3XXSingleton(); + ~BMP3XXSingleton(); public: - BMP3XXSensor(); - virtual void setup() override; - virtual int32_t runOnce() override; - virtual bool getMetrics(meshtastic_Telemetry *measurement) override; - virtual float getAltitudeAMSL(); + // Create a singleton instance (with lock for thread safety) + static BMP3XXSingleton *GetInstance(); + + // Singletons should not be cloneable. + BMP3XXSingleton(BMP3XXSingleton &other) = delete; + + // Singletons should not be assignable. + void operator=(const BMP3XXSingleton &) = delete; + + // Performs a full reading of all sensors in the BMP3XX. Assigns + // the internal temperature, pressure and altitudeAmsl variables + bool performReading(); + + // Altitude in metres above mean sea level, assigned after calling performReading() + double altitudeAmslMetres = 0.0f; }; -extern BMP3XXSensor bmp3xxSensor; +class BMP3XXSensor : public TelemetrySensor +{ +protected: + BMP3XXSingleton *bmp3xx = nullptr; + virtual void setup() override; + +public: + BMP3XXSensor(); + virtual int32_t runOnce() override; + virtual bool getMetrics(meshtastic_Telemetry *measurement) override; +}; #endif From eb1f80f520bcc25ac75dad674cd74a97e176963e Mon Sep 17 00:00:00 2001 From: David <2941290+dhskinner@users.noreply.github.com> Date: Sat, 31 Aug 2024 19:40:54 +1000 Subject: [PATCH 8/9] Fix build issue with mutex --- src/modules/Telemetry/Sensor/BMP3XXSensor.cpp | 11 ++++------- src/modules/Telemetry/Sensor/BMP3XXSensor.h | 6 ++---- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp b/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp index feb08d8ffb..d948cfe388 100644 --- a/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp +++ b/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp @@ -65,21 +65,18 @@ bool BMP3XXSensor::getMetrics(meshtastic_Telemetry *measurement) // Get a singleton wrapper for an Adafruit_bmp3xx BMP3XXSingleton *BMP3XXSingleton::GetInstance() { - std::lock_guard lock(mutex_); - if (pinstance_ == nullptr) + if (pinstance == nullptr) { - pinstance_ = new BMP3XXSingleton(); + pinstance = new BMP3XXSingleton(); } - return pinstance_; + return pinstance; } BMP3XXSingleton::BMP3XXSingleton(){} BMP3XXSingleton::~BMP3XXSingleton(){} -BMP3XXSingleton* BMP3XXSingleton::pinstance_{nullptr}; - -std::mutex BMP3XXSingleton::mutex_; +BMP3XXSingleton* BMP3XXSingleton::pinstance{nullptr}; bool BMP3XXSingleton::performReading() { diff --git a/src/modules/Telemetry/Sensor/BMP3XXSensor.h b/src/modules/Telemetry/Sensor/BMP3XXSensor.h index 04e8f9783b..77b434caac 100644 --- a/src/modules/Telemetry/Sensor/BMP3XXSensor.h +++ b/src/modules/Telemetry/Sensor/BMP3XXSensor.h @@ -7,7 +7,6 @@ #define SEAL_LEVEL_HPA 1013.2f -#include #include #include #include "TelemetrySensor.h" @@ -16,15 +15,14 @@ class BMP3XXSingleton : public Adafruit_BMP3XX { private: - static BMP3XXSingleton * pinstance_; - static std::mutex mutex_; + static BMP3XXSingleton * pinstance; protected: BMP3XXSingleton(); ~BMP3XXSingleton(); public: - // Create a singleton instance (with lock for thread safety) + // Create a singleton instance (not thread safe) static BMP3XXSingleton *GetInstance(); // Singletons should not be cloneable. From e543b61dd8850e300c193167cb45bcb95da0856b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 2 Sep 2024 10:23:31 +0200 Subject: [PATCH 9/9] trunk fmt --- src/detect/ScanI2CTwoWire.cpp | 4 +-- src/modules/Telemetry/Sensor/BMP3XXSensor.cpp | 28 ++++++++----------- src/modules/Telemetry/Sensor/BMP3XXSensor.h | 16 +++++------ 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp index 76ca42b7f7..21e7ca8ac1 100644 --- a/src/detect/ScanI2CTwoWire.cpp +++ b/src/detect/ScanI2CTwoWire.cpp @@ -268,7 +268,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) break; default: registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x00), 1); // GET_ID - switch(registerValue) { + switch (registerValue) { case 0x50: // BMP-388 should be 0x50 LOG_INFO("BMP-388 sensor found at address 0x%x\n", (uint8_t)addr.address); type = BMP_3XX; @@ -279,7 +279,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) type = BMP_280; break; } - break; + break; } break; #ifndef HAS_NCP5623 diff --git a/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp b/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp index d948cfe388..3996106139 100644 --- a/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp +++ b/src/modules/Telemetry/Sensor/BMP3XXSensor.cpp @@ -4,15 +4,14 @@ #include "BMP3XXSensor.h" -BMP3XXSensor::BMP3XXSensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BMP3XX, "BMP3XX"){} +BMP3XXSensor::BMP3XXSensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BMP3XX, "BMP3XX") {} void BMP3XXSensor::setup() {} int32_t BMP3XXSensor::runOnce() { LOG_INFO("Init sensor: %s\n", sensorName); - if (!hasSensor()) - { + if (!hasSensor()) { return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; } @@ -29,8 +28,7 @@ int32_t BMP3XXSensor::runOnce() bmp3xx->setOutputDataRate(BMP3_ODR_25_HZ); // take a couple of initial readings to settle the sensor filters - for (int i = 0; i < 3; i++) - { + for (int i = 0; i < 3; i++) { bmp3xx->performReading(); } return initI2CSensor(); @@ -41,8 +39,7 @@ bool BMP3XXSensor::getMetrics(meshtastic_Telemetry *measurement) if (bmp3xx == nullptr) { bmp3xx = BMP3XXSingleton::GetInstance(); } - if ((int)measurement->which_variant == meshtastic_Telemetry_environment_metrics_tag) - { + if ((int)measurement->which_variant == meshtastic_Telemetry_environment_metrics_tag) { bmp3xx->performReading(); measurement->variant.environment_metrics.has_temperature = true; @@ -53,10 +50,10 @@ bool BMP3XXSensor::getMetrics(meshtastic_Telemetry *measurement) measurement->variant.environment_metrics.barometric_pressure = static_cast(bmp3xx->pressure) / 100.0F; measurement->variant.environment_metrics.relative_humidity = 0.0f; - LOG_DEBUG("BMP3XXSensor::getMetrics id: %i temp: %.1f press %.1f\n", measurement->which_variant, measurement->variant.environment_metrics.temperature, measurement->variant.environment_metrics.barometric_pressure); - } - else - { + LOG_DEBUG("BMP3XXSensor::getMetrics id: %i temp: %.1f press %.1f\n", measurement->which_variant, + measurement->variant.environment_metrics.temperature, + measurement->variant.environment_metrics.barometric_pressure); + } else { LOG_DEBUG("BMP3XXSensor::getMetrics id: %i\n", measurement->which_variant); } return true; @@ -65,18 +62,17 @@ bool BMP3XXSensor::getMetrics(meshtastic_Telemetry *measurement) // Get a singleton wrapper for an Adafruit_bmp3xx BMP3XXSingleton *BMP3XXSingleton::GetInstance() { - if (pinstance == nullptr) - { + if (pinstance == nullptr) { pinstance = new BMP3XXSingleton(); } return pinstance; } -BMP3XXSingleton::BMP3XXSingleton(){} +BMP3XXSingleton::BMP3XXSingleton() {} -BMP3XXSingleton::~BMP3XXSingleton(){} +BMP3XXSingleton::~BMP3XXSingleton() {} -BMP3XXSingleton* BMP3XXSingleton::pinstance{nullptr}; +BMP3XXSingleton *BMP3XXSingleton::pinstance{nullptr}; bool BMP3XXSingleton::performReading() { diff --git a/src/modules/Telemetry/Sensor/BMP3XXSensor.h b/src/modules/Telemetry/Sensor/BMP3XXSensor.h index 77b434caac..79939c8d8d 100644 --- a/src/modules/Telemetry/Sensor/BMP3XXSensor.h +++ b/src/modules/Telemetry/Sensor/BMP3XXSensor.h @@ -7,21 +7,21 @@ #define SEAL_LEVEL_HPA 1013.2f -#include -#include #include "TelemetrySensor.h" +#include +#include // Singleton wrapper for the Adafruit_BMP3XX class class BMP3XXSingleton : public Adafruit_BMP3XX { -private: - static BMP3XXSingleton * pinstance; + private: + static BMP3XXSingleton *pinstance; -protected: + protected: BMP3XXSingleton(); ~BMP3XXSingleton(); -public: + public: // Create a singleton instance (not thread safe) static BMP3XXSingleton *GetInstance(); @@ -41,11 +41,11 @@ class BMP3XXSingleton : public Adafruit_BMP3XX class BMP3XXSensor : public TelemetrySensor { -protected: + protected: BMP3XXSingleton *bmp3xx = nullptr; virtual void setup() override; -public: + public: BMP3XXSensor(); virtual int32_t runOnce() override; virtual bool getMetrics(meshtastic_Telemetry *measurement) override;