diff --git a/src/Power.cpp b/src/Power.cpp index b489bc33c..bdab5c28e 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -82,6 +82,8 @@ static const uint8_t ext_chrg_detect_value = EXT_CHRG_DETECT_VALUE; #endif #if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR +#include "main.h"; +uint8_t INA_ADDR_LOCAL; #if __has_include() INA219Sensor ina219Sensor; #else @@ -474,7 +476,8 @@ class AnalogBatteryLevel : public HasBatteryLevel if (hasINA()) { // get current flow from INA sensor - negative value means power flowing into the battery // default assuming BATTERY+ <--> INA_VIN+ <--> SHUNT RESISTOR <--> INA_VIN- <--> LOAD - LOG_DEBUG("Using INA on I2C addr 0x%x for charging detection", config.power.device_battery_ina_address); + // LOG_DEBUG("Using INA on I2C addr 0x%x for charging detection", config.power.device_battery_ina_address); + LOG_DEBUG("Using INA on I2C addr 0x%x for charging detection", INA_ADDR_LOCAL); #if defined(INA_CHARGING_DETECTION_INVERT) return getINACurrent() > 0; #else @@ -517,61 +520,131 @@ class AnalogBatteryLevel : public HasBatteryLevel #endif #if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR + /* + Read Voltage from INA using autodetect of addr first else use addr in config.power.device_battery_ina_address + */ uint16_t getINAVoltage() { - if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA219].first == config.power.device_battery_ina_address) { - return ina219Sensor.getBusVoltageMv(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA226].first == - config.power.device_battery_ina_address) { - return ina226Sensor.getBusVoltageMv(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA260].first == - config.power.device_battery_ina_address) { - return ina260Sensor.getBusVoltageMv(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA3221].first == - config.power.device_battery_ina_address) { - return ina3221Sensor.getBusVoltageMv(); + if (!config.power.device_battery_ina_address) { + 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) { + return ina219Sensor.getBusVoltageMv(); + } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA226].first == + config.power.device_battery_ina_address) { + return ina226Sensor.getBusVoltageMv(); + } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA260].first == + config.power.device_battery_ina_address) { + return ina260Sensor.getBusVoltageMv(); + } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA3221].first == + config.power.device_battery_ina_address) { + return ina3221Sensor.getBusVoltageMv(); + } } return 0; } + /* + Read Current from INA using autodetect of addr first else use addr in config.power.device_battery_ina_address + */ int16_t getINACurrent() { - if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA219].first == config.power.device_battery_ina_address) { - return ina219Sensor.getCurrentMa(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA226].first == - config.power.device_battery_ina_address) { - return ina226Sensor.getCurrentMa(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA3221].first == - config.power.device_battery_ina_address) { - return ina3221Sensor.getCurrentMa(); + if (!config.power.device_battery_ina_address) { + 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) { + return ina219Sensor.getCurrentMa(); + } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA226].first == + config.power.device_battery_ina_address) { + return ina226Sensor.getCurrentMa(); + } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA3221].first == + config.power.device_battery_ina_address) { + return ina3221Sensor.getCurrentMa(); + } } return 0; } bool hasINA() + /* + Use autodetect of addr first else use addr in config.power.device_battery_ina_address + Store INA addr in local variable for later use. + */ { if (!config.power.device_battery_ina_address) { - return false; - } - if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA219].first == config.power.device_battery_ina_address) { - if (!ina219Sensor.isInitialized()) - return ina219Sensor.runOnce() > 0; - return ina219Sensor.isRunning(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA226].first == - config.power.device_battery_ina_address) { - if (!ina226Sensor.isInitialized()) - return ina226Sensor.runOnce() > 0; - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA260].first == - config.power.device_battery_ina_address) { - if (!ina260Sensor.isInitialized()) - return ina260Sensor.runOnce() > 0; - return ina260Sensor.isRunning(); - } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA3221].first == - config.power.device_battery_ina_address) { - 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; + if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA219].first == config.power.device_battery_ina_address) { + if (!ina219Sensor.isInitialized()) + return ina219Sensor.runOnce() > 0; + return ina219Sensor.isRunning(); + } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA226].first == + config.power.device_battery_ina_address) { + if (!ina226Sensor.isInitialized()) + return ina226Sensor.runOnce() > 0; + } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA260].first == + config.power.device_battery_ina_address) { + if (!ina260Sensor.isInitialized()) + return ina260Sensor.runOnce() > 0; + return ina260Sensor.isRunning(); + } else if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_INA3221].first == + config.power.device_battery_ina_address) { + if (!ina3221Sensor.isInitialized()) + return ina3221Sensor.runOnce() > 0; + return ina3221Sensor.isRunning(); + } } + INA_ADDR_LOCAL = 0; return false; } #endif diff --git a/src/detect/ScanI2C.cpp b/src/detect/ScanI2C.cpp index 170bef3a6..bb47bb5d5 100644 --- a/src/detect/ScanI2C.cpp +++ b/src/detect/ScanI2C.cpp @@ -41,6 +41,12 @@ ScanI2C::FoundDevice ScanI2C::firstAccelerometer() const return firstOfOrNONE(9, types); } +ScanI2C::FoundDevice ScanI2C::firstINA() const +{ + ScanI2C::DeviceType types[] = {INA219, INA226, INA260, INA3221}; + return firstOfOrNONE(4, types); +} + ScanI2C::FoundDevice ScanI2C::firstAQI() const { ScanI2C::DeviceType types[] = {PMSA0031, SCD4X}; diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h index c1358861b..2874255d1 100644 --- a/src/detect/ScanI2C.h +++ b/src/detect/ScanI2C.h @@ -132,6 +132,8 @@ class ScanI2C FoundDevice firstAccelerometer() const; + FoundDevice firstINA() const; + FoundDevice firstAQI() const; FoundDevice firstRGBLED() const; diff --git a/src/main.cpp b/src/main.cpp index 1868d98c7..3719639e5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -194,9 +194,15 @@ 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; + /// The I2C address of our Air Quality Indicator (if found) ScanI2C::DeviceAddress aqi_found = ScanI2C::ADDRESS_NONE; + #ifdef T_WATCH_S3 Adafruit_DRV2605 drv; #endif @@ -653,6 +659,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 7105bd62b..7e168500d 100644 --- a/src/main.h +++ b/src/main.h @@ -35,6 +35,8 @@ extern bool kb_found; 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 ScanI2C::DeviceAddress aqi_found; extern bool eink_found;