From 927362354d07df1b683e38d4158f3723ef89e391 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Tue, 13 Jul 2021 22:45:40 +0200 Subject: [PATCH] Some more fixes for the new Mares Genius firmware The changes in commit 5cb527d53ca88ac692beb55288172fc1003975fa to support the new Mares Genius firmware v01.02.00 were incomplete. For dives recorded prior to the firmware upgrade, only the header version changed from 0.0 to 1.1, while the profile version remained the same. But for dives recorded after the firmware upgrade, the profile version also changed from 0.2 to 1.0. The known header and profile object versions (indicated as type.major.minor) are now: Model | Firmware | Header | Profile ========|==========|========|========= Genius | 1.0.x | 1.0.0 | 0.0.2 Genius | 1.2.0 | 1.1.1 | 0.1.0 Horizon | 1.7.28 | 1.0.1 | 1.0.2 To simplify the object version check, all versions below a certain upper limit are now considered supported. --- src/mares_iconhd_parser.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mares_iconhd_parser.c b/src/mares_iconhd_parser.c index b518da6..34d39c7 100644 --- a/src/mares_iconhd_parser.c +++ b/src/mares_iconhd_parser.c @@ -31,6 +31,10 @@ #define ISINSTANCE(parser) dc_parser_isinstance((parser), &mares_iconhd_parser_vtable) +#define OBJVERSION(major,minor) ( \ + (((major) & 0xFF) << 8) | \ + ((minor) & 0xFF)) + #define SMART 0x000010 #define SMARTAPNEA 0x010010 #define ICONHD 0x14 @@ -374,7 +378,7 @@ mares_genius_cache (mares_iconhd_parser_t *parser) unsigned int type = array_uint16_le (data); unsigned int minor = data[2]; unsigned int major = data[3]; - if (type != 1 || major > 1 || minor > 1) { + if (type != 1 || OBJVERSION(major,minor) > OBJVERSION(1,1)) { ERROR (abstract->context, "Unsupported object type (%u) or version (%u.%u).", type, major, minor); return DC_STATUS_DATAFORMAT; @@ -875,7 +879,9 @@ mares_iconhd_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t unsigned int type = array_uint16_le (data); unsigned int minor = data[2]; unsigned int major = data[3]; - if (type > 1 || major != 0 || minor != 2) { + if (type > 1 || + (type == 0 && OBJVERSION(major,minor) > OBJVERSION(1,0)) || + (type == 1 && OBJVERSION(major,minor) > OBJVERSION(0,2))) { ERROR (abstract->context, "Unsupported object type (%u) or version (%u.%u).", type, major, minor); return DC_STATUS_DATAFORMAT;