]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Correctly parse the braindamaged tank size information from uemis
authorDirk Hohndel <dirk@hohndel.org>
Fri, 30 Sep 2011 05:12:42 +0000 (22:12 -0700)
committerDirk Hohndel <dirk@hohndel.org>
Fri, 30 Sep 2011 05:12:42 +0000 (22:12 -0700)
Admittedly the cuft ratings are stupid, but still, it's not that hard.
In order to correctly describe a tank based on the cuft system you need to
know the cuft AND the working pressure. But the uemis Zurich always
assumes that the working pressure is 200bar. That's pretty close to
3000psi and therefore works "good enough" for Aluminum tanks - but in
general this will of course fail (e.g. for HP or LP tanks).

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
uemis.c

diff --git a/uemis.c b/uemis.c
index 980c1827c86847cd6d5ba85253b515a33fef63cf..8dfc5a373f384d28c581d0464f1b36b7e05821c0 100644 (file)
--- a/uemis.c
+++ b/uemis.c
@@ -186,9 +186,30 @@ static void parse_divelog_binary(char *base64, struct dive **divep) {
        uint8_t *data;
        struct sample *sample;
        struct dive *dive = *divep;
+       int template, gasoffset;
 
        datalen = uemis_convert_base64(base64, &data);
 
+       /* dive template in use:
+          0 = air
+          1 = nitrox (B)
+          2 = nitrox (B+D)
+          3 = nitrox (B+T+D)
+          uemis cylinder data is insane - it stores seven tank settings in a block
+          and the template tells us which of the four groups of tanks we need to look at
+        */
+       gasoffset = template = *(uint8_t *)(data+115);
+       if (template == 3)
+               gasoffset = 4;
+       for (i = 0; i < template; i++) {
+               float volume = *(float *)(data+116+25*(gasoffset + i)) * 1000.0;
+               /* uemis always assumes a working pressure of 3000psi / 206bar - even though that's wrong */
+               /* I also think that the unit that it stores (cuft for me) might change with SDA settings */
+               // dive->cylinder[i].type.size.mliter = volume * 206.84 / 28.317;
+               dive->cylinder[i].type.size.mliter = volume * 200 / 28.317;
+               dive->cylinder[i].gasmix.o2.permille = *(uint8_t *)(data+120+25*(gasoffset + i)) * 10 + 0.5;
+               dive->cylinder[i].gasmix.he.permille = 0;
+       }
        /* first byte of divelog data is at offset 0x123 */
        i = 0x123;
        while ((i < datalen) && (*(uint16_t *)(data+i))) {