Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
LARN
PRRT
Commits
e5807511
Commit
e5807511
authored
Nov 16, 2018
by
rna
Browse files
~= clock sync
parent
d6f46156
Changes
3
Hide whitespace changes
Inline
Side-by-side
prrt/proto/clock.c
View file @
e5807511
#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
(
l
abs
(
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
;
}
...
...
prrt/proto/clock.h
View file @
e5807511
...
...
@@ -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))
...
...
prrt/receiver.c
View file @
e5807511
...
...
@@ -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
\n
P: %d
\n
D:
\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
++
;
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment