Fix the clock synchronization

For dives with a timestamp that is larger than the current device time
(e.g. in the future), the clock synchronization produces incorrect
values. In that case, the time difference suddenly becomes negative,
which corresponds to a large positive value as an unsigned integer.

Under normal circumstances, this scenario can't happen. But sometimes
actions such as battery replacements or firmware upgrades can cause the
internal clock to reset.

The Reefnet devices shouldn't need this fix, because their internal
clock can't be changed, but it doesn't hurt either.
This commit is contained in:
Jef Driesen 2022-06-21 21:07:42 +02:00
parent e6f091909b
commit be5bb9e690
4 changed files with 24 additions and 4 deletions

View File

@ -133,7 +133,12 @@ reefnet_sensus_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *dateti
unsigned int timestamp = array_uint32_le (abstract->data + 2);
dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp);
dc_ticks_t ticks = parser->systime;
if (timestamp < parser->devtime) {
ticks -= parser->devtime - timestamp;
} else {
ticks += timestamp - parser->devtime;
}
if (!dc_datetime_localtime (datetime, ticks))
return DC_STATUS_DATAFORMAT;

View File

@ -132,7 +132,12 @@ reefnet_sensuspro_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *dat
unsigned int timestamp = array_uint32_le (abstract->data + 6);
dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp);
dc_ticks_t ticks = parser->systime;
if (timestamp < parser->devtime) {
ticks -= parser->devtime - timestamp;
} else {
ticks += timestamp - parser->devtime;
}
if (!dc_datetime_localtime (datetime, ticks))
return DC_STATUS_DATAFORMAT;

View File

@ -132,7 +132,12 @@ reefnet_sensusultra_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *d
unsigned int timestamp = array_uint32_le (abstract->data + 4);
dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp);
dc_ticks_t ticks = parser->systime;
if (timestamp < parser->devtime) {
ticks -= parser->devtime - timestamp;
} else {
ticks += timestamp - parser->devtime;
}
if (!dc_datetime_localtime (datetime, ticks))
return DC_STATUS_DATAFORMAT;

View File

@ -96,7 +96,12 @@ uwatec_memomouse_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *date
unsigned int timestamp = array_uint32_le (abstract->data + 11);
dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp) / 2;
dc_ticks_t ticks = parser->systime;
if (timestamp < parser->devtime) {
ticks -= (parser->devtime - timestamp) / 2;
} else {
ticks += (timestamp - parser->devtime) / 2;
}
if (!dc_datetime_localtime (datetime, ticks))
return DC_STATUS_DATAFORMAT;