max17055
This commit is contained in:
jLynx 2024-07-16 08:17:55 +12:00 committed by GitHub
parent 9ef58b7763
commit ae75540d35
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 1122 additions and 18 deletions

View file

@ -2,6 +2,7 @@
#include "event_m0.hpp"
#include "portapack.hpp"
#include "ads1110.hpp"
#include "max17055.hpp"
// uncomment if you want to emulate batt management system
// #define USE_BATT_EMULATOR
@ -14,6 +15,7 @@ constexpr uint32_t BATTERY_UPDATE_INTERVAL = 30000;
BatteryManagement::BatteryModules BatteryManagement::detected_ = BatteryManagement::BATT_NONE;
ads1110::ADS1110 battery_ads1110{portapack::i2c0, 0x48};
max17055::MAX17055 battery_max17055{portapack::i2c0, 0x36};
Thread* BatteryManagement::thread = nullptr;
@ -23,6 +25,9 @@ void BatteryManagement::init() {
if (battery_ads1110.detect()) {
battery_ads1110.init();
detected_ = BATT_ADS1110;
} else if (battery_max17055.detect()) {
battery_max17055.init();
detected_ = BATT_MAX17055;
}
// add new supported module detect + init here
@ -40,11 +45,15 @@ void BatteryManagement::init() {
}
// sets the values, it the currend module supports it.
bool BatteryManagement::getBatteryInfo(uint8_t& batteryPercentage, uint16_t& voltage, int32_t& current, bool& isCharging) {
if (detected_ == BATT_NONE) return false;
if (detected_ == BATT_ADS1110) {
bool BatteryManagement::getBatteryInfo(uint8_t& batteryPercentage, uint16_t& voltage, int32_t& current) {
if (detected_ == BATT_NONE) {
return false;
} else if (detected_ == BATT_ADS1110) {
battery_ads1110.getBatteryInfo(batteryPercentage, voltage);
return true;
} else if (detected_ == BATT_MAX17055) {
battery_max17055.getBatteryInfo(batteryPercentage, voltage, current);
return true;
}
// add new module query here
@ -59,18 +68,30 @@ bool BatteryManagement::getBatteryInfo(uint8_t& batteryPercentage, uint16_t& vol
}
#endif
(void)isCharging; // keep the compiler calm
(void)current;
return false;
}
uint16_t BatteryManagement::read_register(const uint8_t reg) {
if (detected_ == BATT_MAX17055) {
return battery_max17055.read_register(reg);
}
return 0xFFFF;
}
bool BatteryManagement::write_register(const uint8_t reg, const uint16_t value) {
if (detected_ == BATT_MAX17055) {
return battery_max17055.write_register(reg, value);
}
return false;
}
uint8_t BatteryManagement::getPercent() {
if (detected_ == BATT_NONE) return 102;
uint8_t batteryPercentage = 0;
bool isCharging = false;
uint16_t voltage = 0;
int32_t current = 0;
getBatteryInfo(batteryPercentage, voltage, current, isCharging);
getBatteryInfo(batteryPercentage, voltage, current);
return batteryPercentage;
}
@ -78,10 +99,9 @@ uint16_t BatteryManagement::getVoltage() {
if (detected_ == BATT_NONE) return 0;
if (detected_ == BATT_NONE) return 102;
uint8_t batteryPercentage = 0;
bool isCharging = false;
uint16_t voltage = 0;
int32_t current = 0;
getBatteryInfo(batteryPercentage, voltage, current, isCharging);
getBatteryInfo(batteryPercentage, voltage, current);
return voltage;
}
@ -89,14 +109,13 @@ msg_t BatteryManagement::timer_fn(void* arg) {
(void)arg;
if (!detected_) return 0;
uint8_t batteryPercentage = 102;
bool isCharging = false;
uint16_t voltage = 0;
int32_t current = 0;
chThdSleepMilliseconds(1000); // wait ui for fully load
while (1) {
if (BatteryManagement::getBatteryInfo(batteryPercentage, voltage, current, isCharging)) {
if (BatteryManagement::getBatteryInfo(batteryPercentage, voltage, current)) {
// send local message
BatteryStateMessage msg{batteryPercentage, isCharging, voltage};
BatteryStateMessage msg{batteryPercentage, current >= 0, voltage};
EventDispatcher::send_message(msg);
}
chThdSleepMilliseconds(BATTERY_UPDATE_INTERVAL);