From ddf6fca65f155cce05588386de9ac043291e4b8a Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Sat, 7 May 2011 14:13:50 +0200 Subject: [PATCH] Add support for the Uwatec Galileo Trimix. --- src/uwatec_smart_parser.c | 47 +++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/src/uwatec_smart_parser.c b/src/uwatec_smart_parser.c index 4305aa4..1931bd8 100644 --- a/src/uwatec_smart_parser.c +++ b/src/uwatec_smart_parser.c @@ -37,6 +37,7 @@ #define ALADINTEC2G 0x13 #define SMARTCOM 0x14 #define SMARTTEC 0x18 +#define GALILEOTRIMIX 0x19 #define SMARTZ 0x1C typedef struct uwatec_smart_parser_t uwatec_smart_parser_t; @@ -207,6 +208,7 @@ uwatec_smart_parser_get_field (parser_t *abstract, parser_field_type_t type, uns unsigned int size = abstract->size; unsigned int header = 0; + unsigned int trimix = 0; const uwatec_smart_header_info_t *table = NULL; // Load the correct table. @@ -216,7 +218,12 @@ uwatec_smart_parser_get_field (parser_t *abstract, parser_field_type_t type, uns table = &uwatec_smart_pro_header; break; case GALILEO: + case GALILEOTRIMIX: header = 152; + if (data[43] & 0x80) { + header = 0xB1; + trimix = 1; + } table = &uwatec_galileo_sol_header; break; case ALADINTEC: @@ -257,7 +264,10 @@ uwatec_smart_parser_get_field (parser_t *abstract, parser_field_type_t type, uns *((double *) value) = array_uint16_le (data + table->maxdepth) / 100.0; break; case FIELD_TYPE_GASMIX_COUNT: - *((unsigned int *) value) = table->ngases; + if (trimix) + *((unsigned int *) value) = 0; + else + *((unsigned int *) value) = table->ngases; break; case FIELD_TYPE_GASMIX: gasmix->helium = 0.0; @@ -340,6 +350,8 @@ typedef enum { BEARING, ALARMS, TIME, + UNKNOWN1, + UNKNOWN2, } uwatec_smart_sample_t; typedef struct uwatec_smart_sample_info_t { @@ -429,6 +441,8 @@ uwatec_smart_sample_info_t uwatec_galileo_sol_table [] = { {HEARTRATE, 1, 0, 8, 0, 1}, // 1111 0111 dddddddd {BEARING, 1, 0, 8, 0, 2}, // 1111 1000 dddddddd dddddddd {ALARMS, 1, 2, 8, 0, 1}, // 1111 1001 dddddddd + {UNKNOWN1, 1, 0, 8, 0, 0}, // 1111 1010 (8 bytes) + {UNKNOWN2, 1, 0, 8, 0, 1}, // 1111 1011 dddddddd (n-1 bytes) }; static parser_status_t @@ -445,6 +459,7 @@ uwatec_smart_parser_samples_foreach (parser_t *abstract, sample_callback_t callb const uwatec_smart_sample_info_t *table = NULL; unsigned int entries = 0; unsigned int header = 0; + unsigned int trimix = 0; // Load the correct table. switch (parser->model) { @@ -454,7 +469,12 @@ uwatec_smart_parser_samples_foreach (parser_t *abstract, sample_callback_t callb entries = NELEMENTS (uwatec_smart_pro_table); break; case GALILEO: + case GALILEOTRIMIX: header = 152; + if (data[43] & 0x80) { + header = 0xB1; + trimix = 1; + } table = uwatec_galileo_sol_table; entries = NELEMENTS (uwatec_galileo_sol_table); break; @@ -515,7 +535,7 @@ uwatec_smart_parser_samples_foreach (parser_t *abstract, sample_callback_t callb // Process the type bits in the bitstream. unsigned int id = 0; - if (parser->model == GALILEO) { + if (parser->model == GALILEO || parser->model == GALILEOTRIMIX) { // Uwatec Galileo id = uwatec_galileo_identify (data[offset]); } else { @@ -588,8 +608,13 @@ uwatec_smart_parser_samples_foreach (parser_t *abstract, sample_callback_t callb break; case PRESSURE: if (table[id].absolute) { - tank = table[id].index; - pressure = value / 4.0; + if (trimix) { + tank = (value & 0xF000) >> 24; + pressure = (value & 0x0FFF) / 4.0; + } else { + tank = table[id].index; + pressure = value / 4.0; + } have_pressure = 1; } else { pressure += svalue / 4.0; @@ -627,6 +652,20 @@ uwatec_smart_parser_samples_foreach (parser_t *abstract, sample_callback_t callb case TIME: complete = value; break; + case UNKNOWN1: + if (offset + 8 > size) { + WARNING ("Incomplete sample data."); + return PARSER_STATUS_ERROR; + } + offset += 8; + break; + case UNKNOWN2: + if (value < 1 || offset + value - 1 > size) { + WARNING ("Incomplete sample data."); + return PARSER_STATUS_ERROR; + } + offset += value - 1; + break; default: WARNING ("Unknown sample type."); break;