time accuracy finetuning
This commit is contained in:
parent
e156770fc3
commit
5f2d2d0dd5
@ -36,7 +36,7 @@ void irqHandler(void *pvParameters) {
|
||||
|
||||
// display needs refresh?
|
||||
#ifdef HAS_DISPLAY
|
||||
if (InterruptStatus & DISPLAY_IRQ)
|
||||
if (InterruptStatus & DISPLAY_IRQ)
|
||||
refreshtheDisplay();
|
||||
#endif
|
||||
|
||||
|
@ -53,7 +53,7 @@ void send_timesync_req() {
|
||||
"timesync_req", // name of task
|
||||
2048, // stack size of task
|
||||
(void *)1, // task parameter
|
||||
2, // priority of the task
|
||||
4, // priority of the task
|
||||
&timeSyncReqTask, // task handle
|
||||
1); // CPU core
|
||||
}
|
||||
@ -104,23 +104,26 @@ void process_timesync_req(void *taskparameter) {
|
||||
if (i < TIME_SYNC_SAMPLES - 1) {
|
||||
// wait until next cycle
|
||||
vTaskDelay(pdMS_TO_TICKS(TIME_SYNC_CYCLE * 1000));
|
||||
} else {
|
||||
// send flush to open a receive window for last time_sync_answer
|
||||
payload.reset();
|
||||
payload.addByte(0x99);
|
||||
SendPayload(RCMDPORT, prio_high);
|
||||
// Send a alive open a receive window for last time_sync_answer
|
||||
// void LMIC_sendAlive();
|
||||
} else { // before sending last time sample...
|
||||
// ...send flush to open a receive window for last time_sync_answer
|
||||
// payload.reset();
|
||||
// payload.addByte(0x99);
|
||||
// SendPayload(RCMDPORT, prio_high);
|
||||
// ...send a alive open a receive window for last time_sync_answer
|
||||
LMIC_sendAlive();
|
||||
}
|
||||
}
|
||||
} // for
|
||||
|
||||
// begin of time critical section: lock I2C bus to ensure accurate timing
|
||||
I2C_MUTEX_LOCK();
|
||||
|
||||
// average time offset from collected diffs
|
||||
time_offset_ms /= TIME_SYNC_SAMPLES;
|
||||
|
||||
// calculate time offset with millisecond precision using time base
|
||||
// of LMIC os, since we use LMIC's ostime_t txEnd as tx timestamp.
|
||||
// apply calibration factor for processing time
|
||||
// calculate time offset with millisecond precision using LMIC's time base,
|
||||
// since we use LMIC's ostime_t txEnd as tx timestamp.
|
||||
// Finally apply calibration const for processing time.
|
||||
time_offset_ms +=
|
||||
milliseconds(osticks2ms(os_getTime())) + milliseconds(TIME_SYNC_FIXUP);
|
||||
|
||||
@ -136,36 +139,31 @@ void process_timesync_req(void *taskparameter) {
|
||||
// adjust system time
|
||||
if (timeIsValid(time_to_set)) {
|
||||
|
||||
#ifdef HAS_RTC
|
||||
// get and lock access to i2c before we start time sync
|
||||
if (I2C_MUTEX_LOCK()) {
|
||||
#endif
|
||||
|
||||
// wait until top of second with 4ms precision
|
||||
time_to_set++; // advance time 1 sec wait time
|
||||
vTaskDelay(pdMS_TO_TICKS(1000 - time_to_set_fraction_msec));
|
||||
// wait until top of second with 4ms precision
|
||||
time_to_set++; // advance time 1 sec wait time
|
||||
vTaskDelay(pdMS_TO_TICKS(1000 - time_to_set_fraction_msec));
|
||||
|
||||
#ifdef HAS_RTC
|
||||
// set RTC time and, if he have, calibrate RTC_INT pulse on top of second
|
||||
set_rtctime(time_to_set, no_mutex);
|
||||
I2C_MUTEX_UNLOCK();
|
||||
} // release i2c bus access
|
||||
// set RTC time and calibrate RTC_INT pulse on top of second
|
||||
set_rtctime(time_to_set, no_mutex);
|
||||
#endif
|
||||
|
||||
#if (!defined GPS_INT && !defined RTC_INT)
|
||||
// sync pps timer to top of second
|
||||
// sync pps timer to top of second
|
||||
timerRestart(ppsIRQ); // reset pps timer
|
||||
CLOCKIRQ(); // fire clock pps
|
||||
#endif
|
||||
|
||||
setTime(time_to_set); // set the time on top of second
|
||||
|
||||
// end of time critical section: release I2C bus
|
||||
I2C_MUTEX_UNLOCK();
|
||||
|
||||
timeSource = _lora;
|
||||
timesyncer.attach(TIME_SYNC_INTERVAL * 60,
|
||||
timeSync); // set to regular repeat
|
||||
ESP_LOGI(TAG, "[%0.3f] Timesync finished, time was adjusted",
|
||||
millis() / 1000.0);
|
||||
|
||||
} else
|
||||
ESP_LOGW(TAG, "[%0.3f] Timesync failed, outdated time calculated",
|
||||
millis() / 1000.0);
|
||||
|
Loading…
Reference in New Issue
Block a user