retain telemetry across transport outages
This commit is contained in:
+20
-3
@@ -85,6 +85,18 @@ static void encode_header(uint8_t *output,
|
||||
put_u32_le(output + 32, 0);
|
||||
}
|
||||
|
||||
bool trikke_wire_timestamp_delta_fits(
|
||||
int64_t previous_timestamp_us,
|
||||
int64_t timestamp_us)
|
||||
{
|
||||
if (timestamp_us < previous_timestamp_us) {
|
||||
return false;
|
||||
}
|
||||
const uint64_t delta_us =
|
||||
(uint64_t)timestamp_us - (uint64_t)previous_timestamp_us;
|
||||
return delta_us <= TRIKKE_WIRE_MAX_TIMESTAMP_DELTA_US;
|
||||
}
|
||||
|
||||
size_t trikke_encode_metadata_packet(
|
||||
uint8_t *output,
|
||||
size_t output_size,
|
||||
@@ -159,12 +171,17 @@ size_t trikke_encode_sample_packet(
|
||||
i * TRIKKE_WIRE_SAMPLE_RECORD_SIZE;
|
||||
uint16_t timestamp_delta_10us = 0;
|
||||
if (i > 0) {
|
||||
const int64_t delta_us = samples[i].timestamp_us - previous_timestamp_us;
|
||||
if (delta_us < 0 || delta_us > (int64_t)UINT16_MAX * 10) {
|
||||
if (!trikke_wire_timestamp_delta_fits(
|
||||
previous_timestamp_us, samples[i].timestamp_us)) {
|
||||
timestamp_delta_10us = UINT16_MAX;
|
||||
packet_flags |= TRIKKE_PACKET_FLAG_TIMESTAMP_DELTA_SATURATED;
|
||||
} else {
|
||||
timestamp_delta_10us = (uint16_t)((delta_us + 5) / 10);
|
||||
const uint64_t delta_us =
|
||||
(uint64_t)samples[i].timestamp_us -
|
||||
(uint64_t)previous_timestamp_us;
|
||||
timestamp_delta_10us = (uint16_t)(
|
||||
(delta_us + TRIKKE_WIRE_TIMESTAMP_DELTA_UNIT_US / 2) /
|
||||
TRIKKE_WIRE_TIMESTAMP_DELTA_UNIT_US);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user