# HG changeset patch # User A.M. Thurnherr # Date 1443827866 14400 # Node ID 02776c16813580c0259f9e74b67d5142dd74409c # Parent 1a761865f839699d0d2e0786eb1019ed0490004a made RDI_BB_IO work with files containing leading garbage 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: Tue Jun 16 09:01:26 2015 +# dlm: Fri Oct 2 19:17:15 2015 # (c) 2003 A.M. Thurnherr -# uE-Info: 354 0 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 66 47 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== # Read RDI BroadBand Binary Data Files (*.[0-9][0-9][0-9]) @@ -63,6 +63,7 @@ # 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??? +# Oct 2, 2015: - added &skip_initial_trash() # FIRMWARE VERSIONS: # It appears that different firmware versions generate different file @@ -308,6 +309,36 @@ my($FmtErr) = "%s: illegal %s Id 0x%04x at ensemble %d"; #---------------------------------------------------------------------- +# skip to first valid ensemble (skip over initial garbage) +#---------------------------------------------------------------------- + +sub skip_initial_trash(@) +{ + my($quiet) = @_; + my($buf,$dta); + + my($found) = 0; # zero consecutive 0x7f found + my($skipped) = 0; + while ($found < 2) { + sysread(WBRF,$buf,1) == 1 || last; + ($dta) = unpack('C',$buf); + if ($dta == 0x7f) { + $found++; + } elsif ($found == 0) { + $skipped++; + } else { + $skipped += $found; + $found = 0; + } + } + die("$WBRcfn: no valid ensemble header found [$!]\n") + if ($found < 2); + printf(STDERR "WARNING: %d bytes of initial garbage\n",$skipped) + if ($skipped > 0 && !$quiet); + return sysseek(WBRF,-2,1); +} + +#---------------------------------------------------------------------- # readHeader(file_name,^dta) WBRhdr(^data) # - read header data # - also includes some data from 1st ens @@ -324,18 +355,19 @@ sub WBRhdr($) { my($dta) = @_; - my($buf,$hid,$did,$Ndt,$B,$W,$i,$dummy,$id,@WBRofs); + my($start_ens,$buf,$hid,$did,$Ndt,$B,$W,$i,$dummy,$id,@WBRofs); my($B1,$B2,$B3,$B4,$B5,$B6,$B7,$W1,$W2,$W3,$W4,$W5); #-------------------- # HEADER #-------------------- + $start_ens = skip_initial_trash(); sysread(WBRF,$buf,6) == 6 || die("$WBRcfn: $!"); ($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES}) = unpack('CCvCC',$buf); $hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0)); -## $did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Data Source",$did,0)); +## $did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Data Source",$did,0)); # IMP uses this printf(STDERR "WARNING: unexpected number of data types (%d)\n", $dta->{NUMBER_OF_DATA_TYPES}) unless ($dta->{NUMBER_OF_DATA_TYPES} == 6 || @@ -379,35 +411,35 @@ # Check Data Format of 1st Ensemble #---------------------------------- - sysseek(WBRF,$WBRofs[1],0) || die("$WBRcfn: $!"); + sysseek(WBRF,$start_ens+$WBRofs[1],0) || die("$WBRcfn: $!"); sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); $id = unpack('v',$buf); - $id == 0x0080 || die(sprintf($FmtErr,$WBRcfn,"Variable Leader",$id,1)); + $id == 0x0080 || printf(STDERR $FmtErr."\n",$WBRcfn,"Variable Leader",$id,1); - sysseek(WBRF,$WBRofs[2],0) || die("$WBRcfn: $!"); + sysseek(WBRF,$start_ens+$WBRofs[2],0) || die("$WBRcfn: $!"); sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); $id = unpack('v',$buf); - $id == 0x0100 || die(sprintf($FmtErr,$WBRcfn,"Velocity Data",$id,1)); + $id == 0x0100 || printf(STDERR $FmtErr."\n",$WBRcfn,"Velocity Data",$id,1); - sysseek(WBRF,$WBRofs[3],0) || die("$WBRcfn: $!"); + sysseek(WBRF,$start_ens+$WBRofs[3],0) || die("$WBRcfn: $!"); sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); $id = unpack('v',$buf); - $id == 0x0200 || die(sprintf($FmtErr,$WBRcfn,"Correlation Data",$id,1)); + $id == 0x0200 || printf(STDERR $FmtErr."\n",$WBRcfn,"Correlation Data",$id,1); - sysseek(WBRF,$WBRofs[4],0) || die("$WBRcfn: $!"); + sysseek(WBRF,$start_ens+$WBRofs[4],0) || die("$WBRcfn: $!"); sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); $id = unpack('v',$buf); - $id == 0x0300 || die(sprintf($FmtErr,$WBRcfn,"Echo Intensity",$id,1)); + $id == 0x0300 || printf(STDERR $FmtErr."\n",$WBRcfn,"Echo Intensity",$id,1); - sysseek(WBRF,$WBRofs[5],0) || die("$WBRcfn: $!"); + sysseek(WBRF,$start_ens+$WBRofs[5],0) || die("$WBRcfn: $!"); sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); $id = unpack('v',$buf); - $id == 0x0400 || die(sprintf($FmtErr,$WBRcfn,"Percent-Good Data",$id,1)); + $id == 0x0400 || printf(STDERR $FmtErr."\n",$WBRcfn,"Percent-Good Data",$id,1); my($BT_dt); if ($dta->{BT_PRESENT}) { 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: $!"); + sysseek(WBRF,$start_ens+$WBRofs[$BT_dt],0) || die("$WBRcfn: $!"); sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); $id = unpack('v',$buf); last if ($id == 0x0600); @@ -423,7 +455,7 @@ # FIXED LEADER #-------------------- - sysseek(WBRF,$WBRofs[0],0) || die("$WBRcfn: $!"); + sysseek(WBRF,$start_ens+$WBRofs[0],0) || die("$WBRcfn: $!"); sysread(WBRF,$buf,42) == 42 || die("$WBRcfn: $!"); ($id,$dta->{CPU_FW_VER},$dta->{CPU_FW_REV},$B1,$B2,$dummy,$dummy,$dummy, $dta->{N_BINS},$dta->{PINGS_PER_ENSEMBLE},$dta->{BIN_LENGTH}, @@ -437,7 +469,7 @@ $dta->{TRANSMIT_LAG_DISTANCE}) = unpack('vCCCCC3CvvvCCCCvCCCCvvCCvvCCCCv',$buf); - $id == 0x0000 || die(sprintf($FmtErr,$WBRcfn,"Fixed Leader",$id,0)); + $id == 0x0000 || printf(STDERR $FmtErr."\n",$WBRcfn,"Fixed Leader",$id,0); $dta->{BEAM_FREQUENCY} = 2**($B1 & 0x07) * 75; $dta->{CONVEX_BEAM_PATTERN} = 1 if ($B1 & 0x08); @@ -528,7 +560,7 @@ #----------------------- if ($dta->{BT_PRESENT}) { - sysseek(WBRF,$WBRofs[$BT_dt],0) || die("$WBRcfn: $!"); + 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}, @@ -536,7 +568,7 @@ $dta->{BT_MAX_ERROR_VELOCITY}) = unpack('vvvCCCCv',$buf); $id == 0x0600 || - die(sprintf($FmtErr,$WBRcfn,"Bottom Track",$id,0,tell(WBRF))); + 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 @@ -582,7 +614,9 @@ my($start_ens,$B1,$B2,$B3,$B4,$I,$id,$bin,$beam,$buf,$dummy,@dta,$i,$cs,@WBRofs); my($ens,$ensNo,$dayStart,$ens_length,$hid,$did,$ndt); - for ($ens=$start_ens=0; 1; $ens++,$start_ens+=$ens_length+2) { + sysseek(WBRF,0,0) || die("$WBRcfn: $!"); + $start_ens = skip_initial_trash(1); + for ($ens=0; 1; $ens++,$start_ens+=$ens_length+2) { # print(STDERR "ens = $ens\n"); # print(STDERR "start_ens = $start_ens\n");