power_test.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <furi.h>
  2. #include <furi_hal.h>
  3. #include "../minunit.h"
  4. static void power_test_deinit(void) {
  5. // Try to reset to default charge voltage limit
  6. furi_hal_power_set_battery_charge_voltage_limit(4.208f);
  7. }
  8. MU_TEST(test_power_charge_voltage_limit_exact) {
  9. // Power of 16mV charge voltage limits get applied exactly
  10. // (bq25896 charge controller works in 16mV increments)
  11. //
  12. // This test may need adapted if other charge controllers are used in the future.
  13. for(uint16_t charge_mv = 3840; charge_mv <= 4208; charge_mv += 16) {
  14. float charge_volt = (float)charge_mv / 1000.0f;
  15. furi_hal_power_set_battery_charge_voltage_limit(charge_volt);
  16. mu_assert_double_eq(charge_volt, furi_hal_power_get_battery_charge_voltage_limit());
  17. }
  18. }
  19. MU_TEST(test_power_charge_voltage_limit_floating_imprecision) {
  20. // 4.016f should act as 4.016 V, even with floating point imprecision
  21. furi_hal_power_set_battery_charge_voltage_limit(4.016f);
  22. mu_assert_double_eq(4.016f, furi_hal_power_get_battery_charge_voltage_limit());
  23. }
  24. MU_TEST(test_power_charge_voltage_limit_inexact) {
  25. // Charge voltage limits that are not power of 16mV get truncated down
  26. furi_hal_power_set_battery_charge_voltage_limit(3.841f);
  27. mu_assert_double_eq(3.840, furi_hal_power_get_battery_charge_voltage_limit());
  28. furi_hal_power_set_battery_charge_voltage_limit(3.900f);
  29. mu_assert_double_eq(3.888, furi_hal_power_get_battery_charge_voltage_limit());
  30. furi_hal_power_set_battery_charge_voltage_limit(4.200f);
  31. mu_assert_double_eq(4.192, furi_hal_power_get_battery_charge_voltage_limit());
  32. }
  33. MU_TEST(test_power_charge_voltage_limit_invalid_clamped) {
  34. // Out-of-range charge voltage limits get clamped to 3.840 V and 4.208 V
  35. furi_hal_power_set_battery_charge_voltage_limit(3.808f);
  36. mu_assert_double_eq(3.840, furi_hal_power_get_battery_charge_voltage_limit());
  37. furi_hal_power_set_battery_charge_voltage_limit(1.0f);
  38. mu_assert_double_eq(3.840, furi_hal_power_get_battery_charge_voltage_limit());
  39. // NOTE: Intentionally picking a small increment above 4.208 V to reduce the risk of an
  40. // unhappy battery if this fails.
  41. furi_hal_power_set_battery_charge_voltage_limit(4.240f);
  42. mu_assert_double_eq(4.208, furi_hal_power_get_battery_charge_voltage_limit());
  43. // Likewise, picking a number that the uint8_t wraparound in the driver would result in a
  44. // VREG value under 23 if this test fails.
  45. // E.g. (uint8_t)((8105-3840)/16) -> 10
  46. furi_hal_power_set_battery_charge_voltage_limit(8.105f);
  47. mu_assert_double_eq(4.208, furi_hal_power_get_battery_charge_voltage_limit());
  48. }
  49. MU_TEST_SUITE(test_power_suite) {
  50. MU_RUN_TEST(test_power_charge_voltage_limit_exact);
  51. MU_RUN_TEST(test_power_charge_voltage_limit_floating_imprecision);
  52. MU_RUN_TEST(test_power_charge_voltage_limit_inexact);
  53. MU_RUN_TEST(test_power_charge_voltage_limit_invalid_clamped);
  54. power_test_deinit();
  55. }
  56. int run_minunit_test_power() {
  57. MU_RUN_SUITE(test_power_suite);
  58. return MU_EXIT_CODE;
  59. }