]> git.tdb.fi Git - ext/subsurface.git/blobdiff - cochran.c
Fix profile and average depth for freedives
[ext/subsurface.git] / cochran.c
index 650a479b126be47c672aa410e3509a6e54c2223b..933e1de1fcac5f95b36498d76693a62b1db525e1 100644 (file)
--- a/cochran.c
+++ b/cochran.c
@@ -8,6 +8,8 @@
 #include "dive.h"
 #include "file.h"
 
+#define DON
+
 /*
  * The Cochran file format is designed to be annoying to read. It's roughly:
  *
@@ -135,11 +137,7 @@ static void parse_cochran_header(const char *filename,
         * The header scrambling is different form the dive
         * scrambling. Oh yay!
         */
-#if 0 // Alex
-       partial_decode(0x058c, 0x0b14, decode, 0, mod, in, size, buf);
-#else // Don
-       partial_decode(0x05a0, 0x0b14, decode, 0, mod, in, size, buf);
-#endif
+       partial_decode(0x010e, 0x0b14, decode, 0, mod, in, size, buf);
        partial_decode(0x0b14, 0x1b14, decode, 0, mod, in, size, buf);
        partial_decode(0x1b14, 0x2b14, decode, 0, mod, in, size, buf);
        partial_decode(0x2b14, 0x3b14, decode, 0, mod, in, size, buf);
@@ -152,11 +150,74 @@ static void parse_cochran_header(const char *filename,
        free(buf);
 }
 
+/*
+ * Cochran export files show that depths seem to be in
+ * quarter feet (rounded up to tenths).
+ *
+ * Temperature seems to be exported in Fahrenheit.
+ *
+ * Cylinder pressure seems to be in multiples of 4 psi.
+ *
+ * The data seems to be some byte-stream where the pattern
+ * appears to be that the two high bits indicate type of
+ * data.
+ *
+ * For '00', the low six bits seem to be positive
+ * values with a distribution towards zero, probably depth
+ * deltas. '0 0' exists, but is very rare ("surface"?). 63
+ * exists, but is rare.
+ *
+ * For '01', the low six bits seem to be a signed binary value,
+ * with the most common being 0, and 1 and -1 (63) being the
+ * next most common values.
+ *
+ * NOTE! Don's CAN data is different. It shows the reverse pattern
+ * for 00 and 01 above: 00 looks like signed data, with 01 looking
+ * like unsigned data.
+ *
+ * For '10', there seems to be another positive value distribution,
+ * but unlike '00' the value 0 is common, and I see examples of 63
+ * too ("overflow"?) and a spike at '7'.
+ *
+ * Again, Don's data is different.
+ *
+ * The values for '11' seem to be some exception case. Possibly
+ * overflow handling, possibly warning events. It doesn't have
+ * any clear distribution: values 0, 1, 16, 33, 35, 48, 51, 55
+ * and 63 are common.
+ *
+ * For David and Don's data, '01' is the most common, with '00'
+ * and '10' not uncommon. '11' is two orders of magnitude less
+ * common.
+ *
+ * For Alex, '00' is the most common, with 01 about a third as
+ * common, and 02 a third of that. 11 is least common.
+ *
+ * There clearly are variations in the format here. And Alex has
+ * a different data offset than Don/David too (see the #ifdef DON).
+ * Christ. Maybe I've misread the patterns entirely.
+ */
+static void cochran_profile_write(const unsigned char *buf, int size)
+{
+       int i;
+
+       for (i = 0; i < size; i++) {
+               unsigned char c = buf[i];
+               printf("%d %d\n",
+                       c >> 6, c & 0x3f);
+       }
+}
+
 static void parse_cochran_dive(const char *filename, int dive,
                const unsigned char *decode, unsigned mod,
                const unsigned char *in, unsigned size)
 {
        char *buf = malloc(size);
+#ifdef DON
+       unsigned int offset = 0x4a14;
+#else
+       unsigned int offset = 0x4b14;
+#endif
 
        /*
         * The scrambling has odd boundaries. I think the boundaries
@@ -179,12 +240,12 @@ static void parse_cochran_dive(const char *filename, int dive,
         * scrambled, but there seems to be size differences in the data,
         * so this just descrambles part of it:
         */
-       partial_decode(0x48ff, 0x4a14, decode, 0, mod, in, size, buf);
-       partial_decode(0x4a14, 0xc9bd, decode, 0, mod, in, size, buf);
-       partial_decode(0xc9bd,   size, decode, 0, mod, in, size, buf);
+       partial_decode(0x48ff, offset, decode, 0, mod, in, size, buf);
+       partial_decode(offset,   size, decode, 0, mod, in, size, buf);
 
        printf("\n%s, dive %d\n\n", filename, dive);
        cochran_debug_write(filename, buf, size);
+       cochran_profile_write(buf + offset, size - offset);
 
        free(buf);
 }