diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2011-09-29 22:12:42 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2011-09-29 22:12:42 -0700 |
commit | 775a081769d2969e449feead164a82cbe53d9b7e (patch) | |
tree | 6bc1abe132695b466aa815aa07dfc90e307098ba /uemis.c | |
parent | 529412aa379ead5beaa9e66c19fbc127d24b9ed4 (diff) | |
download | subsurface-775a081769d2969e449feead164a82cbe53d9b7e.tar.gz |
Correctly parse the braindamaged tank size information from uemis
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>
Diffstat (limited to 'uemis.c')
-rw-r--r-- | uemis.c | 21 |
1 files changed, 21 insertions, 0 deletions
@@ -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))) { |