mirror of
https://github.com/usatiuk/cardboy.git
synced 2025-10-28 15:17:48 +01:00
battery percentage
This commit is contained in:
@@ -18,6 +18,7 @@ public:
|
||||
float get_voltage() const;
|
||||
float get_charge() const;
|
||||
float get_current() const;
|
||||
float get_percentage() const;
|
||||
|
||||
void pooler(); // FIXME:
|
||||
private:
|
||||
@@ -33,6 +34,7 @@ private:
|
||||
volatile float _voltage;
|
||||
volatile float _current;
|
||||
volatile float _charge;
|
||||
volatile float _percentage;
|
||||
|
||||
TaskHandle_t _pooler_task;
|
||||
};
|
||||
|
||||
@@ -48,6 +48,8 @@ static constexpr uint16_t DesignCapMah = 180; // 100mOhm
|
||||
|
||||
constexpr float mahToCap(float mah) { return mah * (1000.0 / 5.0) * RSense; }
|
||||
constexpr float capToMah(uint16_t cap) { return cap * (5.0 / 1000.0) / RSense; }
|
||||
// lsb is 1/256%
|
||||
constexpr float regToPercent(uint16_t reg) { return static_cast<float>(reg) / 256.0f; }
|
||||
constexpr float regToCurrent(uint16_t reg) {
|
||||
return static_cast<float>(static_cast<int16_t>(reg)) * 0.0015625f / RSense; // Convert to mA
|
||||
}
|
||||
@@ -103,6 +105,7 @@ void BatMon::pooler() {
|
||||
_charge = capToMah(ReadRegister(0x05));
|
||||
_current = regToCurrent(ReadRegister(0x0B));
|
||||
_voltage = regToVoltage(ReadRegister(0x09));
|
||||
_percentage = regToPercent(ReadRegister(0x06));
|
||||
vTaskDelay(pdMS_TO_TICKS(10000));
|
||||
if (_voltage < 3.0f) {
|
||||
Shutdowner::get().shutdown();
|
||||
@@ -113,3 +116,4 @@ void BatMon::pooler() {
|
||||
float BatMon::get_voltage() const { return _voltage; }
|
||||
float BatMon::get_charge() const { return _charge; }
|
||||
float BatMon::get_current() const { return _current; }
|
||||
float BatMon::get_percentage() const { return _percentage; }
|
||||
|
||||
@@ -78,6 +78,7 @@ public:
|
||||
[[nodiscard]] float voltage() const override { return BatMon::get().get_voltage(); }
|
||||
[[nodiscard]] float charge() const override { return BatMon::get().get_charge(); }
|
||||
[[nodiscard]] float current() const override { return BatMon::get().get_current(); }
|
||||
[[nodiscard]] float percentage() const override { return BatMon::get().get_percentage(); }
|
||||
};
|
||||
|
||||
class EspRuntime::StorageService final : public cardboy::sdk::IStorage {
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <ctime>
|
||||
#include <string>
|
||||
@@ -446,6 +447,18 @@ private:
|
||||
|
||||
framebuffer.frameReady();
|
||||
|
||||
if (auto* battery = context.battery(); battery && battery->hasData()) {
|
||||
const float percentage = battery->percentage();
|
||||
if (std::isfinite(percentage) && percentage >= 0.0f) {
|
||||
char pct[8];
|
||||
std::snprintf(pct, sizeof(pct), "%.0f%%", static_cast<double>(percentage));
|
||||
const int pctWidth = font16x8::measureText(pct, 1, 1);
|
||||
const int pctX = framebuffer.width() - pctWidth - 4;
|
||||
const int pctY = 4;
|
||||
font16x8::drawText(framebuffer, pctX, pctY, pct, 1, true, 1);
|
||||
}
|
||||
}
|
||||
|
||||
const int scaleTime = 4;
|
||||
const int scaleSeconds = 2;
|
||||
const int scaleSmall = 1;
|
||||
|
||||
@@ -39,6 +39,7 @@ public:
|
||||
[[nodiscard]] virtual float voltage() const { return 0.0f; }
|
||||
[[nodiscard]] virtual float charge() const { return 0.0f; }
|
||||
[[nodiscard]] virtual float current() const { return 0.0f; }
|
||||
[[nodiscard]] virtual float percentage() const { return 0.0f; }
|
||||
};
|
||||
|
||||
class IStorage {
|
||||
|
||||
@@ -40,7 +40,6 @@ public:
|
||||
class DesktopBattery final : public cardboy::sdk::IBatteryMonitor {
|
||||
public:
|
||||
[[nodiscard]] bool hasData() const override { return false; }
|
||||
};
|
||||
|
||||
class DesktopStorage final : public cardboy::sdk::IStorage {
|
||||
public:
|
||||
|
||||
@@ -52,14 +52,10 @@ std::string StatusBar::prepareRightText() const {
|
||||
if (_services->battery && _services->battery->hasData()) {
|
||||
const float current = _services->battery->current();
|
||||
const float chargeMah = _services->battery->charge();
|
||||
const float fallbackV = _services->battery->voltage();
|
||||
const float percentage = _services->battery->percentage();
|
||||
char buf[64];
|
||||
if (std::isfinite(current) && std::isfinite(chargeMah)) {
|
||||
std::snprintf(buf, sizeof(buf), "cur %.2fmA chr %.2fmAh", static_cast<double>(current),
|
||||
static_cast<double>(chargeMah));
|
||||
} else {
|
||||
std::snprintf(buf, sizeof(buf), "vol %.2fV", static_cast<double>(fallbackV));
|
||||
}
|
||||
std::snprintf(buf, sizeof(buf), "%.2fmA %.2fmAh %.0f%%", static_cast<double>(current),
|
||||
static_cast<double>(chargeMah), static_cast<double>(percentage));
|
||||
right.assign(buf);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user