diff --git a/src/parser.c b/src/parser.c index 98d2c89..9fdb1a9 100644 --- a/src/parser.c +++ b/src/parser.c @@ -149,10 +149,10 @@ dc_parser_new_internal (dc_parser_t **out, dc_context_t *context, dc_family_t fa rc = atomics_cobalt_parser_create (&parser, context); break; case DC_FAMILY_SHEARWATER_PREDATOR: - rc = shearwater_predator_parser_create (&parser, context); + rc = shearwater_predator_parser_create (&parser, context, model); break; case DC_FAMILY_SHEARWATER_PETREL: - rc = shearwater_petrel_parser_create (&parser, context); + rc = shearwater_petrel_parser_create (&parser, context, model); break; case DC_FAMILY_DIVERITE_NITEKQ: rc = diverite_nitekq_parser_create (&parser, context); diff --git a/src/shearwater_petrel.h b/src/shearwater_petrel.h index 8b927d6..c23bb74 100644 --- a/src/shearwater_petrel.h +++ b/src/shearwater_petrel.h @@ -34,7 +34,7 @@ dc_status_t shearwater_petrel_device_open (dc_device_t **device, dc_context_t *context, const char *name); dc_status_t -shearwater_petrel_parser_create (dc_parser_t **parser, dc_context_t *context); +shearwater_petrel_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); #ifdef __cplusplus } diff --git a/src/shearwater_predator.h b/src/shearwater_predator.h index f21d445..4665f80 100644 --- a/src/shearwater_predator.h +++ b/src/shearwater_predator.h @@ -34,7 +34,7 @@ dc_status_t shearwater_predator_device_open (dc_device_t **device, dc_context_t *context, const char *name); dc_status_t -shearwater_predator_parser_create (dc_parser_t **parser, dc_context_t *context); +shearwater_predator_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); #ifdef __cplusplus } diff --git a/src/shearwater_predator_parser.c b/src/shearwater_predator_parser.c index 039926f..e922220 100644 --- a/src/shearwater_predator_parser.c +++ b/src/shearwater_predator_parser.c @@ -48,10 +48,14 @@ #define NGASMIXES 10 +#define PREDATOR 2 +#define PETREL 3 + typedef struct shearwater_predator_parser_t shearwater_predator_parser_t; struct shearwater_predator_parser_t { dc_parser_t base; + unsigned int model; unsigned int petrel; unsigned int samplesize; // Cached fields. @@ -61,6 +65,7 @@ struct shearwater_predator_parser_t { unsigned int ngasmixes; unsigned int oxygen[NGASMIXES]; unsigned int helium[NGASMIXES]; + double calibration[3]; dc_divemode_t mode; }; @@ -105,7 +110,7 @@ shearwater_predator_find_gasmix (shearwater_predator_parser_t *parser, unsigned static dc_status_t -shearwater_common_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int petrel) +shearwater_common_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model, unsigned int petrel) { shearwater_predator_parser_t *parser = NULL; const dc_parser_vtable_t *vtable = NULL; @@ -130,6 +135,7 @@ shearwater_common_parser_create (dc_parser_t **out, dc_context_t *context, unsig } // Set the default values. + parser->model = model; parser->petrel = petrel; parser->samplesize = samplesize; parser->cached = 0; @@ -149,16 +155,16 @@ shearwater_common_parser_create (dc_parser_t **out, dc_context_t *context, unsig dc_status_t -shearwater_predator_parser_create (dc_parser_t **out, dc_context_t *context) +shearwater_predator_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) { - return shearwater_common_parser_create (out, context, 0); + return shearwater_common_parser_create (out, context, model, 0); } dc_status_t -shearwater_petrel_parser_create (dc_parser_t **out, dc_context_t *context) +shearwater_petrel_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) { - return shearwater_common_parser_create (out, context, 1); + return shearwater_common_parser_create (out, context, model, 1); } @@ -281,6 +287,20 @@ shearwater_predator_parser_cache (shearwater_predator_parser_t *parser) offset += parser->samplesize; } + // Cache sensor calibration for later use + parser->calibration[0] = array_uint16_be(data + 87) / 100000.0; + parser->calibration[1] = array_uint16_be(data + 89) / 100000.0; + parser->calibration[2] = array_uint16_be(data + 91) / 100000.0; + // The Predator expects the mV output of the cells to be within 30mV + // to 70mV in 100% O2 at 1 atmosphere. + // If the calibration value is scaled with a factor 2.2, then the + // sensors lines up and matches the average. + if (parser->model == PREDATOR) { + for (size_t i = 0; i < 3; ++i) { + parser->calibration[i] *= 2.2; + } + } + // Cache the data for later use. parser->headersize = headersize; parser->footersize = footersize; @@ -422,11 +442,24 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal // Status flags. unsigned int status = data[offset + 11]; - // PPO2 - sample.ppo2 = data[offset + 6] / 100.0; - if (callback) callback (DC_SAMPLE_PPO2, sample, userdata); - if ((status & OC) == 0) { + // PPO2 +#ifdef SENSOR_AVERAGE + sample.ppo2 = data[offset + 6] / 100.0; + if (callback) callback (DC_SAMPLE_PPO2, sample, userdata); +#else + if ((status & PPO2_EXTERNAL) == 0) { + sample.ppo2 = data[offset + 12] * parser->calibration[0]; + if (callback && (data[86] & 0x01)) callback (DC_SAMPLE_PPO2, sample, userdata); + + sample.ppo2 = data[offset + 14] * parser->calibration[1]; + if (callback && (data[86] & 0x02)) callback (DC_SAMPLE_PPO2, sample, userdata); + + sample.ppo2 = data[offset + 15] * parser->calibration[2]; + if (callback && (data[86] & 0x04)) callback (DC_SAMPLE_PPO2, sample, userdata); + } +#endif + // Setpoint if (parser->petrel) { sample.setpoint = data[offset + 18] / 100.0;