From 2a26da3737dc7106b93c6774cc5a7069548caf06 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Mon, 6 Jun 2011 22:28:34 +0200 Subject: [PATCH] Add support for the Oceanic Atom 3.0 and VT 4.0. --- src/oceanic_atom2.c | 6 +++++- src/oceanic_atom2_parser.c | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c index c7aaf04..fc7fe70 100644 --- a/src/oceanic_atom2.c +++ b/src/oceanic_atom2.c @@ -69,6 +69,8 @@ static const unsigned char aeris_epic_version[] = "2M EPIC r\0\0 512K"; static const unsigned char oceanic_proplus2_version[] = "PROPLUS2 \0\0 512K"; static const unsigned char oceanic_atom1_version[] = "ATOM rev\0\0 256K"; static const unsigned char oceanic_atom2_version[] = "2M ATOM r\0\0 512K"; +static const unsigned char oceanic_atom3_version[] = "OCEATOM3 \0\0 1024"; +static const unsigned char oceanic_vt4_version[] = "OCEANVT4 \0\0 1024"; static const unsigned char oceanic_geo2_version[] = "OCEGEO20 \0\0 512K"; static const unsigned char oceanic_oc1_version[] = "OCWATCH R\0\0 1024"; static const unsigned char oceanic_veo2_version[] = "OCEVEO20 \0\0 512K"; @@ -351,7 +353,9 @@ oceanic_atom2_device_open (device_t **out, const char* name) } // Override the base class values. - if (oceanic_common_match (oceanic_oc1_version, device->version, sizeof (device->version))) + if (oceanic_common_match (oceanic_oc1_version, device->version, sizeof (device->version)) || + oceanic_common_match (oceanic_atom3_version, device->version, sizeof (device->version)) || + oceanic_common_match (oceanic_vt4_version, device->version, sizeof (device->version))) device->base.layout = &oceanic_oc1_layout; else if (oceanic_common_match (tusa_zenair_version, device->version, sizeof (device->version))) device->base.layout = &tusa_zenair_layout; diff --git a/src/oceanic_atom2_parser.c b/src/oceanic_atom2_parser.c index 85bc420..20f5adc 100644 --- a/src/oceanic_atom2_parser.c +++ b/src/oceanic_atom2_parser.c @@ -41,7 +41,9 @@ #define VEO30 0x435A #define ZENAIR 0x4442 #define GEO20 0x4446 +#define VT4 0x4447 #define OC1B 0x4449 +#define ATOM3 0x444C typedef struct oceanic_atom2_parser_t oceanic_atom2_parser_t; @@ -152,6 +154,8 @@ oceanic_atom2_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime) switch (parser->model) { case OC1A: case OC1B: + case VT4: + case ATOM3: 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); @@ -314,6 +318,8 @@ oceanic_atom2_parser_samples_foreach (parser_t *abstract, sample_callback_t call parser->model == GEO || parser->model == GEO20 || parser->model == VEO20 || parser->model == VEO30) header -= PAGESIZE; + else if (parser->model == VT4) + header += PAGESIZE; else if (parser->model == ATOM1) header -= 2 * PAGESIZE; @@ -422,6 +428,8 @@ oceanic_atom2_parser_samples_foreach (parser_t *abstract, sample_callback_t call parser->model == VEO30 || parser->model == OC1A || parser->model == OC1B) { temperature = data[offset + 3]; + } else if (parser->model == VT4 || parser->model == ATOM3) { + temperature = ((data[offset + 7] & 0xF0) >> 4) | ((data[offset + 7] & 0x0C) << 2) | ((data[offset + 5] & 0x0C) << 4); } else { unsigned int sign; if (parser->model == ATOM2 || parser->model == EPIC) @@ -439,7 +447,7 @@ oceanic_atom2_parser_samples_foreach (parser_t *abstract, sample_callback_t call // Tank Pressure (psi) if (parser->model == OC1A || parser->model == OC1B) pressure = (data[offset + 10] + (data[offset + 11] << 8)) & 0x0FFF; - else if (parser->model == ZENAIR) + else if (parser->model == ZENAIR || parser->model == VT4 || parser->model == ATOM3) pressure = (((data[offset + 0] & 0x03) << 8) + data[offset + 1]) * 5; else pressure -= data[offset + 1];