Merge branch 'divemode'

This commit is contained in:
Jef Driesen 2014-11-07 22:12:23 +01:00
commit 14a29decd0
12 changed files with 194 additions and 10 deletions

View File

@ -467,6 +467,22 @@ doparse (FILE *fp, dc_device_t *device, const unsigned char data[], unsigned int
tank.beginpressure, tank.endpressure);
}
// Parse the dive mode.
message ("Parsing the dive mode.\n");
dc_divemode_t divemode = DC_DIVEMODE_OC;
rc = dc_parser_get_field (parser, DC_FIELD_DIVEMODE, 0, &divemode);
if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) {
WARNING ("Error parsing the dive mode.");
dc_parser_destroy (parser);
return rc;
}
if (rc != DC_STATUS_UNSUPPORTED) {
const char *names[] = {"freedive", "gauge", "oc", "cc"};
fprintf (fp, "<divemode>%s</divemode>\n",
names[divemode]);
}
// Parse the salinity.
message ("Parsing the salinity.\n");
dc_salinity_t salinity = {DC_WATER_FRESH, 0.0};

View File

@ -58,7 +58,8 @@ typedef enum dc_field_type_t {
DC_FIELD_TEMPERATURE_MINIMUM,
DC_FIELD_TEMPERATURE_MAXIMUM,
DC_FIELD_TANK_COUNT,
DC_FIELD_TANK
DC_FIELD_TANK,
DC_FIELD_DIVEMODE
} dc_field_type_t;
typedef enum parser_sample_event_t {
@ -115,6 +116,13 @@ typedef enum dc_water_t {
DC_WATER_SALT
} dc_water_t;
typedef enum dc_divemode_t {
DC_DIVEMODE_FREEDIVE,
DC_DIVEMODE_GAUGE,
DC_DIVEMODE_OC, /* Open circuit */
DC_DIVEMODE_CC /* Closed circuit */
} dc_divemode_t;
typedef enum dc_deco_type_t {
DC_DECO_NDL,
DC_DECO_SAFETYSTOP,

View File

@ -203,6 +203,18 @@ atomics_cobalt_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, un
tank->beginpressure = array_uint16_le(p + 6) * PSI / BAR;
tank->endpressure = array_uint16_le(p + 14) * PSI / BAR;
break;
case DC_FIELD_DIVEMODE:
switch(p[0x24]) {
case 0: // Open Circuit Trimix
case 2: // Open Circuit Nitrox
*((dc_divemode_t *) value) = DC_DIVEMODE_OC;
break;
case 1: // Closed Circuit
*((dc_divemode_t *) value) = DC_DIVEMODE_CC;
break;
default:
return DC_STATUS_DATAFORMAT;
}
default:
return DC_STATUS_UNSUPPORTED;
}

View File

@ -33,6 +33,23 @@
#define MAXCONFIG 7
#define MAXGASMIX 5
#define OSTC_ZHL16_OC 0
#define OSTC_GAUGE 1
#define OSTC_ZHL16_CC 2
#define OSTC_APNEA 3
#define OSTC_ZHL16_OC_GF 4
#define OSTC_ZHL16_CC_GF 5
#define OSTC_PSCR_GF 6
#define FROG_ZHL16 0
#define FROG_ZHL16_GF 1
#define FROG_APNEA 2
#define OSTC3_OC 0
#define OSTC3_CC 1
#define OSTC3_GAUGE 2
#define OSTC3_APNEA 3
typedef struct hw_ostc_parser_t hw_ostc_parser_t;
struct hw_ostc_parser_t {
@ -323,6 +340,60 @@ hw_ostc_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned
case DC_FIELD_TEMPERATURE_MINIMUM:
*((double *) value) = (signed short) array_uint16_le (data + layout->temperature) / 10.0;
break;
case DC_FIELD_DIVEMODE:
if (version == 0x21) {
switch (data[51]) {
case OSTC_APNEA:
*((dc_divemode_t *) value) = DC_DIVEMODE_FREEDIVE;
break;
case OSTC_GAUGE:
*((dc_divemode_t *) value) = DC_DIVEMODE_GAUGE;
break;
case OSTC_ZHL16_OC:
case OSTC_ZHL16_OC_GF:
*((dc_divemode_t *) value) = DC_DIVEMODE_OC;
break;
case OSTC_ZHL16_CC:
case OSTC_ZHL16_CC_GF:
case OSTC_PSCR_GF:
*((dc_divemode_t *) value) = DC_DIVEMODE_CC;
break;
default:
return DC_STATUS_DATAFORMAT;
}
} else if (version == 0x22) {
switch (data[51]) {
case FROG_ZHL16:
case FROG_ZHL16_GF:
*((dc_divemode_t *) value) = DC_DIVEMODE_OC;
break;
case FROG_APNEA:
*((dc_divemode_t *) value) = DC_DIVEMODE_FREEDIVE;
break;
default:
return DC_STATUS_DATAFORMAT;
}
} else if (version == 0x23) {
switch (data[82]) {
case OSTC3_OC:
*((dc_divemode_t *) value) = DC_DIVEMODE_OC;
break;
case OSTC3_CC:
*((dc_divemode_t *) value) = DC_DIVEMODE_CC;
break;
case OSTC3_GAUGE:
*((dc_divemode_t *) value) = DC_DIVEMODE_GAUGE;
break;
case OSTC3_APNEA:
*((dc_divemode_t *) value) = DC_DIVEMODE_FREEDIVE;
break;
default:
return DC_STATUS_DATAFORMAT;
}
} else {
return DC_STATUS_UNSUPPORTED;
}
break;
default:
return DC_STATUS_UNSUPPORTED;
}

View File

@ -46,6 +46,11 @@
#define NEMOAPNEIST 18
#define PUCKAIR 19
#define AIR 0
#define NITROX 1
#define FREEDIVE 2
#define GAUGE 3
void
mares_common_device_init (mares_common_device_t *device, dc_context_t *context, const dc_device_vtable_t *vtable)
{
@ -212,9 +217,9 @@ mares_common_extract_dives (dc_context_t *context, const mares_common_layout_t *
// Get the freedive mode for this model.
unsigned int model = data[1];
unsigned int freedive = 2;
unsigned int freedive = FREEDIVE;
if (model == NEMOWIDE || model == NEMOAIR || model == PUCK || model == PUCKAIR)
freedive = 3;
freedive = GAUGE;
// Get the end of the profile ring buffer.
unsigned int eop = array_uint16_le (data + 0x6B);

View File

@ -258,6 +258,19 @@ mares_iconhd_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsi
case DC_FIELD_TEMPERATURE_MAXIMUM:
*((double *) value) = (signed short) array_uint16_le (p + 0x48) / 10.0;
break;
case DC_FIELD_DIVEMODE:
switch (p[0] & 0x03) {
case AIR:
case NITROX:
*((dc_divemode_t *) value) = DC_DIVEMODE_OC;
break;
case GAUGE:
*((dc_divemode_t *) value) = DC_DIVEMODE_GAUGE;
break;
default:
return DC_STATUS_DATAFORMAT;
}
break;
default:
return DC_STATUS_UNSUPPORTED;
}

View File

@ -39,6 +39,11 @@
#define NEMOAPNEIST 18
#define PUCKAIR 19
#define AIR 0
#define NITROX 1
#define FREEDIVE 2
#define GAUGE 3
typedef struct mares_nemo_parser_t mares_nemo_parser_t;
struct mares_nemo_parser_t {
@ -87,14 +92,14 @@ mares_nemo_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int
parser_init (&parser->base, context, &mares_nemo_parser_vtable);
// Get the freedive mode for this model.
unsigned int freedive = 2;
unsigned int freedive = FREEDIVE;
if (model == NEMOWIDE || model == NEMOAIR || model == PUCK || model == PUCKAIR)
freedive = 3;
freedive = GAUGE;
// Set the default values.
parser->model = model;
parser->freedive = freedive;
parser->mode = 0;
parser->mode = AIR;
parser->length = 0;
parser->sample_count = 0;
parser->sample_size = 0;
@ -125,7 +130,7 @@ mares_nemo_parser_set_data (dc_parser_t *abstract, const unsigned char *data, un
// Clear the previous state.
parser->base.data = NULL;
parser->base.size = 0;
parser->mode = 0;
parser->mode = AIR;
parser->length = 0;
parser->sample_count = 0;
parser->sample_size = 0;
@ -234,17 +239,17 @@ mares_nemo_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsign
*((double *) value) = array_uint16_le (p + 53 - 10) / 10.0;
break;
case DC_FIELD_GASMIX_COUNT:
if (parser->mode == 0 || parser->mode == 1)
if (parser->mode == AIR || parser->mode == NITROX)
*((unsigned int *) value) = 1;
else
*((unsigned int *) value) = 0;
break;
case DC_FIELD_GASMIX:
switch (parser->mode) {
case 0: // Air
case AIR:
gasmix->oxygen = 0.21;
break;
case 1: // Nitrox
case NITROX:
gasmix->oxygen = p[53 - 43] / 100.0;
break;
default:
@ -256,6 +261,20 @@ mares_nemo_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsign
case DC_FIELD_TEMPERATURE_MINIMUM:
*((double *) value) = (signed char) p[53 - 11];
break;
case DC_FIELD_DIVEMODE:
switch (parser->mode) {
case AIR:
case NITROX:
*((dc_divemode_t *) value) = DC_DIVEMODE_OC;
break;
case FREEDIVE:
case GAUGE:
*((dc_divemode_t *) value) = DC_DIVEMODE_GAUGE;
break;
default:
return DC_STATUS_DATAFORMAT;
}
break;
default:
return DC_STATUS_UNSUPPORTED;
}
@ -278,6 +297,9 @@ mares_nemo_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsign
case DC_FIELD_TEMPERATURE_MINIMUM:
*((double *) value) = (signed char) p[28 - 11];
break;
case DC_FIELD_DIVEMODE:
*((dc_divemode_t *) value) = DC_DIVEMODE_FREEDIVE;
break;
default:
return DC_STATUS_UNSUPPORTED;
}

View File

@ -211,6 +211,9 @@ reefnet_sensus_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, un
case DC_FIELD_GASMIX_COUNT:
*((unsigned int *) value) = 0;
break;
case DC_FIELD_DIVEMODE:
*((dc_divemode_t *) value) = DC_DIVEMODE_GAUGE;
break;
default:
return DC_STATUS_UNSUPPORTED;
}

View File

@ -200,6 +200,9 @@ reefnet_sensuspro_parser_get_field (dc_parser_t *abstract, dc_field_type_t type,
case DC_FIELD_GASMIX_COUNT:
*((unsigned int *) value) = 0;
break;
case DC_FIELD_DIVEMODE:
*((dc_divemode_t *) value) = DC_DIVEMODE_GAUGE;
break;
default:
return DC_STATUS_UNSUPPORTED;
}

View File

@ -201,6 +201,9 @@ reefnet_sensusultra_parser_get_field (dc_parser_t *abstract, dc_field_type_t typ
case DC_FIELD_GASMIX_COUNT:
*((unsigned int *) value) = 0;
break;
case DC_FIELD_DIVEMODE:
*((dc_divemode_t *) value) = DC_DIVEMODE_GAUGE;
break;
default:
return DC_STATUS_UNSUPPORTED;
}

View File

@ -51,6 +51,7 @@
#define GAUGE 2
#define FREEDIVE 3
#define MIXED 4
#define CCR 5
#define SAFETYSTOP (1 << 0)
#define DECOSTOP (1 << 1)
@ -326,6 +327,26 @@ suunto_d9_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigne
gasmix->oxygen = parser->oxygen[flags] / 100.0;
gasmix->nitrogen = 1.0 - gasmix->oxygen - gasmix->helium;
break;
case DC_FIELD_DIVEMODE:
switch (parser->mode) {
case AIR:
case NITROX:
case MIXED:
*((dc_divemode_t *) value) = DC_DIVEMODE_OC;
break;
case GAUGE:
*((dc_divemode_t *) value) = DC_DIVEMODE_GAUGE;
break;
case FREEDIVE:
*((dc_divemode_t *) value) = DC_DIVEMODE_FREEDIVE;
break;
case CCR:
*((dc_divemode_t *) value) = DC_DIVEMODE_CC;
break;
default:
return DC_STATUS_DATAFORMAT;
}
break;
default:
return DC_STATUS_UNSUPPORTED;
}

View File

@ -198,6 +198,13 @@ suunto_vyper_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsi
case DC_FIELD_TEMPERATURE_MINIMUM:
*((double *) value) = (signed char) data[parser->marker + 1];
break;
case DC_FIELD_DIVEMODE:
if (data[4] & 0x40) {
*((dc_divemode_t *) value) = DC_DIVEMODE_GAUGE;
} else {
*((dc_divemode_t *) value) = DC_DIVEMODE_OC;
}
break;
default:
return DC_STATUS_UNSUPPORTED;
}