FiWiTSF/tsf_affine_example.c

67 lines
1.6 KiB
C

/* SPDX-License-Identifier: GPL-2.0 OR MIT */
/* Example: 24 radios, radio 0 = master → 23 affine maps. */
#include "tsf_affine.h"
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#define N_RADIO 24u
#define MASTER 0u
#define WINDOW 32u
/* Toy “true” radio TSF: same rate as master, fixed offset per index (for sanity check). */
static uint64_t true_radio_tsf(unsigned int idx, uint64_t master_tsf)
{
if (idx == MASTER)
return master_tsf;
return master_tsf + (uint64_t)idx * 1000000u;
}
int main(void)
{
struct tsf_affine_pool pool;
uint64_t out[TSF_AFFINE_MAX_RADIOS];
uint64_t m;
unsigned k, i;
if (tsf_affine_pool_init(&pool, N_RADIO, MASTER, WINDOW) != 0) {
perror("tsf_affine_pool_init");
return 1;
}
/* Train: several snapshots */
for (k = 0; k < 8; k++) {
m = 9000000000000ull + (uint64_t)k * 5000000ull;
for (i = 0; i < N_RADIO; i++)
tsf_affine_pool_sample(&pool, i, m, true_radio_tsf(i, m));
}
m = 9000000000000ull + 100000000ull;
tsf_affine_pool_master_to_all(&pool, m, out);
printf("master TSF=%" PRIu64 " (radio %u identity)\n", m,
(unsigned)MASTER);
for (i = 0; i < N_RADIO; i++) {
uint64_t truth = true_radio_tsf(i, m);
int64_t err;
if (i == MASTER) {
printf(" [%2u] pred=%" PRIu64 " (master)\n", i, out[i]);
continue;
}
if (out[i] == 0 && !tsf_affine_map_ready(&pool.maps[i])) {
printf(" [%2u] map not ready\n", i);
continue;
}
err = (int64_t)(out[i] - truth);
printf(" [%2u] pred=%" PRIu64 " truth=%" PRIu64 " err=%" PRId64
" µs\n",
i, out[i], truth, err);
}
tsf_affine_pool_fini(&pool);
return 0;
}