Commit e5807511 authored by rna's avatar rna
Browse files

~= clock sync

parent d6f46156
Loading
Loading
Loading
Loading
+14 −18
Original line number Diff line number Diff line
#include <sys/time.h>
#include <stdlib.h>
#include "../util/time.h"
#include "../util/common.h"
#include "clock.h"

@@ -19,50 +20,45 @@ prrtTimestamp_t PrrtClock_get_prrt_time_us(PrrtClock *clock)
        prrtTimestamp_t lastMeasurement = clock->lastMeasurement;
        prrtTimeDifference_t diff = diff_abs_ts(currentTime, lastMeasurement);
        prrtTimeDifference_t skew = (diff * clock->skew) / 400;
        return (prrtTimestamp_t) virtualTime + clock->meanDeviation + skew;
        return (prrtTimestamp_t) (virtualTime + clock->meanDeviation + skew);
    } else {
        return currentTime;
    }
}


bool PrrtClock_update(PrrtClock *clock, uint32_t referenceTime, uint32_t rtt)
bool PrrtClock_update(PrrtClock *clock, uint32_t referenceTime, uint32_t propagation_delay)
{
    prrtTimestamp_t virtualTime = PrrtClock_get_prrt_time_us(clock);
    prrtTimestamp_t currentTime = PrrtClock_get_current_time_us();
    prrtTimestamp_t virtualTime = clock->virtualTime;
    prrtTimeDifference_t clockSkew = clock->skew;
    prrtTimedelta_t delay = rtt/2; // half the rtt
    prrtTimeDifference_t phaseError = referenceTime - virtualTime + delay;
    //printf("V: %13u, C: %13u, S: %13d, R: %13u, E: %13d, D: %3u L: %u\n", virtualTime, currentTime, clockSkew, referenceTime, phaseError, delay, clock->lastMeasurement);
    int64_t clockSkew = clock->skew;
    prrtTimedelta_t delay = propagation_delay / 2; // half the rtt
    int64_t phaseError = PrrtTimestamp_cmp(referenceTime, virtualTime) + delay;
    //printf("V: %13u, C: %13u, S: %13d, R: %13u, E: %13ld, D: %3u L: %u\n", virtualTime, currentTime, clockSkew, referenceTime, phaseError, delay, clock->lastMeasurement);

    if(abs(phaseError) > 10000) {
    if(labs(phaseError) > 10000) {
        clock->meanDeviation = 0;
        clock->skew = 0;
        clock->lastMeasurement = currentTime;
        clock->virtualTime = currentTime;
    }

    prrtTimeDifference_t deviationSum = (prrtTimeDifference_t) (phaseError + 3 * clock->meanDeviation); // TODO: why 3?
    int64_t deviationSum =(phaseError + 3 * clock->meanDeviation); // TODO: why 3?
    prrtTimeDifference_t meanDeviation = (prrtTimeDifference_t) (deviationSum / 4); // TODO: find out why???
    prrtTimeDifference_t period = diff_abs_ts(currentTime, clock->lastMeasurement);
    int64_t period = PrrtTimestamp_cmp(currentTime, clock->lastMeasurement);

    if(period > 0) {
        clockSkew = (meanDeviation / period) + 15 * clock->skew;
        clockSkew = (prrtTimeDifference_t) (clockSkew / 16);
    }

    virtualTime = virtualTime + meanDeviation + period * clockSkew / 400;
    virtualTime = clock->virtualTime + meanDeviation + period * clockSkew / 400;

    clock->meanDeviation = meanDeviation;
    clock->skew = clockSkew;
    clock->skew = (prrtTimeDifference_t) clockSkew;
    clock->lastMeasurement = currentTime;
    clock->virtualTime = virtualTime;

    if(abs(phaseError) > 10000) {
        clock->virtualTime = currentTime;
    }

    //printf("V: %13u, C: %13u; S: %13d; M: %13d, P:%13u\n", virtualTime, currentTime, clockSkew, meanDeviation, period);
    //printf("V: %13u, C: %13u; S: %13d; M: %13d, P:%13u\n\n", virtualTime, currentTime, clockSkew, meanDeviation, period);
    return true;
}

+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ prrtTimestamp_t PrrtClock_get_current_time_us(void);

prrtTimestamp_t PrrtClock_get_prrt_time_us(PrrtClock *clock);

bool PrrtClock_update(PrrtClock *clock, prrtTimestamp_t referenceTime, prrtTimedelta_t rtt);
bool PrrtClock_update(PrrtClock *clock, prrtTimestamp_t referenceTime, prrtTimedelta_t propagation_delay);

#define diff_abs_ts(timeA, timeB) (prrtTimeDifference_t) abs(((prrtTimeDifference_t) timeA) - ((prrtTimeDifference_t)timeB))

+4 −0
Original line number Diff line number Diff line
@@ -129,6 +129,10 @@ int main(int argc, char **argv) {
        buffer[n] = '\0';
        unsigned int seqno;
        sscanf(buffer, "%u", &seqno);
        prrtTimestamp_t current_time = PrrtClock_get_current_time_us();
        prrtTimestamp_t prrt_time = PrrtClock_get_prrt_time_us(&s->clock);
        printf("C: %d\nP: %d\nD: \n%d\n\n", current_time, prrt_time, prrt_time - current_time);

        debug(DEBUG_RECEIVER, "[B (n: %3d, i: %3d)] %s", n, i, buffer);
        i++;
    }