bat mon as a pooler

This commit is contained in:
2025-03-02 22:48:27 +01:00
parent f7d751e7dc
commit e6b7d1eb43
2 changed files with 52 additions and 33 deletions

View File

@@ -8,14 +8,16 @@
#include "config.hpp"
#include "driver/i2c_master.h"
#include "freertos/FreeRTOS.h"
class BatMon {
public:
static BatMon& get();
float get_voltage();
float get_charge();
float get_current();
float get_voltage() const;
float get_charge() const;
float get_current() const;
void pooler(); // FIXME:
private:
static inline i2c_device_config_t _dev_cfg = {
.dev_addr_length = I2C_ADDR_BIT_LEN_7,
@@ -24,6 +26,12 @@ private:
};
BatMon();
volatile float _voltage;
volatile float _current;
volatile float _charge;
TaskHandle_t _pooler_task;
};
#endif // CB_BAT_MON_HPP

View File

@@ -4,6 +4,9 @@
#include "bat_mon.hpp"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "i2c_global.hpp"
static i2c_master_dev_handle_t dev_handle;
@@ -13,35 +16,43 @@ BatMon& BatMon::get() {
return bat_mon;
}
BatMon::BatMon() { ESP_ERROR_CHECK(i2c_master_bus_add_device(I2cGlobal::get().get_bus_handle(), &_dev_cfg, &dev_handle)); }
float BatMon::get_voltage() {
uint8_t reg = 8;
uint16_t buffer;
ESP_ERROR_CHECK(
i2c_master_transmit_receive(dev_handle, &reg, sizeof(reg), reinterpret_cast<uint8_t*>(&buffer), 2, -1));
float voltage = buffer;
voltage *= 2.44f;
voltage /= 1000;
return voltage;
static void start_pooler(void* arg) { static_cast<BatMon*>(arg)->pooler(); }
BatMon::BatMon() {
ESP_ERROR_CHECK(i2c_master_bus_add_device(I2cGlobal::get().get_bus_handle(), &_dev_cfg, &dev_handle));
xTaskCreate(&start_pooler, "BatMon", 2048, this, tskIDLE_PRIORITY, &_pooler_task);
}
float BatMon::get_charge() {
uint8_t reg = 2;
uint16_t buffer;
ESP_ERROR_CHECK(
i2c_master_transmit_receive(dev_handle, &reg, sizeof(reg), reinterpret_cast<uint8_t*>(&buffer), 2, -1));
float charge = *reinterpret_cast<int16_t*>(&buffer);
charge *= 6.70f;
charge /= 50;
return charge;
}
float BatMon::get_current() {
uint8_t reg = 6;
uint16_t buffer;
ESP_ERROR_CHECK(
i2c_master_transmit_receive(dev_handle, &reg, sizeof(reg), reinterpret_cast<uint8_t*>(&buffer), 2, -1));
float current = static_cast<int16_t>(buffer << 2);
current *= 11.77f;
current /= 50;
current /= 4;
return current;
void BatMon::pooler() {
while (true) {
uint8_t reg = 8;
uint16_t buffer;
ESP_ERROR_CHECK(
i2c_master_transmit_receive(dev_handle, &reg, sizeof(reg), reinterpret_cast<uint8_t*>(&buffer), 2, -1));
float voltage = buffer;
voltage *= 2.44f;
voltage /= 1000;
_voltage = voltage;
reg = 2;
ESP_ERROR_CHECK(
i2c_master_transmit_receive(dev_handle, &reg, sizeof(reg), reinterpret_cast<uint8_t*>(&buffer), 2, -1));
float charge = *reinterpret_cast<int16_t*>(&buffer);
charge *= 6.70f;
charge /= 50;
_charge = charge;
reg = 6;
ESP_ERROR_CHECK(
i2c_master_transmit_receive(dev_handle, &reg, sizeof(reg), reinterpret_cast<uint8_t*>(&buffer), 2, -1));
float current = static_cast<int16_t>(buffer << 2);
current *= 11.77f;
current /= 50;
current /= 4;
_current = current;
vTaskDelay(10 * 1000 / portTICK_PERIOD_MS);
}
}
float BatMon::get_voltage() const { return _voltage; }
float BatMon::get_charge() const { return _charge; }
float BatMon::get_current() const { return _current; }