diff --git a/Firmware/main/include/bat_mon.hpp b/Firmware/main/include/bat_mon.hpp index 75cf912..fce9e5e 100644 --- a/Firmware/main/include/bat_mon.hpp +++ b/Firmware/main/include/bat_mon.hpp @@ -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 diff --git a/Firmware/main/src/bat_mon.cpp b/Firmware/main/src/bat_mon.cpp index 81a114f..1b8ade1 100644 --- a/Firmware/main/src/bat_mon.cpp +++ b/Firmware/main/src/bat_mon.cpp @@ -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, ®, sizeof(reg), reinterpret_cast(&buffer), 2, -1)); - float voltage = buffer; - voltage *= 2.44f; - voltage /= 1000; - return voltage; +static void start_pooler(void* arg) { static_cast(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, ®, sizeof(reg), reinterpret_cast(&buffer), 2, -1)); - float charge = *reinterpret_cast(&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, ®, sizeof(reg), reinterpret_cast(&buffer), 2, -1)); - float current = static_cast(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, ®, sizeof(reg), reinterpret_cast(&buffer), 2, -1)); + float voltage = buffer; + voltage *= 2.44f; + voltage /= 1000; + _voltage = voltage; + reg = 2; + ESP_ERROR_CHECK( + i2c_master_transmit_receive(dev_handle, ®, sizeof(reg), reinterpret_cast(&buffer), 2, -1)); + float charge = *reinterpret_cast(&buffer); + charge *= 6.70f; + charge /= 50; + _charge = charge; + reg = 6; + ESP_ERROR_CHECK( + i2c_master_transmit_receive(dev_handle, ®, sizeof(reg), reinterpret_cast(&buffer), 2, -1)); + float current = static_cast(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; }