From 6b09bdb7ef5e663389ebe11b09ddbf78dc5dd381 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Fri, 26 Feb 2010 14:40:58 +0000 Subject: [PATCH] Autodetect the Mares Nemo Air. --- src/mares_puck.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/mares_puck.c b/src/mares_puck.c index 70b3b87..f0edc35 100644 --- a/src/mares_puck.c +++ b/src/mares_puck.c @@ -68,6 +68,14 @@ static const mares_common_layout_t mares_puck_layout = { 0x4000 /* rb_freedives_end */ }; +static const mares_common_layout_t mares_nemoair_layout = { + 0x8000, /* memsize */ + 0x0070, /* rb_profile_begin */ + 0x8000, /* rb_profile_end */ + 0x8000, /* rb_freedives_begin */ + 0x8000 /* rb_freedives_end */ +}; + static int device_is_mares_puck (device_t *abstract) { @@ -94,9 +102,6 @@ mares_puck_device_open (device_t **out, const char* name) // Initialize the base class. mares_common_device_init (&device->base, &mares_puck_device_backend); - // Override the base class values. - device->base.layout = &mares_puck_layout; - // Set the default values. device->port = NULL; @@ -134,6 +139,21 @@ mares_puck_device_open (device_t **out, const char* name) return DEVICE_STATUS_IO; } + // Identify the model number. + unsigned char header[PACKETSIZE] = {0}; + device_status_t status = mares_puck_device_read ((device_t *) device, 0, header, sizeof (header)); + if (status != DEVICE_STATUS_SUCCESS) { + serial_close (device->port); + free (device); + return status; + } + + // Override the base class values. + if (header[1] == 4) + device->base.layout = &mares_nemoair_layout; + else + device->base.layout = &mares_puck_layout; + *out = (device_t*) device; return DEVICE_STATUS_SUCCESS; @@ -377,7 +397,7 @@ mares_puck_device_foreach (device_t *abstract, dive_callback_t callback, void *u // Emit a device info event. unsigned char *data = dc_buffer_get_data (buffer); device_devinfo_t devinfo; - devinfo.model = 0; + devinfo.model = data[1]; devinfo.firmware = 0; devinfo.serial = array_uint16_be (data + 8); device_event_emit (abstract, DEVICE_EVENT_DEVINFO, &devinfo); @@ -398,7 +418,14 @@ mares_puck_extract_dives (device_t *abstract, const unsigned char data[], unsign if (abstract && !device_is_mares_puck (abstract)) return DEVICE_STATUS_TYPE_MISMATCH; - const mares_common_layout_t *layout = &mares_puck_layout; + if (size < PACKETSIZE) + return DEVICE_STATUS_ERROR; + + const mares_common_layout_t *layout = NULL; + if (data[1] == 4) + layout = &mares_nemoair_layout; + else + layout = &mares_puck_layout; if (size < layout->memsize) return DEVICE_STATUS_ERROR;