cleanup
This commit is contained in:
+29
-5
@@ -1,9 +1,33 @@
|
||||
#include "Battery.h"
|
||||
#include <Wire.h>
|
||||
|
||||
// Meyer's singleton — guaranteed single instance across all translation units.
|
||||
// Constructed with GPIO0 (X4 ADC default). For X3, main.cpp calls
|
||||
// battery().setI2CFuelGauge() to switch to BQ27220 I2C reads instead.
|
||||
BatteryMonitor& battery() {
|
||||
static BatteryMonitor instance(BAT_GPIO0);
|
||||
void BatteryProvider::setI2CFuelGauge(uint8_t i2cAddr, uint8_t socRegister) {
|
||||
_useI2C = true;
|
||||
_i2cAddr = i2cAddr;
|
||||
_socRegister = socRegister;
|
||||
}
|
||||
|
||||
uint16_t BatteryProvider::readPercentage() const {
|
||||
if (_useI2C) {
|
||||
// Read SOC directly from I2C fuel gauge (16-bit LE register).
|
||||
// Returns 0 on I2C error so the UI shows 0% rather than crashing.
|
||||
Wire.beginTransmission(_i2cAddr);
|
||||
Wire.write(_socRegister);
|
||||
if (Wire.endTransmission(false) != 0) return 0;
|
||||
Wire.requestFrom(_i2cAddr, (uint8_t)2);
|
||||
if (Wire.available() < 2) return 0;
|
||||
const uint8_t lo = Wire.read();
|
||||
const uint8_t hi = Wire.read();
|
||||
const uint16_t soc = (hi << 8) | lo;
|
||||
return soc > 100 ? 100 : soc;
|
||||
}
|
||||
// ADC path: read raw voltage, apply divider, convert via LiPo polynomial
|
||||
return _adcMonitor.readPercentage();
|
||||
}
|
||||
|
||||
// Meyer's singleton — single shared instance across all translation units.
|
||||
// Defaults to X4 ADC mode. For X3, main.cpp calls setI2CFuelGauge() to switch.
|
||||
BatteryProvider& battery() {
|
||||
static BatteryProvider instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
+24
-6
@@ -1,11 +1,29 @@
|
||||
#pragma once
|
||||
#include <BatteryMonitor.h>
|
||||
#include <cstdint>
|
||||
|
||||
#define BAT_GPIO0 0 // Battery voltage (X4 ADC pin)
|
||||
|
||||
// Shared battery monitor singleton. Returns a single BatteryMonitor instance
|
||||
// used by all callers (themes, activities, etc.).
|
||||
//
|
||||
// - X4: reads battery voltage via ADC on GPIO0 (default, no extra setup needed)
|
||||
// - X3: reads SOC from BQ27220 fuel gauge via I2C (call setI2CFuelGauge() after Wire.begin())
|
||||
BatteryMonitor& battery();
|
||||
// Unified battery reader supporting two backends:
|
||||
// - X4: ADC voltage divider on GPIO0 (default, no setup needed)
|
||||
// - X3: BQ27220 fuel gauge via I2C at 0x55, SOC register 0x2C
|
||||
// (call setI2CFuelGauge() after Wire.begin())
|
||||
class BatteryProvider {
|
||||
public:
|
||||
// Read battery percentage (0-100). Delegates to ADC or I2C depending on mode.
|
||||
uint16_t readPercentage() const;
|
||||
|
||||
// Switch to I2C fuel gauge mode. Wire.begin() must be called first.
|
||||
// i2cAddr: fuel gauge I2C address (e.g. 0x55 for BQ27220)
|
||||
// socRegister: register holding state-of-charge 0-100% (e.g. 0x2C)
|
||||
void setI2CFuelGauge(uint8_t i2cAddr, uint8_t socRegister);
|
||||
|
||||
private:
|
||||
BatteryMonitor _adcMonitor{BAT_GPIO0};
|
||||
bool _useI2C = false;
|
||||
uint8_t _i2cAddr = 0;
|
||||
uint8_t _socRegister = 0;
|
||||
};
|
||||
|
||||
// Shared singleton used by themes and activities.
|
||||
BatteryProvider& battery();
|
||||
|
||||
@@ -255,10 +255,6 @@ void onGoHome() {
|
||||
|
||||
void setupDisplayAndFonts() {
|
||||
if (gpio.getDeviceType() == HalGPIO::DeviceType::X3) {
|
||||
display.setDcPin(4);
|
||||
display.setBusyActiveHigh(false);
|
||||
display.setBwOnly(true);
|
||||
display.setControllerType(EInkDisplay::ControllerType::SSD1677);
|
||||
display.setDisplayDimensions(792, 528);
|
||||
// X3 has a BQ27220 fuel gauge on I2C (addr 0x55) instead of an ADC voltage
|
||||
// divider. SOC (0-100%) is read directly from register 0x2C.
|
||||
|
||||
Reference in New Issue
Block a user