summaryrefslogtreecommitdiffstats
path: root/uemis.c
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2011-09-29 22:12:42 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2011-09-29 22:12:42 -0700
commit775a081769d2969e449feead164a82cbe53d9b7e (patch)
tree6bc1abe132695b466aa815aa07dfc90e307098ba /uemis.c
parent529412aa379ead5beaa9e66c19fbc127d24b9ed4 (diff)
downloadsubsurface-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.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/uemis.c b/uemis.c
index 980c1827c..8dfc5a373 100644
--- 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))) {