Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
fae45f3
fix(sca): Add missing API declarations
Ruben-Lohberg Jul 27, 2026
3f715ae
fix(sca): Make narrowing conversions explicit
Ruben-Lohberg Jul 27, 2026
bedc33e
fix(power): Use floating-point absolute value
Ruben-Lohberg Jul 27, 2026
f18cc4a
fix(bluetooth): Return correctly from connection callback
Ruben-Lohberg Jul 27, 2026
781ab46
fix(sca): Initialize state before use
Ruben-Lohberg Jul 27, 2026
fe48039
fix(bmp388): Guard FIFO processing after length read
Ruben-Lohberg Jul 27, 2026
be95439
fix(button): Ignore unrelated GPIO interrupts
Ruben-Lohberg Jul 27, 2026
2c7f331
fix(sca): Remove unused local values
Ruben-Lohberg Jul 27, 2026
29dda6f
fix(sca): Log discarded errors
Ruben-Lohberg Jul 27, 2026
ddaabe9
fix(sca): Discard unused battery return values
Ruben-Lohberg Aug 3, 2026
08a3b14
fix(sca): Discard unused subsystem return values
Ruben-Lohberg Aug 3, 2026
45aa55f
fix(sca): Avoid overwritten sensor results
Ruben-Lohberg Aug 3, 2026
fe892f1
fix(sca): Guard conditional scan parameters
Ruben-Lohberg Aug 3, 2026
29d3c9e
fix(audio): Avoid null TX buffer dereference
Ruben-Lohberg Aug 3, 2026
9e2df58
fix(bluetooth): Ignore missing CSIS RSI data
Ruben-Lohberg Aug 3, 2026
20e565c
fix(bluetooth): Ignore missing peer chip IDs
Ruben-Lohberg Aug 3, 2026
5ac629f
fix(audio): Reject incomplete stereo encoder setup
Ruben-Lohberg Aug 3, 2026
981450f
fix(audio): Initialize silence-frame decode inputs
Ruben-Lohberg Aug 3, 2026
0629508
fix(bluetooth): clarify guarded scan data
Ruben-Lohberg Aug 3, 2026
dcd8df4
fix(audio): persist codec mode after apply
Ruben-Lohberg Aug 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions src/Battery/BQ25120a.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,28 +153,28 @@ void BQ25120a::setup(const battery_settings &_battery_settings) {

uint8_t BQ25120a::read_charging_state() {
uint8_t status = 0;
bool ret = readReg(registers::CTRL, (uint8_t *) &status, sizeof(status));
(void)readReg(registers::CTRL, (uint8_t *) &status, sizeof(status));

return status;
}

uint8_t BQ25120a::read_fault() {
uint8_t status = 0;
bool ret = readReg(registers::FAULT, (uint8_t *) &status, sizeof(status));
(void)readReg(registers::FAULT, (uint8_t *) &status, sizeof(status));

return status;
}

uint8_t BQ25120a::read_ts_fault() {
uint8_t status = 0;
bool ret = readReg(registers::TS_FAULT, (uint8_t *) &status, sizeof(status));
(void)readReg(registers::TS_FAULT, (uint8_t *) &status, sizeof(status));

return status;
}

chrg_state BQ25120a::read_charging_control() {
uint8_t status = 0;
bool ret = readReg(registers::CHARGE_CTRL, (uint8_t *) &status, sizeof(status));
(void)readReg(registers::CHARGE_CTRL, (uint8_t *) &status, sizeof(status));

chrg_state chrg;

Expand All @@ -200,7 +200,7 @@ chrg_state BQ25120a::read_charging_control() {

uint8_t BQ25120a::write_charging_control(float mA) {
uint8_t status = 0;
bool ret = readReg(registers::CHARGE_CTRL, &status, sizeof(status));
(void)readReg(registers::CHARGE_CTRL, &status, sizeof(status));

status &= 0x3;

Expand Down Expand Up @@ -255,7 +255,7 @@ uint8_t BQ25120a::write_LDO_voltage_control(float volt) {

float BQ25120a::read_ldo_voltage() {
uint8_t status = 0;
bool ret = readReg(registers::LS_LDO_CTRL, (uint8_t *) &status, sizeof(status));
(void)readReg(registers::LS_LDO_CTRL, (uint8_t *) &status, sizeof(status));

float voltage = 0.8f + ((status >> 2 & 0x1F)) * 0.1f;

Expand All @@ -264,7 +264,7 @@ float BQ25120a::read_ldo_voltage() {

float BQ25120a::read_battery_voltage_control() {
uint8_t status = 0;
bool ret = readReg(registers::BAT_VOL_CTRL, (uint8_t *) &status, sizeof(status));
(void)readReg(registers::BAT_VOL_CTRL, (uint8_t *) &status, sizeof(status));

float voltage = 3.6f + (status >> 1) * 0.01f;

Expand All @@ -288,7 +288,7 @@ uint8_t BQ25120a::write_battery_voltage_control(float volt) {

chrg_state BQ25120a::read_termination_control() {
uint8_t status = 0;
bool ret = readReg(registers::TERM_CTRL, (uint8_t *) &status, sizeof(status));
(void)readReg(registers::TERM_CTRL, (uint8_t *) &status, sizeof(status));

struct chrg_state chrg;

Expand Down Expand Up @@ -341,7 +341,7 @@ ilim_uvlo BQ25120a::read_uvlo_ilim() {
struct ilim_uvlo param;
uint8_t status = 0;

bool ret = readReg(registers::ILIM_UVLO, (uint8_t *) &status, sizeof(status));
(void)readReg(registers::ILIM_UVLO, (uint8_t *) &status, sizeof(status));

// if (!ret) printk("failed to read\n");

Expand Down Expand Up @@ -408,7 +408,7 @@ button_state BQ25120a::read_button_state() {
struct button_state btn;

uint8_t status = 0;
bool ret = readReg(registers::BTN_CTRL, (uint8_t *) &status, sizeof(status));
(void)readReg(registers::BTN_CTRL, (uint8_t *) &status, sizeof(status));

// if (!ret) printk("failed to read\n");

Expand All @@ -426,4 +426,4 @@ int BQ25120a::set_power_connect_callback(gpio_callback_handler_t handler) {
int BQ25120a::set_int_callback(gpio_callback_handler_t handler) {
gpio_init_callback(&int_cb_data, handler, int_cb_data.pin_mask | BIT(int_pin.pin));
return gpio_add_callback(int_pin.port, &int_cb_data);
}
}
100 changes: 47 additions & 53 deletions src/Battery/BQ27220.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ void BQ27220::writeReg(uint8_t reg, uint8_t *buffer, uint16_t len) {
bat_status BQ27220::battery_status() {
bat_status status;
uint16_t val = 0;
bool ret = readReg(registers::FLAGS, (uint8_t *) &val, sizeof(val));
(void)readReg(registers::FLAGS, (uint8_t *) &val, sizeof(val));

status.DSG = val & 0x1;
status.SYSDWN = val & (1 << 1);
Expand Down Expand Up @@ -135,98 +135,98 @@ gauge_status BQ27220::gauging_state() {

float BQ27220::temperature() {
uint16_t temp_K = 0;
bool ret = readReg(registers::TEMP, (uint8_t *) &temp_K, sizeof(temp_K));
(void)readReg(registers::TEMP, (uint8_t *) &temp_K, sizeof(temp_K));

float temp = temp_K / 10.0 - 273.15;
return temp;
}

float BQ27220::voltage() {
uint16_t mV = 0;
bool ret = readReg(registers::VOLT, (uint8_t *) &mV, sizeof(mV));
(void)readReg(registers::VOLT, (uint8_t *) &mV, sizeof(mV));

float v = mV / 1000.0;
return v;
}

float BQ27220::capacity() {
uint16_t mAh = 0;
bool ret = readReg(registers::FCC, (uint8_t *) &mAh, sizeof(mAh));
(void)readReg(registers::FCC, (uint8_t *) &mAh, sizeof(mAh));
return mAh;
}

float BQ27220::time_to_full() {
uint16_t minutes = 0;
bool ret = readReg(registers::TTF, (uint8_t *) &minutes, sizeof(minutes));
(void)readReg(registers::TTF, (uint8_t *) &minutes, sizeof(minutes));
return minutes;
}


float BQ27220::time_to_empty() {
uint16_t minutes = 0;
bool ret = readReg(registers::TTE, (uint8_t *) &minutes, sizeof(minutes));
(void)readReg(registers::TTE, (uint8_t *) &minutes, sizeof(minutes));
return minutes;
}

float BQ27220::state_of_charge() {
uint16_t soc = 0;
bool ret = readReg(registers::SOC, (uint8_t *) &soc, sizeof(soc));
(void)readReg(registers::SOC, (uint8_t *) &soc, sizeof(soc));
return soc;
}

float BQ27220::state_of_health() {
uint16_t soc = 0;
bool ret = readReg(registers::SOH, (uint8_t *) &soc, sizeof(soc));
(void)readReg(registers::SOH, (uint8_t *) &soc, sizeof(soc));
return soc;
}

float BQ27220::current() {
int16_t mA = 0;
bool ret = readReg(registers::NAC, (uint8_t *) &mA, sizeof(mA));
(void)readReg(registers::NAC, (uint8_t *) &mA, sizeof(mA));
return mA;
}

float BQ27220::average_current() {
int16_t mA = 0;
bool ret = readReg(registers::AI, (uint8_t *) &mA, sizeof(mA));
(void)readReg(registers::AI, (uint8_t *) &mA, sizeof(mA));
return mA;
}

float BQ27220::design_cap() {
uint16_t mAh = 0;
bool ret = readReg(registers::DCAP, (uint8_t *) &mAh, sizeof(mAh));
(void)readReg(registers::DCAP, (uint8_t *) &mAh, sizeof(mAh));
return mAh;
}

float BQ27220::remaining_cap() {
uint16_t mAh = 0;
bool ret = readReg(registers::RM, (uint8_t *) &mAh, sizeof(mAh));
(void)readReg(registers::RM, (uint8_t *) &mAh, sizeof(mAh));
return mAh;
}

float BQ27220::charge_current() {
int16_t mA = 0;
bool ret = readReg(registers::CC, (uint8_t *) &mA, sizeof(mA));
(void)readReg(registers::CC, (uint8_t *) &mA, sizeof(mA));
return mA;
}

int BQ27220::cycle_count() {
uint16_t n_cycles = 0;
bool ret = readReg(registers::CYCT, (uint8_t *) &n_cycles, sizeof(n_cycles));
(void)readReg(registers::CYCT, (uint8_t *) &n_cycles, sizeof(n_cycles));
return n_cycles;
}

float BQ27220::standby_current() {
int16_t mA = 0;
bool ret = readReg(registers::SI, (uint8_t *) &mA, sizeof(mA));
(void)readReg(registers::SI, (uint8_t *) &mA, sizeof(mA));

return mA;
}

op_state BQ27220::operation_state() {
op_state state;
uint16_t status = 0;
bool ret = readReg(registers::OP_STAT, (uint8_t *) &status, sizeof(status));
(void)readReg(registers::OP_STAT, (uint8_t *) &status, sizeof(status));

state.CALD = status & 0x01;
state.SEC = (status >> 1) & 0x3;
Expand Down Expand Up @@ -302,27 +302,23 @@ void BQ27220::exit_config_update(bool init) {
}

void BQ27220::read_RAM(uint16_t ram_address, uint8_t * data, int len) {
bool ret;

writeReg(0x3E, (uint8_t *) &ram_address, sizeof(ram_address));
k_usleep(BQ27220_RAM_TIMEOUT_US);
ret = readReg(0x40, data, len);
(void)readReg(0x40, data, len);
}

int BQ27220::write_RAM(uint16_t ram_address, uint8_t * data, int len, bool check) {
uint8_t check_sum=0;
uint8_t data_len=0;
uint8_t buf[len];

bool ret;

writeReg(0x3E, (uint8_t *) &ram_address, sizeof(ram_address));

k_usleep(BQ27220_RAM_TIMEOUT_US);

ret = readReg(0x61, (uint8_t *) &data_len, sizeof(data_len));
ret = readReg(0x40, buf, len);
ret = readReg(0x60, (uint8_t *) &check_sum, sizeof(check_sum));
(void)readReg(0x61, (uint8_t *) &data_len, sizeof(data_len));
(void)readReg(0x40, buf, len);
(void)readReg(0x60, (uint8_t *) &check_sum, sizeof(check_sum));

uint8_t my_check = (uint8_t)0xFF-check_sum; // - data[0] - data[1];

Expand Down Expand Up @@ -367,8 +363,6 @@ int BQ27220::write_RAM(uint16_t ram_address, uint16_t val, bool check) {
}

void BQ27220::setup(const battery_settings &_battery_settings, bool init) {
int ret;

// unseal
write_command(0x0414);
k_msleep(100);
Expand All @@ -385,44 +379,44 @@ void BQ27220::setup(const battery_settings &_battery_settings, bool init) {
//ret = write_RAM(0x9220, 0);

// design and full charge capacity
ret = write_RAM(0x929F, _battery_settings.capacity);
ret = write_RAM(0x929D, _battery_settings.capacity); //130
(void)write_RAM(0x929F, _battery_settings.capacity);
(void)write_RAM(0x929D, _battery_settings.capacity); //130
// near full
ret = write_RAM(0x926B, 5);
(void)write_RAM(0x926B, 5);

ret = write_RAM(0x91F5, _battery_settings.temp_min * 10);
ret = write_RAM(0x91F7, _battery_settings.temp_max * 10);
(void)write_RAM(0x91F5, _battery_settings.temp_min * 10);
(void)write_RAM(0x91F7, _battery_settings.temp_max * 10);

// charge current
ret = write_RAM(0x91FB, _battery_settings.i_charge);
(void)write_RAM(0x91FB, _battery_settings.i_charge);

// charge voltage
ret = write_RAM(0x91FD, _battery_settings.u_term * 1000);
(void)write_RAM(0x91FD, _battery_settings.u_term * 1000);

// taper current
ret = write_RAM(0x9201, _battery_settings.i_term);
(void)write_RAM(0x9201, _battery_settings.i_term);

// experimental: min taper capacity
ret = write_RAM(0x9203, 4); // standard: 25
(void)write_RAM(0x9203, 4); // standard: 25

// deadband
uint8_t val = 1;
ret = write_RAM(0x91DE, &val, sizeof(uint8_t));
(void)write_RAM(0x91DE, &val, sizeof(uint8_t));

// deadband CC (verursacht Probleme, rm zählt zu schnell?)
/*val = 5;
ret = write_RAM(0x91DF, &val, sizeof(uint8_t));
*/

// sleep current
ret = write_RAM(0x9217, 1);
(void)write_RAM(0x9217, 1);

// dischage current trd
ret = write_RAM(0x9228, 2);
(void)write_RAM(0x9228, 2);
// charge current trd
ret = write_RAM(0x922A, 2);
(void)write_RAM(0x922A, 2);
// quit current
ret = write_RAM(0x922C, 1);
(void)write_RAM(0x922C, 1);

//dod 0%: 4287
//dod 10%: 4125
Expand All @@ -444,29 +438,29 @@ void BQ27220::setup(const battery_settings &_battery_settings, bool init) {
//dod: 103.25%: 3089

// sysDown set Voltage
ret = write_RAM(0x9240, _battery_settings.u_vlo * 1000 + CONFIG_BATTERY_SYSDOWN_SET_OFFSET);
(void)write_RAM(0x9240, _battery_settings.u_vlo * 1000 + CONFIG_BATTERY_SYSDOWN_SET_OFFSET);

// sysDown clear Voltage
ret = write_RAM(0x9243, _battery_settings.u_vlo * 1000 + CONFIG_BATTERY_SYSDOWN_SET_OFFSET + CONFIG_BATTERY_SYSDOWN_HYSTERESIS);
(void)write_RAM(0x9243, _battery_settings.u_vlo * 1000 + CONFIG_BATTERY_SYSDOWN_SET_OFFSET + CONFIG_BATTERY_SYSDOWN_HYSTERESIS);

// FD set
ret = write_RAM(0x9282, _battery_settings.u_vlo * 1000 + CONFIG_BATTERY_FD_SET_OFFSET);
(void)write_RAM(0x9282, _battery_settings.u_vlo * 1000 + CONFIG_BATTERY_FD_SET_OFFSET);

// FD clear
ret = write_RAM(0x9284, _battery_settings.u_vlo * 1000 + CONFIG_BATTERY_FD_SET_OFFSET + CONFIG_BATTERY_FD_HYSTERESIS);
(void)write_RAM(0x9284, _battery_settings.u_vlo * 1000 + CONFIG_BATTERY_FD_SET_OFFSET + CONFIG_BATTERY_FD_HYSTERESIS);

// FC Voltage
ret = write_RAM(0x9288, _battery_settings.u_term * 1000 - CONFIG_BATTERY_FC_VOLTAGE_OFFSET);
(void)write_RAM(0x9288, _battery_settings.u_term * 1000 - CONFIG_BATTERY_FC_VOLTAGE_OFFSET);

// Electonic Load in 3µA steps
ret = write_RAM(0x9269, 6); // 18 µA
(void)write_RAM(0x9269, 6); // 18 µA

// EMF
//write_RAM(0x92A7, 36001);
//C0
ret = write_RAM(0x92A9, 480); //bat1:250
(void)write_RAM(0x92A9, 480); //bat1:250
//R0
ret = write_RAM(0x92AB, 19941); //bat1: 19941 //22542 //new bat: 17340
(void)write_RAM(0x92AB, 19941); //bat1: 19941 //22542 //new bat: 17340
//R1
//write_RAM(0x92AF, 3160);

Expand All @@ -478,16 +472,16 @@ void BQ27220::setup(const battery_settings &_battery_settings, bool init) {
// do not use, only on CT makes sense:
// SOC Flag, enable FC voltage detection
uint8_t flags_b = 0x8C;
ret = write_RAM(0x9281, &flags_b, sizeof(flags_b));
(void)write_RAM(0x9281, &flags_b, sizeof(flags_b));

// Overload current
ret = write_RAM(0x9264, _battery_settings.i_max);
(void)write_RAM(0x9264, _battery_settings.i_max);

// CEDV Smoothing Config
uint8_t cedv_conf = 0x0D; //Default: 0x08, Enable SMEXT, SMEN 0x0D
ret = write_RAM(0x9271, &cedv_conf, sizeof(cedv_conf));
(void)write_RAM(0x9271, &cedv_conf, sizeof(cedv_conf));

ret = write_RAM(0x9272, 3700);
(void)write_RAM(0x9272, 3700);

exit_config_update(init);

Expand All @@ -498,4 +492,4 @@ void BQ27220::setup(const battery_settings &_battery_settings, bool init) {
int BQ27220::set_int_callback(gpio_callback_handler_t handler) {
gpio_init_callback(&int_cb_data, handler, int_cb_data.pin_mask | BIT(gpout_pin.pin));
return gpio_add_callback(gpout_pin.port, &int_cb_data);
}
}
Loading
Loading