Shearwater: add transmitter battery information

This should be a STRING callback, but those come from the header and we
don't have the information until after we have parsed all the samples.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2017-07-07 07:52:28 -07:00
parent 84ad5aa5ad
commit 04073759a8
2 changed files with 19 additions and 3 deletions

View File

@ -120,9 +120,13 @@ typedef enum parser_sample_vendor_t {
SAMPLE_VENDOR_UWATEC_SMART,
SAMPLE_VENDOR_OCEANIC_VTPRO,
SAMPLE_VENDOR_OCEANIC_VEO250,
SAMPLE_VENDOR_OCEANIC_ATOM2
SAMPLE_VENDOR_OCEANIC_ATOM2,
SAMPLE_VENDOR_SHEARWATER_TRANSMITTERDATA
} parser_sample_vendor_t;
// allow to check at compile time for this feature
#define SAMPLE_VENDOR_SHEARWATER_TRANSMITTERDATA SAMPLE_VENDOR_SHEARWATER_TRANSMITTERDATA
typedef enum dc_water_t {
DC_WATER_FRESH,
DC_WATER_SALT

View File

@ -75,6 +75,7 @@ struct shearwater_predator_parser_t {
unsigned int serial;
dc_divemode_t mode;
unsigned char logversion;
unsigned char tstate[2];
};
static dc_status_t shearwater_predator_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size);
@ -501,8 +502,12 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal
unsigned int time = 0;
unsigned int offset = parser->headersize;
unsigned int length = size - parser->footersize;
while (offset < length) {
// initialize sensors as not paired
parser->tstate[1] = parser->tstate[0] = 0xF;
dc_sample_value_t sample = {0};
while (offset < length) {
// Ignore empty samples.
if (array_isequal (data + offset, parser->samplesize, 0x00)) {
@ -618,6 +623,7 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal
// top 4 bits battery level:
// 0 - normal, 1 - critical, 2 - warning
unsigned int pressure = array_uint16_be (data + offset + 27);
parser->tstate[0] = pressure >> 12;
if ((pressure & 0xFFF0) != 0xFFF0) {
pressure &= 0x0FFF;
sample.pressure.tank = 0;
@ -625,6 +631,7 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal
if (callback) callback (DC_SAMPLE_PRESSURE, sample, userdata);
}
pressure = array_uint16_be (data + offset + 19);
parser->tstate[1] = pressure >> 12;
if ((pressure & 0xFFF0) != 0xFFF0) {
pressure &= 0x0FFF;
sample.pressure.tank = 1;
@ -640,6 +647,11 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal
offset += parser->samplesize;
}
if (parser->logversion >= 7 && (parser->tstate[0] != 0xf || parser->tstate[1] != 0xf)) {
sample.vendor.type = SAMPLE_VENDOR_SHEARWATER_TRANSMITTERDATA;
sample.vendor.size = 2;
sample.vendor.data = parser->tstate;
if (callback) callback (DC_SAMPLE_VENDOR, sample, userdata);
}
return DC_STATUS_SUCCESS;
}