From be5bb9e690fb5288164caa532493c100b441929d Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Tue, 21 Jun 2022 21:07:42 +0200 Subject: [PATCH] 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. --- src/reefnet_sensus_parser.c | 7 ++++++- src/reefnet_sensuspro_parser.c | 7 ++++++- src/reefnet_sensusultra_parser.c | 7 ++++++- src/uwatec_memomouse_parser.c | 7 ++++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/reefnet_sensus_parser.c b/src/reefnet_sensus_parser.c index 50fd69e..35fb952 100644 --- a/src/reefnet_sensus_parser.c +++ b/src/reefnet_sensus_parser.c @@ -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; diff --git a/src/reefnet_sensuspro_parser.c b/src/reefnet_sensuspro_parser.c index 7e68a72..c303ee9 100644 --- a/src/reefnet_sensuspro_parser.c +++ b/src/reefnet_sensuspro_parser.c @@ -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; diff --git a/src/reefnet_sensusultra_parser.c b/src/reefnet_sensusultra_parser.c index 8aaacca..bad5450 100644 --- a/src/reefnet_sensusultra_parser.c +++ b/src/reefnet_sensusultra_parser.c @@ -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; diff --git a/src/uwatec_memomouse_parser.c b/src/uwatec_memomouse_parser.c index f36dc6c..386e984 100644 --- a/src/uwatec_memomouse_parser.c +++ b/src/uwatec_memomouse_parser.c @@ -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;