core: replace add_sample() by append_sample()

add_sample() was used in only one place, and the return value was
always ignored. It took a time parameter, suggesting that a sample
could be added anywhere, but in reality the sample was added at
the end of the list. It used prepare_sample() that copies data
from the previous sample, just to overwrite it with the newly
added sample.

All in all very weird. Simplify the function: just append the
passed in sample and name it accordingly.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2024-05-25 08:50:20 +02:00 committed by bstoeger
parent af6201f89c
commit c27314d603
3 changed files with 15 additions and 18 deletions

View file

@ -1211,14 +1211,14 @@ struct dive *fixup_dive(struct dive *dive)
#define MERGE_NONZERO(res, a, b, n) res->n = a->n ? a->n : b->n #define MERGE_NONZERO(res, a, b, n) res->n = a->n ? a->n : b->n
/* /*
* This is like add_sample(), but if the distance from the last sample * This is like append_sample(), but if the distance from the last sample
* is excessive, we add two surface samples in between. * is excessive, we add two surface samples in between.
* *
* This is so that if you merge two non-overlapping dives, we make sure * This is so that if you merge two non-overlapping dives, we make sure
* that the time in between the dives is at the surface, not some "last * that the time in between the dives is at the surface, not some "last
* sample that happened to be at a depth of 1.2m". * sample that happened to be at a depth of 1.2m".
*/ */
static void merge_one_sample(const struct sample &sample, int time, struct divecomputer *dc) static void merge_one_sample(const struct sample &sample, struct divecomputer *dc)
{ {
if (!dc->samples.empty()) { if (!dc->samples.empty()) {
const struct sample &prev = dc->samples.back(); const struct sample &prev = dc->samples.back();
@ -1229,18 +1229,21 @@ static void merge_one_sample(const struct sample &sample, int time, struct divec
* Only do surface events if the samples are more than * Only do surface events if the samples are more than
* a minute apart, and shallower than 5m * a minute apart, and shallower than 5m
*/ */
if (time > last_time + 60 && last_depth < 5000) { if (sample.time.seconds > last_time + 60 && last_depth < 5000) {
struct sample surface; struct sample surface;
/* Init a few values from prev sample to avoid useless info in XML */ /* Init a few values from prev sample to avoid useless info in XML */
surface.bearing.degrees = prev.bearing.degrees; surface.bearing.degrees = prev.bearing.degrees;
surface.ndl.seconds = prev.ndl.seconds; surface.ndl.seconds = prev.ndl.seconds;
surface.time.seconds = last_time + 20;
add_sample(&surface, last_time + 20, dc); append_sample(surface, dc);
add_sample(&surface, time - 20, dc);
surface.time.seconds = sample.time.seconds - 20;
append_sample(surface, dc);
} }
} }
add_sample(&sample, time, dc); append_sample(sample, dc);
} }
static void renumber_last_sample(struct divecomputer *dc, const int mapping[]); static void renumber_last_sample(struct divecomputer *dc, const int mapping[]);
@ -1287,7 +1290,7 @@ static void merge_samples(struct divecomputer *res,
/* Only samples from a? */ /* Only samples from a? */
if (bt < 0) { if (bt < 0) {
add_sample_a: add_sample_a:
merge_one_sample(*as, at, res); merge_one_sample(*as, res);
renumber_last_sample(res, cylinders_map_a); renumber_last_sample(res, cylinders_map_a);
as++; as++;
continue; continue;
@ -1296,7 +1299,7 @@ static void merge_samples(struct divecomputer *res,
/* Only samples from b? */ /* Only samples from b? */
if (at < 0) { if (at < 0) {
add_sample_b: add_sample_b:
merge_one_sample(*bs, bt, res); merge_one_sample(*bs, res);
renumber_last_sample(res, cylinders_map_b); renumber_last_sample(res, cylinders_map_b);
bs++; bs++;
continue; continue;
@ -1339,7 +1342,7 @@ static void merge_samples(struct divecomputer *res,
if (as->in_deco) if (as->in_deco)
sample.in_deco = true; sample.in_deco = true;
merge_one_sample(sample, at, res); merge_one_sample(sample, res);
as++; as++;
bs++; bs++;

View file

@ -263,15 +263,9 @@ struct sample *prepare_sample(struct divecomputer *dc)
return NULL; return NULL;
} }
struct sample *add_sample(const struct sample *sample, int time, struct divecomputer *dc) void append_sample(const struct sample &sample, struct divecomputer *dc)
{ {
struct sample *p = prepare_sample(dc); dc->samples.push_back(sample);
if (p) {
*p = *sample;
p->time.seconds = time;
}
return p;
} }
/* /*

View file

@ -56,7 +56,7 @@ extern void free_dc_contents(struct divecomputer *dc);
extern int get_depth_at_time(const struct divecomputer *dc, unsigned int time); extern int get_depth_at_time(const struct divecomputer *dc, unsigned int time);
extern void free_dive_dcs(struct divecomputer *dc); extern void free_dive_dcs(struct divecomputer *dc);
extern struct sample *prepare_sample(struct divecomputer *dc); extern struct sample *prepare_sample(struct divecomputer *dc);
extern struct sample *add_sample(const struct sample *sample, int time, struct divecomputer *dc); extern void append_sample(const struct sample &sample, struct divecomputer *dc);
extern void fixup_dc_duration(struct divecomputer *dc); extern void fixup_dc_duration(struct divecomputer *dc);
extern unsigned int dc_airtemp(const struct divecomputer *dc); extern unsigned int dc_airtemp(const struct divecomputer *dc);
extern unsigned int dc_watertemp(const struct divecomputer *dc); extern unsigned int dc_watertemp(const struct divecomputer *dc);