implementation of RAR response window timer suspension
(this is needed because it might expire while MSG2 is being decoded despite being received inside the window)
This commit is contained in:
@@ -1380,15 +1380,22 @@ int set_default_nta_offset(frequency_range_t freq_range, uint32_t samples_per_su
|
||||
void nr_timer_start(NR_timer_t *timer)
|
||||
{
|
||||
timer->active = true;
|
||||
timer->suspended = false;
|
||||
timer->counter = 0;
|
||||
}
|
||||
|
||||
void nr_timer_stop(NR_timer_t *timer)
|
||||
{
|
||||
timer->active = false;
|
||||
timer->suspended = false;
|
||||
timer->counter = 0;
|
||||
}
|
||||
|
||||
void nr_timer_suspension(NR_timer_t *timer)
|
||||
{
|
||||
timer->suspended = !timer->suspended;
|
||||
}
|
||||
|
||||
bool nr_timer_is_active(const NR_timer_t *timer)
|
||||
{
|
||||
return timer->active;
|
||||
@@ -1399,7 +1406,7 @@ bool nr_timer_tick(NR_timer_t *timer)
|
||||
bool expired = false;
|
||||
if (timer->active) {
|
||||
timer->counter += timer->step;
|
||||
if (timer->target == UINT_MAX) // infinite target, never expires
|
||||
if (timer->target == UINT_MAX || timer->suspended) // infinite target, never expires
|
||||
return false;
|
||||
expired = nr_timer_expired(timer);
|
||||
if (expired)
|
||||
@@ -1410,7 +1417,7 @@ bool nr_timer_tick(NR_timer_t *timer)
|
||||
|
||||
bool nr_timer_expired(const NR_timer_t *timer)
|
||||
{
|
||||
if (timer->target == UINT_MAX) // infinite target, never expires
|
||||
if (timer->target == UINT_MAX || timer->suspended) // infinite target, never expires
|
||||
return false;
|
||||
return timer->counter >= timer->target;
|
||||
}
|
||||
|
||||
@@ -156,6 +156,7 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
bool active;
|
||||
bool suspended;
|
||||
uint32_t counter;
|
||||
uint32_t target;
|
||||
uint32_t step;
|
||||
@@ -171,6 +172,12 @@ void nr_timer_start(NR_timer_t *timer);
|
||||
* @param timer Timer to stopped
|
||||
*/
|
||||
void nr_timer_stop(NR_timer_t *timer);
|
||||
/**
|
||||
* @brief To suspend/resume a timer
|
||||
* @param timer Timer to be stopped/suspended
|
||||
*/
|
||||
void nr_timer_suspension(NR_timer_t *timer);
|
||||
|
||||
/**
|
||||
* @brief If active, it increases timer counter by an amout of units equal to step. It stops timer if expired
|
||||
* @param timer Timer to be handled
|
||||
|
||||
Reference in New Issue
Block a user