7#define CHECK(condition) \
10 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, #condition); \
17 return mv * 65535U / 10624U + 1U;
49 b.sampled_at_ms = now_ms;
82 .wake_tolerance_ms = 500,
83 .callback_budget_ms = 50,
84 .battery_warn_mv = 7000,
85 .battery_fail_mv = 6600,
86 .battery_hysteresis_mv = 100};
96 memset(f, 0,
sizeof(*f));
133 p.on_usb_power =
NULL;
155 memset(&f, 0,
sizeof(f));
189 for (
int i = 0; i < 6; ++i) {
194 now +=
r.sleep_s * 1000U;
388 for (
int i = 0; i < 10; ++i) {
442 uint32_t now = UINT32_MAX - 15000U;
444 for (
int i = 0; i < 4; ++i) {
448 now +=
r.sleep_s * 1000U;
453 idle.last.sequence = UINT32_MAX;
464 for (
int i = 0; i < 300; ++i) {
492 puts(
"idle tests passed");
static const emmc_port_t port
idle_result_t idle_on_wake(idle_t *idle, uint32_t now_ms)
const idle_heartbeat_t * idle_last_heartbeat(const idle_t *idle)
bool idle_enter(idle_t *idle, uint32_t now_ms)
uint16_t idle_counts_to_mv(uint32_t raw_counts)
bool idle_init(idle_t *idle, const idle_config_t *config, const idle_port_t *port, void *context)
@ IDLE_EVENT_ARM_REQUESTED
#define IDLE_MAX_COMMANDS_PER_WAKE
*brief create JSON pointer *sa reference_tokens const string_t const string_t & b
idle_command_t commands[16]
self_test_reply_t send_reply
self_test_battery_t battery
uint32_t callback_budget_ms
uint32_t wake_tolerance_ms
uint32_t heartbeat_interval_ms
self_test_result_t previous_send
idle_battery_state_t battery
uint8_t consecutive_send_failures
self_test_result_t result
static void test_arm_requested_without_heartbeat(void)
static void test_radio_wake_does_not_delay_heartbeat(void)
static void test_conversion(void)
static void note(fake_t *f, unsigned what)
static void test_battery_read_before_transmit(void)
static uint32_t counts_for_mv(uint32_t mv)
static void test_send_failure_counted_and_sleep_continues(void)
static void test_thresholds(void)
static void test_early_lsi_wake_within_tolerance(void)
static bool fake_usb(void *context)
static void test_wake_before_enter_is_error(void)
static void test_clock_and_sequence_wraparound(void)
static void test_hysteresis(void)
static void test_failure_count_saturates(void)
static void test_sixty_seconds_gives_six_heartbeats(void)
static void test_long_gap_sends_one_heartbeat(void)
static void test_usb_is_never_battery_health(void)
static void test_init_rejects_bad_input(void)
static void test_disarm_stays_idle(void)
static void test_first_wake_sends_heartbeat(void)
static void set_mv(fake_t *f, uint32_t mv)
static void push_command(fake_t *f, idle_command_t cmd)
static idle_command_t fake_poll(void *context)
static self_test_battery_t fake_battery(void *context, uint32_t now_ms, uint32_t budget_ms)
static void test_disarm_then_arm_in_one_wake(void)
static idle_config_t config(void)
static void test_command_drain_is_bounded(void)
static self_test_reply_t fake_send(void *context, const idle_heartbeat_t *hb, uint32_t budget_ms)
static void test_invalid_battery_still_sends(void)