From ca56b5932a4c3c1d52c0394a01e31c2767ea0c07 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Sat, 31 Dec 2011 06:44:24 +0100 Subject: [PATCH] Add support for the Mares Darwin. The Darwin and Darwin Air share a very similar layout, but with a few differences here and there. Unfortunately, there seems to be no way to autodetect the exact model during the download. Therefore, an extra model parameter is added to select the appropriate model manually. --- examples/mares_darwinair_test.c | 2 +- examples/universal.c | 4 ++-- src/mares_darwinair.c | 24 +++++++++++++++++++++--- src/mares_darwinair.h | 4 ++-- src/mares_darwinair_parser.c | 33 +++++++++++++++++++++++++-------- 5 files changed, 51 insertions(+), 16 deletions(-) diff --git a/examples/mares_darwinair_test.c b/examples/mares_darwinair_test.c index 693458c..f331262 100644 --- a/examples/mares_darwinair_test.c +++ b/examples/mares_darwinair_test.c @@ -32,7 +32,7 @@ test_dump_memory (const char* name, const char* filename) device_t *device = NULL; message ("mares_darwinair_device_open\n"); - device_status_t rc = mares_darwinair_device_open (&device, name); + device_status_t rc = mares_darwinair_device_open (&device, name, 0); if (rc != DEVICE_STATUS_SUCCESS) { WARNING ("Error opening serial port."); return rc; diff --git a/examples/universal.c b/examples/universal.c index b83407f..d65d951 100644 --- a/examples/universal.c +++ b/examples/universal.c @@ -336,7 +336,7 @@ doparse (FILE *fp, device_data_t *devdata, const unsigned char data[], unsigned rc = mares_nemo_parser_create (&parser, devdata->devinfo.model); break; case DEVICE_TYPE_MARES_DARWINAIR: - rc = mares_darwinair_parser_create (&parser); + rc = mares_darwinair_parser_create (&parser, devdata->devinfo.model); break; case DEVICE_TYPE_MARES_ICONHD: rc = mares_iconhd_parser_create (&parser, devdata->devinfo.model); @@ -635,7 +635,7 @@ dowork (device_type_t backend, const char *devname, const char *rawfile, const c rc = mares_puck_device_open (&device, devname); break; case DEVICE_TYPE_MARES_DARWINAIR: - rc = mares_darwinair_device_open (&device, devname); + rc = mares_darwinair_device_open (&device, devname, 0); break; case DEVICE_TYPE_MARES_ICONHD: rc = mares_iconhd_device_open (&device, devname); diff --git a/src/mares_darwinair.c b/src/mares_darwinair.c index 7f31b51..5129834 100644 --- a/src/mares_darwinair.c +++ b/src/mares_darwinair.c @@ -30,6 +30,9 @@ #include "utils.h" #include "array.h" +#define DARWIN 0 +#define DARWINAIR 1 + typedef struct mares_darwinair_layout_t { // Memory size. unsigned int memsize; @@ -47,6 +50,7 @@ typedef struct mares_darwinair_layout_t { typedef struct mares_darwinair_device_t { mares_common_device_t base; const mares_darwinair_layout_t *layout; + unsigned int model; unsigned char fingerprint[6]; } mares_darwinair_device_t; @@ -66,6 +70,16 @@ static const device_backend_t mares_darwinair_device_backend = { mares_darwinair_device_close /* close */ }; +static const mares_darwinair_layout_t mares_darwin_layout = { + 0x4000, /* memsize */ + 0x0100, /* rb_logbook_offset */ + 52, /* rb_logbook_size */ + 50, /* rb_logbook_count */ + 0x0B30, /* rb_profile_begin */ + 0x4000, /* rb_profile_end */ + 2 /* samplesize */ +}; + static const mares_darwinair_layout_t mares_darwinair_layout = { 0x4000, /* memsize */ 0x0100, /* rb_logbook_offset */ @@ -86,7 +100,7 @@ device_is_mares_darwinair (device_t *abstract) } device_status_t -mares_darwinair_device_open (device_t **out, const char* name) +mares_darwinair_device_open (device_t **out, const char* name, unsigned int model) { if (out == NULL) return DEVICE_STATUS_ERROR; @@ -103,7 +117,11 @@ mares_darwinair_device_open (device_t **out, const char* name) // Set the default values. memset (device->fingerprint, 0, sizeof (device->fingerprint)); - device->layout = &mares_darwinair_layout; + device->model = model; + if (model == DARWINAIR) + device->layout = &mares_darwinair_layout; + else + device->layout = &mares_darwin_layout; // Open the device. int rc = serial_open (&device->base.port, name); @@ -224,7 +242,7 @@ mares_darwinair_device_foreach (device_t *abstract, dive_callback_t callback, vo // Emit a device info event. unsigned char *data = dc_buffer_get_data (buffer); device_devinfo_t devinfo; - devinfo.model = 0; + devinfo.model = device->model; devinfo.firmware = 0; devinfo.serial = array_uint16_be (data + 8); device_event_emit (abstract, DEVICE_EVENT_DEVINFO, &devinfo); diff --git a/src/mares_darwinair.h b/src/mares_darwinair.h index dba8d41..12ac5fc 100644 --- a/src/mares_darwinair.h +++ b/src/mares_darwinair.h @@ -30,13 +30,13 @@ extern "C" { #endif /* __cplusplus */ device_status_t -mares_darwinair_device_open (device_t **device, const char *name); +mares_darwinair_device_open (device_t **device, const char *name, unsigned int model); device_status_t mares_darwinair_extract_dives (device_t *device, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata); parser_status_t -mares_darwinair_parser_create (parser_t **parser); +mares_darwinair_parser_create (parser_t **parser, unsigned int model); #ifdef __cplusplus } diff --git a/src/mares_darwinair_parser.c b/src/mares_darwinair_parser.c index 7708f84..c3c949e 100644 --- a/src/mares_darwinair_parser.c +++ b/src/mares_darwinair_parser.c @@ -28,12 +28,15 @@ #include "utils.h" #include "array.h" -#define HEADERSIZE 60 +#define DARWIN 0 +#define DARWINAIR 1 typedef struct mares_darwinair_parser_t mares_darwinair_parser_t; struct mares_darwinair_parser_t { parser_t base; + unsigned int headersize; + unsigned int samplesize; }; static parser_status_t mares_darwinair_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size); @@ -63,7 +66,7 @@ parser_is_mares_darwinair (parser_t *abstract) parser_status_t -mares_darwinair_parser_create (parser_t **out) +mares_darwinair_parser_create (parser_t **out, unsigned int model) { if (out == NULL) return PARSER_STATUS_ERROR; @@ -78,6 +81,14 @@ mares_darwinair_parser_create (parser_t **out) // Initialize the base class. parser_init (&parser->base, &mares_darwinair_parser_backend); + if (model == DARWINAIR) { + parser->headersize = 60; + parser->samplesize = 3; + } else { + parser->headersize = 52; + parser->samplesize = 2; + } + *out = (parser_t *) parser; return PARSER_STATUS_SUCCESS; @@ -107,7 +118,9 @@ mares_darwinair_parser_set_data (parser_t *abstract, const unsigned char *data, static parser_status_t mares_darwinair_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime) { - if (abstract->size < HEADERSIZE) + mares_darwinair_parser_t *parser = (mares_darwinair_parser_t *) abstract; + + if (abstract->size < parser->headersize) return PARSER_STATUS_ERROR; const unsigned char *p = abstract->data; @@ -128,7 +141,9 @@ mares_darwinair_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime static parser_status_t mares_darwinair_parser_get_field (parser_t *abstract, parser_field_type_t type, unsigned int flags, void *value) { - if (abstract->size < HEADERSIZE) + mares_darwinair_parser_t *parser = (mares_darwinair_parser_t *) abstract; + + if (abstract->size < parser->headersize) return PARSER_STATUS_ERROR; const unsigned char *p = abstract->data; @@ -163,13 +178,15 @@ mares_darwinair_parser_get_field (parser_t *abstract, parser_field_type_t type, static parser_status_t mares_darwinair_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata) { - if (abstract->size < HEADERSIZE) + mares_darwinair_parser_t *parser = (mares_darwinair_parser_t *) abstract; + + if (abstract->size < parser->headersize) return PARSER_STATUS_ERROR; unsigned int time = 0; - unsigned int offset = HEADERSIZE; - while (offset + 3 <= abstract->size) { + unsigned int offset = parser->headersize; + while (offset + parser->samplesize <= abstract->size) { parser_sample_value_t sample = {0}; // Surface Time (seconds). @@ -182,7 +199,7 @@ mares_darwinair_parser_samples_foreach (parser_t *abstract, sample_callback_t ca sample.depth = depth / 10.0; if (callback) callback (SAMPLE_TYPE_DEPTH, sample, userdata); - offset += 3; + offset += parser->samplesize; } return PARSER_STATUS_SUCCESS;