From: Linus Torvalds Date: Thu, 1 Sep 2011 23:26:11 +0000 (-0700) Subject: gasmix: stop tracking nitrogen percentages X-Git-Url: http://git.tdb.fi/?p=ext%2Fsubsurface.git;a=commitdiff_plain;h=d5e42d485e6c4a62b78281aac900bb447d811ab1 gasmix: stop tracking nitrogen percentages The only thing you can do with that thing is screw things up (like libdivecomputer did). There's no value in tracking the "filler" gas, since you can always just calculate it from the gases that actually matter. So just track Oxygen and Helium - and make sure they have sane values. Signed-off-by: Linus Torvalds --- diff --git a/dive.h b/dive.h index 0bac6b2..bce1fe6 100644 --- a/dive.h +++ b/dive.h @@ -66,7 +66,6 @@ typedef struct { typedef struct { fraction_t o2; - fraction_t n2; fraction_t he; } gasmix_t; diff --git a/parse-xml.c b/parse-xml.c index e0231ce..9b0797e 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -333,6 +333,10 @@ static void gasmix(char *buffer, void *_fraction) percent(buffer, _fraction); } +static void gasmix_nitrogen(char *buffer, void *_gasmix) +{ + /* Ignore n2 percentages. There's no value in them. */ +} #define MATCH(pattern, fn, dest) \ match(pattern, strlen(pattern), name, len, fn, buf, dest) @@ -407,7 +411,7 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf) if (MATCH(".o2", gasmix, &dive->gasmix[gasmix_index].o2)) return; - if (MATCH(".n2", gasmix, &dive->gasmix[gasmix_index].n2)) + if (MATCH(".n2", gasmix_nitrogen, &dive->gasmix[gasmix_index])) return; if (MATCH(".he", gasmix, &dive->gasmix[gasmix_index].he)) return; @@ -468,12 +472,43 @@ static char *generate_name(struct dive *dive) return p; } +static void sanitize_gasmix(struct dive *dive) +{ + int i; + + for (i = 0; i < MAX_MIXES; i++) { + gasmix_t *mix = dive->gasmix+i; + unsigned int o2, he; + + o2 = mix->o2.permille; + he = mix->he.permille; + + /* Regular air: leave empty */ + if (!he) { + if (!o2) + continue; + /* 20.9% or 21% O2 is just air */ + if (o2 >= 209 && o2 <= 210) { + mix->o2.permille = 0; + continue; + } + } + + /* Sane mix? */ + if (o2 <= 1000 && he <= 1000 && o2+he <= 1000) + continue; + fprintf(stderr, "Odd gasmix: %d O2 %d He\n", o2, he); + memset(mix, 0, sizeof(*mix)); + } +} + static void dive_end(void) { if (!dive) return; if (!dive->name) dive->name = generate_name(dive); + sanitize_gasmix(dive); record_dive(dive); dive = NULL; gasmix_index = 0;