diff --git a/include/libdivecomputer/parser.h b/include/libdivecomputer/parser.h index c69a887..62ac0fa 100644 --- a/include/libdivecomputer/parser.h +++ b/include/libdivecomputer/parser.h @@ -42,7 +42,8 @@ typedef enum dc_sample_type_t { DC_SAMPLE_VENDOR, DC_SAMPLE_SETPOINT, DC_SAMPLE_PPO2, - DC_SAMPLE_CNS + DC_SAMPLE_CNS, + DC_SAMPLE_DECO } dc_sample_type_t; typedef enum dc_field_type_t { @@ -57,10 +58,7 @@ typedef enum dc_field_type_t { typedef enum parser_sample_event_t { SAMPLE_EVENT_NONE, - SAMPLE_EVENT_DECOSTOP, /* The event value contains an optional decompression - depth (in meters) and time (in seconds), packed as - two 16bit integers in respectively the low and - high part. */ + SAMPLE_EVENT_DECOSTOP, SAMPLE_EVENT_RBT, SAMPLE_EVENT_ASCENT, SAMPLE_EVENT_CEILING, @@ -87,8 +85,6 @@ typedef enum parser_sample_event_t { SAMPLE_EVENT_GASCHANGE2, /* The event value contains the O2 and He percentages, packed as two 16bit integers in respectively the low and high part. */ - SAMPLE_EVENT_NDL /* The event value contains an optional no decompression - time (in seconds). */ } parser_sample_event_t; typedef enum parser_sample_flags_t { @@ -111,6 +107,13 @@ typedef enum dc_water_t { DC_WATER_SALT } dc_water_t; +typedef enum dc_deco_type_t { + DC_DECO_NDL, + DC_DECO_DECOSTOP, + DC_DECO_DEEPSTOP, + DC_DECO_SAFETYSTOP +} dc_deco_type_t; + typedef struct dc_salinity_t { dc_water_t type; double density; @@ -147,6 +150,11 @@ typedef union dc_sample_value_t { double setpoint; double ppo2; double cns; + struct { + unsigned int type; + unsigned int time; + double depth; + } deco; } dc_sample_value_t; typedef struct dc_parser_t dc_parser_t; diff --git a/src/hw_ostc_parser.c b/src/hw_ostc_parser.c index cce8f03..87d8949 100644 --- a/src/hw_ostc_parser.c +++ b/src/hw_ostc_parser.c @@ -414,15 +414,14 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call break; case 1: // Deco / NDL if (data[offset]) { - sample.event.type = SAMPLE_EVENT_DECOSTOP; - sample.event.value = data[offset] | ((data[offset + 1] * 60) << 16); + sample.deco.type = DC_DECO_DECOSTOP; + sample.deco.depth = data[offset]; } else { - sample.event.type = SAMPLE_EVENT_NDL; - sample.event.value = data[offset + 1] * 60; + sample.deco.type = DC_DECO_NDL; + sample.deco.depth = 0.0; } - sample.event.time = 0; - sample.event.flags = 0; - if (callback) callback (DC_SAMPLE_EVENT, sample, userdata); + sample.deco.time = data[offset + 1] * 60; + if (callback) callback (DC_SAMPLE_DECO, sample, userdata); break; case 5: // CNS sample.cns = data[offset] / 100.0; diff --git a/src/shearwater_predator_parser.c b/src/shearwater_predator_parser.c index a514ada..c0c6cec 100644 --- a/src/shearwater_predator_parser.c +++ b/src/shearwater_predator_parser.c @@ -251,19 +251,17 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal // Deco stop / NDL. unsigned int decostop = array_uint16_be (data + offset + 2); if (decostop) { - sample.event.type = SAMPLE_EVENT_DECOSTOP; + sample.deco.type = DC_DECO_DECOSTOP; if (units == IMPERIAL) - sample.event.value = decostop * FEET + 0.5; + sample.deco.depth = decostop * FEET; else - sample.event.value = decostop; - sample.event.value |= (data[offset + 9] * 60) << 16; + sample.deco.depth = decostop; } else { - sample.event.type = SAMPLE_EVENT_NDL; - sample.event.value = data[offset + 9] * 60; + sample.deco.type = DC_DECO_NDL; + sample.deco.depth = 0.0; } - sample.event.time = 0; - sample.event.flags = 0; - if (callback) callback (DC_SAMPLE_EVENT, sample, userdata); + sample.deco.time = data[offset + 9] * 60; + if (callback) callback (DC_SAMPLE_DECO, sample, userdata); offset += SZ_SAMPLE; }