Report the firmware version in the devinfo event

This commit is contained in:
Jef Driesen 2020-03-31 23:04:12 +02:00
parent 50f3ba3189
commit b7850e9cbf
5 changed files with 13 additions and 8 deletions

View File

@ -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) {

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -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;