diff options
Diffstat (limited to 'core/dive.c')
-rw-r--r-- | core/dive.c | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/core/dive.c b/core/dive.c index 680635e8f..66f05b0b3 100644 --- a/core/dive.c +++ b/core/dive.c @@ -244,7 +244,7 @@ void add_extra_data(struct divecomputer *dc, const char *key, const char *value) struct event *get_next_divemodechange(struct event **evd) { /* Starting at the event pointed to by evd, find the next divemode change event and initialise its * type and divemode. Requires an external pointer (evd) to a divemode change event, usually - * initialised to dc->events. This function is self-tracking and the value of evd needs no + * a copy of dc->events. This function is self-tracking and the value of evd needs no * setting or manipulation outside of this function. */ struct event *ev = *evd; while (ev) { // Step through the events. @@ -277,27 +277,40 @@ struct event *peek_next_divemodechange(struct event *evd) return (NULL); } +/* +enum dive_comp_type get_divemode_at_time(struct divecomputer *dc, int divetime, struct event **ev_dmc) +{ // The dummy version of this function, call parameters compatible with self-tracking version. + return dc->divemode; +} + +enum dive_comp_type get_divemode_at_time(struct divecomputer *dc, int divetime, struct event **ev_dmc) +{ // The non-self-tracking version of this function, call parameters compatible with self-tracking version. + struct event *ev, *ev_ndc = dc->events; + enum dive_comp_type mode = dc->divemode; + ev = get_next_divemodechange(&ev_ndc); + while (ev && (divetime >= ev->time.seconds)) { + mode = ev->divemode; + ev = get_next_divemodechange(&ev_ndc); + } + return mode; +} */ + enum dive_comp_type get_divemode_at_time(struct divecomputer *dc, int dtime, struct event **ev_dmc) { /* For a particular dive computer and its linked list of events, find the divemode dtime seconds * into the dive. Requires an external pointer (ev_dmc) to a divemode change event, usually - * initialised by a call to get_next_divemodechange(dc->events). This function is self-tracking - * and the value of ev_dmc needs no setting or manipulation outside of this function. */ - enum dive_comp_type mode; - struct event *ev = *ev_dmc; // ev_dmc points to event initialised by get_next_divemodechange() - if (!ev) - mode = dc->divemode; // if there is no divemodechange event, default to dc->divemode - else { - mode = ev->divemode; // If there is a starting divemodechange event, use the divemode of that event. - while (ev && (dtime >= ev->time.seconds)) { // If dtime is AFTER this event time, store divemode - mode = ev->divemode; - *ev_dmc = ev; - ev = peek_next_divemodechange(ev->next); // peek at the time of the following divemode change event - } - } + * initialised by a call to get_next_divemodechange(©-of-dc->events). This function is self-tracking + * and the value of ev_dmc needs no manipulation outside of this function. */ + enum dive_comp_type mode = dc->divemode; + struct event *ev_last = *ev_dmc, *ev = *ev_dmc; // ev_dmc points to event initialised by get_next_divemodechange() + while (ev && (dtime >= ev->time.seconds)) { // If dtime is AFTER this event time, store divemode + mode = ev->divemode; + ev_last = ev; + ev = peek_next_divemodechange(ev->next); // peek at the time of the following divemode change event + } + *ev_dmc = ev_last; return (mode); } - /* this returns a pointer to static variable - so use it right away after calling */ struct gasmix *get_gasmix_from_event(struct dive *dive, struct event *ev) { |