mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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>
This commit is contained in:
parent
529412aa37
commit
775a081769
1 changed files with 21 additions and 0 deletions
21
uemis.c
21
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))) {
|
||||
|
|
Loading…
Add table
Reference in a new issue