Change the units for the sample time to milliseconds

Some dive computers, especially freediving computers, supports multiple
samples per second. Since our smallest unit of time is one second, we
can't represent this, and the extra samples are dropped. Therefore, the
units are changed to milliseconds to prepare supporting this extra
resolution.
This commit is contained in:
Jef Driesen 2018-10-16 09:10:52 +02:00
parent 070de23b83
commit a34e909a84
39 changed files with 65 additions and 57 deletions

View File

@ -63,7 +63,7 @@ closed.
The following sample types may be raised:
.Bl -tag -width Ds
.It Dv DC_SAMPLE_TIME
The time of the sample taken in seconds after the dive began.
The time of the sample taken in milliseconds after the dive began.
Set in the
.Fa time
field.

View File

@ -104,12 +104,20 @@ sample_cb (dc_sample_type_t type, dc_sample_value_t value, void *userdata)
sample_data_t *sampledata = (sample_data_t *) userdata;
unsigned int seconds = 0, milliseconds = 0;
switch (type) {
case DC_SAMPLE_TIME:
seconds = value.time / 1000;
milliseconds = value.time % 1000;
if (sampledata->nsamples++)
fprintf (sampledata->ostream, "</sample>\n");
fprintf (sampledata->ostream, "<sample>\n");
fprintf (sampledata->ostream, " <time>%02u:%02u</time>\n", value.time / 60, value.time % 60);
if (milliseconds) {
fprintf (sampledata->ostream, " <time>%02u:%02u.%03u</time>\n", seconds / 60, seconds % 60, milliseconds);
} else {
fprintf (sampledata->ostream, " <time>%02u:%02u</time>\n", seconds / 60, seconds % 60);
}
break;
case DC_SAMPLE_DEPTH:
fprintf (sampledata->ostream, " <depth>%.2f</depth>\n",

View File

@ -225,7 +225,7 @@ typedef struct dc_decomodel_t {
} dc_decomodel_t;
typedef union dc_sample_value_t {
unsigned int time;
unsigned int time; /* Milliseconds */
double depth;
struct {
unsigned int tank;

View File

@ -276,7 +276,7 @@ atomics_cobalt_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
// Time (seconds).
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/1000 bar).

View File

@ -241,7 +241,7 @@ citizen_aqualand_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
// Time
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth

View File

@ -578,7 +578,7 @@ cochran_commander_parser_samples_foreach_tm (dc_parser_t *abstract, dc_sample_ca
unsigned int temp = samples[0]; // Half degrees F
unsigned int depth = samples[1]; // Half feet
last_sample_time = sample.time = time;
last_sample_time = sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
sample.depth = (depth / 2.0) * FEET;
@ -593,7 +593,7 @@ cochran_commander_parser_samples_foreach_tm (dc_parser_t *abstract, dc_sample_ca
while (offset < size) {
const unsigned char *s = samples + offset;
sample.time = time;
sample.time = time * 1000;
if (last_sample_time != sample.time) {
// We haven't issued this time yet.
last_sample_time = sample.time;
@ -714,7 +714,7 @@ cochran_commander_parser_samples_foreach_emc (dc_parser_t *abstract, dc_sample_c
start_depth = array_uint16_le (data + layout->start_depth) / 256.0;
}
last_sample_time = sample.time = time;
last_sample_time = sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
sample.depth = start_depth * FEET;
@ -730,7 +730,7 @@ cochran_commander_parser_samples_foreach_emc (dc_parser_t *abstract, dc_sample_c
while (offset < size) {
const unsigned char *s = samples + offset;
sample.time = time;
sample.time = time * 1000;
if (last_sample_time != sample.time) {
// We haven't issued this time yet.
last_sample_time = sample.time;

View File

@ -201,7 +201,7 @@ cressi_edy_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t c
// Time (seconds).
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m).

View File

@ -329,7 +329,7 @@ cressi_goa_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t c
if (complete) {
// Time (seconds).
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Temperature (1/10 °C).

View File

@ -196,7 +196,7 @@ cressi_leonardo_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callbac
// Time (seconds).
time += surftime;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m).
@ -211,7 +211,7 @@ cressi_leonardo_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callbac
// Time (seconds).
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m).

View File

@ -204,7 +204,7 @@ deepblu_cosmiq_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
offset += SZ_SAMPLE;
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
sample.depth = (signed int) (depth - atmospheric) * (BAR / 1000.0) / parser->hydrostatic;

View File

@ -423,7 +423,7 @@ deepsix_excursion_parser_samples_foreach_v0 (dc_parser_t *abstract, dc_sample_ca
if (type == TEMPERATURE) {
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback(DC_SAMPLE_TIME, sample, userdata);
sample.depth = pressure_to_depth(depth, atmospheric, DENSITY);
@ -591,7 +591,7 @@ deepsix_excursion_parser_samples_foreach_v1 (dc_parser_t *abstract, dc_sample_ca
// Time (seconds).
time += samplerate;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
unsigned int depth = array_uint16_le (data + offset);

View File

@ -264,7 +264,7 @@ diverite_nitekq_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callbac
// Time (seconds).
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Gas change

View File

@ -924,7 +924,7 @@ divesoft_freedom_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
continue;
}
time = timestamp;
sample.time = time;
sample.time = time * 1000;
if (callback) callback(DC_SAMPLE_TIME, sample, userdata);
}

View File

@ -474,7 +474,7 @@ divesystem_idive_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
return DC_STATUS_DATAFORMAT;
}
time = timestamp;
sample.time = timestamp;
sample.time = timestamp * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m).

View File

@ -833,7 +833,7 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call
// Time (seconds).
time += samplerate;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Initial gas mix.

View File

@ -545,7 +545,7 @@ liquivision_lynx_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
// Time (seconds).
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/100 m).

View File

@ -242,7 +242,7 @@ mares_darwin_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
// Surface Time (seconds).
time += 20;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m).

View File

@ -1022,7 +1022,7 @@ mares_iconhd_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
// Surface Time (seconds).
time += surftime;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Surface Depth (0 m).
@ -1035,7 +1035,7 @@ mares_iconhd_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
for (unsigned int i = 0; i < divetime; ++i) {
// Time (seconds).
time += parser->interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m).
@ -1052,7 +1052,7 @@ mares_iconhd_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
// Surface Time (seconds).
time += surftime;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Surface Depth (0 m).
@ -1061,7 +1061,7 @@ mares_iconhd_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
// Dive Time (seconds).
time += divetime;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Maximum Depth (1/10 m).
@ -1123,7 +1123,7 @@ mares_iconhd_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
// Time (seconds).
time += parser->interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m).

View File

@ -382,7 +382,7 @@ mares_nemo_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t c
// Time (seconds).
time += 20;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m).
@ -459,7 +459,7 @@ mares_nemo_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t c
// Surface Time (seconds).
time += surftime;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Surface Depth (0 m).
@ -500,7 +500,7 @@ mares_nemo_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t c
time += interval;
if (time > maxtime)
time = maxtime; // Adjust the last sample.
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m).
@ -519,7 +519,7 @@ mares_nemo_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t c
} else {
// Dive Time (seconds).
time += divetime;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Maximum Depth (1/10 m).

View File

@ -269,7 +269,7 @@ mclean_extreme_parser_samples_foreach(dc_parser_t *abstract, dc_sample_callback_
const unsigned int setpoint = abstract->data[0x0013 + sp_index];
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback(DC_SAMPLE_TIME, sample, userdata);
sample.depth = 0.1 * depth;

View File

@ -758,7 +758,7 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_
for (unsigned int i = 0; i < nsamples; ++i) {
// Time
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Vendor specific data
@ -802,7 +802,7 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_
} else {
time += interval;
}
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Vendor specific data

View File

@ -230,7 +230,7 @@ oceanic_veo250_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
// Time.
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Vendor specific data

View File

@ -331,7 +331,7 @@ oceanic_vtpro_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_
time = timestamp * 60 + (i + 1) * interval;
else
time = timestamp * 60 + (i + 1) * 60.0 / count + 0.5;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Vendor specific data

View File

@ -249,7 +249,7 @@ oceans_s1_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t ca
unsigned int nsamples = seconds / interval;
for (unsigned int i = 0; i < nsamples; ++i) {
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
sample.depth = 0;
@ -257,7 +257,7 @@ oceans_s1_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t ca
}
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
sample.depth = depth / 100.0;
@ -280,7 +280,7 @@ oceans_s1_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t ca
}
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
sample.depth = depth / 100.0;

View File

@ -399,7 +399,7 @@ sample_statistics_cb (dc_sample_type_t type, dc_sample_value_t value, void *user
switch (type) {
case DC_SAMPLE_TIME:
statistics->divetime = value.time;
statistics->divetime = value.time / 1000;
break;
case DC_SAMPLE_DEPTH:
if (statistics->maxdepth < value.depth)

View File

@ -279,7 +279,7 @@ reefnet_sensus_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback
// Time (seconds)
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (adjusted feet of seawater).

View File

@ -278,7 +278,7 @@ reefnet_sensuspro_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callb
// Time (seconds)
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Temperature (°F)

View File

@ -275,7 +275,7 @@ reefnet_sensusultra_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal
// Time (seconds)
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Temperature (0.01 °K)

View File

@ -331,7 +331,7 @@ seac_screen_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
return DC_STATUS_DATAFORMAT;
}
time = timestamp;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/100 m).

View File

@ -899,7 +899,7 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal
if (type == LOG_RECORD_DIVE_SAMPLE) {
// Time (seconds).
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m or ft).
@ -1076,7 +1076,7 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal
// Time (seconds).
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (absolute pressure in millibar)

View File

@ -184,7 +184,7 @@ sporasub_sp2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
// Time (seconds)
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/100 m)

View File

@ -521,7 +521,7 @@ suunto_d9_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t ca
dc_sample_value_t sample = {0};
// Time (seconds).
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Sample data.

View File

@ -294,7 +294,7 @@ suunto_eon_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t c
if (complete) {
// Time (seconds).
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
complete = 0;
}
@ -341,7 +341,7 @@ suunto_eon_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t c
// Time
if (complete) {
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
}

View File

@ -474,7 +474,7 @@ static void sample_time(struct sample_data *info, unsigned short time_delta)
dc_sample_value_t sample = {0};
info->time += time_delta;
sample.time = info->time / 1000;
sample.time = info->time / 1000 * 1000;
if (info->callback) info->callback(DC_SAMPLE_TIME, sample, info->userdata);
}

View File

@ -183,7 +183,7 @@ suunto_solution_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callbac
if (value < 0x7e || value > 0x82) {
// Time (minutes).
time += 3 * 60;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (ft).

View File

@ -353,7 +353,7 @@ suunto_vyper_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
if (complete) {
// Time (seconds).
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
complete = 0;
}
@ -425,7 +425,7 @@ suunto_vyper_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
// Time
if (complete) {
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
}

View File

@ -159,7 +159,7 @@ tecdiving_divecomputereu_parser_samples_foreach (dc_parser_t *abstract, dc_sampl
// Time (seconds).
time += interval;
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (1/10 m).

View File

@ -250,7 +250,7 @@ uwatec_memomouse_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
offset += 2;
// Time (seconds)
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Depth (meters)

View File

@ -1162,7 +1162,7 @@ uwatec_smart_parse (uwatec_smart_parser_t *parser, dc_sample_callback_t callback
}
while (complete) {
sample.time = time;
sample.time = time * 1000;
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
if (parser->ngasmixes && gasmix != gasmix_previous) {