67 lines
1.6 KiB
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;
|
|
}
|