Add a TTS field to the deco sample

Some dive computers report the time of the next decompression stop,
while others report the Time To Surface (TTS). Some models can even
report both.

Add a TTS field to the deco sample to support both values.
This commit is contained in:
Jef Driesen 2021-04-22 20:56:25 +02:00
parent b1ff2c6a8e
commit 4b383a778e
20 changed files with 32 additions and 2 deletions

View File

@ -171,6 +171,10 @@ sample_cb (dc_sample_type_t type, dc_sample_value_t value, void *userdata)
value.deco.time, value.deco.time,
convert_depth(value.deco.depth, sampledata->units), convert_depth(value.deco.depth, sampledata->units),
decostop[value.deco.type]); decostop[value.deco.type]);
if (value.deco.tts) {
fprintf (sampledata->ostream, " <tts>%u</tts>\n",
value.deco.tts);
}
break; break;
case DC_SAMPLE_GASMIX: case DC_SAMPLE_GASMIX:
fprintf (sampledata->ostream, " <gasmix>%u</gasmix>\n", value.gasmix); fprintf (sampledata->ostream, " <gasmix>%u</gasmix>\n", value.gasmix);

View File

@ -257,6 +257,7 @@ typedef union dc_sample_value_t {
unsigned int type; unsigned int type;
unsigned int time; unsigned int time;
double depth; double depth;
unsigned int tts;
} deco; } deco;
unsigned int gasmix; /* Gas mix index */ unsigned int gasmix; /* Gas mix index */
} dc_sample_value_t; } dc_sample_value_t;

View File

@ -344,6 +344,7 @@ atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
sample.deco.type = DC_DECO_NDL; sample.deco.type = DC_DECO_NDL;
sample.deco.time = ndl; sample.deco.time = ndl;
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
offset += SZ_SEGMENT; offset += SZ_SEGMENT;

View File

@ -615,6 +615,7 @@ cochran_commander_parser_samples_foreach_tm (dc_parser_t *abstract, dc_sample_ca
sample.deco.type = DC_DECO_DECOSTOP; sample.deco.type = DC_DECO_DECOSTOP;
sample.deco.time = 60; // We don't know the duration sample.deco.time = 60; // We don't know the duration
sample.deco.depth = deco_ceiling * FEET; sample.deco.depth = deco_ceiling * FEET;
sample.deco.tts = 0;
if (callback) callback(DC_SAMPLE_DECO, sample, userdata); if (callback) callback(DC_SAMPLE_DECO, sample, userdata);
break; break;
case 0xAD: // Increment ceiling (shallower) case 0xAD: // Increment ceiling (shallower)
@ -623,6 +624,7 @@ cochran_commander_parser_samples_foreach_tm (dc_parser_t *abstract, dc_sample_ca
sample.deco.type = DC_DECO_DECOSTOP; sample.deco.type = DC_DECO_DECOSTOP;
sample.deco.depth = deco_ceiling * FEET; sample.deco.depth = deco_ceiling * FEET;
sample.deco.time = 60; // We don't know the duration sample.deco.time = 60; // We don't know the duration
sample.deco.tts = 0;
if (callback) callback(DC_SAMPLE_DECO, sample, userdata); if (callback) callback(DC_SAMPLE_DECO, sample, userdata);
break; break;
default: default:
@ -774,6 +776,7 @@ cochran_commander_parser_samples_foreach_emc (dc_parser_t *abstract, dc_sample_c
sample.deco.type = DC_DECO_DECOSTOP; sample.deco.type = DC_DECO_DECOSTOP;
sample.deco.time = (array_uint16_le(s + 3) + 1) * 60; sample.deco.time = (array_uint16_le(s + 3) + 1) * 60;
sample.deco.depth = deco_ceiling * FEET; sample.deco.depth = deco_ceiling * FEET;
sample.deco.tts = 0;
if (callback) callback(DC_SAMPLE_DECO, sample, userdata); if (callback) callback(DC_SAMPLE_DECO, sample, userdata);
break; break;
case 0xAD: // Increment ceiling (shallower) case 0xAD: // Increment ceiling (shallower)
@ -782,6 +785,7 @@ cochran_commander_parser_samples_foreach_emc (dc_parser_t *abstract, dc_sample_c
sample.deco.type = DC_DECO_DECOSTOP; sample.deco.type = DC_DECO_DECOSTOP;
sample.deco.depth = deco_ceiling * FEET; sample.deco.depth = deco_ceiling * FEET;
sample.deco.time = (array_uint16_le(s + 3) + 1) * 60; sample.deco.time = (array_uint16_le(s + 3) + 1) * 60;
sample.deco.tts = 0;
if (callback) callback(DC_SAMPLE_DECO, sample, userdata); if (callback) callback(DC_SAMPLE_DECO, sample, userdata);
break; break;
case 0xC0: // Switched to FO2 21% mode (surface) case 0xC0: // Switched to FO2 21% mode (surface)
@ -855,6 +859,7 @@ cochran_commander_parser_samples_foreach_emc (dc_parser_t *abstract, dc_sample_c
sample.deco.type = DC_DECO_NDL; sample.deco.type = DC_DECO_NDL;
sample.deco.time = deco_time * 60; sample.deco.time = deco_time * 60;
sample.deco.depth = 0; sample.deco.depth = 0;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
} }
break; break;
@ -865,6 +870,7 @@ cochran_commander_parser_samples_foreach_emc (dc_parser_t *abstract, dc_sample_c
sample.deco.type = DC_DECO_DECOSTOP; sample.deco.type = DC_DECO_DECOSTOP;
sample.deco.depth = deco_ceiling * FEET; sample.deco.depth = deco_ceiling * FEET;
sample.deco.time = deco_time * 60; sample.deco.time = deco_time * 60;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
} }
break; break;

View File

@ -978,6 +978,7 @@ divesoft_freedom_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
sample.deco.time = ndl * 60; sample.deco.time = ndl * 60;
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
} }
sample.deco.tts = tts * 60;
if (callback) callback(DC_SAMPLE_DECO, sample, userdata); if (callback) callback(DC_SAMPLE_DECO, sample, userdata);
// Setpoint // Setpoint

View File

@ -566,11 +566,13 @@ divesystem_idive_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
if (decostop) { if (decostop) {
sample.deco.type = DC_DECO_DECOSTOP; sample.deco.type = DC_DECO_DECOSTOP;
sample.deco.depth = decostop / 10.0; sample.deco.depth = decostop / 10.0;
sample.deco.time = apos4 ? decotime : tts; sample.deco.time = decotime;
sample.deco.tts = tts;
} else { } else {
sample.deco.type = DC_DECO_NDL; sample.deco.type = DC_DECO_NDL;
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
sample.deco.time = tts; sample.deco.time = tts;
sample.deco.tts = 0;
} }
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);

View File

@ -1053,6 +1053,7 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
} }
sample.deco.time = data[offset + 1] * 60; sample.deco.time = data[offset + 1] * 60;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
break; break;
case PPO2: case PPO2:

View File

@ -593,6 +593,7 @@ liquivision_lynx_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
} }
sample.deco.time = 0; sample.deco.time = 0;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
have_deco = 0; have_deco = 0;
} }

View File

@ -282,6 +282,7 @@ mares_darwin_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
} }
sample.deco.time = 0; sample.deco.time = 0;
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
if (parser->samplesize == 3) { if (parser->samplesize == 3) {

View File

@ -1159,6 +1159,7 @@ mares_iconhd_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
} }
sample.deco.time = decotime * 60; sample.deco.time = decotime * 60;
sample.deco.tts = tts;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
// Alarms // Alarms

View File

@ -422,6 +422,7 @@ mares_nemo_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t c
} }
sample.deco.time = 0; sample.deco.time = 0;
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
// Pressure (1 bar). // Pressure (1 bar).

View File

@ -964,6 +964,7 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
} }
sample.deco.time = decotime * 60; sample.deco.time = decotime * 60;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
} }

View File

@ -277,6 +277,7 @@ oceanic_veo250_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
} }
sample.deco.time = decotime * 60; sample.deco.time = decotime * 60;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
} }

View File

@ -372,6 +372,7 @@ oceanic_vtpro_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
} }
sample.deco.time = decotime * 60; sample.deco.time = decotime * 60;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
} }

View File

@ -298,6 +298,7 @@ oceans_s1_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t ca
} }
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
sample.deco.time = 0; sample.deco.time = 0;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
} }
} }

View File

@ -377,6 +377,7 @@ seac_screen_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
sample.deco.time = ndl_tts; sample.deco.time = ndl_tts;
sample.deco.depth = 0; sample.deco.depth = 0;
} }
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
// CNS // CNS

View File

@ -995,6 +995,7 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
} }
sample.deco.time = data[offset + pnf + 9] * 60; sample.deco.time = data[offset + pnf + 9] * 60;
sample.deco.tts = array_uint16_be (data + offset + pnf + 4) * 60;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
// for logversion 7 and newer (introduced for Perdix AI) // for logversion 7 and newer (introduced for Perdix AI)

View File

@ -811,6 +811,7 @@ suunto_d9_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t ca
} }
sample.deco.time = 0; sample.deco.time = 0;
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
time += interval_sample; time += interval_sample;

View File

@ -510,6 +510,7 @@ static void sample_ndl(struct sample_data *info, short ndl)
sample.deco.type = DC_DECO_NDL; sample.deco.type = DC_DECO_NDL;
sample.deco.time = ndl; sample.deco.time = ndl;
sample.deco.tts = 0;
if (info->callback) info->callback(DC_SAMPLE_DECO, sample, info->userdata); if (info->callback) info->callback(DC_SAMPLE_DECO, sample, info->userdata);
} }
@ -996,8 +997,9 @@ static int traverse_samples(unsigned short type, const struct type_desc *desc, c
dc_sample_value_t sample = {0}; dc_sample_value_t sample = {0};
sample.deco.type = DC_DECO_DECOSTOP; sample.deco.type = DC_DECO_DECOSTOP;
sample.deco.time = info->tts; sample.deco.time = 0;
sample.deco.depth = info->ceiling; sample.deco.depth = info->ceiling;
sample.deco.tts = info->tts;
if (info->callback) info->callback(DC_SAMPLE_DECO, sample, info->userdata); if (info->callback) info->callback(DC_SAMPLE_DECO, sample, info->userdata);
} }

View File

@ -272,6 +272,7 @@ uwatec_memomouse_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
} }
sample.deco.time = 0; sample.deco.time = 0;
sample.deco.depth = 0.0; sample.deco.depth = 0.0;
sample.deco.tts = 0;
if (callback) callback (DC_SAMPLE_DECO, sample, userdata); if (callback) callback (DC_SAMPLE_DECO, sample, userdata);
// Warnings // Warnings