--- 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