43#include <ti/drivers/rf/RF.h>
46#define RAT_RANGE 4294967296ull
47#define RAT_ONE_QUARTER (RAT_RANGE / (uint32_t)4)
48#define RAT_ONE_THIRD (RAT_RANGE / (uint32_t)3)
49#define RAT_THREE_QUARTERS (RAT_ONE_QUARTER * 3)
50#define RTIMER_TO_RAT(x) ((x) * (RAT_SECOND / RTIMER_SECOND))
53check_rat_overflow(
void)
55 const bool was_off = !radio_mode->rx_is_active();
58 RF_runDirectCmd(radio_mode->rf_handle, CMD_NOP);
61 const uint32_t current_value = RF_getCurrentTime();
63 static bool initial_iteration =
true;
64 static uint32_t last_value;
66 if(initial_iteration) {
68 initial_iteration =
false;
71 if(current_value < last_value) {
74 radio_mode->rat.overflow_count += 1;
78 last_value = current_value;
81 RF_yield(radio_mode->rf_handle);
86rat_overflow_cb(
void *arg)
90 const clock_time_t two_quarters = (2 * RAT_ONE_QUARTER *
CLOCK_SECOND) / RAT_SECOND;
91 ctimer_set(&radio_mode->rat.overflow_timer, two_quarters, rat_overflow_cb, NULL);
98 const clock_time_t one_third = (RAT_ONE_THIRD *
CLOCK_SECOND) / RAT_SECOND;
99 ctimer_set(&radio_mode->rat.overflow_timer, one_third, rat_overflow_cb, NULL);
103rat_to_timestamp(
const uint32_t rat_ticks, int32_t offset_ticks)
105 check_rat_overflow();
107 uint64_t adjusted_overflow_count = radio_mode->rat.overflow_count;
111 if(rat_ticks > RAT_THREE_QUARTERS) {
112 const rtimer_clock_t one_quarter = (RAT_ONE_QUARTER *
RTIMER_SECOND) / RAT_SECOND;
113 if(RTIMER_CLOCK_LT(
RTIMER_NOW(), radio_mode->rat.last_overflow + one_quarter)) {
114 adjusted_overflow_count -= 1;
119 const uint64_t rat_ticks_adjusted = (uint64_t)rat_ticks + (uint64_t)RAT_RANGE * adjusted_overflow_count;
121 return RAT_TO_RTIMER(rat_ticks_adjusted + offset_ticks);
#define CLOCK_SECOND
A second, measured in system clock time.
void ctimer_set(struct ctimer *c, clock_time_t t, void(*f)(void *), void *ptr)
Set a callback timer.
#define RTIMER_SECOND
Number of rtimer ticks for 1 second.
#define RTIMER_NOW()
Get the current clock time.
Header file of the generic radio mode API.
Header file of the CC13xx/CC26xx RAT timer handler.