aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/divelist.c29
-rw-r--r--core/divelist.h1
-rw-r--r--core/statistics.c10
-rw-r--r--core/statistics.h2
4 files changed, 33 insertions, 9 deletions
diff --git a/core/divelist.c b/core/divelist.c
index 84290e6b6..94adc92dc 100644
--- a/core/divelist.c
+++ b/core/divelist.c
@@ -1420,3 +1420,32 @@ void sort_table(struct dive_table *table)
{
qsort(table->dives, table->nr, sizeof(struct dive *), sortfn);
}
+
+/*
+ * Calculate surface interval for dive starting at "when". Currently, we
+ * might display dives which are not yet in the divelist, therefore the
+ * input parameter is a timestamp.
+ * If the given dive starts during a different dive, the surface interval
+ * is 0. If we can't determine a surface interval (first dive), <0 is
+ * returned. This does *not* consider pathological cases such as dives
+ * that happened inside other dives. The interval will always be calculated
+ * with respect to the dive that started previously.
+ */
+timestamp_t get_surface_interval(timestamp_t when)
+{
+ int i;
+ timestamp_t prev_end;
+
+ /* find previous dive. might want to use a binary search. */
+ for (i = dive_table.nr - 1; i >= 0; --i) {
+ if (dive_table.dives[i]->when < when)
+ break;
+ }
+ if (i < 0)
+ return -1;
+
+ prev_end = dive_endtime(dive_table.dives[i]);
+ if (prev_end > when)
+ return 0;
+ return when - prev_end;
+}
diff --git a/core/divelist.h b/core/divelist.h
index 937909d2b..af47d0f23 100644
--- a/core/divelist.h
+++ b/core/divelist.h
@@ -42,6 +42,7 @@ extern struct dive *first_selected_dive();
extern struct dive *last_selected_dive();
extern bool is_trip_before_after(const struct dive *dive, bool before);
extern void set_dive_nr_for_current_dive();
+extern timestamp_t get_surface_interval(timestamp_t when);
int get_min_datafile_version();
void reset_min_datafile_version();
diff --git a/core/statistics.c b/core/statistics.c
index beeb258a6..b25080a9f 100644
--- a/core/statistics.c
+++ b/core/statistics.c
@@ -3,7 +3,7 @@
*
* core logic for the Info & Stats page -
* char *get_minutes(int seconds);
- * void process_all_dives(struct dive *dive, struct dive **prev_dive);
+ * void process_all_dives();
*/
#include "gettext.h"
#include <string.h>
@@ -91,7 +91,7 @@ char *get_minutes(int seconds)
return buf;
}
-void process_all_dives(struct dive *dive, struct dive **prev_dive)
+void process_all_dives()
{
int idx;
struct dive *dp;
@@ -105,7 +105,6 @@ void process_all_dives(struct dive *dive, struct dive **prev_dive)
dive_trip_t *trip_ptr = 0;
unsigned int size, tsize;
- *prev_dive = NULL;
memset(&stats, 0, sizeof(stats));
if (dive_table.nr > 0) {
stats.shortest_time.seconds = dive_table.dives[0]->duration.seconds;
@@ -152,11 +151,6 @@ void process_all_dives(struct dive *dive, struct dive **prev_dive)
/* this relies on the fact that the dives in the dive_table
* are in chronological order */
for_each_dive (idx, dp) {
- if (dive && dp->when == dive->when) {
- /* that's the one we are showing */
- if (idx > 0)
- *prev_dive = dive_table.dives[idx - 1];
- }
process_dive(dp, &stats);
/* yearly statistics */
diff --git a/core/statistics.h b/core/statistics.h
index 597edfb94..7766d3154 100644
--- a/core/statistics.h
+++ b/core/statistics.h
@@ -48,7 +48,7 @@ extern stats_t *stats_by_trip;
extern stats_t *stats_by_type;
extern char *get_minutes(int seconds);
-extern void process_all_dives(struct dive *dive, struct dive **prev_dive);
+extern void process_all_dives();
extern void get_gas_used(struct dive *dive, volume_t gases[MAX_CYLINDERS]);
extern void process_selected_dives(void);
void selected_dives_gas_parts(volume_t *o2_tot, volume_t *he_tot);