/** * @file sweep.c * @brief Periodic staircase sweep state machine. */ #include "sweep.h" #include bool sweep_start(sweep_t *sweep, const sweep_config_t *config, uint32_t tick_us) { if ((sweep == NULL) || (config == NULL) || (tick_us == 0u) || (config->min_code > config->max_code) || (config->step_code == 0u) || (config->step_period_us < tick_us)) { return false; } sweep->min_code = config->min_code; sweep->max_code = config->max_code; sweep->step_code = config->step_code; sweep->step_ticks = config->step_period_us / tick_us; sweep->pause_ticks = ((uint32_t)config->pause_ms * 1000u) / tick_us; sweep->next_code = config->min_code; sweep->countdown_ticks = 1u; sweep->enabled = 1u; return true; } void sweep_stop(sweep_t *sweep) { if (sweep != NULL) { sweep->enabled = 0u; } } bool sweep_tick(sweep_t *sweep, uint16_t *out_code) { if ((sweep->enabled == 0u) || (--sweep->countdown_ticks != 0u)) { return false; } *out_code = (uint16_t)sweep->next_code; sweep->countdown_ticks = sweep->step_ticks; if (sweep->next_code == sweep->min_code) { /* The lower bound is held for the inter-sweep pause. */ sweep->countdown_ticks += sweep->pause_ticks; } if (sweep->next_code >= sweep->max_code) { sweep->next_code = sweep->min_code; } else { sweep->next_code += sweep->step_code; if (sweep->next_code > sweep->max_code) { sweep->next_code = sweep->max_code; } } return true; }