diff --git a/src/Power.cpp b/src/Power.cpp index 5f1b99449..fa94ea229 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -72,6 +72,7 @@ static const uint8_t ext_chrg_detect_value = EXT_CHRG_DETECT_VALUE; #endif #if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(ARCH_PORTDUINO) +#include "main.h"; uint8_t INA_ADDR_LOCAL; INA219Sensor ina219Sensor; INA226Sensor ina226Sensor; @@ -470,14 +471,21 @@ class AnalogBatteryLevel : public HasBatteryLevel uint16_t getINAVoltage() { if (!config.power.device_battery_ina_address) { - if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA219].first > 0) { - return ina219Sensor.getBusVoltageMv(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA226].first > 0) { - return ina226Sensor.getBusVoltageMv(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA260].first > 0) { - return ina260Sensor.getBusVoltageMv(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA3221].first > 0) { - return ina3221Sensor.getBusVoltageMv(); + if (ina_found.type != ScanI2C::DeviceType::NONE) { + switch (ina_found.type) { + case ScanI2C::DeviceType::INA219: + return ina219Sensor.getBusVoltageMv(); + break; + case ScanI2C::DeviceType::INA226: + return ina226Sensor.getBusVoltageMv(); + break; + case ScanI2C::DeviceType::INA260: + return ina260Sensor.getBusVoltageMv(); + break; + case ScanI2C::DeviceType::INA3221: + return ina3221Sensor.getBusVoltageMv(); + break; + } } } else if (config.power.device_battery_ina_address) { if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA219].first == config.power.device_battery_ina_address) { @@ -502,12 +510,17 @@ class AnalogBatteryLevel : public HasBatteryLevel int16_t getINACurrent() { if (!config.power.device_battery_ina_address) { - if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA219].first > 0) { - return ina219Sensor.getCurrentMa(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA226].first > 0) { - return ina226Sensor.getCurrentMa(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA3221].first > 0) { - return ina3221Sensor.getCurrentMa(); + if (ina_found.type != ScanI2C::DeviceType::NONE) { + switch (ina_found.type) { + case ScanI2C::DeviceType::INA219: + return ina219Sensor.getCurrentMa(); + + case ScanI2C::DeviceType::INA226: + return ina226Sensor.getCurrentMa(); + + case ScanI2C::DeviceType::INA3221: + return ina3221Sensor.getCurrentMa(); + } } } else if (config.power.device_battery_ina_address) { if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA219].first == config.power.device_battery_ina_address) { @@ -530,25 +543,29 @@ class AnalogBatteryLevel : public HasBatteryLevel */ { if (!config.power.device_battery_ina_address) { - if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA219].first > 0) { - INA_ADDR_LOCAL = nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA219].first; - if (!ina219Sensor.isInitialized()) - return ina219Sensor.runOnce() > 0; - return ina219Sensor.isRunning(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA226].first > 0) { - INA_ADDR_LOCAL = nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA226].first; - if (!ina226Sensor.isInitialized()) - return ina226Sensor.runOnce() > 0; - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA260].first > 0) { - INA_ADDR_LOCAL = nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA260].first; - if (!ina260Sensor.isInitialized()) - return ina260Sensor.runOnce() > 0; - return ina260Sensor.isRunning(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA3221].first > 0) { - INA_ADDR_LOCAL = nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA3221].first; - if (!ina3221Sensor.isInitialized()) - return ina3221Sensor.runOnce() > 0; - return ina3221Sensor.isRunning(); + if (ina_found.type != ScanI2C::DeviceType::NONE) { + INA_ADDR_LOCAL = ina_found.address.address; + switch (ina_found.type) { + case ScanI2C::DeviceType::INA219: + if (!ina219Sensor.isInitialized()) + return ina219Sensor.runOnce() > 0; + return ina219Sensor.isRunning(); + + case ScanI2C::DeviceType::INA226: + if (!ina226Sensor.isInitialized()) + return ina226Sensor.runOnce() > 0; + return ina226Sensor.isRunning(); + + case ScanI2C::DeviceType::INA260: + if (!ina260Sensor.isInitialized()) + return ina260Sensor.runOnce() > 0; + return ina260Sensor.isRunning(); + + case ScanI2C::DeviceType::INA3221: + if (!ina3221Sensor.isInitialized()) + return ina3221Sensor.runOnce() > 0; + return ina3221Sensor.isRunning(); + } } } else if (config.power.device_battery_ina_address) { INA_ADDR_LOCAL = config.power.device_battery_ina_address; diff --git a/src/detect/ScanI2C.cpp b/src/detect/ScanI2C.cpp index 4caa0f730..28bcc34c9 100644 --- a/src/detect/ScanI2C.cpp +++ b/src/detect/ScanI2C.cpp @@ -41,6 +41,12 @@ ScanI2C::FoundDevice ScanI2C::firstAccelerometer() const return firstOfOrNONE(8, types); } +ScanI2C::FoundDevice ScanI2C::firstINA() const +{ + ScanI2C::DeviceType types[] = {INA219, INA226, INA260, INA3221}; + return firstOfOrNONE(4, types); +} + ScanI2C::FoundDevice ScanI2C::find(ScanI2C::DeviceType) const { return DEVICE_NONE; diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h index 6828169a8..91e7fdb3e 100644 --- a/src/detect/ScanI2C.h +++ b/src/detect/ScanI2C.h @@ -119,6 +119,8 @@ class ScanI2C FoundDevice firstKeyboard() const; FoundDevice firstAccelerometer() const; + + FoundDevice firstINA() const; virtual FoundDevice find(DeviceType) const; diff --git a/src/main.cpp b/src/main.cpp index e5e1a2537..cec8763c1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -168,6 +168,10 @@ ScanI2C::DeviceAddress rtc_found = ScanI2C::ADDRESS_NONE; ScanI2C::DeviceAddress accelerometer_found = ScanI2C::ADDRESS_NONE; // The I2C address of the RGB LED (if found) ScanI2C::FoundDevice rgb_found = ScanI2C::FoundDevice(ScanI2C::DeviceType::NONE, ScanI2C::ADDRESS_NONE); +// The I2C address of the INA Module (if found) +ScanI2C::FoundDevice ina_found = ScanI2C::FoundDevice(ScanI2C::DeviceType::NONE, ScanI2C::ADDRESS_NONE); +ScanI2C::DeviceAddress ina_Address = ScanI2C::ADDRESS_NONE; + #ifdef T_WATCH_S3 Adafruit_DRV2605 drv; @@ -609,6 +613,12 @@ void setup() LOG_DEBUG("acc_info = %i", acc_info.type); #endif +#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(ARCH_PORTDUINO) + auto ina_Info = i2cScanner->firstINA(); +// ina_Address = ina_Info.type != ScanI2C::DeviceType::NONE ? ina_Info.address : ina_Address; + LOG_DEBUG("ina_info = %i", ina_Info.type); +#endif + scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::BME_680, meshtastic_TelemetrySensorType_BME680); scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::BME_280, meshtastic_TelemetrySensorType_BME280); scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::BMP_280, meshtastic_TelemetrySensorType_BMP280); diff --git a/src/main.h b/src/main.h index 3b71cfeea..c06227301 100644 --- a/src/main.h +++ b/src/main.h @@ -34,6 +34,8 @@ extern uint8_t kb_model; extern ScanI2C::DeviceAddress rtc_found; extern ScanI2C::DeviceAddress accelerometer_found; extern ScanI2C::FoundDevice rgb_found; +//extern ScanI2C::DeviceAddress ina_Address; +extern ScanI2C::FoundDevice ina_found; extern bool eink_found; extern bool pmu_found;