RDI_PD0_IO.pl
changeset 58 78607e2e8add
parent 57 5a59411306ba
child 61 69192495f0db
equal deleted inserted replaced
57:5a59411306ba 58:78607e2e8add
     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: Sat Mar  6 14:13:23 2021
     4 #                    dlm: Wed Mar 17 22:54:27 2021
     5 #                    (c) 2003 A.M. Thurnherr
     5 #                    (c) 2003 A.M. Thurnherr
     6 #					 uE-Info: 643 43 NIL 0 0 72 2 2 4 NIL ofnI
     6 #					 uE-Info: 129 35 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:
   123 #					progreass; not sure whether this merge is successful
   123 #					progreass; not sure whether this merge is successful
   124 #				  - disabled duplicate ens detection, which turns reading into
   124 #				  - disabled duplicate ens detection, which turns reading into
   125 #					O(N^2) process
   125 #					O(N^2) process
   126 #	Apr 14, 2020: - BUG: WBPens did not work for ens# > 65535 (high byte)
   126 #	Apr 14, 2020: - BUG: WBPens did not work for ens# > 65535 (high byte)
   127 #	Mar  3, 2021: - adapted to Nortek PD0 files
   127 #	Mar  3, 2021: - adapted to Nortek PD0 files
       
   128 #	Mar 13, 2021: - finished adaptation to Nortek files
       
   129 #	Mar 17, 2021: - updated HISTORY
   128 # END OF HISTORY
   130 # END OF HISTORY
   129     
   131     
   130 # FIRMWARE VERSIONS:
   132 # FIRMWARE VERSIONS:
   131 #	It appears that different firmware versions generate different file
   133 #	It appears that different firmware versions generate different file
   132 #	structures. Currently (Sep 2005) these routines have been tested
   134 #	structures. Currently (Sep 2005) these routines have been tested
   981 		#--------------------
   983 		#--------------------
   982 
   984 
   983 		my($ndata) = $nbins * 4;
   985 		my($ndata) = $nbins * 4;
   984 
   986 
   985 		my($vel_di) = WBRdtaIndex(0x0100);
   987 		my($vel_di) = WBRdtaIndex(0x0100);
   986 		die("no velocity data in ensemble #$ensNo\n")
   988 		if (defined($vel_di)) {
   987 			unless defined($vel_di);
   989 			sysseek(WBRF,$start_ens+$WBRofs[$vel_di],0) || die("$WBRcfn: $!");
   988 	    
   990 			sysread(WBRF,$buf,2+$ndata*2) == 2+$ndata*2 || die("$WBRcfn: $!");
   989 		sysseek(WBRF,$start_ens+$WBRofs[$vel_di],0) || die("$WBRcfn: $!");
   991 			($id,@dta) = unpack("vv$ndata",$buf);
   990 		sysread(WBRF,$buf,2+$ndata*2) == 2+$ndata*2 || die("$WBRcfn: $!");
   992 	
   991 		($id,@dta) = unpack("vv$ndata",$buf);
   993 			for ($i=0,$bin=0; $bin<$nbins; $bin++) {
   992 
   994 				for ($beam=0; $beam<4; $beam++,$i++) {
   993 		for ($i=0,$bin=0; $bin<$nbins; $bin++) {
   995 					${$E}[$ens]->{VELOCITY}[$bin][$beam] =
   994 			for ($beam=0; $beam<4; $beam++,$i++) {
   996 						unpack('s',pack('S',$dta[$i])) / 1000
   995 				${$E}[$ens]->{VELOCITY}[$bin][$beam] =
   997 							if ($dta[$i] != 0x8000);
   996 					unpack('s',pack('S',$dta[$i])) / 1000
   998 				}
   997 						if ($dta[$i] != 0x8000);
   999 	        }
   998 			}
  1000 	    } else {
   999 		}
  1001 #   		die("no velocity data in ensemble #$ensNo\n");
       
  1002 			print(STDERR "WARNING: no velocity data in ensemble #$ensNo\n");
       
  1003         }	    
  1000 
  1004 
  1001 		#--------------------
  1005 		#--------------------
  1002 		# Correlation Data
  1006 		# Correlation Data
  1003 		#--------------------
  1007 		#--------------------
  1004 
  1008 
  1005 		my($corr_di) = WBRdtaIndex(0x0200);
  1009 		my($corr_di) = WBRdtaIndex(0x0200);
  1006 		die("no correlation data in ensemble #$ensNo\n")
  1010 		if (defined($corr_di)) {
  1007 			unless defined($corr_di);
  1011 			sysseek(WBRF,$start_ens+$WBRofs[$corr_di],0) || die("$WBRcfn: $!");
  1008 	    
  1012 			sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!");
  1009 		sysseek(WBRF,$start_ens+$WBRofs[$corr_di],0) || die("$WBRcfn: $!");
  1013 			($id,@dta) = unpack("vC$ndata",$buf);
  1010 		sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!");
  1014 	
  1011 		($id,@dta) = unpack("vC$ndata",$buf);
  1015 			for ($i=0,$bin=0; $bin<$nbins; $bin++) {
  1012 
  1016 				for ($beam=0; $beam<4; $beam++,$i++) {
  1013 		for ($i=0,$bin=0; $bin<$nbins; $bin++) {
  1017 					${$E}[$ens]->{CORRELATION}[$bin][$beam] = $dta[$i]
  1014 			for ($beam=0; $beam<4; $beam++,$i++) {
  1018 						if ($dta[$i]);
  1015 				${$E}[$ens]->{CORRELATION}[$bin][$beam] = $dta[$i]
  1019 				}
  1016 					if ($dta[$i]);
  1020 	        }
  1017 			}
  1021 	    } else {
  1018 		}
  1022 #  			die("no correlation data in ensemble #$ensNo\n")
       
  1023   			print(STDERR "WARNING: no correlation data in ensemble #$ensNo\n")
       
  1024   		}
  1019 
  1025 
  1020 		#--------------------
  1026 		#--------------------
  1021 		# Echo Intensity Data
  1027 		# Echo Intensity Data
  1022 		#--------------------
  1028 		#--------------------
  1023 
  1029 
  1024 		my($echo_di) = WBRdtaIndex(0x0300);
  1030 		my($echo_di) = WBRdtaIndex(0x0300);
  1025 		die("no echo intensity data in ensemble #$ensNo\n")
  1031 		if (defined($echo_di)) {
  1026 			unless defined($echo_di);
  1032 			sysseek(WBRF,$start_ens+$WBRofs[$echo_di],0) || die("$WBRcfn: $!");
  1027 	    
  1033 			sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!");
  1028 		sysseek(WBRF,$start_ens+$WBRofs[$echo_di],0) || die("$WBRcfn: $!");
  1034 			($id,@dta) = unpack("vC$ndata",$buf);
  1029 		sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!");
  1035 	
  1030 		($id,@dta) = unpack("vC$ndata",$buf);
  1036 			$id == 0x0300 ||
  1031 
  1037 				die(sprintf($FmtErr,$WBRcfn,"Echo Intensity",$id,$ensNo));
  1032 		$id == 0x0300 ||
  1038 	
  1033 			die(sprintf($FmtErr,$WBRcfn,"Echo Intensity",$id,$ensNo));
  1039 			for ($i=0,$bin=0; $bin<$nbins; $bin++) {
  1034 
  1040 				for ($beam=0; $beam<4; $beam++,$i++) {
  1035 		for ($i=0,$bin=0; $bin<$nbins; $bin++) {
  1041 					${$E}[$ens]->{ECHO_AMPLITUDE}[$bin][$beam] = $dta[$i];
  1036 			for ($beam=0; $beam<4; $beam++,$i++) {
  1042 				}
  1037 				${$E}[$ens]->{ECHO_AMPLITUDE}[$bin][$beam] = $dta[$i];
  1043 	        }
  1038 			}
  1044 	    } else {
       
  1045 #			die("no echo intensity data in ensemble #$ensNo\n");
       
  1046 			print(STDERR "WARNING: no echo intensity data in ensemble #$ensNo\n");
  1039 		}
  1047 		}
  1040 
  1048 
  1041 		#--------------------
  1049 		#--------------------
  1042 		# Percent Good Data
  1050 		# Percent Good Data
  1043 		#--------------------
  1051 		#--------------------
  1143 sub WBRdtaIndex($)																# return index of particular data type
  1151 sub WBRdtaIndex($)																# return index of particular data type
  1144 {																				#	where index refers to data sections inside PD0 files
  1152 {																				#	where index refers to data sections inside PD0 files
  1145 	my($trgid) = @_;
  1153 	my($trgid) = @_;
  1146 	our($ndt,$buf,$id,$start_ens,@WBRofs);
  1154 	our($ndt,$buf,$id,$start_ens,@WBRofs);
  1147 	
  1155 	
       
  1156 #	printf(STDERR "WBRdtaIndex(%04X)\n",$trgid);
  1148 	for (my($di)=2; $di<$ndt; $di++) {
  1157 	for (my($di)=2; $di<$ndt; $di++) {
  1149 		sysseek(WBRF,$start_ens+$WBRofs[$di],0) || die("$WBRcfn: $!");
  1158 		sysseek(WBRF,$start_ens+$WBRofs[$di],0) || die("$WBRcfn: $!");
  1150 		sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
  1159 		sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!");
  1151 		$id = unpack('v',$buf);
  1160 		$id = unpack('v',$buf);
       
  1161 #		printf(STDERR "\tid = %04X\n",$id);
  1152 		return $di if ($id == $trgid);
  1162 		return $di if ($id == $trgid);
  1153     }
  1163     }
  1154     return undef;
  1164     return undef;
  1155 }
  1165 }
  1156 
  1166