aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--device.c38
-rw-r--r--dives/test0.xml4
-rw-r--r--dives/test0b.xml15
3 files changed, 52 insertions, 5 deletions
diff --git a/device.c b/device.c
index 4084c4edb..030368c60 100644
--- a/device.c
+++ b/device.c
@@ -12,10 +12,10 @@
* To do that, we generate a 6-point profile:
*
* (0, 0)
- * (t0, max_d)
* (t1, max_d)
- * (t2, d)
+ * (t2, max_d)
* (t3, d)
+ * (t4, d)
* (max_t, 0)
*
* with the same ascent/descent rates between the
@@ -80,6 +80,28 @@ static int fill_samples(struct sample *s, int max_d, int avg_d, int max_t, doubl
return 1;
}
+/* we have no average depth; instead of making up a random average depth
+ * we should assume either a PADI recrangular profile (for short and/or
+ * shallow dives) or more reasonably a six point profile with a 3 minute
+ * safety stop at 5m */
+static void fill_samples_no_avg(struct sample *s, int max_d, int max_t, double slope)
+{
+ // shallow or short dives are just trapecoids based on the given slope
+ if (max_d < 10000 || max_t < 600) {
+ s[1].time.seconds = max_d / slope; s[1].depth.mm = max_d;
+ s[2].time.seconds = max_t - max_d / slope; s[2].depth.mm = max_d;
+ } else {
+ s[1].time.seconds = max_d / slope;
+ s[1].depth.mm = max_d;
+ s[2].time.seconds = max_t - max_d / slope - 180;
+ s[2].depth.mm = max_d;
+ s[3].time.seconds = max_t - 5000 / slope - 180;
+ s[3].depth.mm = 5000;
+ s[4].time.seconds = max_t - 5000 / slope;
+ s[4].depth.mm = 5000;
+ }
+}
+
struct divecomputer* fake_dc(struct divecomputer* dc)
{
static struct sample fake[6];
@@ -105,7 +127,17 @@ struct divecomputer* fake_dc(struct divecomputer* dc)
* a reasonable average, let's just make something
* up. Note that 'avg_d == max_d' is _not_ a reasonable
* average.
- */
+ * We explicitly treat avg_d == 0 differently */
+ if (avg_d == 0) {
+ /* we try for a sane slope, but bow to the insanity of
+ * the user supplied data */
+ fill_samples_no_avg(fake, max_d, max_t, MAX(2.0 * max_d / max_t, 5000.0 / 60));
+ if(fake[3].time.seconds == 0) { // just a 4 point profile
+ fakedc.samples = 4;
+ fake[3].time.seconds = max_t;
+ }
+ return &fakedc;
+ }
if (avg_d < max_d / 10 || avg_d >= max_d) {
avg_d = (max_d+10000)/3;
if (avg_d > max_d)
diff --git a/dives/test0.xml b/dives/test0.xml
index 1d15fac85..6ade06519 100644
--- a/dives/test0.xml
+++ b/dives/test0.xml
@@ -1,6 +1,6 @@
<dives>
<program name='subsurface' version='1'></program>
- <dive number='0' date='2011-01-01' time='08:00:00' duration='30:00 min'>
+ <dive number='0' date='2011-01-01' time='07:00:00' duration='30:00 min'>
<depth max='30.00 m' mean='15.00 m' />
</dive>
-</dives> \ No newline at end of file
+</dives>
diff --git a/dives/test0b.xml b/dives/test0b.xml
new file mode 100644
index 000000000..30e6f34b6
--- /dev/null
+++ b/dives/test0b.xml
@@ -0,0 +1,15 @@
+<dives>
+ <program name='subsurface' version='1'></program>
+ <dive number='0' date='2011-01-01' time='08:00:00' duration='20:00 min'>
+ <depth max='30.00 m' />
+ </dive>
+ <dive number='0' date='2011-01-01' time='08:25:00' duration='8:00 min'>
+ <depth max='11.00 m' />
+ </dive>
+ <dive number='0' date='2011-01-01' time='08:35:00' duration='10:00 min'>
+ <depth max='8.00 m' />
+ </dive>
+ <dive number='0' date='2011-01-01' time='08:50:00' duration='3:00 min'>
+ <depth max='20.00 m' />
+ </dive>
+</dives>