RDI_BB_Read.pl
changeset 1 a3b6a908dec5
parent 0 229a0d72d2ab
child 6 603221e51c6f
equal deleted inserted replaced
0:229a0d72d2ab 1:a3b6a908dec5
     1 #======================================================================
     1 #======================================================================
     2 #                    R D I _ B B _ R E A D . P L 
     2 #                    R D I _ B B _ R E A D . P L 
     3 #                    doc: Sat Jan 18 14:54:43 2003
     3 #                    doc: Sat Jan 18 14:54:43 2003
     4 #                    dlm: Wed Jun  4 09:43:15 2008
     4 #                    dlm: Sun Aug 15 16:35:54 2010
     5 #                    (c) 2003 A.M. Thurnherr
     5 #                    (c) 2003 A.M. Thurnherr
     6 #                    uE-Info: 44 25 NIL 0 0 72 0 2 4 NIL ofnI
     6 #                    uE-Info: 47 72 NIL 0 0 72 0 2 4 NIL ofnI
     7 #======================================================================
     7 #======================================================================
     8 
     8 
     9 # Read RDI BroadBand Binary Data Files (*.[0-9][0-9][0-9])
     9 # Read RDI BroadBand Binary Data Files (*.[0-9][0-9][0-9])
    10 
    10 
    11 # HISTORY:
    11 # HISTORY:
    40 #	Aug 31: 2006: - added DAYNO
    40 #	Aug 31: 2006: - added DAYNO
    41 #	Aug  1, 2007: - BUG: typo in monthLength()
    41 #	Aug  1, 2007: - BUG: typo in monthLength()
    42 #	Sep 18, 2007: - modified readHeader() readDta() WBRhdr() WBRens() to
    42 #	Sep 18, 2007: - modified readHeader() readDta() WBRhdr() WBRens() to
    43 #					conserve memory (no large arrays as retvals)
    43 #					conserve memory (no large arrays as retvals)
    44 #	Jun  4, 2008: - BUG: BB150 code was not considered on Sep 18, 2007
    44 #	Jun  4, 2008: - BUG: BB150 code was not considered on Sep 18, 2007
       
    45 #	Aug 15, 2010: - downgraded "unexpected number of data types" from error to warning
       
    46 #				  - BUG: WBRcfn had not been set correctly
       
    47 #				  - modified to allow processing files without time info
    45 
    48 
    46 # FIRMWARE VERSIONS:
    49 # FIRMWARE VERSIONS:
    47 #	It appears that different firmware versions generate different file
    50 #	It appears that different firmware versions generate different file
    48 #	structures. Currently (Sep 2005) these routines have been tested
    51 #	structures. Currently (Sep 2005) these routines have been tested
    49 #	with the following firmware versions (as reported by [listhdr]):
    52 #	with the following firmware versions (as reported by [listhdr]):
   292 	read(WBRF,$buf,6) == 6 || die("$WBRcfn: $!\n");
   295 	read(WBRF,$buf,6) == 6 || die("$WBRcfn: $!\n");
   293 	($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES})
   296 	($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES})
   294 		= unpack('CCvCC',$buf);
   297 		= unpack('CCvCC',$buf);
   295 	$hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0));
   298 	$hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0));
   296 	$did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Data Source",$did,0));
   299 	$did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Data Source",$did,0));
   297 	die(sprintf("\n$WBRcfn: WARNING: unexpected number of data types (%d)\n",
   300 	printf(STDERR "\n$WBRcfn: WARNING: unexpected number of data types (%d)\n",
   298 		$dta->{NUMBER_OF_DATA_TYPES}))
   301 		$dta->{NUMBER_OF_DATA_TYPES})
   299 			unless ($dta->{NUMBER_OF_DATA_TYPES} == 6 ||
   302 			unless ($dta->{NUMBER_OF_DATA_TYPES} == 6 ||
   300 					$dta->{NUMBER_OF_DATA_TYPES} == 7);
   303 					$dta->{NUMBER_OF_DATA_TYPES} == 7);
   301 	$dta->{BT_PRESENT} = ($dta->{NUMBER_OF_DATA_TYPES} == 7);
   304 	$dta->{BT_PRESENT} = ($dta->{NUMBER_OF_DATA_TYPES} == 7);
   302 					  
   305 					  
   303 	read(WBRF,$buf,2*$dta->{NUMBER_OF_DATA_TYPES})
   306 	read(WBRF,$buf,2*$dta->{NUMBER_OF_DATA_TYPES})
   598 									 	  ${$E}[$ens]->{SECONDS});
   601 									 	  ${$E}[$ens]->{SECONDS});
   599 		${$E}[$ens]->{DAYNO}
   602 		${$E}[$ens]->{DAYNO}
   600 			= &dayNo(${$E}[$ens]->{YEAR},${$E}[$ens]->{MONTH},${$E}[$ens]->{DAY},
   603 			= &dayNo(${$E}[$ens]->{YEAR},${$E}[$ens]->{MONTH},${$E}[$ens]->{DAY},
   601 					 ${$E}[$ens]->{HOUR},${$E}[$ens]->{MINUTE},${$E}[$ens]->{SECONDS});
   604 					 ${$E}[$ens]->{HOUR},${$E}[$ens]->{MINUTE},${$E}[$ens]->{SECONDS});
   602 
   605 
   603 		${$E}[$ens]->{UNIX_TIME}
   606 		# when analyzing an STA file from an OS75 SADCP (Poseidion),
   604 			= timegm(0,${$E}[$ens]->{MINUTE},
   607 		# I noticed that there is no time information. This causes
   605 				 	   ${$E}[$ens]->{HOUR},
   608 		# timegm to bomb. 
   606 					   ${$E}[$ens]->{DAY},
   609 		if (${$E}[$ens]->{MONTH} == 0) {					# no time info
   607 					   ${$E}[$ens]->{MONTH}-1,		# NB!!!
   610 			${$E}[$ens]->{UNIX_TIME} = 0;
   608 					   ${$E}[$ens]->{YEAR})
   611 			${$E}[$ens]->{SECNO} = 0;
   609 			  + ${$E}[$ens]->{SECONDS};
   612         } else {
   610 
   613 			${$E}[$ens]->{UNIX_TIME}
   611 		$dayStart = timegm(0,0,0,${$E}[$ens]->{DAY},
   614 				= timegm(0,${$E}[$ens]->{MINUTE},
   612 	  		                     ${$E}[$ens]->{MONTH}-1,     # NB!!!
   615 						   ${$E}[$ens]->{HOUR},
   613 		                         ${$E}[$ens]->{YEAR})
   616 						   ${$E}[$ens]->{DAY},
   614 			unless defined($dayStart);
   617 						   ${$E}[$ens]->{MONTH}-1,			# timegm jan==0!!!
   615 		${$E}[$ens]->{SECNO} = ${$E}[$ens]->{UNIX_TIME} - $dayStart;
   618 						   ${$E}[$ens]->{YEAR})
       
   619 				  + ${$E}[$ens]->{SECONDS};
       
   620 	
       
   621 			$dayStart = timegm(0,0,0,${$E}[$ens]->{DAY},
       
   622 									 ${$E}[$ens]->{MONTH}-1,
       
   623 									 ${$E}[$ens]->{YEAR})
       
   624 				unless defined($dayStart);
       
   625 	        ${$E}[$ens]->{SECNO} = ${$E}[$ens]->{UNIX_TIME} - $dayStart;
       
   626         }
   616 
   627 
   617 		seek(WBRF,$start_ens+$WBRofs[0]+4,0)		# System Config / Fixed Leader
   628 		seek(WBRF,$start_ens+$WBRofs[0]+4,0)		# System Config / Fixed Leader
   618 			|| die("$WBRcfn: $!");
   629 			|| die("$WBRcfn: $!");
   619 
   630 
   620 		read(WBRF,$buf,5) == 5 || die("$WBRcfn: $!\n");
   631 		read(WBRF,$buf,5) == 5 || die("$WBRcfn: $!\n");
   772 	} # ens loop
   783 	} # ens loop
   773 }
   784 }
   774 
   785 
   775 sub readHeader(@)
   786 sub readHeader(@)
   776 {
   787 {
   777 	my($WBRcfn,$dta) = @_;
   788 	my($fn,$dta) = @_;
       
   789 	$WBRcfn = $fn;
   778     open(WBRF,$WBRcfn) || die("$WBRcfn: $!\n");
   790     open(WBRF,$WBRcfn) || die("$WBRcfn: $!\n");
   779     WBRhdr($dta);    
   791     WBRhdr($dta);    
   780 }
   792 }
   781 
   793 
   782 sub readData(@)
   794 sub readData(@)
   783 {
   795 {
   784 	my($WBRcfn,$dta) = @_;
   796 	my($fn,$dta) = @_;
       
   797 	$WBRcfn = $fn;
   785     open(WBRF,$WBRcfn) || die("$WBRcfn: $!\n");
   798     open(WBRF,$WBRcfn) || die("$WBRcfn: $!\n");
   786     WBRhdr($dta);
   799     WBRhdr($dta);
   787 	WBRens($dta->{N_BINS},$dta->{ENSEMBLE_BYTES},
   800 	WBRens($dta->{N_BINS},$dta->{ENSEMBLE_BYTES},
   788 		   $dta->{BT_PRESENT},$dta->{DATA_FORMAT},
   801 		   $dta->{BT_PRESENT},$dta->{DATA_FORMAT},
   789 		   \@{$dta->{ENSEMBLE}});
   802 		   \@{$dta->{ENSEMBLE}});