*/
void time_ext_sync(uint64_t local, uint64_t world)
{
- sirq_printf("syncing clocks: %d -> %d\r\n",
- (int)(local/NSEC_PER_SEC),
- (int)(world/NSEC_PER_SEC));
+ uint64_t guess = time_to_world(local);
+ uint64_t error = world > guess ? world - guess :
+ guess > world ? guess - world : 0;
+ int ahead = guess > world;
time_last_local = local;
- time_last_world = world;
+ time_last_world = guess/2 + world/2;
+
+ world = time_last_world;
+
+ sirq_printf("syncing clocks: %d=%d.%04u -> %d.%04u (err: %s%ld.%09lu)\r\n",
+ (int)((local / NSEC_PER_SEC)),
+ (int)((guess / NSEC_PER_SEC)),
+ (int)((guess % NSEC_PER_SEC)/(NSEC_PER_SEC/10000)),
+ (int)((world / NSEC_PER_SEC)),
+ (int)((world % NSEC_PER_SEC)/(NSEC_PER_SEC/10000)),
+ ahead ? "-" : "",
+ (int32_t )(error / (int64_t)NSEC_PER_SEC),
+ (uint32_t)(error % (int64_t)NSEC_PER_SEC));
}
/************************
uint8_t buffer[256];
} parser_t;
-const uint64_t serial_sync_delay = NSEC_PER_SEC * 2; // 1hz
+const uint64_t serial_sync_delay = NSEC_PER_SEC / 10; // 1hz
static uint64_t serial_sync_due = 0;
static tdma_t *serial_tdma_rcv = NULL;
serial_sync_due = 0;
// Debug
- sirq_printf("sync msg transmit\r\n");
+ //sirq_printf("sync msg transmit\r\n");
// save transmit time
for (int i = 0; i < 1000; i++)
int valid = tdma_stamp(serial_tdma_xmt, &serial_xmt_local);
if (!valid)
sirq_printf("missing sync transmit time\r\n");
+ tdma_reset(serial_tdma_rcv);
tdma_reset(serial_tdma_xmt);
}
time.seconds = (uint32_t)(world / NSEC_PER_SEC);
time.nanosec = (uint32_t)(world % NSEC_PER_SEC);
- sirq_printf("event received - %08x:%08x - %u.%u\r\n",
+ sirq_printf("event received - %08x:%08x - %u.%09u\r\n",
(uint32_t)(local >> 32), (uint32_t)local,
time.seconds, time.nanosec);
// todo
if (!valid)
sirq_printf("missing sync receive time\r\n");
tdma_reset(serial_tdma_rcv);
+ tdma_reset(serial_tdma_xmt);
// Lookup times
uint64_t world = ((uint64_t)msg->time.seconds) * NSEC_PER_SEC
{
switch (msgid) {
case MSG_ID_SYNC:
- sirq_printf("received sync msg\r\n");
+ //sirq_printf("received sync msg\r\n");
serial_handle_sync((sync_msg_t*)body);
break;
case MSG_ID_EVENT:
- sirq_printf("received event msg\r\n");
+ //sirq_printf("received event msg\r\n");
serial_handle_event((event_msg_t*)body);
break;
}
void task_sync(uint64_t local, uint64_t world)
{
- serial_send_sync(sirq_bbb, local);
+ serial_send_sync(sirq_mbed, local);
}
void task_leds(uint64_t local, uint64_t world)
void task_debug(uint64_t local, uint64_t world)
{
//tdma_debug(tdma_rcv);
- sirq_printf("background - %6d.%02d -> %d.%02d\r\n",
+#ifdef VERBOSE
+ sirq_printf("background - %6u.%02u -> %u.%02u\r\n",
(uint32_t)(local / NSEC_PER_SEC),
(uint32_t)(local % NSEC_PER_SEC / 10000000),
(uint32_t)(world / NSEC_PER_SEC),
(uint32_t)(world % NSEC_PER_SEC / 10000000));
+#endif
}
/********
// Open serial ports
sirq_dbg = sirq_open(SIRQ_UART0, USBTX, USBRX, 115200); // to pc
- sirq_bbb = sirq_open(SIRQ_UART1, PTD3, PTD2, 115200); // to bbb
- sirq_mbed = sirq_open(SIRQ_UART2, PTE0, PTE1, 115200); // to mbed
+ sirq_bbb = sirq_open(SIRQ_UART1, PTE0, PTE1, 115200); // to bbb
+ sirq_mbed = sirq_open(SIRQ_UART2, PTD3, PTD2, 115200); // to mbed
// Setup timers