RDI_PD0_IO.pl
changeset 21 0b5bbe60131c
parent 18 bb7bb9f83db9
child 24 1a761865f839
equal deleted inserted replaced
19:e23a5fd2923a 21:0b5bbe60131c
     1 #======================================================================
     1 #======================================================================
     2 #                    R D I _ P D 0 _ I O . 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 May  7 10:41:18 2014
     4 #                    dlm: Wed Oct 15 21:50:07 2014
     5 #                    (c) 2003 A.M. Thurnherr
     5 #                    (c) 2003 A.M. Thurnherr
     6 #                    uE-Info: 827 0 NIL 0 0 72 74 2 4 NIL ofnI
     6 #                    uE-Info: 65 77 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:
    57 #	Mar  3, 2014: - BUG: WBPens() did not handle incomple ensembles at EOF correctly
    57 #	Mar  3, 2014: - BUG: WBPens() did not handle incomple ensembles at EOF correctly
    58 #	Mar  4, 2014: - added support for DATA_SOURCE_ID
    58 #	Mar  4, 2014: - added support for DATA_SOURCE_ID
    59 #	Apr 24, 2014: - added debug statements to log %-GOOD values
    59 #	Apr 24, 2014: - added debug statements to log %-GOOD values
    60 #	May  6, 2014: - loosened input format checks
    60 #	May  6, 2014: - loosened input format checks
    61 #	May  7, 2014: - removed BT_present flag
    61 #	May  7, 2014: - removed BT_present flag
       
    62 #	Sep  6, 2014: - adapted WBRhdr to >7 data types
       
    63 #	Oct 15, 2014: - implemented work-around for readData() not recognizing
       
    64 #					incomplete ensemble at the end, which seems to imply that there is
       
    65 #				    a garbage final ensemble that passes the checksum test???
    62 
    66 
    63 # FIRMWARE VERSIONS:
    67 # FIRMWARE VERSIONS:
    64 #	It appears that different firmware versions generate different file
    68 #	It appears that different firmware versions generate different file
    65 #	structures. Currently (Sep 2005) these routines have been tested
    69 #	structures. Currently (Sep 2005) these routines have been tested
    66 #	with the following firmware versions (as reported by [listHdr]):
    70 #	with the following firmware versions (as reported by [listHdr]):
   330 	sysread(WBRF,$buf,6) == 6 || die("$WBRcfn: $!");
   334 	sysread(WBRF,$buf,6) == 6 || die("$WBRcfn: $!");
   331 	($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES})
   335 	($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES})
   332 		= unpack('CCvCC',$buf);
   336 		= unpack('CCvCC',$buf);
   333 	$hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0));
   337 	$hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0));
   334 ##	$did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Data Source",$did,0));
   338 ##	$did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Data Source",$did,0));
   335 	printf(STDERR "\n$WBRcfn: WARNING: unexpected number of data types (%d)\n",
   339 	printf(STDERR "WARNING: unexpected number of data types (%d)\n",
   336 		$dta->{NUMBER_OF_DATA_TYPES})
   340 		$dta->{NUMBER_OF_DATA_TYPES})
   337 			unless ($dta->{NUMBER_OF_DATA_TYPES} == 6 ||
   341 			unless ($dta->{NUMBER_OF_DATA_TYPES} == 6 ||
   338 					$dta->{NUMBER_OF_DATA_TYPES} == 7);
   342 					$dta->{NUMBER_OF_DATA_TYPES} == 7);
   339 	$dta->{BT_PRESENT} = ($dta->{NUMBER_OF_DATA_TYPES} == 7);
   343 ##	$dta->{BT_PRESENT} = ($dta->{NUMBER_OF_DATA_TYPES} == 7);
       
   344 	$dta->{BT_PRESENT} = ($dta->{NUMBER_OF_DATA_TYPES} >= 7);
   340 					  
   345 					  
   341 	sysread(WBRF,$buf,2*$dta->{NUMBER_OF_DATA_TYPES})
   346 	sysread(WBRF,$buf,2*$dta->{NUMBER_OF_DATA_TYPES})
   342 		== 2*$dta->{NUMBER_OF_DATA_TYPES}
   347 		== 2*$dta->{NUMBER_OF_DATA_TYPES}
   343 			|| die("$WBRcfn: $!");
   348 			|| die("$WBRcfn: $!");
   344 	@WBRofs = unpack("v$dta->{NUMBER_OF_DATA_TYPES}",$buf);
   349 	@WBRofs = unpack("v$dta->{NUMBER_OF_DATA_TYPES}",$buf);
   397 	sysseek(WBRF,$WBRofs[5],0) || die("$WBRcfn: $!");
   402 	sysseek(WBRF,$WBRofs[5],0) || die("$WBRcfn: $!");
   398 	sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
   403 	sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
   399 	$id = unpack('v',$buf);
   404 	$id = unpack('v',$buf);
   400 	$id == 0x0400 || die(sprintf($FmtErr,$WBRcfn,"Percent-Good Data",$id,1));
   405 	$id == 0x0400 || die(sprintf($FmtErr,$WBRcfn,"Percent-Good Data",$id,1));
   401 
   406 
       
   407 	my($BT_dt);
   402 	if ($dta->{BT_PRESENT}) {
   408 	if ($dta->{BT_PRESENT}) {
   403 		sysseek(WBRF,$WBRofs[6],0) || die("$WBRcfn: $!");
   409 		for ($BT_dt=6; $BT_dt<$dta->{NUMBER_OF_DATA_TYPES}; $BT_dt++) {										# scan until BT found
   404 		sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
   410 			sysseek(WBRF,$WBRofs[$BT_dt],0) || die("$WBRcfn: $!");
   405 		$id = unpack('v',$buf);
   411 			sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
   406 		$id == 0x0600 || die(sprintf($FmtErr,$WBRcfn,"Bottom Track",$id,1));
   412 			$id = unpack('v',$buf);
       
   413 			last if ($id == 0x0600);
       
   414 		}
       
   415 
       
   416 		if ($BT_dt == $dta->{NUMBER_OF_DATA_TYPES}) {
       
   417 			printf(STDERR "WARNING: no BT data found\n");die;
       
   418 			undef($dta->{BT_PRESENT});
       
   419 		}
   407     }
   420     }
   408 
   421 
   409 	#--------------------
   422 	#--------------------
   410 	# FIXED LEADER
   423 	# FIXED LEADER
   411 	#--------------------
   424 	#--------------------
   513 	#-----------------------
   526 	#-----------------------
   514 	# 1st ENSEMBLE, BT Setup
   527 	# 1st ENSEMBLE, BT Setup
   515 	#-----------------------
   528 	#-----------------------
   516 
   529 
   517 	if ($dta->{BT_PRESENT}) {
   530 	if ($dta->{BT_PRESENT}) {
   518 		sysseek(WBRF,$WBRofs[6],0) || die("$WBRcfn: $!");
   531 		sysseek(WBRF,$WBRofs[$BT_dt],0) || die("$WBRcfn: $!");
   519 		sysread(WBRF,$buf,12) == 12 || die("$WBRcfn: $!");
   532 		sysread(WBRF,$buf,12) == 12 || die("$WBRcfn: $!");
   520 		($id,$dta->{BT_PINGS_PER_ENSEMBLE},$dta->{BT_DELAY_BEFORE_REACQUIRE},
   533 		($id,$dta->{BT_PINGS_PER_ENSEMBLE},$dta->{BT_DELAY_BEFORE_REACQUIRE},
   521 		 $dta->{BT_MIN_CORRELATION},$dta->{BT_MIN_EVAL_AMPLITUDE},
   534 		 $dta->{BT_MIN_CORRELATION},$dta->{BT_MIN_EVAL_AMPLITUDE},
   522 		 $dta->{BT_MIN_PERCENT_GOOD},$dta->{BT_MODE},
   535 		 $dta->{BT_MIN_PERCENT_GOOD},$dta->{BT_MODE},
   523 		 $dta->{BT_MAX_ERROR_VELOCITY}) = unpack('vvvCCCCv',$buf);
   536 		 $dta->{BT_MAX_ERROR_VELOCITY}) = unpack('vvvCCCCv',$buf);
   684 			${$E}[$ens]->{PRESSURE_STDDEV} /= 1000;
   697 			${$E}[$ens]->{PRESSURE_STDDEV} /= 1000;
   685 			${$E}[$ens]->{YEAR} *= 100; ${$E}[$ens]->{YEAR} += $B3;
   698 			${$E}[$ens]->{YEAR} *= 100; ${$E}[$ens]->{YEAR} += $B3;
   686 			${$E}[$ens]->{SECONDS} += $B4/100;
   699 			${$E}[$ens]->{SECONDS} += $B4/100;
   687 		}
   700 		}
   688 
   701 
       
   702 		pop(@{$E}),last if (${$E}[$ens]->{MONTH}>12);						# 10/15/2014; IWISE#145 UL ???
       
   703 
   689 		if ($fixed_leader_bytes == 58) {									# Explorer DVL
   704 		if ($fixed_leader_bytes == 58) {									# Explorer DVL
   690 			sysread(WBRF,$buf,14) == 14 || die("$WBRcfn: $!");
   705 			sysread(WBRF,$buf,14) == 14 || die("$WBRcfn: $!");
   691 			(${$E}[$ens]->{ERROR_STATUS_WORD},
   706 			(${$E}[$ens]->{ERROR_STATUS_WORD},
   692 		 	 $dummy,${$E}[$ens]->{PRESSURE},${$E}[$ens]->{PRESSURE_STDDEV})
   707 		 	 $dummy,${$E}[$ens]->{PRESSURE},${$E}[$ens]->{PRESSURE_STDDEV})
   693 				= unpack('VvVV',$buf);
   708 				= unpack('VvVV',$buf);
   827 			last if ($id == 0x0600);
   842 			last if ($id == 0x0600);
   828 		}
   843 		}
   829 
   844 
   830 		next if ($nxt == $ndt);													# no BT found => next ens
   845 		next if ($nxt == $ndt);													# no BT found => next ens
   831 
   846 
   832 
       
   833 		sysseek(WBRF,14,1) || die("$WBRcfn: $!");								# BT config
   847 		sysseek(WBRF,14,1) || die("$WBRcfn: $!");								# BT config
   834 
   848 
   835 		sysread(WBRF,$buf,28) == 28 || die("$WBRcfn: $!");
   849 		sysread(WBRF,$buf,28) == 28 || die("$WBRcfn: $!");
   836 		@dta = unpack('v4v4C4C4C4',$buf);
   850 		@dta = unpack('v4v4C4C4C4',$buf);
   837 	    
   851