timesync fixes
This commit is contained in:
parent
8f79011366
commit
fe0ef13b1f
@ -6,10 +6,10 @@
|
|||||||
#include "timesync.h"
|
#include "timesync.h"
|
||||||
#include "timekeeper.h"
|
#include "timekeeper.h"
|
||||||
|
|
||||||
#define TIME_SYNC_SAMPLES 3 // number of time requests for averaging
|
#define TIME_SYNC_SAMPLES 5 // number of time requests for averaging
|
||||||
#define TIME_SYNC_CYCLE 20 // seconds between two time requests
|
#define TIME_SYNC_CYCLE 60 // seconds between two time requests
|
||||||
#define TIME_SYNC_TIMEOUT 120 // timeout seconds waiting for timeserver answer
|
#define TIME_SYNC_TIMEOUT 120 // timeout seconds waiting for timeserver answer
|
||||||
#define TIME_SYNC_TRIGGER 1 // time deviation threshold triggering time sync
|
#define TIME_SYNC_TRIGGER 100 // time deviation in millisec triggering a time sync
|
||||||
#define TIME_SYNC_FRAME_LENGTH 0x06 // timeserver answer frame length
|
#define TIME_SYNC_FRAME_LENGTH 0x06 // timeserver answer frame length
|
||||||
|
|
||||||
void send_timesync_req(void);
|
void send_timesync_req(void);
|
||||||
|
@ -13,6 +13,8 @@ algorithm in applications without granted license by the patent holder.
|
|||||||
|
|
||||||
#include "timesync.h"
|
#include "timesync.h"
|
||||||
|
|
||||||
|
using namespace std::chrono;
|
||||||
|
|
||||||
// Local logging tag
|
// Local logging tag
|
||||||
static const char TAG[] = __FILE__;
|
static const char TAG[] = __FILE__;
|
||||||
|
|
||||||
@ -73,8 +75,7 @@ void recv_timesync_ans(uint8_t buf[], uint8_t buf_len) {
|
|||||||
timestamp_sec = (tmp_sec <<= 8) |= buf[i];
|
timestamp_sec = (tmp_sec <<= 8) |= buf[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
time_sync_rx[k] += std::chrono::seconds(timestamp_sec) +
|
time_sync_rx[k] += seconds(timestamp_sec) + milliseconds(timestamp_msec);
|
||||||
std::chrono::milliseconds(timestamp_msec);
|
|
||||||
|
|
||||||
ESP_LOGD(TAG, "Timesync request #%d rcvd at %d", seq_no,
|
ESP_LOGD(TAG, "Timesync request #%d rcvd at %d", seq_no,
|
||||||
myClock::to_time_t(time_sync_rx[k]));
|
myClock::to_time_t(time_sync_rx[k]));
|
||||||
@ -87,9 +88,9 @@ void recv_timesync_ans(uint8_t buf[], uint8_t buf_len) {
|
|||||||
// task for sending time sync requests
|
// task for sending time sync requests
|
||||||
void process_timesync_req(void *taskparameter) {
|
void process_timesync_req(void *taskparameter) {
|
||||||
|
|
||||||
time_t time_to_set = 0;
|
|
||||||
uint8_t k = 0, i = 0;
|
uint8_t k = 0, i = 0;
|
||||||
uint32_t seq_no = 0;
|
uint32_t seq_no = 0;
|
||||||
|
// milliseconds time_offset(0);
|
||||||
auto time_offset = myClock_msecTick::zero();
|
auto time_offset = myClock_msecTick::zero();
|
||||||
|
|
||||||
// enqueue timestamp samples in lora sendqueue
|
// enqueue timestamp samples in lora sendqueue
|
||||||
@ -115,9 +116,9 @@ void process_timesync_req(void *taskparameter) {
|
|||||||
else { // calculate time diff from collected timestamps
|
else { // calculate time diff from collected timestamps
|
||||||
k = seq_no % TIME_SYNC_SAMPLES;
|
k = seq_no % TIME_SYNC_SAMPLES;
|
||||||
|
|
||||||
auto t_tx = std::chrono::time_point_cast<std::chrono::milliseconds>(
|
auto t_tx = time_point_cast<milliseconds>(
|
||||||
time_sync_tx[k]); // timepoint when node TX_completed
|
time_sync_tx[k]); // timepoint when node TX_completed
|
||||||
auto t_rx = std::chrono::time_point_cast<std::chrono::milliseconds>(
|
auto t_rx = time_point_cast<milliseconds>(
|
||||||
time_sync_rx[k]); // timepoint when message was seen on gateway
|
time_sync_rx[k]); // timepoint when message was seen on gateway
|
||||||
|
|
||||||
time_offset += t_rx - t_tx; // cumulate timepoint diffs
|
time_offset += t_rx - t_tx; // cumulate timepoint diffs
|
||||||
@ -129,27 +130,27 @@ void process_timesync_req(void *taskparameter) {
|
|||||||
|
|
||||||
// calculate time offset from collected diffs and set time if necessary
|
// calculate time offset from collected diffs and set time if necessary
|
||||||
time_offset /= TIME_SYNC_SAMPLES;
|
time_offset /= TIME_SYNC_SAMPLES;
|
||||||
|
|
||||||
ESP_LOGD(TAG, "Avg time diff: %lldms", time_offset.count());
|
ESP_LOGD(TAG, "Avg time diff: %lldms", time_offset.count());
|
||||||
|
|
||||||
if (abs(time_offset.count()) >= TIME_SYNC_TRIGGER) {
|
if (abs(time_offset.count()) >= TIME_SYNC_TRIGGER) { // milliseconds threshold
|
||||||
|
|
||||||
/*
|
time_t const time_to_set = now() + 1 + time_offset.count() / 1000;
|
||||||
// wait until top of second
|
|
||||||
if (time_offset_ms > 0) // clock is fast
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(time_diff_ms));
|
|
||||||
else if (time_offset_ms < 0) // clock is slow
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(1000 + time_offset_ms));
|
|
||||||
|
|
||||||
time_to_set = t - time_t(time_offset_sec + 1);
|
|
||||||
*/
|
|
||||||
|
|
||||||
time_t time_to_set = myClock::to_time_t(myClock::now() + time_offset);
|
|
||||||
ESP_LOGD(TAG, "New UTC epoch time: %d", time_to_set);
|
ESP_LOGD(TAG, "New UTC epoch time: %d", time_to_set);
|
||||||
|
|
||||||
// adjust system time
|
// adjust system time
|
||||||
if (timeIsValid(time_to_set)) {
|
if (timeIsValid(time_to_set)) {
|
||||||
|
|
||||||
|
// wait until top of second
|
||||||
|
uint16_t const time_offset_msec = time_offset.count() % 1000;
|
||||||
|
ESP_LOGD(TAG, "waiting %dms", 1000 - time_offset_msec);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000 - time_offset_msec));
|
||||||
|
|
||||||
|
// sync timer pps to top of second
|
||||||
|
if (ppsIRQ)
|
||||||
|
timerRestart(ppsIRQ);
|
||||||
|
|
||||||
setTime(time_to_set);
|
setTime(time_to_set);
|
||||||
SyncToPPS();
|
|
||||||
timeSource = _lora;
|
timeSource = _lora;
|
||||||
timesyncer.attach(TIME_SYNC_INTERVAL * 60,
|
timesyncer.attach(TIME_SYNC_INTERVAL * 60,
|
||||||
timeSync); // set to regular repeat
|
timeSync); // set to regular repeat
|
||||||
@ -170,9 +171,7 @@ finish:
|
|||||||
void store_time_sync_req(time_t t_sec, uint32_t t_microsec) {
|
void store_time_sync_req(time_t t_sec, uint32_t t_microsec) {
|
||||||
|
|
||||||
uint8_t k = time_sync_seqNo % TIME_SYNC_SAMPLES;
|
uint8_t k = time_sync_seqNo % TIME_SYNC_SAMPLES;
|
||||||
|
time_sync_tx[k] += seconds(t_sec) + microseconds(t_microsec);
|
||||||
time_sync_tx[k] +=
|
|
||||||
std::chrono::seconds(t_sec) + std::chrono::microseconds(t_microsec);
|
|
||||||
|
|
||||||
ESP_LOGD(TAG, "Timesync request #%d sent at %d", time_sync_seqNo,
|
ESP_LOGD(TAG, "Timesync request #%d sent at %d", time_sync_seqNo,
|
||||||
myClock::to_time_t(time_sync_tx[k]));
|
myClock::to_time_t(time_sync_tx[k]));
|
||||||
|
Loading…
Reference in New Issue
Block a user