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 +# R D I _ B B _ R E A D . P L # doc: Sat Jan 18 14:54:43 2003 -# dlm: Wed May 7 10:41:18 2014 +# dlm: Wed Oct 15 21:50:07 2014 # (c) 2003 A.M. Thurnherr -# uE-Info: 827 0 NIL 0 0 72 74 2 4 NIL ofnI +# uE-Info: 65 77 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # Read RDI BroadBand Binary Data Files (*.[0-9][0-9][0-9]) @@ -59,6 +59,10 @@ # Apr 24, 2014: - added debug statements to log %-GOOD values # May 6, 2014: - loosened input format checks # May 7, 2014: - removed BT_present flag +# Sep 6, 2014: - adapted WBRhdr to >7 data types +# Oct 15, 2014: - implemented work-around for readData() not recognizing +# incomplete ensemble at the end, which seems to imply that there is +# a garbage final ensemble that passes the checksum test??? # FIRMWARE VERSIONS: # It appears that different firmware versions generate different file @@ -332,11 +336,12 @@ = unpack('CCvCC',$buf); $hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0)); ## $did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Data Source",$did,0)); - printf(STDERR "\n$WBRcfn: WARNING: unexpected number of data types (%d)\n", + printf(STDERR "WARNING: unexpected number of data types (%d)\n", $dta->{NUMBER_OF_DATA_TYPES}) unless ($dta->{NUMBER_OF_DATA_TYPES} == 6 || $dta->{NUMBER_OF_DATA_TYPES} == 7); - $dta->{BT_PRESENT} = ($dta->{NUMBER_OF_DATA_TYPES} == 7); +## $dta->{BT_PRESENT} = ($dta->{NUMBER_OF_DATA_TYPES} == 7); + $dta->{BT_PRESENT} = ($dta->{NUMBER_OF_DATA_TYPES} >= 7); sysread(WBRF,$buf,2*$dta->{NUMBER_OF_DATA_TYPES}) == 2*$dta->{NUMBER_OF_DATA_TYPES} @@ -399,11 +404,19 @@ $id = unpack('v',$buf); $id == 0x0400 || die(sprintf($FmtErr,$WBRcfn,"Percent-Good Data",$id,1)); + my($BT_dt); if ($dta->{BT_PRESENT}) { - sysseek(WBRF,$WBRofs[6],0) || die("$WBRcfn: $!"); - sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); - $id = unpack('v',$buf); - $id == 0x0600 || die(sprintf($FmtErr,$WBRcfn,"Bottom Track",$id,1)); + for ($BT_dt=6; $BT_dt<$dta->{NUMBER_OF_DATA_TYPES}; $BT_dt++) { # scan until BT found + sysseek(WBRF,$WBRofs[$BT_dt],0) || die("$WBRcfn: $!"); + sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); + $id = unpack('v',$buf); + last if ($id == 0x0600); + } + + if ($BT_dt == $dta->{NUMBER_OF_DATA_TYPES}) { + printf(STDERR "WARNING: no BT data found\n");die; + undef($dta->{BT_PRESENT}); + } } #-------------------- @@ -515,7 +528,7 @@ #----------------------- if ($dta->{BT_PRESENT}) { - sysseek(WBRF,$WBRofs[6],0) || die("$WBRcfn: $!"); + sysseek(WBRF,$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}, @@ -686,6 +699,8 @@ ${$E}[$ens]->{SECONDS} += $B4/100; } + pop(@{$E}),last if (${$E}[$ens]->{MONTH}>12); # 10/15/2014; IWISE#145 UL ??? + if ($fixed_leader_bytes == 58) { # Explorer DVL sysread(WBRF,$buf,14) == 14 || die("$WBRcfn: $!"); (${$E}[$ens]->{ERROR_STATUS_WORD}, @@ -829,7 +844,6 @@ next if ($nxt == $ndt); # no BT found => next ens - sysseek(WBRF,14,1) || die("$WBRcfn: $!"); # BT config sysread(WBRF,$buf,28) == 28 || die("$WBRcfn: $!");