Files
RadioPhotonic_PCB_software/App/Services/sweep.c
T
2026-10-09 19:45:27 +03:00

67 lines
1.6 KiB
C

/**
* @file sweep.c
* @brief Periodic staircase sweep state machine.
*/
#include "sweep.h"
#include <stddef.h>
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;
}