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.
This commit is contained in:
Jef Driesen 2013-09-08 09:12:13 +02:00
parent b96780ce75
commit 043fc4166c
3 changed files with 30 additions and 4 deletions

View File

@ -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},

View File

@ -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)) {

View File

@ -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;