mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +00:00
Interpretive dance to parse Suunto EON Steel tank sizes
Admittedly, imperial tank sizes are a bit weird. But it must have taken some effort to break things as creatievly as Suunto did. The UI allows only multiples of 100psi and multiples of 10cuft. Which shows that the developers have no idea what typical imperial tanks look like. AL72? AL63? HP tanks at 3440psi? LP+ at 2640psi? Yeah, I get it - you had no idea, someone showed you an AL80 and you made silly assumptions. But even then, what the heck are you storing in your data, dear Suunto? The pressures are off by the very logical factor of 1.00069182389937. And then regardless whether I use the wrong pressure or the corrected pressure, the wet sizes are too small by a non-constant factor. So this code takes the junk that libdivecomputer truthfully passes through from the Suunto parser and tries to convert it into something that matches what the user most likely entered in the EON Steel UI. Ugly. Stupid. But it seems to work. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
f1c682b55a
commit
6495b629fe
1 changed files with 33 additions and 0 deletions
|
@ -126,6 +126,39 @@ static int parse_gasmixes(device_data_t *devdata, struct dive *dive, dc_parser_t
|
|||
if (tank.type == DC_TANKVOLUME_IMPERIAL) {
|
||||
dive->cylinder[i].type.size.mliter = rint(tank.volume * 1000);
|
||||
dive->cylinder[i].type.workingpressure.mbar = rint(tank.workpressure * 1000);
|
||||
if (same_string(devdata->model, "Suunto EON Steel")) {
|
||||
/* Suunto EON Steele gets this wrong. Badly.
|
||||
* but on the plus side it only supports a few imperial sizes,
|
||||
* so let's try and guess at least the most common ones.
|
||||
* First, the pressures are off by a constant factor. WTF?
|
||||
* Then we can round the wet sizes so we get to multiples of 10
|
||||
* for cuft sizes (as that's all that you can enter) */
|
||||
dive->cylinder[i].type.workingpressure.mbar *= 206.843 / 206.7;
|
||||
char name_buffer[9];
|
||||
int rounded_size = ml_to_cuft(gas_volume(&dive->cylinder[i],
|
||||
dive->cylinder[i].type.workingpressure));
|
||||
rounded_size = (int)((rounded_size + 5) / 10) * 10;
|
||||
switch (dive->cylinder[i].type.workingpressure.mbar) {
|
||||
case 206843:
|
||||
snprintf(name_buffer, 9, "AL%d", rounded_size);
|
||||
break;
|
||||
case 234422: /* this is wrong - HP tanks tend to be 3440, but Suunto only allows 3400 */
|
||||
snprintf(name_buffer, 9, "HP%d", rounded_size);
|
||||
break;
|
||||
case 179263:
|
||||
snprintf(name_buffer, 9, "LP+%d", rounded_size);
|
||||
break;
|
||||
case 165474:
|
||||
snprintf(name_buffer, 9, "LP%d", rounded_size);
|
||||
break;
|
||||
default:
|
||||
snprintf(name_buffer, 9, "%d cuft", rounded_size);
|
||||
break;
|
||||
}
|
||||
dive->cylinder[i].type.description = copy_string(name_buffer);
|
||||
dive->cylinder[i].type.size.mliter = cuft_to_l(rounded_size) * 1000 /
|
||||
mbar_to_atm(dive->cylinder[i].type.workingpressure.mbar);
|
||||
}
|
||||
} else if (tank.type == DC_TANKVOLUME_METRIC) {
|
||||
dive->cylinder[i].type.size.mliter = rint(tank.volume * 1000);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue