RDI_BB_Read.pl
changeset 1 a3b6a908dec5
parent 0 229a0d72d2ab
child 6 603221e51c6f
--- a/RDI_BB_Read.pl
+++ b/RDI_BB_Read.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    R D I _ B B _ R E A D . P L 
 #                    doc: Sat Jan 18 14:54:43 2003
-#                    dlm: Wed Jun  4 09:43:15 2008
+#                    dlm: Sun Aug 15 16:35:54 2010
 #                    (c) 2003 A.M. Thurnherr
-#                    uE-Info: 44 25 NIL 0 0 72 0 2 4 NIL ofnI
+#                    uE-Info: 47 72 NIL 0 0 72 0 2 4 NIL ofnI
 #======================================================================
 
 # Read RDI BroadBand Binary Data Files (*.[0-9][0-9][0-9])
@@ -42,6 +42,9 @@
 #	Sep 18, 2007: - modified readHeader() readDta() WBRhdr() WBRens() to
 #					conserve memory (no large arrays as retvals)
 #	Jun  4, 2008: - BUG: BB150 code was not considered on Sep 18, 2007
+#	Aug 15, 2010: - downgraded "unexpected number of data types" from error to warning
+#				  - BUG: WBRcfn had not been set correctly
+#				  - modified to allow processing files without time info
 
 # FIRMWARE VERSIONS:
 #	It appears that different firmware versions generate different file
@@ -294,8 +297,8 @@
 		= unpack('CCvCC',$buf);
 	$hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0));
 	$did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Data Source",$did,0));
-	die(sprintf("\n$WBRcfn: WARNING: unexpected number of data types (%d)\n",
-		$dta->{NUMBER_OF_DATA_TYPES}))
+	printf(STDERR "\n$WBRcfn: 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);
@@ -600,19 +603,27 @@
 			= &dayNo(${$E}[$ens]->{YEAR},${$E}[$ens]->{MONTH},${$E}[$ens]->{DAY},
 					 ${$E}[$ens]->{HOUR},${$E}[$ens]->{MINUTE},${$E}[$ens]->{SECONDS});
 
-		${$E}[$ens]->{UNIX_TIME}
-			= timegm(0,${$E}[$ens]->{MINUTE},
-				 	   ${$E}[$ens]->{HOUR},
-					   ${$E}[$ens]->{DAY},
-					   ${$E}[$ens]->{MONTH}-1,		# NB!!!
-					   ${$E}[$ens]->{YEAR})
-			  + ${$E}[$ens]->{SECONDS};
-
-		$dayStart = timegm(0,0,0,${$E}[$ens]->{DAY},
-	  		                     ${$E}[$ens]->{MONTH}-1,     # NB!!!
-		                         ${$E}[$ens]->{YEAR})
-			unless defined($dayStart);
-		${$E}[$ens]->{SECNO} = ${$E}[$ens]->{UNIX_TIME} - $dayStart;
+		# when analyzing an STA file from an OS75 SADCP (Poseidion),
+		# I noticed that there is no time information. This causes
+		# timegm to bomb. 
+		if (${$E}[$ens]->{MONTH} == 0) {					# no time info
+			${$E}[$ens]->{UNIX_TIME} = 0;
+			${$E}[$ens]->{SECNO} = 0;
+        } else {
+			${$E}[$ens]->{UNIX_TIME}
+				= timegm(0,${$E}[$ens]->{MINUTE},
+						   ${$E}[$ens]->{HOUR},
+						   ${$E}[$ens]->{DAY},
+						   ${$E}[$ens]->{MONTH}-1,			# timegm jan==0!!!
+						   ${$E}[$ens]->{YEAR})
+				  + ${$E}[$ens]->{SECONDS};
+	
+			$dayStart = timegm(0,0,0,${$E}[$ens]->{DAY},
+									 ${$E}[$ens]->{MONTH}-1,
+									 ${$E}[$ens]->{YEAR})
+				unless defined($dayStart);
+	        ${$E}[$ens]->{SECNO} = ${$E}[$ens]->{UNIX_TIME} - $dayStart;
+        }
 
 		seek(WBRF,$start_ens+$WBRofs[0]+4,0)		# System Config / Fixed Leader
 			|| die("$WBRcfn: $!");
@@ -774,14 +785,16 @@
 
 sub readHeader(@)
 {
-	my($WBRcfn,$dta) = @_;
+	my($fn,$dta) = @_;
+	$WBRcfn = $fn;
     open(WBRF,$WBRcfn) || die("$WBRcfn: $!\n");
     WBRhdr($dta);    
 }
 
 sub readData(@)
 {
-	my($WBRcfn,$dta) = @_;
+	my($fn,$dta) = @_;
+	$WBRcfn = $fn;
     open(WBRF,$WBRcfn) || die("$WBRcfn: $!\n");
     WBRhdr($dta);
 	WBRens($dta->{N_BINS},$dta->{ENSEMBLE_BYTES},