123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #include <AP_HAL/AP_HAL.h>
- #include "JitterCorrection.h"
- JitterCorrection::JitterCorrection(uint16_t _max_lag_ms, uint16_t _convergence_loops) :
- max_lag_ms(_max_lag_ms),
- convergence_loops(_convergence_loops)
- {}
- uint64_t JitterCorrection::correct_offboard_timestamp_usec(uint64_t offboard_usec, uint64_t local_usec)
- {
- int64_t diff_us = int64_t(local_usec) - int64_t(offboard_usec);
- if (!initialised ||
- diff_us < link_offset_usec) {
-
-
-
-
- link_offset_usec = diff_us;
- initialised = true;
- }
- int64_t estimate_us = offboard_usec + link_offset_usec;
- if (estimate_us + (max_lag_ms*1000U) < int64_t(local_usec)) {
-
-
- estimate_us = local_usec - (max_lag_ms*1000U);
- link_offset_usec = estimate_us - offboard_usec;
- }
- if (min_sample_counter == 0) {
- min_sample_us = diff_us;
- }
- min_sample_counter++;
- if (diff_us < min_sample_us) {
- min_sample_us = diff_us;
- }
- if (min_sample_counter == convergence_loops) {
-
-
-
- link_offset_usec = min_sample_us;
- min_sample_counter = 0;
- }
-
- return uint64_t(estimate_us);
- }
- uint32_t JitterCorrection::correct_offboard_timestamp_msec(uint32_t offboard_ms, uint32_t local_ms)
- {
- return correct_offboard_timestamp_usec(offboard_ms*1000ULL, local_ms*1000ULL) / 1000ULL;
- }
|