Add support for the dive mode.
The Shearwaters store the current dive mode for each sample, and not one single value for each dive. Therfore we need to process all samples. If there is at least one sample marked as closed circuit, we classify the dive as a closed circuit dive. Otherwise we default to open circuit.
This commit is contained in:
parent
af3b38d6f4
commit
1a8e757daf
@ -37,6 +37,12 @@
|
||||
#define SZ_SAMPLE_PREDATOR 0x10
|
||||
#define SZ_SAMPLE_PETREL 0x20
|
||||
|
||||
#define GASSWITCH 0x01
|
||||
#define PPO2_EXTERNAL 0x02
|
||||
#define SETPOINT_HIGH 0x04
|
||||
#define SC 0x08
|
||||
#define OC 0x10
|
||||
|
||||
#define METRIC 0
|
||||
#define IMPERIAL 1
|
||||
|
||||
@ -236,6 +242,33 @@ shearwater_predator_parser_cache (shearwater_predator_parser_t *parser)
|
||||
return DC_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static dc_divemode_t
|
||||
shearwater_predator_parser_get_divemode (shearwater_predator_parser_t *parser)
|
||||
{
|
||||
dc_parser_t *abstract = (dc_parser_t *) parser;
|
||||
const unsigned char *data = abstract->data;
|
||||
unsigned int size = abstract->size;
|
||||
|
||||
unsigned int offset = parser->headersize;
|
||||
unsigned int length = size - parser->footersize;
|
||||
while (offset < length) {
|
||||
// Ignore empty samples.
|
||||
if (array_isequal (data + offset, parser->samplesize, 0x00)) {
|
||||
offset += parser->samplesize;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Status flags.
|
||||
unsigned int status = data[offset + 11];
|
||||
if ((status & OC) == 0) {
|
||||
return DC_DIVEMODE_CC;
|
||||
}
|
||||
|
||||
offset += parser->samplesize;
|
||||
}
|
||||
|
||||
return DC_DIVEMODE_OC;
|
||||
}
|
||||
|
||||
static dc_status_t
|
||||
shearwater_predator_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value)
|
||||
@ -290,6 +323,9 @@ shearwater_predator_parser_get_field (dc_parser_t *abstract, dc_field_type_t typ
|
||||
case DC_FIELD_ATMOSPHERIC:
|
||||
*((double *) value) = array_uint16_be (data + 47) / 1000.0;
|
||||
break;
|
||||
case DC_FIELD_DIVEMODE:
|
||||
*((dc_divemode_t *) value) = shearwater_predator_parser_get_divemode (parser);
|
||||
break;
|
||||
default:
|
||||
return DC_STATUS_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user