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:
parent
84ad5aa5ad
commit
04073759a8
@ -120,9 +120,13 @@ typedef enum parser_sample_vendor_t {
|
|||||||
SAMPLE_VENDOR_UWATEC_SMART,
|
SAMPLE_VENDOR_UWATEC_SMART,
|
||||||
SAMPLE_VENDOR_OCEANIC_VTPRO,
|
SAMPLE_VENDOR_OCEANIC_VTPRO,
|
||||||
SAMPLE_VENDOR_OCEANIC_VEO250,
|
SAMPLE_VENDOR_OCEANIC_VEO250,
|
||||||
SAMPLE_VENDOR_OCEANIC_ATOM2
|
SAMPLE_VENDOR_OCEANIC_ATOM2,
|
||||||
|
SAMPLE_VENDOR_SHEARWATER_TRANSMITTERDATA
|
||||||
} parser_sample_vendor_t;
|
} 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 {
|
typedef enum dc_water_t {
|
||||||
DC_WATER_FRESH,
|
DC_WATER_FRESH,
|
||||||
DC_WATER_SALT
|
DC_WATER_SALT
|
||||||
|
|||||||
@ -75,6 +75,7 @@ struct shearwater_predator_parser_t {
|
|||||||
unsigned int serial;
|
unsigned int serial;
|
||||||
dc_divemode_t mode;
|
dc_divemode_t mode;
|
||||||
unsigned char logversion;
|
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);
|
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 time = 0;
|
||||||
unsigned int offset = parser->headersize;
|
unsigned int offset = parser->headersize;
|
||||||
unsigned int length = size - parser->footersize;
|
unsigned int length = size - parser->footersize;
|
||||||
|
|
||||||
|
// initialize sensors as not paired
|
||||||
|
parser->tstate[1] = parser->tstate[0] = 0xF;
|
||||||
|
|
||||||
|
dc_sample_value_t sample = {0};
|
||||||
while (offset < length) {
|
while (offset < length) {
|
||||||
dc_sample_value_t sample = {0};
|
|
||||||
|
|
||||||
// Ignore empty samples.
|
// Ignore empty samples.
|
||||||
if (array_isequal (data + offset, parser->samplesize, 0x00)) {
|
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:
|
// top 4 bits battery level:
|
||||||
// 0 - normal, 1 - critical, 2 - warning
|
// 0 - normal, 1 - critical, 2 - warning
|
||||||
unsigned int pressure = array_uint16_be (data + offset + 27);
|
unsigned int pressure = array_uint16_be (data + offset + 27);
|
||||||
|
parser->tstate[0] = pressure >> 12;
|
||||||
if ((pressure & 0xFFF0) != 0xFFF0) {
|
if ((pressure & 0xFFF0) != 0xFFF0) {
|
||||||
pressure &= 0x0FFF;
|
pressure &= 0x0FFF;
|
||||||
sample.pressure.tank = 0;
|
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);
|
if (callback) callback (DC_SAMPLE_PRESSURE, sample, userdata);
|
||||||
}
|
}
|
||||||
pressure = array_uint16_be (data + offset + 19);
|
pressure = array_uint16_be (data + offset + 19);
|
||||||
|
parser->tstate[1] = pressure >> 12;
|
||||||
if ((pressure & 0xFFF0) != 0xFFF0) {
|
if ((pressure & 0xFFF0) != 0xFFF0) {
|
||||||
pressure &= 0x0FFF;
|
pressure &= 0x0FFF;
|
||||||
sample.pressure.tank = 1;
|
sample.pressure.tank = 1;
|
||||||
@ -640,6 +647,11 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal
|
|||||||
|
|
||||||
offset += parser->samplesize;
|
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;
|
return DC_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user