Skip to content

Commit 9cde393

Browse files
committed
Merge branch 'shearwater-tank-usage'
2 parents ceaaba3 + 9bc742d commit 9cde393

File tree

3 files changed

+53
-21
lines changed

3 files changed

+53
-21
lines changed

src/array.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,3 +404,14 @@ signextend (unsigned int value, unsigned int nbits)
404404
else
405405
return value & mask;
406406
}
407+
408+
unsigned int
409+
popcount (unsigned int value)
410+
{
411+
unsigned int count = 0;
412+
while (value) {
413+
value &= value - 1;
414+
count++;
415+
}
416+
return count;
417+
}

src/array.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ dec2bcd (unsigned char value);
126126
unsigned int
127127
signextend (unsigned int value, unsigned int nbits);
128128

129+
unsigned int
130+
popcount (unsigned int value);
131+
129132
#ifdef __cplusplus
130133
}
131134
#endif /* __cplusplus */

src/shearwater_predator_parser.c

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ typedef struct shearwater_predator_tank_t {
118118
unsigned int pressure_reserve;
119119
unsigned int serial;
120120
char name[2];
121+
dc_usage_t usage;
121122
} shearwater_predator_tank_t;
122123

123124
struct shearwater_predator_parser_t {
@@ -140,6 +141,7 @@ struct shearwater_predator_parser_t {
140141
shearwater_predator_tank_t tank[NTANKS];
141142
unsigned int tankidx[NTANKS];
142143
unsigned int aimode;
144+
unsigned int hpccr;
143145
unsigned int calibrated;
144146
double calibration[3];
145147
unsigned int divemode;
@@ -179,6 +181,12 @@ static const dc_parser_vtable_t shearwater_petrel_parser_vtable = {
179181
};
180182

181183

184+
static unsigned int
185+
shearwater_predator_is_ccr (unsigned int divemode)
186+
{
187+
return divemode == M_CC || divemode == M_CC2 || divemode == M_SC;
188+
}
189+
182190
static unsigned int
183191
shearwater_predator_find_gasmix (shearwater_predator_parser_t *parser, unsigned int o2, unsigned int he, unsigned int dil)
184192
{
@@ -248,9 +256,11 @@ shearwater_common_parser_create (dc_parser_t **out, dc_context_t *context, const
248256
parser->tank[i].pressure_reserve = 0;
249257
parser->tank[i].serial = 0;
250258
memset (parser->tank[i].name, 0, sizeof (parser->tank[i].name));
259+
parser->tank[i].usage = DC_USAGE_NONE;
251260
parser->tankidx[i] = i;
252261
}
253262
parser->aimode = AI_OFF;
263+
parser->hpccr = 0;
254264
parser->calibrated = 0;
255265
for (unsigned int i = 0; i < 3; ++i) {
256266
parser->calibration[i] = 0.0;
@@ -379,6 +389,7 @@ shearwater_predator_parser_cache (shearwater_predator_parser_t *parser)
379389
shearwater_predator_tank_t tank[NTANKS] = {0};
380390
unsigned int o2_previous = UNDEFINED, he_previous = UNDEFINED, dil_previous = UNDEFINED;
381391
unsigned int aimode = AI_OFF;
392+
unsigned int hpccr = 0;
382393
if (!pnf) {
383394
for (unsigned int i = 0; i < NFIXED; ++i) {
384395
gasmix[i].oxygen = data[20 + i];
@@ -490,8 +501,8 @@ shearwater_predator_parser_cache (shearwater_predator_parser_t *parser)
490501
tank[id].enabled = 1;
491502
tank[id].beginpressure = pressure;
492503
tank[id].endpressure = pressure;
493-
tank[id].name[0] = i == 0 ? 'D': 'O';
494-
tank[id].name[1] = 0;
504+
tank[id].usage = i == 0 ? DC_USAGE_DILUENT : DC_USAGE_OXYGEN;
505+
hpccr = 1;
495506
}
496507
tank[id].endpressure = pressure;
497508
}
@@ -535,9 +546,17 @@ shearwater_predator_parser_cache (shearwater_predator_parser_t *parser)
535546
if (aimode == AI_HPCCR) {
536547
for (unsigned int i = 0; i < 2; ++i) {
537548
tank[4 + i].enabled = 1;
538-
tank[4 + i].name[0] = i == 0 ? 'D': 'O';
539-
tank[4 + i].name[1] = 0;
549+
tank[4 + i].usage = i == 0 ? DC_USAGE_DILUENT : DC_USAGE_OXYGEN;
540550
}
551+
hpccr = 1;
552+
}
553+
}
554+
}
555+
unsigned int gtrmode = data[offset + 29];
556+
if (popcount(gtrmode) >= 2) {
557+
for (unsigned int i = 0; i < 4; ++i) {
558+
if (gtrmode & (1 << i)) {
559+
tank[i].usage = DC_USAGE_SIDEMOUNT;
541560
}
542561
}
543562
}
@@ -659,8 +678,7 @@ shearwater_predator_parser_cache (shearwater_predator_parser_t *parser)
659678
for (unsigned int i = 0; i < ngasmixes; ++i) {
660679
if (gasmix[i].oxygen == 0 && gasmix[i].helium == 0)
661680
continue;
662-
if (gasmix[i].diluent &&
663-
(divemode != M_CC && divemode != M_CC2 && divemode != M_SC))
681+
if (gasmix[i].diluent && !shearwater_predator_is_ccr (divemode))
664682
continue;
665683
parser->gasmix[parser->ngasmixes] = gasmix[i];
666684
parser->ngasmixes++;
@@ -677,6 +695,7 @@ shearwater_predator_parser_cache (shearwater_predator_parser_t *parser)
677695
}
678696
}
679697
parser->aimode = aimode;
698+
parser->hpccr = hpccr;
680699
parser->divemode = divemode;
681700
parser->units = data[parser->opening[0] + 8];
682701
parser->atmospheric = array_uint16_be (data + parser->opening[1] + (parser->pnf ? 16 : 47));
@@ -741,21 +760,20 @@ shearwater_predator_parser_get_field (dc_parser_t *abstract, dc_field_type_t typ
741760
tank->beginpressure = parser->tank[flags].beginpressure * 2 * PSI / BAR;
742761
tank->endpressure = parser->tank[flags].endpressure * 2 * PSI / BAR;
743762
tank->gasmix = DC_GASMIX_UNKNOWN;
744-
switch (parser->tank[flags].name[0]) {
745-
case 'S':
746-
tank->usage = DC_USAGE_SIDEMOUNT;
747-
break;
748-
case 'O':
749-
tank->usage = DC_USAGE_OXYGEN;
750-
break;
751-
case 'D':
752-
tank->usage = DC_USAGE_DILUENT;
753-
break;
754-
case 'T':
755-
case 'B':
756-
default:
757-
tank->usage = DC_USAGE_NONE;
758-
break;
763+
if (shearwater_predator_is_ccr (parser->divemode) && !parser->hpccr) {
764+
switch (parser->tank[flags].name[0]) {
765+
case 'O':
766+
tank->usage = DC_USAGE_OXYGEN;
767+
break;
768+
case 'D':
769+
tank->usage = DC_USAGE_DILUENT;
770+
break;
771+
default:
772+
tank->usage = DC_USAGE_NONE;
773+
break;
774+
}
775+
} else {
776+
tank->usage = parser->tank[flags].usage;
759777
}
760778
break;
761779
case DC_FIELD_SALINITY:

0 commit comments

Comments
 (0)