#include "power.h" #include "char_lcd.h" #include "starcode.h" #include static const char* TAG = "power"; void bat_monitor_task(void* arg) { while (1) { char str_buf[33] = {0}; uint16_t voltage = lipo.voltage(); sprintf(str_buf, "%d.%03dV", voltage / 1000, voltage % 1000); lcd_clear(); lcd_print(0, 1, str_buf); int16_t current = lipo.current(); sprintf(str_buf, "%dmA", current); lcd_print(1, 1, str_buf); int16_t total_cap = lipo.capacity(capacity_measure::FULL); sprintf(str_buf, "%dmAh", total_cap); lcd_print(2, 1, str_buf); int16_t soc = lipo.soc(soc_measure::FILTERED); sprintf(str_buf, "%d%%", soc); lcd_print(3, 1, str_buf); vTaskDelay(pdMS_TO_TICKS(250)); } vTaskDelete(NULL); } void init_power_board() { ESP_LOGI(TAG, "Initializing power board..."); if (!lipo.begin()) { ESP_LOGE(TAG, "Failed to init communication with the battery gas guage"); return; } auto voltage = lipo.voltage(); ESP_LOGI(TAG, "Battery Voltage: %d", voltage); ESP_LOGI(TAG, "Power board initialized!"); } uint16_t get_bat_voltage() { return lipo.voltage(); } void lcd_print_header_bat() { if (!lcd_header_enabled()) return; if (lcd_starcode_displaying_result()) return; uint8_t soc = lipo.soc(); int16_t current = lipo.current(); char buf[6]; if (soc < 5 && current <= 0) { snprintf(buf, sizeof(buf), " LOW"); } else if (soc == 100) { snprintf(buf, sizeof(buf), " 100"); } else { if (current > 0) { snprintf(buf, sizeof(buf), " %2d+", soc); } else { snprintf(buf, sizeof(buf), " %2d%%", soc); } } lcd_print(0, 16, buf); } // memory version // void lcd_print_header_bat() { // if (!lcd_header_enabled()) return; // if (lcd_starcode_displaying_result()) return; // // Show memory usage percentage instead of battery percentage // char buf[6]; // size_t free_heap = heap_caps_get_free_size(MALLOC_CAP_DEFAULT); // size_t total_heap = heap_caps_get_total_size(MALLOC_CAP_DEFAULT); // uint8_t mem_percent = 0; // if (total_heap > 0) { // mem_percent = (uint8_t)(100 - ((free_heap * 100) / total_heap)); // } // if (mem_percent >= 100) { // snprintf(buf, sizeof(buf), " 100"); // } else { // snprintf(buf, sizeof(buf), " %2d%%", mem_percent); // } // lcd_print(0, 16, buf); // }