RDI_PD0_IO.pl
changeset 26 02776c168135
parent 24 1a761865f839
child 28 7c7da52363c2
--- 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");