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; };