Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

I2c fix #2287

Merged
merged 2 commits into from
Oct 7, 2024
Merged

I2c fix #2287

Show file tree
Hide file tree
Changes from all commits
Commits
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
154 changes: 66 additions & 88 deletions firmware/application/apps/ui_battinfo.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
* Copyright (C) 2016 Furrtek
* Copyright (C) 2024 HTotoo
*
* This file is part of PortaPack.
*
Expand Down Expand Up @@ -43,86 +44,87 @@ void BattinfoView::on_timer() {
}
}

void BattinfoView::update_results_ads1110(i2cdev::I2cDev_ADS1110* dev) {
bool uichg = false;
auto voltage = dev->readVoltage();
auto percent = battery::BatteryManagement::calc_percent_voltage(voltage);
if (percent <= 100)
text_percent.set(to_string_dec_uint(percent) + " %");
else
void BattinfoView::update_result() {
if (!battery::BatteryManagement::isDetected()) {
text_percent.set("UNKNOWN");
if (voltage > 1) {
text_voltage.set(to_string_decimal(voltage / 1000.0, 3) + " V");
} else {
text_voltage.set("UNKNOWN");
text_current.set("-");
text_charge.set("-");
text_cycles.set("-");
text_ttef.set("-");
text_method.set("-");
text_warn.set("");
return;
}

// ui hide:
if (!labels_opt.hidden()) uichg = true;
labels_opt.hidden(true);
text_current.hidden(true);
text_charge.hidden(true);
labels_opt.hidden(true);
text_ttef.hidden(true);
text_cycles.hidden(true);
text_warn.set("");
text_ttef.hidden(true);
text_method.set("Voltage");
button_mode.set_text("Voltage");
if (uichg) set_dirty();
BatteryStateMessage msg{1, percent, false, voltage};
EventDispatcher::send_message(msg);
}

void BattinfoView::update_results_max17055(i2cdev::I2cDev_MAX17055* dev) {
bool uichg = false;
uint8_t valid_mask = 0;
dev->getBatteryInfo(valid_mask, percent, voltage, current);
battery::BatteryManagement::getBatteryInfo(valid_mask, percent, voltage, current);
// update text fields
if (percent <= 100)
if (percent <= 100 && (valid_mask & battery::BatteryManagement::BATT_VALID_VOLTAGE) == battery::BatteryManagement::BATT_VALID_VOLTAGE)
text_percent.set(to_string_dec_uint(percent) + " %");
else
text_percent.set("UNKNOWN");
if (voltage > 1) {
if (voltage > 1 && (valid_mask & battery::BatteryManagement::BATT_VALID_VOLTAGE) == battery::BatteryManagement::BATT_VALID_VOLTAGE) {
text_voltage.set(to_string_decimal(voltage / 1000.0, 3) + " V");
} else {
text_voltage.set("UNKNOWN");
}
if (labels_opt.hidden()) uichg = true;
labels_opt.hidden(false);
text_current.hidden(false);
text_charge.hidden(false);
text_current.set(to_string_dec_int(current) + " mA");
text_charge.set(current >= 0 ? "Charging" : "Discharging");
labels_opt.hidden(false);
text_ttef.hidden(false);
// cycles
text_cycles.hidden(false);
uint16_t cycles = (uint16_t)dev->getValue("Cycles");
if (cycles < 2)
text_warn.set("SoC improves after 2 cycles");
else
if ((valid_mask & battery::BatteryManagement::BATT_VALID_CURRENT) == battery::BatteryManagement::BATT_VALID_CURRENT) {
if (labels_opt.hidden()) uichg = true;
labels_opt.hidden(false);
text_current.hidden(false);
text_charge.hidden(false);
text_current.set(to_string_dec_int(current) + " mA");
text_charge.set(current >= 0 ? "Charging" : "Discharging");
labels_opt.hidden(false);

text_ttef.hidden(false);
} else {
if (!labels_opt.hidden()) uichg = true;
labels_opt.hidden(true);
text_current.hidden(true);
text_charge.hidden(true);
text_cycles.hidden(true);
text_ttef.hidden(true);
text_warn.set("");
text_cycles.set(to_string_dec_uint(cycles));
// ttef
text_ttef.hidden(false);
float ttef = 0;
if (current <= 0) {
ttef = dev->getValue("TTE");
}
if ((valid_mask & battery::BatteryManagement::BATT_VALID_CYCLES) == battery::BatteryManagement::BATT_VALID_CYCLES) {
text_cycles.hidden(false);
uint16_t cycles = battery::BatteryManagement::get_cycles();
if (cycles < 2)
text_warn.set("SoC improves after 2 cycles");
else
text_warn.set("");
text_cycles.set(to_string_dec_uint(cycles));
} else {
ttef = dev->getValue("TTF");
text_cycles.hidden(true);
text_warn.set("");
}
// Convert ttef to hours and minutes
uint8_t hours = static_cast<uint8_t>(ttef);
uint8_t minutes = static_cast<uint8_t>((ttef - hours) * 60 + 0.5); // +0.5 for rounding
// Create the formatted string
std::string formatted_time;
if (hours > 0) {
formatted_time += to_string_dec_uint(hours) + "h ";
if ((valid_mask & battery::BatteryManagement::BATT_VALID_TTEF) == battery::BatteryManagement::BATT_VALID_TTEF) {
text_ttef.hidden(false);
float ttef = 0;
if (current <= 0) {
ttef = battery::BatteryManagement::get_tte();
} else {
ttef = battery::BatteryManagement::get_ttf();
}

// Convert ttef to hours and minutes
uint8_t hours = static_cast<uint8_t>(ttef);
uint8_t minutes = static_cast<uint8_t>((ttef - hours) * 60 + 0.5); // +0.5 for rounding

// Create the formatted string
std::string formatted_time;
if (hours > 0) {
formatted_time += to_string_dec_uint(hours) + "h ";
}
formatted_time += to_string_dec_uint(minutes) + "m";

text_ttef.set(formatted_time);
} else {
text_ttef.hidden(true);
}
formatted_time += to_string_dec_uint(minutes) + "m";
text_ttef.set(formatted_time);
if (!battery::BatteryManagement::calcOverride) {
if ((valid_mask & battery::BatteryManagement::BATT_VALID_PERCENT) == battery::BatteryManagement::BATT_VALID_PERCENT) {
text_method.set("IC");
button_mode.set_text("Volt");
} else {
Expand All @@ -135,30 +137,6 @@ void BattinfoView::update_results_max17055(i2cdev::I2cDev_MAX17055* dev) {
EventDispatcher::send_message(msg);
}

void BattinfoView::update_result() {
auto dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_MAX17055);
if (dev) {
update_results_max17055((i2cdev::I2cDev_MAX17055*)dev);
return;
}

dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_ADS1110);
if (dev) {
update_results_ads1110((i2cdev::I2cDev_ADS1110*)dev);
return;
}

// no dev found
text_percent.set("UNKNOWN");
text_voltage.set("UNKNOWN");
text_current.set("-");
text_charge.set("-");
text_cycles.set("-");
text_ttef.set("-");
text_method.set("-");
text_warn.set("");
}

BattinfoView::BattinfoView(NavigationView& nav)
: nav_{nav} {
add_children({&labels,
Expand Down Expand Up @@ -208,4 +186,4 @@ BattinfoView::~BattinfoView() {
thread = nullptr;
}
}
} // namespace ui
} // namespace ui
7 changes: 2 additions & 5 deletions firmware/application/apps/ui_battinfo.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
* Copyright (C) 2016 Furrtek
* Copyright (C) 2024 HTotoo
*
* This file is part of PortaPack.
*
Expand Down Expand Up @@ -28,8 +29,6 @@
#include "ui_navigation.hpp"
#include "string_format.hpp"
#include "i2cdevmanager.hpp"
#include "i2cdev_max17055.hpp"
#include "i2cdev_ads1110.hpp"

namespace ui {
class BattinfoView : public View {
Expand All @@ -46,8 +45,6 @@ class BattinfoView : public View {

private:
void update_result();
void update_results_max17055(i2cdev::I2cDev_MAX17055* dev);
void update_results_ads1110(i2cdev::I2cDev_ADS1110* dev);
void on_timer();
NavigationView& nav_;
uint16_t timer_period = 60;
Expand Down Expand Up @@ -109,4 +106,4 @@ class BattinfoView : public View {

} /* namespace ui */

#endif /*__UI_BATTINFO__*/
#endif /*__UI_BATTINFO__*/
2 changes: 1 addition & 1 deletion firmware/application/apps/ui_debug_max17055.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class BatteryCapacityView : public View {
public:
BatteryCapacityView(NavigationView& nav);
void focus() override;
std::string title() const override { return "MAX17055 Registers"; }
std::string title() const override { return "Battery Registers"; }

bool on_encoder(const EncoderEvent delta) override;

Expand Down
1 change: 1 addition & 0 deletions firmware/application/ui_navigation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
#include "sd_card.hpp"
#include "external_app.hpp"
#include "view_factory.hpp"
#include "battery.hpp"

// for incrementing fake date when RTC battery is dead
#define DATE_FILEFLAG u"/SETTINGS/DATE_FILEFLAG"
Expand Down
49 changes: 48 additions & 1 deletion firmware/common/battery.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#include "battery.hpp"
#include "portapack.hpp"
#include "i2cdevmanager.hpp"
#include "i2cdev_max17055.hpp"
#include "i2cdev_ads1110.hpp"

namespace battery {

bool BatteryManagement::calcOverride = false;
Expand All @@ -27,4 +29,49 @@ uint8_t BatteryManagement::calc_percent_voltage(uint16_t voltage) {
return batteryPercentage;
}

// helper function to get data from ANY batt management ic
void BatteryManagement::getBatteryInfo(uint8_t& valid_mask, uint8_t& percent, uint16_t& voltage, int32_t& current) {
auto dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_MAX17055);
if (dev) {
((i2cdev::I2cDev_MAX17055*)dev)->getBatteryInfo(valid_mask, percent, voltage, current);
return;
}
dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_ADS1110);
if (dev) {
voltage = ((i2cdev::I2cDev_ADS1110*)dev)->readVoltage();
percent = calc_percent_voltage(voltage);
valid_mask = 1;
return;
}

valid_mask = 0;
}

// helper function to get data from ANY batt management ic
uint16_t BatteryManagement::get_cycles() {
auto dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_MAX17055);
if (dev) {
return ((i2cdev::I2cDev_MAX17055*)dev)->getValue("Cycles");
}
return 0;
}

// helper function to get data from ANY batt management ic
float BatteryManagement::get_tte() {
auto dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_MAX17055);
if (dev) {
return ((i2cdev::I2cDev_MAX17055*)dev)->getValue("TTE");
}
return 0;
}

// helper function to get data from ANY batt management ic
float BatteryManagement::get_ttf() {
auto dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_MAX17055);
if (dev) {
return ((i2cdev::I2cDev_MAX17055*)dev)->getValue("TTF");
}
return 0;
}

} // namespace battery
5 changes: 5 additions & 0 deletions firmware/common/battery.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ class BatteryManagement {
static void set_calc_override(bool override);
static uint8_t calc_percent_voltage(uint16_t); // calculates battery percentage from the voltage
static bool calcOverride; // if set to true, it'll override the battery percent calculation based on current voltage.
static void getBatteryInfo(uint8_t& valid_mask, uint8_t& percent, uint16_t& voltage, int32_t& current);
static uint16_t get_cycles();
static float get_tte();
static float get_ttf();

private:
};
}; // namespace battery
Expand Down
Loading