diff --git a/src/suunto_common2.c b/src/suunto_common2.c index 35d652e..7f519b2 100644 --- a/src/suunto_common2.c +++ b/src/suunto_common2.c @@ -51,6 +51,7 @@ suunto_common2_device_init (suunto_common2_device_t *device, dc_context_t *conte // Set the default values. device->layout = NULL; + memset (device->version, 0, sizeof (device->version)); memset (device->fingerprint, 0, sizeof (device->fingerprint)); } @@ -236,24 +237,12 @@ suunto_common2_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac // Enable progress notifications. dc_event_progress_t progress = EVENT_PROGRESS_INITIALIZER; progress.maximum = layout->rb_profile_end - layout->rb_profile_begin + - 8 + SZ_VERSION + (SZ_MINIMUM > 4 ? SZ_MINIMUM : 4); - device_event_emit (abstract, DC_EVENT_PROGRESS, &progress); - - // Read the version info. - unsigned char version[SZ_VERSION] = {0}; - dc_status_t rc = suunto_common2_device_version (abstract, version, sizeof (version)); - if (rc != DC_STATUS_SUCCESS) { - ERROR (abstract->context, "Failed to read the memory header."); - return rc; - } - - // Update and emit a progress event. - progress.current += sizeof (version); + 8 + (SZ_MINIMUM > 4 ? SZ_MINIMUM : 4); device_event_emit (abstract, DC_EVENT_PROGRESS, &progress); // Read the serial number. unsigned char serial[SZ_MINIMUM > 4 ? SZ_MINIMUM : 4] = {0}; - rc = suunto_common2_device_read (abstract, layout->serial, serial, sizeof (serial)); + dc_status_t rc = suunto_common2_device_read (abstract, layout->serial, serial, sizeof (serial)); if (rc != DC_STATUS_SUCCESS) { ERROR (abstract->context, "Failed to read the memory header."); return rc; @@ -265,8 +254,8 @@ suunto_common2_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac // Emit a device info event. dc_event_devinfo_t devinfo; - devinfo.model = version[0]; - devinfo.firmware = array_uint24_be (version + 1); + devinfo.model = device->version[0]; + devinfo.firmware = array_uint24_be (device->version + 1); devinfo.serial = array_uint32_be (serial); device_event_emit (abstract, DC_EVENT_DEVINFO, &devinfo); diff --git a/src/suunto_common2.h b/src/suunto_common2.h index c77f818..693398e 100644 --- a/src/suunto_common2.h +++ b/src/suunto_common2.h @@ -41,6 +41,7 @@ typedef struct suunto_common2_layout_t { typedef struct suunto_common2_device_t { dc_device_t base; const suunto_common2_layout_t *layout; + unsigned char version[4]; unsigned char fingerprint[7]; } suunto_common2_device_t; diff --git a/src/suunto_d9.c b/src/suunto_d9.c index 5fd008b..9f43448 100644 --- a/src/suunto_d9.c +++ b/src/suunto_d9.c @@ -45,7 +45,6 @@ typedef struct suunto_d9_device_t { suunto_common2_device_t base; serial_t *port; - unsigned char version[4]; } suunto_d9_device_t; static dc_status_t suunto_d9_device_packet (dc_device_t *abstract, const unsigned char command[], unsigned int csize, unsigned char answer[], unsigned int asize, unsigned int size); @@ -114,7 +113,7 @@ suunto_d9_device_autodetect (suunto_d9_device_t *device, unsigned int model) } // Try reading the version info. - status = suunto_common2_device_version ((dc_device_t *) device, device->version, sizeof (device->version)); + status = suunto_common2_device_version ((dc_device_t *) device, device->base.version, sizeof (device->base.version)); if (status == DC_STATUS_SUCCESS) break; } @@ -141,7 +140,6 @@ suunto_d9_device_open (dc_device_t **out, dc_context_t *context, const char *nam // Set the default values. device->port = NULL; - memset (device->version, 0, sizeof (device->version)); // Open the device. int rc = serial_open (&device->port, context, name); @@ -192,7 +190,7 @@ suunto_d9_device_open (dc_device_t **out, dc_context_t *context, const char *nam } // Override the base class values. - model = device->version[0]; + model = device->base.version[0]; if (model == D4i || model == D6i || model == D9tx) device->base.layout = &suunto_d9tx_layout; else diff --git a/src/suunto_vyper2.c b/src/suunto_vyper2.c index 2cc32f9..01ff2c2 100644 --- a/src/suunto_vyper2.c +++ b/src/suunto_vyper2.c @@ -134,6 +134,15 @@ suunto_vyper2_device_open (dc_device_t **out, dc_context_t *context, const char // Enable half-duplex emulation. serial_set_halfduplex (device->port, 1); + // Read the version info. + dc_status_t status = suunto_common2_device_version ((dc_device_t *) device, device->base.version, sizeof (device->base.version)); + if (status != DC_STATUS_SUCCESS) { + ERROR (context, "Failed to read the version info."); + serial_close (device->port); + free (device); + return status; + } + // Override the base class values. device->base.layout = &suunto_vyper2_layout;