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;