From 043fc4166c91572e3b4c0458865de5ffc8f71992 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Sun, 8 Sep 2013 09:12:13 +0200 Subject: [PATCH] Add support for the Oceanic OCi. The new Oceanic OCi appears to be almost identical to the already supported Oceanic OC1. The most important change is the different location for the logbook ringbuffer. --- src/descriptor.c | 1 + src/oceanic_atom2.c | 19 +++++++++++++++++++ src/oceanic_atom2_parser.c | 14 ++++++++++---- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/descriptor.c b/src/descriptor.c index 8c0f38f..ce5379a 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -162,6 +162,7 @@ static const dc_descriptor_t g_descriptors[] = { {"Sherwood", "Wisdom 3", DC_FAMILY_OCEANIC_ATOM2, 0x4458}, {"Sherwood", "Amphos", DC_FAMILY_OCEANIC_ATOM2, 0x4545}, {"Oceanic", "Pro Plus 3", DC_FAMILY_OCEANIC_ATOM2, 0x4548}, + {"Oceanic", "OCi", DC_FAMILY_OCEANIC_ATOM2, 0x454B}, /* Mares Nemo */ {"Mares", "Nemo", DC_FAMILY_MARES_NEMO, 0}, {"Mares", "Nemo Steel", DC_FAMILY_MARES_NEMO, 0}, diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c index 845c4d3..f31b130 100644 --- a/src/oceanic_atom2.c +++ b/src/oceanic_atom2.c @@ -117,6 +117,10 @@ static const oceanic_common_version_t oceanic_oc1_version[] = { {"OCSWATCH \0\0 1024"}, }; +static const oceanic_common_version_t oceanic_oci_version[] = { + {"OCEANOCI \0\0 1024"}, +}; + static const oceanic_common_version_t oceanic_atom3_version[] = { {"OCEANVT4 \0\0 1024"}, {"OCEATOM3 \0\0 1024"}, @@ -237,6 +241,19 @@ static const oceanic_common_layout_t oceanic_oc1_layout = { 1 /* pt_mode_logbook */ }; +static const oceanic_common_layout_t oceanic_oci_layout = { + 0x20000, /* memsize */ + 0x0000, /* cf_devinfo */ + 0x0040, /* cf_pointers */ + 0x10C0, /* rb_logbook_begin */ + 0x1400, /* rb_logbook_end */ + 8, /* rb_logbook_entry_size */ + 0x1400, /* rb_profile_begin */ + 0x1FE00, /* rb_profile_end */ + 0, /* pt_mode_global */ + 1 /* pt_mode_logbook */ +}; + static const oceanic_common_layout_t oceanic_atom3_layout = { 0x20000, /* memsize */ 0x0000, /* cf_devinfo */ @@ -450,6 +467,8 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, const char device->base.layout = &tusa_zenair_layout; } else if (OCEANIC_COMMON_MATCH (device->base.version, oceanic_oc1_version)) { device->base.layout = &oceanic_oc1_layout; + } else if (OCEANIC_COMMON_MATCH (device->base.version, oceanic_oci_version)) { + device->base.layout = &oceanic_oci_layout; } else if (OCEANIC_COMMON_MATCH (device->base.version, oceanic_atom3_version)) { device->base.layout = &oceanic_atom3_layout; } else if (OCEANIC_COMMON_MATCH (device->base.version, oceanic_veo1_version)) { diff --git a/src/oceanic_atom2_parser.c b/src/oceanic_atom2_parser.c index ebd0a25..a3cd39c 100644 --- a/src/oceanic_atom2_parser.c +++ b/src/oceanic_atom2_parser.c @@ -60,6 +60,7 @@ #define A300AI 0x4457 #define AMPHOS 0x4545 #define PROPLUS3 0x4548 +#define OCI 0x454B typedef struct oceanic_atom2_parser_t oceanic_atom2_parser_t; @@ -168,6 +169,7 @@ oceanic_atom2_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetim case ATOM3: case ATOM31: case A300AI: + case OCI: datetime->year = ((p[5] & 0xE0) >> 5) + ((p[7] & 0xE0) >> 2) + 2000; datetime->month = (p[3] & 0x0F); datetime->day = ((p[0] & 0x80) >> 3) + ((p[3] & 0xF0) >> 4); @@ -396,7 +398,8 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ } unsigned int samplesize = PAGESIZE / 2; - if (parser->model == OC1A || parser->model == OC1B || parser->model == OC1C) + if (parser->model == OC1A || parser->model == OC1B || + parser->model == OC1C || parser->model == OCI) samplesize = PAGESIZE; else if (parser->model == F10) samplesize = 2; @@ -506,7 +509,8 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ temperature = data[offset + 6]; } else if (parser->model == GEO20 || parser->model == VEO20 || parser->model == VEO30 || parser->model == OC1A || - parser->model == OC1B || parser->model == OC1C) { + parser->model == OC1B || parser->model == OC1C || + parser->model == OCI) { temperature = data[offset + 3]; } else if (parser->model == OCS) { temperature = data[offset + 1]; @@ -533,7 +537,8 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ // Tank Pressure (psi) if (have_pressure) { - if (parser->model == OC1A || parser->model == OC1B || parser->model == OC1C) + if (parser->model == OC1A || parser->model == OC1B || + parser->model == OC1C || parser->model == OCI) pressure = (data[offset + 10] + (data[offset + 11] << 8)) & 0x0FFF; else if (parser->model == VT4 || parser->model == VT41|| parser->model == ATOM3 || parser->model == ATOM31 || @@ -551,7 +556,8 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ unsigned int depth; if (parser->model == GEO20 || parser->model == VEO20 || parser->model == VEO30 || parser->model == OC1A || - parser->model == OC1B || parser->model == OC1C) + parser->model == OC1B || parser->model == OC1C || + parser->model == OCI) depth = (data[offset + 4] + (data[offset + 5] << 8)) & 0x0FFF; else if (parser->model == ATOM1) depth = data[offset + 3] * 16;