diff --git a/RDI_PD0_IO.pl b/RDI_PD0_IO.pl --- a/RDI_PD0_IO.pl +++ b/RDI_PD0_IO.pl @@ -1,9 +1,9 @@ #====================================================================== # R D I _ P D 0 _ I O . P L # doc: Sat Jan 18 14:54:43 2003 -# dlm: Wed Mar 3 15:02:04 2021 +# dlm: Thu Mar 4 11:23:23 2021 # (c) 2003 A.M. Thurnherr -# uE-Info: 1047 82 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 1157 0 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== # Read RDI PD0 binary data files (*.[0-9][0-9][0-9]) @@ -456,9 +456,9 @@ sub WBRhdr($) { my($dta) = @_; - my($start_ens,$buf,$hid,$did,$Ndt,$B,$W,$i,$dummy,$id,@WBRofs); + my($hid,$did,$B,$W,$i,$dummy); + local our($ndt,$buf,$id,$start_ens,@WBRofs); my($B1,$B2,$B3,$B4,$B5,$B6,$B7,$W1,$W2,$W3,$W4,$W5); - my($BT_dt); #-------------------- # HEADER @@ -475,6 +475,7 @@ = unpack('CCvCC',$buf); $hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header (hid)",$hid,0)); $did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header (did)",$did,0)); + $ndt = $dta->{NUMBER_OF_DATA_TYPES}; $start_ens = sysseek(WBRF,$dta->{ENSEMBLE_BYTES}-6+2,1) || return undef; sysread(WBRF,$buf,6) == 6 || return undef; @@ -496,11 +497,11 @@ == 2*$dta->{NUMBER_OF_DATA_TYPES} || die("$WBRcfn: $!"); @WBRofs = unpack("v$dta->{NUMBER_OF_DATA_TYPES}",$buf); + # for ($i=0; $i<$dta->{NUMBER_OF_DATA_TYPES}; $i++) { -# printf(STDERR "WBRofs[$i] = %d",$WBRofs[$i]); +# printf(STDERR "WBRofs[$i] = %d\n",$WBRofs[$i]); # } - $dta->{HEADER_BYTES} = $WBRofs[0]; $dta->{FIXED_LEADER_BYTES} = $WBRofs[1] - $WBRofs[0]; $dta->{VARIABLE_LEADER_BYTES} = $WBRofs[2] - $WBRofs[1]; @@ -519,6 +520,10 @@ $dta->{INSTRUMENT_TYPE} = 'unknown'; } + my($BT_dt) = WBRdtaIndex(0x0600); + $dta->{BT_PRESENT} = defined($BT_dt); + @{$dta->{DATA_TYPES}} = WBRdtaTypes(); + #-------------------------------- # Variable Leader: SPEED_OF_SOUND #-------------------------------- @@ -656,37 +661,34 @@ # 1st ENSEMBLE, BT Setup #----------------------- -# CODE DISABLED BECAUSE BT_PRESENT FLAG WAS REMOVED. WITHOUT THIS CODE, -# [listHdr] DOES NOT LIST ANY BT INFO -# -# if ($dta->{BT_PRESENT}) { -# sysseek(WBRF,$start_ens+$WBRofs[$BT_dt],0) || die("$WBRcfn: $!"); -# sysread(WBRF,$buf,12) == 12 || die("$WBRcfn: $!"); -# ($id,$dta->{BT_PINGS_PER_ENSEMBLE},$dta->{BT_DELAY_BEFORE_REACQUIRE}, -# $dta->{BT_MIN_CORRELATION},$dta->{BT_MIN_EVAL_AMPLITUDE}, -# $dta->{BT_MIN_PERCENT_GOOD},$dta->{BT_MODE}, -# $dta->{BT_MAX_ERROR_VELOCITY}) = unpack('vvvCCCCv',$buf); -# -# $id == 0x0600 || -# printf(STDERR $FmtErr."\n",$WBRcfn,"Bottom Track",$id,0,tell(WBRF)); -# -# $dta->{BT_MAX_ERROR_VELOCITY} = -# $dta->{BT_MAX_ERROR_VELOCITY} ? $dta->{BT_MAX_ERROR_VELOCITY} / 1000 -# : undef; -# -# sysseek(WBRF,28,1) || die("$WBRcfn: $!"); -# sysread(WBRF,$buf,6) == 6 || die("$WBRcfn: $!"); -# ($dta->{BT_RL_MIN_SIZE},$dta->{BT_RL_NEAR},$dta->{BT_RL_FAR}) -# = unpack('vvv',$buf); -# -# $dta->{BT_RL_MIN_SIZE} /= 10; -# $dta->{BT_RL_NEAR} /= 10; -# $dta->{BT_RL_FAR} /= 10; -# -# sysseek(WBRF,20,1) || die("$WBRcfn: $!"); # skip data -# sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); -# $dta->{BT_MAX_TRACKING_DEPTH} = unpack('v',$buf) / 10; -# } + if ($dta->{BT_PRESENT}) { + sysseek(WBRF,$start_ens+$WBRofs[$BT_dt],0) || die("$WBRcfn: $!"); + sysread(WBRF,$buf,12) == 12 || die("$WBRcfn: $!"); + ($id,$dta->{BT_PINGS_PER_ENSEMBLE},$dta->{BT_DELAY_BEFORE_REACQUIRE}, + $dta->{BT_MIN_CORRELATION},$dta->{BT_MIN_EVAL_AMPLITUDE}, + $dta->{BT_MIN_PERCENT_GOOD},$dta->{BT_MODE}, + $dta->{BT_MAX_ERROR_VELOCITY}) = unpack('vvvCCCCv',$buf); + + $id == 0x0600 || + printf(STDERR $FmtErr."\n",$WBRcfn,"Bottom Track",$id,0,tell(WBRF)); + + $dta->{BT_MAX_ERROR_VELOCITY} = + $dta->{BT_MAX_ERROR_VELOCITY} ? $dta->{BT_MAX_ERROR_VELOCITY} / 1000 + : undef; + + sysseek(WBRF,28,1) || die("$WBRcfn: $!"); + sysread(WBRF,$buf,6) == 6 || die("$WBRcfn: $!"); + ($dta->{BT_RL_MIN_SIZE},$dta->{BT_RL_NEAR},$dta->{BT_RL_FAR}) + = unpack('vvv',$buf); + + $dta->{BT_RL_MIN_SIZE} /= 10; + $dta->{BT_RL_NEAR} /= 10; + $dta->{BT_RL_FAR} /= 10; + + sysseek(WBRF,20,1) || die("$WBRcfn: $!"); # skip data + sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); + $dta->{BT_MAX_TRACKING_DEPTH} = unpack('v',$buf) / 10; + } return $dta; } @@ -1143,6 +1145,28 @@ return undef; } +sub WBRdtaTypes() # return list of data types +{ + my(@dt); + our($ndt,$buf,$id,$start_ens,@WBRofs); + + for (my($di)=2; $di<$ndt; $di++) { + sysseek(WBRF,$start_ens+$WBRofs[$di],0) || die("$WBRcfn: $!"); + sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); + $id = unpack('v',$buf); + if ($id == 0x0000) { push(@dt,'FixedLeader'); } + elsif ($id == 0x0080) { push(@dt,'VariableLeader'); } + elsif ($id == 0x0081) { push(@dt,'VariableLeader'); } # TRDI Ocean Surveyor + elsif ($id == 0x0100) { push(@dt,'VELOCITY'); } + elsif ($id == 0x0200) { push(@dt,'CORRELATION'); } + elsif ($id == 0x0300) { push(@dt,'ECHO_AMPLITUDE'); } + elsif ($id == 0x0400) { push(@dt,'PERCENT_GOOD'); } + elsif ($id == 0x0600) { push(@dt,'BOTTOM_TRACK'); } + else { push(@dt,'Unknown'); } + } + return @dt; +} + #---------------------------------------------------------------------- # writeData(output_file_name,^data) WBPens(nbins,fixed_leader_bytes,^data) # - writeData() copies file previously read with readData() to output_file_name