RDI_PD0_IO.pl
changeset 21 0b5bbe60131c
parent 18 bb7bb9f83db9
child 24 1a761865f839
--- 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: $!");