summaryrefslogtreecommitdiffstats
path: root/core/dive.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/dive.c')
-rw-r--r--core/dive.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/core/dive.c b/core/dive.c
index 3bba4179c..1658d3bdd 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -127,6 +127,11 @@ int event_is_gaschange(const struct event *ev)
ev->type == SAMPLE_EVENT_GASCHANGE2;
}
+bool event_is_divemodechange(const struct event *ev)
+{
+ return same_string(ev->name, "modechange");
+}
+
struct event *create_event(unsigned int time, int type, int flags, int value, const char *name)
{
int gas_index = -1;
@@ -573,6 +578,31 @@ void copy_events(const struct divecomputer *s, struct divecomputer *d)
*pev = NULL;
}
+/* copies all events from all dive computers before a given time
+ this is used when editing a dive in the planner to preserve the events
+ of the old dive */
+void copy_events_until(const struct dive *sd, struct dive *dd, int time)
+{
+ if (!sd || !dd)
+ return;
+
+ const struct divecomputer *s = &sd->dc;
+ struct divecomputer *d = &dd->dc;
+
+ while (s && d) {
+ const struct event *ev;
+ ev = s->events;
+ while (ev != NULL) {
+ // Don't add events the planner knows about
+ if (ev->time.seconds < time && !event_is_gaschange(ev) && !event_is_divemodechange(ev))
+ add_event(d, ev->time.seconds, ev->type, ev->flags, ev->value, ev->name);
+ ev = ev->next;
+ }
+ s = s->next;
+ d = d->next;
+ }
+}
+
int nr_cylinders(const struct dive *dive)
{
return dive->cylinders.nr;