Changeset 9959554 in subsurface


Ignore:
Timestamp:
Feb 2, 2017, 12:35:58 PM (4 months ago)
Author:
Dirk Hohndel <dirk@…>
Branches:
master
Children:
a031dbb
Parents:
bc8c9f4c
git-author:
Robert C. Helling <helling@…> (02/02/17 01:56:22)
git-committer:
Dirk Hohndel <dirk@…> (02/02/17 12:35:58)
Message:

Handle more tanks than gasmixes

When Suunto Vytecs are used in gauge mode they don't record gasmixes.
If a tank pressure sensor is present they nevertheless record the
pressures. This patch handles this situation by assuming the tanks
contain air (and warning the user about this).

Reported-by: antonnorth@…
Signed-off-by: Robert C. Helling <helling@…>
Signed-off-by: Dirk Hohndel <dirk@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • core/libdivecomputer.c

    re1ee577 r9959554  
    9595        rc = dc_parser_get_field(parser, DC_FIELD_TANK_COUNT, 0, &ntanks);
    9696        if (rc == DC_STATUS_SUCCESS) {
    97                 if (ntanks && ntanks != ngases) {
     97                if (ntanks && ntanks < ngases) {
    9898                        shown_warning = true;
    99                         report_error("different number of gases (%d) and tanks (%d)", ngases, ntanks);
    100                 }
    101         }
    102 #endif
    103 
    104         for (i = 0; i < ngases; i++) {
    105                 dc_gasmix_t gasmix = { 0 };
    106                 int o2, he;
    107                 bool no_volume = true;
    108 
    109                 rc = dc_parser_get_field(parser, DC_FIELD_GASMIX, i, &gasmix);
    110                 if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED)
    111                         return rc;
    112 
    113                 if (i >= MAX_CYLINDERS)
    114                         continue;
    115 
    116                 o2 = rint(gasmix.oxygen * 1000);
    117                 he = rint(gasmix.helium * 1000);
    118 
    119                 /* Ignore bogus data - libdivecomputer does some crazy stuff */
    120                 if (o2 + he <= O2_IN_AIR || o2 > 1000) {
    121                         if (!shown_warning) {
    122                                 shown_warning = true;
    123                                 report_error("unlikely dive gas data from libdivecomputer: o2 = %d he = %d", o2, he);
     99                        report_error("Warning: different number of gases (%d) and tanks (%d)", ngases, ntanks);
     100                } else if (ntanks > ngases) {
     101                        shown_warning = true;
     102                        report_error("Warning: smaller number of gases (%d) than tanks (%d). Assuming air.", ngases, ntanks);
     103                }
     104        }
     105#endif
     106        bool no_volume = true;
     107
     108        for (i = 0; i < ngases || i < ntanks; i++) {
     109                if (i < ngases) {
     110                        dc_gasmix_t gasmix = { 0 };
     111                        int o2, he;
     112
     113                        rc = dc_parser_get_field(parser, DC_FIELD_GASMIX, i, &gasmix);
     114                        if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED)
     115                                return rc;
     116
     117                        if (i >= MAX_CYLINDERS)
     118                                continue;
     119
     120                         o2 = rint(gasmix.oxygen * 1000);
     121                        he = rint(gasmix.helium * 1000);
     122
     123                        /* Ignore bogus data - libdivecomputer does some crazy stuff */
     124                        if (o2 + he <= O2_IN_AIR || o2 > 1000) {
     125                                if (!shown_warning) {
     126                                        shown_warning = true;
     127                                        report_error("unlikely dive gas data from libdivecomputer: o2 = %d he = %d", o2, he);
     128                                }
     129                                o2 = 0;
    124130                        }
    125                         o2 = 0;
    126                 }
    127                 if (he < 0 || o2 + he > 1000) {
    128                         if (!shown_warning) {
    129                                 shown_warning = true;
    130                                 report_error("unlikely dive gas data from libdivecomputer: o2 = %d he = %d", o2, he);
     131                        if (he < 0 || o2 + he > 1000) {
     132                                if (!shown_warning) {
     133                                        shown_warning = true;
     134                                        report_error("unlikely dive gas data from libdivecomputer: o2 = %d he = %d", o2, he);
     135                                }
     136                                he = 0;
    131137                        }
    132                         he = 0;
    133                 }
    134                 dive->cylinder[i].gasmix.o2.permille = o2;
    135                 dive->cylinder[i].gasmix.he.permille = he;
     138                        dive->cylinder[i].gasmix.o2.permille = o2;
     139                        dive->cylinder[i].gasmix.he.permille = he;
     140                } else {
     141                        dive->cylinder[i].gasmix.o2.permille = 0;
     142                        dive->cylinder[i].gasmix.he.permille = 0;
     143                }
    136144
    137145#if DC_VERSION_CHECK(0, 5, 0) && defined(DC_GASMIX_UNKNOWN)
Note: See TracChangeset for help on using the changeset viewer.