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;