diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h index 57ebe42515f2450f8b9938220c795f012e6c27d5..484e951f5c9b9c1e98b181717d4bf8740e1767b5 100644 --- a/epicardium/modules/modules.h +++ b/epicardium/modules/modules.h @@ -34,6 +34,9 @@ int personal_state_enabled(); /* ---------- PMIC --------------------------------------------------------- */ void vPmicTask(void *pvParameters); +/* Critical battery voltage */ +#define BATTERY_CRITICAL 3.40f + enum pmic_amux_signal { PMIC_AMUX_CHGIN_U = 0x1, PMIC_AMUX_CHGIN_I = 0x2, diff --git a/epicardium/modules/pmic.c b/epicardium/modules/pmic.c index ef97392cb887b1ce43cbe948b79ec07286eccf5a..48a311c983cedd2ff2b1b71a4b4d4ddd9583336c 100644 --- a/epicardium/modules/pmic.c +++ b/epicardium/modules/pmic.c @@ -154,6 +154,36 @@ pmic_poll_interrupts(TickType_t *button_start_tick, TickType_t duration) } } +__attribute__((noreturn)) static void pmic_die(float u_batt) +{ + /* Stop core 1 */ + core1_stop(); + + /* Grab the screen */ + disp_forcelock(); + + /* Draw an error screen */ + epic_disp_clear(0x0000); + + epic_disp_print(0, 0, " Battery", 0xffff, 0x0000); + epic_disp_print(0, 20, " critical", 0xffff, 0x0000); + epic_disp_print(0, 40, " !!!!", 0xffff, 0x0000); + epic_disp_update(); + + /* Vibrate violently */ + epic_vibra_set(true); + + /* Wait a bit */ + for (int i = 0; i < 50000000; i++) + __NOP(); + + LOG_WARN("pmic", "Poweroff"); + MAX77650_setSFT_RST(0x2); + + while (1) + __WFI(); +} + /* * Check the battery voltage. If it drops too low, turn card10 off. */ @@ -175,9 +205,9 @@ static void pmic_check_battery() (int)(u_batt * 1000.0) % 1000 ); - /* - * TODO: Handle voltage value - */ + if (u_batt < BATTERY_CRITICAL) { + pmic_die(u_batt); + } } /*