From b7850e9cbf351efe0c0247fa4884ba2ec1c52cb3 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Tue, 31 Mar 2020 23:04:12 +0200 Subject: [PATCH] Report the firmware version in the devinfo event --- src/oceanic_atom2.c | 2 +- src/oceanic_common.c | 8 ++++++-- src/oceanic_common.h | 7 ++++--- src/oceanic_veo250.c | 2 +- src/oceanic_vtpro.c | 2 +- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c index dc7e751..ccad96c 100644 --- a/src/oceanic_atom2.c +++ b/src/oceanic_atom2.c @@ -910,7 +910,7 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, dc_iostream } // Detect the memory layout. - device->base.layout = OCEANIC_COMMON_MATCH(device->base.version, versions); + device->base.layout = OCEANIC_COMMON_MATCH(device->base.version, versions, &device->base.firmware); if (device->base.layout == NULL) { WARNING (context, "Unsupported device detected!"); if (memcmp(device->base.version + 12, "256K", 4) == 0) { diff --git a/src/oceanic_common.c b/src/oceanic_common.c index d65db1b..9a7c2e2 100644 --- a/src/oceanic_common.c +++ b/src/oceanic_common.c @@ -130,13 +130,16 @@ oceanic_common_match_pattern (const unsigned char *string, const unsigned char * } const oceanic_common_layout_t * -oceanic_common_match (const unsigned char *version, const oceanic_common_version_t patterns[], size_t n) +oceanic_common_match (const unsigned char *version, const oceanic_common_version_t patterns[], size_t n, unsigned int *firmware) { for (size_t i = 0; i < n; ++i) { unsigned int fw = 0; if (oceanic_common_match_pattern (version, patterns[i].pattern, &fw) && fw >= patterns[i].firmware) { + if (firmware) { + *firmware = fw; + } return patterns[i].layout; } } @@ -151,6 +154,7 @@ oceanic_common_device_init (oceanic_common_device_t *device) assert (device != NULL); // Set the default values. + device->firmware = 0; memset (device->version, 0, sizeof (device->version)); memset (device->fingerprint, 0, sizeof (device->fingerprint)); device->layout = NULL; @@ -608,7 +612,7 @@ oceanic_common_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac // Emit a device info event. dc_event_devinfo_t devinfo; devinfo.model = array_uint16_be (id + 8); - devinfo.firmware = 0; + devinfo.firmware = device->firmware; if (layout->pt_mode_serial == 0) devinfo.serial = bcd2dec (id[10]) * 10000 + bcd2dec (id[11]) * 100 + bcd2dec (id[12]); else if (layout->pt_mode_serial == 1) diff --git a/src/oceanic_common.h b/src/oceanic_common.h index 7a5bd43..915081e 100644 --- a/src/oceanic_common.h +++ b/src/oceanic_common.h @@ -31,9 +31,9 @@ extern "C" { #define PAGESIZE 0x10 #define FPMAXSIZE 0x20 -#define OCEANIC_COMMON_MATCH(version,patterns) \ +#define OCEANIC_COMMON_MATCH(version,patterns,firmware) \ oceanic_common_match ((version), (patterns), \ - sizeof (patterns) / sizeof *(patterns)) + sizeof (patterns) / sizeof *(patterns), (firmware)) typedef struct oceanic_common_layout_t { // Memory size. @@ -61,6 +61,7 @@ typedef struct oceanic_common_layout_t { typedef struct oceanic_common_device_t { dc_device_t base; + unsigned int firmware; unsigned char version[PAGESIZE]; unsigned char fingerprint[FPMAXSIZE]; const oceanic_common_layout_t *layout; @@ -80,7 +81,7 @@ typedef struct oceanic_common_version_t { } oceanic_common_version_t; const oceanic_common_layout_t * -oceanic_common_match (const unsigned char *version, const oceanic_common_version_t patterns[], size_t n); +oceanic_common_match (const unsigned char *version, const oceanic_common_version_t patterns[], size_t n, unsigned int *firmware); void oceanic_common_device_init (oceanic_common_device_t *device); diff --git a/src/oceanic_veo250.c b/src/oceanic_veo250.c index ae4512b..db323db 100644 --- a/src/oceanic_veo250.c +++ b/src/oceanic_veo250.c @@ -316,7 +316,7 @@ oceanic_veo250_device_open (dc_device_t **out, dc_context_t *context, dc_iostrea } // Detect the memory layout. - device->base.layout = OCEANIC_COMMON_MATCH(device->base.version, versions); + device->base.layout = OCEANIC_COMMON_MATCH(device->base.version, versions, &device->base.firmware); if (device->base.layout == NULL) { WARNING (context, "Unsupported device detected!"); device->base.layout = &oceanic_veo250_layout; diff --git a/src/oceanic_vtpro.c b/src/oceanic_vtpro.c index c05e4ca..22d61fd 100644 --- a/src/oceanic_vtpro.c +++ b/src/oceanic_vtpro.c @@ -493,7 +493,7 @@ oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, dc_iostream if (model == AERIS500AI) { device->base.layout = &aeris_500ai_layout; } else { - device->base.layout = OCEANIC_COMMON_MATCH(device->base.version, versions); + device->base.layout = OCEANIC_COMMON_MATCH(device->base.version, versions, &device->base.firmware); if (device->base.layout == NULL) { WARNING (context, "Unsupported device detected!"); device->base.layout = &oceanic_vtpro_layout;