@@ -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
123124struct 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+
182190static unsigned int
183191shearwater_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