RDI_PD0_IO.pl
changeset 56 82384f531dba
parent 55 540d6574caca
child 57 5a59411306ba
equal deleted inserted replaced
55:540d6574caca 56:82384f531dba
     1 #======================================================================
     1 #======================================================================
     2 #                    R D I _ P D 0 _ I O . P L 
     2 #                    R D I _ P D 0 _ I O . P L 
     3 #                    doc: Sat Jan 18 14:54:43 2003
     3 #                    doc: Sat Jan 18 14:54:43 2003
     4 #                    dlm: Wed Mar  3 15:02:04 2021
     4 #                    dlm: Thu Mar  4 11:23:23 2021
     5 #                    (c) 2003 A.M. Thurnherr
     5 #                    (c) 2003 A.M. Thurnherr
     6 #					 uE-Info: 1047 82 NIL 0 0 72 2 2 4 NIL ofnI
     6 #					 uE-Info: 1157 0 NIL 0 0 72 2 2 4 NIL ofnI
     7 #======================================================================
     7 #======================================================================
     8     
     8     
     9 # Read RDI PD0 binary data files (*.[0-9][0-9][0-9])
     9 # Read RDI PD0 binary data files (*.[0-9][0-9][0-9])
    10     
    10     
    11 # HISTORY:
    11 # HISTORY:
   454 }
   454 }
   455 
   455 
   456 sub WBRhdr($)
   456 sub WBRhdr($)
   457 {
   457 {
   458 	my($dta) = @_;
   458 	my($dta) = @_;
   459 	my($start_ens,$buf,$hid,$did,$Ndt,$B,$W,$i,$dummy,$id,@WBRofs);
   459 	my($hid,$did,$B,$W,$i,$dummy);
       
   460 	local our($ndt,$buf,$id,$start_ens,@WBRofs);
   460 	my($B1,$B2,$B3,$B4,$B5,$B6,$B7,$W1,$W2,$W3,$W4,$W5);
   461 	my($B1,$B2,$B3,$B4,$B5,$B6,$B7,$W1,$W2,$W3,$W4,$W5);
   461 	my($BT_dt);
       
   462     
   462     
   463 	#--------------------
   463 	#--------------------
   464 	# HEADER
   464 	# HEADER
   465 	#--------------------
   465 	#--------------------
   466 
   466 
   473 	sysread(WBRF,$buf,6) == 6 || return undef;
   473 	sysread(WBRF,$buf,6) == 6 || return undef;
   474 	($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES})
   474 	($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES})
   475 		= unpack('CCvCC',$buf);
   475 		= unpack('CCvCC',$buf);
   476 	$hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header (hid)",$hid,0));
   476 	$hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header (hid)",$hid,0));
   477 	$did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header (did)",$did,0));
   477 	$did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header (did)",$did,0));
       
   478 	$ndt = $dta->{NUMBER_OF_DATA_TYPES};
   478 
   479 
   479 	$start_ens = sysseek(WBRF,$dta->{ENSEMBLE_BYTES}-6+2,1) || return undef;
   480 	$start_ens = sysseek(WBRF,$dta->{ENSEMBLE_BYTES}-6+2,1) || return undef;
   480 	sysread(WBRF,$buf,6) == 6 || return undef;
   481 	sysread(WBRF,$buf,6) == 6 || return undef;
   481 	($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES})
   482 	($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES})
   482 		= unpack('CCvCC',$buf);
   483 		= unpack('CCvCC',$buf);
   494 
   495 
   495 	sysread(WBRF,$buf,2*$dta->{NUMBER_OF_DATA_TYPES})
   496 	sysread(WBRF,$buf,2*$dta->{NUMBER_OF_DATA_TYPES})
   496 		== 2*$dta->{NUMBER_OF_DATA_TYPES}
   497 		== 2*$dta->{NUMBER_OF_DATA_TYPES}
   497 			|| die("$WBRcfn: $!");
   498 			|| die("$WBRcfn: $!");
   498 	@WBRofs = unpack("v$dta->{NUMBER_OF_DATA_TYPES}",$buf);
   499 	@WBRofs = unpack("v$dta->{NUMBER_OF_DATA_TYPES}",$buf);
       
   500 
   499 #	for ($i=0; $i<$dta->{NUMBER_OF_DATA_TYPES}; $i++) {
   501 #	for ($i=0; $i<$dta->{NUMBER_OF_DATA_TYPES}; $i++) {
   500 #		printf(STDERR "WBRofs[$i] = %d",$WBRofs[$i]);
   502 #		printf(STDERR "WBRofs[$i] = %d\n",$WBRofs[$i]);
   501 #	}
   503 #	}
   502 
       
   503 
   504 
   504 	$dta->{HEADER_BYTES}					= $WBRofs[0];
   505 	$dta->{HEADER_BYTES}					= $WBRofs[0];
   505 	$dta->{FIXED_LEADER_BYTES}				= $WBRofs[1] - $WBRofs[0];
   506 	$dta->{FIXED_LEADER_BYTES}				= $WBRofs[1] - $WBRofs[0];
   506 	$dta->{VARIABLE_LEADER_BYTES}			= $WBRofs[2] - $WBRofs[1];
   507 	$dta->{VARIABLE_LEADER_BYTES}			= $WBRofs[2] - $WBRofs[1];
   507 
   508 
   516 	} elsif ($dta->{FIXED_LEADER_BYTES} == 60) {		# OS75
   517 	} elsif ($dta->{FIXED_LEADER_BYTES} == 60) {		# OS75
   517 		$dta->{INSTRUMENT_TYPE} = 'Ocean Surveyor';
   518 		$dta->{INSTRUMENT_TYPE} = 'Ocean Surveyor';
   518 	} else {
   519 	} else {
   519 		$dta->{INSTRUMENT_TYPE} = 'unknown';
   520 		$dta->{INSTRUMENT_TYPE} = 'unknown';
   520 	}
   521 	}
       
   522 
       
   523 	my($BT_dt) = WBRdtaIndex(0x0600); 
       
   524 	$dta->{BT_PRESENT} = defined($BT_dt);
       
   525 	@{$dta->{DATA_TYPES}} = WBRdtaTypes();
   521 
   526 
   522 	#--------------------------------
   527 	#--------------------------------
   523 	# Variable Leader: SPEED_OF_SOUND
   528 	# Variable Leader: SPEED_OF_SOUND
   524 	#--------------------------------
   529 	#--------------------------------
   525 
   530 
   654 
   659 
   655 	#-----------------------
   660 	#-----------------------
   656 	# 1st ENSEMBLE, BT Setup
   661 	# 1st ENSEMBLE, BT Setup
   657 	#-----------------------
   662 	#-----------------------
   658 
   663 
   659 #	CODE DISABLED BECAUSE BT_PRESENT FLAG WAS REMOVED. WITHOUT THIS CODE,
   664 	if ($dta->{BT_PRESENT}) {
   660 #	[listHdr] DOES NOT LIST ANY BT INFO
   665 		sysseek(WBRF,$start_ens+$WBRofs[$BT_dt],0) || die("$WBRcfn: $!");
   661 #
   666 		sysread(WBRF,$buf,12) == 12 || die("$WBRcfn: $!");
   662 #	if ($dta->{BT_PRESENT}) {
   667 		($id,$dta->{BT_PINGS_PER_ENSEMBLE},$dta->{BT_DELAY_BEFORE_REACQUIRE},
   663 #		sysseek(WBRF,$start_ens+$WBRofs[$BT_dt],0) || die("$WBRcfn: $!");
   668 		 $dta->{BT_MIN_CORRELATION},$dta->{BT_MIN_EVAL_AMPLITUDE},
   664 #		sysread(WBRF,$buf,12) == 12 || die("$WBRcfn: $!");
   669 		 $dta->{BT_MIN_PERCENT_GOOD},$dta->{BT_MODE},
   665 #		($id,$dta->{BT_PINGS_PER_ENSEMBLE},$dta->{BT_DELAY_BEFORE_REACQUIRE},
   670 		 $dta->{BT_MAX_ERROR_VELOCITY}) = unpack('vvvCCCCv',$buf);
   666 #		 $dta->{BT_MIN_CORRELATION},$dta->{BT_MIN_EVAL_AMPLITUDE},
   671 		 
   667 #		 $dta->{BT_MIN_PERCENT_GOOD},$dta->{BT_MODE},
   672 		$id == 0x0600 ||
   668 #		 $dta->{BT_MAX_ERROR_VELOCITY}) = unpack('vvvCCCCv',$buf);
   673 			printf(STDERR $FmtErr."\n",$WBRcfn,"Bottom Track",$id,0,tell(WBRF));
   669 #		 
   674    
   670 #		$id == 0x0600 ||
   675 		$dta->{BT_MAX_ERROR_VELOCITY} =
   671 #			printf(STDERR $FmtErr."\n",$WBRcfn,"Bottom Track",$id,0,tell(WBRF));
   676 			$dta->{BT_MAX_ERROR_VELOCITY} ? $dta->{BT_MAX_ERROR_VELOCITY} / 1000
   672 #   
   677 										  : undef;
   673 #		$dta->{BT_MAX_ERROR_VELOCITY} =
   678    
   674 #			$dta->{BT_MAX_ERROR_VELOCITY} ? $dta->{BT_MAX_ERROR_VELOCITY} / 1000
   679 		sysseek(WBRF,28,1) || die("$WBRcfn: $!");
   675 #										  : undef;
   680 		sysread(WBRF,$buf,6) == 6 || die("$WBRcfn: $!");
   676 #   
   681 		($dta->{BT_RL_MIN_SIZE},$dta->{BT_RL_NEAR},$dta->{BT_RL_FAR})
   677 #		sysseek(WBRF,28,1) || die("$WBRcfn: $!");
   682 			= unpack('vvv',$buf);
   678 #		sysread(WBRF,$buf,6) == 6 || die("$WBRcfn: $!");
   683    
   679 #		($dta->{BT_RL_MIN_SIZE},$dta->{BT_RL_NEAR},$dta->{BT_RL_FAR})
   684 		$dta->{BT_RL_MIN_SIZE} /= 10;
   680 #			= unpack('vvv',$buf);
   685 		$dta->{BT_RL_NEAR} /= 10;
   681 #   
   686 		$dta->{BT_RL_FAR} /= 10;
   682 #		$dta->{BT_RL_MIN_SIZE} /= 10;
   687 	    
   683 #		$dta->{BT_RL_NEAR} /= 10;
   688 		sysseek(WBRF,20,1) || die("$WBRcfn: $!");		# skip data
   684 #		$dta->{BT_RL_FAR} /= 10;
   689 		sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
   685 #	    
   690 		$dta->{BT_MAX_TRACKING_DEPTH} = unpack('v',$buf) / 10;
   686 #		sysseek(WBRF,20,1) || die("$WBRcfn: $!");		# skip data
   691 	 }
   687 #		sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
       
   688 #		$dta->{BT_MAX_TRACKING_DEPTH} = unpack('v',$buf) / 10;
       
   689 #	 }
       
   690     
   692     
   691 	return $dta;
   693 	return $dta;
   692 }
   694 }
   693 
   695 
   694 #----------------------------------------------------------------------
   696 #----------------------------------------------------------------------
  1139 		sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
  1141 		sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
  1140 		$id = unpack('v',$buf);
  1142 		$id = unpack('v',$buf);
  1141 		return $di if ($id == $trgid);
  1143 		return $di if ($id == $trgid);
  1142     }
  1144     }
  1143     return undef;
  1145     return undef;
       
  1146 }
       
  1147 
       
  1148 sub WBRdtaTypes()																# return list of data types
       
  1149 {
       
  1150 	my(@dt);
       
  1151 	our($ndt,$buf,$id,$start_ens,@WBRofs);
       
  1152 	
       
  1153 	for (my($di)=2; $di<$ndt; $di++) {
       
  1154 		sysseek(WBRF,$start_ens+$WBRofs[$di],0) || die("$WBRcfn: $!");
       
  1155 		sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
       
  1156 		$id = unpack('v',$buf);
       
  1157 		if 	  ($id == 0x0000) { push(@dt,'FixedLeader'); }
       
  1158 		elsif ($id == 0x0080) { push(@dt,'VariableLeader'); }
       
  1159 		elsif ($id == 0x0081) { push(@dt,'VariableLeader'); }					# TRDI Ocean Surveyor
       
  1160 		elsif ($id == 0x0100) { push(@dt,'VELOCITY'); }
       
  1161 		elsif ($id == 0x0200) { push(@dt,'CORRELATION'); }
       
  1162 		elsif ($id == 0x0300) { push(@dt,'ECHO_AMPLITUDE'); }
       
  1163 		elsif ($id == 0x0400) { push(@dt,'PERCENT_GOOD'); }
       
  1164 		elsif ($id == 0x0600) { push(@dt,'BOTTOM_TRACK'); }
       
  1165 		else				  { push(@dt,'Unknown'); }
       
  1166     }
       
  1167     return @dt;
  1144 }
  1168 }
  1145 
  1169 
  1146 #----------------------------------------------------------------------
  1170 #----------------------------------------------------------------------
  1147 # writeData(output_file_name,^data) WBPens(nbins,fixed_leader_bytes,^data)
  1171 # writeData(output_file_name,^data) WBPens(nbins,fixed_leader_bytes,^data)
  1148 #	- writeData() copies file previously read with readData() to output_file_name
  1172 #	- writeData() copies file previously read with readData() to output_file_name