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 Jan 9 17:57:01 2016 |
4 # dlm: Mon Feb 29 12:30:04 2016 |
5 # (c) 2003 A.M. Thurnherr |
5 # (c) 2003 A.M. Thurnherr |
6 # uE-Info: 73 64 NIL 0 0 72 10 2 4 NIL ofnI |
6 # uE-Info: 1232 63 NIL 0 0 72 10 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: |
69 # Jan 9, 2016: - removed system() from writeData() |
69 # Jan 9, 2016: - removed system() from writeData() |
70 # - BUG: WBRhdr() did not set DATA_SOURCE_ID |
70 # - BUG: WBRhdr() did not set DATA_SOURCE_ID |
71 # - added PRODUCER |
71 # - added PRODUCER |
72 # - BUG: writeData() did not work correctly for ECOGIG OC26 moored data (spaces in filename?) |
72 # - BUG: writeData() did not work correctly for ECOGIG OC26 moored data (spaces in filename?) |
73 # - added support for patching coordinate system |
73 # - added support for patching coordinate system |
|
74 # Feb 16, 2016: - added transducer orientation to WBPens() |
|
75 # - BUG: most WBPens() error messages used wrong file name |
|
76 # Feb 23, 2016: - changed WBRhdr() to use 2nd ensemble (with correct data-source id) |
|
77 # Feb 26, 2016: - added basic BT data to WBPens(); not BT_RL_* and BT_SIGNAL_STRENGTH |
|
78 # Feb 29, 2016: - LEAP DAY: actually got BT data to work |
74 |
79 |
75 # FIRMWARE VERSIONS: |
80 # FIRMWARE VERSIONS: |
76 # It appears that different firmware versions generate different file |
81 # It appears that different firmware versions generate different file |
77 # structures. Currently (Sep 2005) these routines have been tested |
82 # structures. Currently (Sep 2005) these routines have been tested |
78 # with the following firmware versions (as reported by [listHdr]): |
83 # with the following firmware versions (as reported by [listHdr]): |
83 # 16.12 WH300 (1) FSU A0304 53 |
88 # 16.12 WH300 (1) FSU A0304 53 |
84 # 16.21 WH300 (1) LDEO NBP0402 53 |
89 # 16.21 WH300 (1) LDEO NBP0402 53 |
85 # 16.27 WH300 (2) Nash ? 59 |
90 # 16.27 WH300 (2) Nash ? 59 |
86 |
91 |
87 # PD0 FILE FORMAT EXTENSIONS: |
92 # PD0 FILE FORMAT EXTENSIONS: |
|
93 # |
|
94 # - file creator encoded in DATA_SOURCE_ID |
|
95 # |
|
96 # - first ensemble uses default RDI DATA_SOURCE_ID because the LDEO_IX |
|
97 # software assumes this |
88 # |
98 # |
89 # - DATA_SOURCE_ID = 0x7F original TRDI PD0 file |
99 # - DATA_SOURCE_ID = 0x7F original TRDI PD0 file |
90 # |
100 # |
91 # - DATA_SOURCE_ID = 0xA0 | PATCHED_MASK produced by IMP+LADP |
101 # - DATA_SOURCE_ID = 0xA0 | PATCHED_MASK produced by IMP+LADP |
92 # PATCHED_MASK & 0x04: pitch value has been patched |
102 # PATCHED_MASK & 0x04: pitch value has been patched |
374 |
384 |
375 #-------------------- |
385 #-------------------- |
376 # HEADER |
386 # HEADER |
377 #-------------------- |
387 #-------------------- |
378 |
388 |
379 $start_ens = skip_initial_trash(); |
389 skip_initial_trash(); |
|
390 sysread(WBRF,$buf,6) == 6 || die("$WBRcfn: $!"); |
|
391 ($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES}) |
|
392 = unpack('CCvCC',$buf); |
|
393 $hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0)); |
|
394 $did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$did,0)); |
|
395 |
|
396 $start_ens = sysseek(WBRF,$dta->{ENSEMBLE_BYTES}-6+2,1) || die("$WBRcfn: $!"); |
380 sysread(WBRF,$buf,6) == 6 || die("$WBRcfn: $!"); |
397 sysread(WBRF,$buf,6) == 6 || die("$WBRcfn: $!"); |
381 ($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES}) |
398 ($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES}) |
382 = unpack('CCvCC',$buf); |
399 = unpack('CCvCC',$buf); |
383 $hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0)); |
400 $hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0)); |
384 $dta->{DATA_SOURCE_ID} = $did; |
401 $dta->{DATA_SOURCE_ID} = $did; |
908 last if ($id == 0x0600); |
925 last if ($id == 0x0600); |
909 } |
926 } |
910 |
927 |
911 next if ($nxt == $ndt); # no BT found => next ens |
928 next if ($nxt == $ndt); # no BT found => next ens |
912 |
929 |
913 sysseek(WBRF,14,1) || die("$WBRcfn: $!"); # BT config |
930 sysseek(WBRF,14,1) || die("$WBRcfn: $!"); # BT range, velocity, corr, %-good, ... |
914 |
|
915 sysread(WBRF,$buf,28) == 28 || die("$WBRcfn: $!"); |
931 sysread(WBRF,$buf,28) == 28 || die("$WBRcfn: $!"); |
916 @dta = unpack('v4v4C4C4C4',$buf); |
932 @dta = unpack('v4v4C4C4C4',$buf); |
917 |
|
918 for ($beam=0; $beam<4; $beam++) { |
933 for ($beam=0; $beam<4; $beam++) { |
919 ${$E}[$ens]->{BT_RANGE}[$beam] = $dta[$beam] / 100 |
934 ${$E}[$ens]->{BT_RANGE}[$beam] = $dta[$beam] / 100 # lower 2 bytes only! |
920 if ($dta[$beam]); |
935 if ($dta[$beam]); # (see below for high bytes) |
921 } |
936 } |
922 for ($beam=0; $beam<4; $beam++) { |
937 for ($beam=0; $beam<4; $beam++) { |
923 ${$E}[$ens]->{BT_VELOCITY}[$beam] = |
938 ${$E}[$ens]->{BT_VELOCITY}[$beam] = |
924 unpack('s',pack('S',$dta[4+$beam])) / 1000 |
939 unpack('s',pack('S',$dta[4+$beam])) / 1000 |
925 if ($dta[4+$beam] != 0x8000); |
940 if ($dta[4+$beam] != 0x8000); |
926 } |
941 } |
927 for ($beam=0; $beam<4; $beam++) { |
942 for ($beam=0; $beam<4; $beam++) { |
928 ${$E}[$ens]->{BT_CORRELATION}[$beam] = $dta[8+$beam] |
943 ${$E}[$ens]->{BT_CORRELATION}[$beam] = $dta[8+$beam] |
929 if ($dta[8+$beam]); |
944 if ($dta[8+$beam]); |
930 } |
945 } |
931 for ($beam=0; $beam<4; $beam++) { |
946 for ($beam=0; $beam<4; $beam++) { # BT filter parameter |
932 ${$E}[$ens]->{BT_EVAL_AMPLITUDE}[$beam] = $dta[12+$beam]; |
947 ${$E}[$ens]->{BT_EVAL_AMPLITUDE}[$beam] = $dta[12+$beam]; |
933 } |
948 } |
934 for ($beam=0; $beam<4; $beam++) { |
949 for ($beam=0; $beam<4; $beam++) { |
935 ${$E}[$ens]->{BT_PERCENT_GOOD}[$beam] = $dta[16+$beam]; |
950 ${$E}[$ens]->{BT_PERCENT_GOOD}[$beam] = $dta[16+$beam]; |
936 } |
951 } |
937 |
952 |
938 sysseek(WBRF,6,1) || die("$WBRcfn: $!"); # BT config |
953 sysseek(WBRF,6,1) || die("$WBRcfn: $!"); # BT ref level stuff |
939 |
|
940 sysread(WBRF,$buf,20) == 20 || die("$WBRcfn: $!"); |
954 sysread(WBRF,$buf,20) == 20 || die("$WBRcfn: $!"); |
941 @dta = unpack('v4C4C4C4',$buf); |
955 @dta = unpack('v4C4C4C4',$buf); |
942 |
|
943 for ($beam=0; $beam<4; $beam++) { |
956 for ($beam=0; $beam<4; $beam++) { |
944 ${$E}[$ens]->{BT_RL_VELOCITY}[$beam] = |
957 ${$E}[$ens]->{BT_RL_VELOCITY}[$beam] = |
945 unpack('s',pack('S',$dta[$beam])) / 1000 |
958 unpack('s',pack('S',$dta[$beam])) / 1000 |
946 if ($dta[$beam] != 0x8000); |
959 if ($dta[$beam] != 0x8000); |
947 } |
960 } |
954 } |
967 } |
955 for ($beam=0; $beam<4; $beam++) { |
968 for ($beam=0; $beam<4; $beam++) { |
956 ${$E}[$ens]->{BT_RL_PERCENT_GOOD}[$beam] = $dta[12+$beam]; |
969 ${$E}[$ens]->{BT_RL_PERCENT_GOOD}[$beam] = $dta[12+$beam]; |
957 } |
970 } |
958 |
971 |
959 sysseek(WBRF,2,1) || die("$WBRcfn: $!"); # BT config |
972 sysseek(WBRF,2,1) || die("$WBRcfn: $!"); # BT signal strength & BT range high bytes |
960 |
|
961 sysread(WBRF,$buf,9) == 9 || die("$WBRcfn: $!"); |
973 sysread(WBRF,$buf,9) == 9 || die("$WBRcfn: $!"); |
962 @dta = unpack('C4CC4',$buf); |
974 @dta = unpack('C4CC4',$buf); |
963 |
|
964 for ($beam=0; $beam<4; $beam++) { |
975 for ($beam=0; $beam<4; $beam++) { |
965 ${$E}[$ens]->{BT_SIGNAL_STRENGTH}[$beam] = $dta[$beam]; |
976 ${$E}[$ens]->{BT_SIGNAL_STRENGTH}[$beam] = $dta[$beam]; |
966 } |
977 } |
967 ${$E}[$ens]->{HIGH_GAIN} if ($dta[4]); |
978 ${$E}[$ens]->{HIGH_GAIN} if ($dta[4]); |
968 ${$E}[$ens]->{LOW_GAIN} unless ($dta[4]); |
979 ${$E}[$ens]->{LOW_GAIN} unless ($dta[4]); |
969 for ($beam=0; $beam<4; $beam++) { |
980 for ($beam=0; $beam<4; $beam++) { # high bytes (1 byte per beam) |
970 ${$E}[$ens]->{BT_RANGE}[$beam] += $dta[5+$beam] * 655.36 |
981 ${$E}[$ens]->{BT_RANGE}[$beam] += $dta[5+$beam] * 655.36 |
971 if ($dta[5+$beam]); |
982 if ($dta[5+$beam]); |
972 } |
983 } |
973 } # ens loop |
984 } # ens loop |
974 } |
985 } |
1049 |
1060 |
1050 #-------------------- |
1061 #-------------------- |
1051 # Fixed Leader |
1062 # Fixed Leader |
1052 #-------------------- |
1063 #-------------------- |
1053 |
1064 |
1054 sysseek(WBPF,$start_ens+$WBPofs[0]+25,0) || die("$WBPcfn: $!"); # jump to EX/Coord-Transform |
1065 sysseek(WBPF,$start_ens+$WBPofs[0]+4,0) # system config (transducer orientation) |
|
1066 || die("$WBPcfn: $!"); |
|
1067 sysread(WBPF,$buf,1) == 1 || die("$WBPcfn: $!"); |
|
1068 $B1 = unpack('C',$buf); |
|
1069 $B1 |= 0x80 if ($dta->{ENSEMBLE}[$ens]->{XDUCER_FACING_UP}); |
|
1070 $B1 &= 0x7F if ($dta->{ENSEMBLE}[$ens]->{XDUCER_FACING_DOWN}); |
|
1071 $buf = pack('C',$B1); |
|
1072 sysseek(WBPF,$start_ens+$WBPofs[0]+4,0) |
|
1073 || die("$WBPcfn: $!"); |
|
1074 syswrite(WBPF,$buf,1) == 1 || die("$WBPcfn: $!"); |
|
1075 |
|
1076 sysseek(WBPF,$start_ens+$WBPofs[0]+25,0) || die("$WBPcfn: $!"); # EX / coord-transformation |
1055 sysread(WBPF,$buf,1) == 1 || die("$WBPcfn: $!"); |
1077 sysread(WBPF,$buf,1) == 1 || die("$WBPcfn: $!"); |
1056 my($EX) = unpack('C',$buf); |
1078 my($EX) = unpack('C',$buf); |
1057 if ($dta->{BEAM_COORDINATES}) { |
1079 if ($dta->{BEAM_COORDINATES}) { |
1058 $EX &= ~0x18; |
1080 $EX &= ~0x18; |
1059 } elsif ($dta->{EARTH_COORDINATES}) { |
1081 } elsif ($dta->{EARTH_COORDINATES}) { |
1071 |
1093 |
1072 sysseek(WBPF,$start_ens+$WBPofs[1]+14,0) || die("$WBPcfn: $!"); # jump to SPEED_OF_SOUND |
1094 sysseek(WBPF,$start_ens+$WBPofs[1]+14,0) || die("$WBPcfn: $!"); # jump to SPEED_OF_SOUND |
1073 |
1095 |
1074 $dta->{ENSEMBLE}[$ens]->{XDUCER_DEPTH} = round($dta->{ENSEMBLE}[$ens]->{XDUCER_DEPTH}*10); |
1096 $dta->{ENSEMBLE}[$ens]->{XDUCER_DEPTH} = round($dta->{ENSEMBLE}[$ens]->{XDUCER_DEPTH}*10); |
1075 |
1097 |
1076 #----------------------------- |
1098 #--------------------------------- |
1077 # IMP allows for missing value |
1099 # NB: IMP allows for missing value |
1078 #----------------------------- |
1100 #--------------------------------- |
1079 |
1101 |
1080 $dta->{ENSEMBLE}[$ens]->{HEADING} = defined($dta->{ENSEMBLE}[$ens]->{HEADING}) |
1102 $dta->{ENSEMBLE}[$ens]->{HEADING} = defined($dta->{ENSEMBLE}[$ens]->{HEADING}) |
1081 ? round($dta->{ENSEMBLE}[$ens]->{HEADING}*100) |
1103 ? round($dta->{ENSEMBLE}[$ens]->{HEADING}*100) |
1082 : 0xF000; |
1104 : 0xF000; |
1083 $dta->{ENSEMBLE}[$ens]->{PITCH} = defined($dta->{ENSEMBLE}[$ens]->{PITCH}) |
1105 $dta->{ENSEMBLE}[$ens]->{PITCH} = defined($dta->{ENSEMBLE}[$ens]->{PITCH}) |
1102 |
1124 |
1103 #-------------------- |
1125 #-------------------- |
1104 # Velocity Data |
1126 # Velocity Data |
1105 #-------------------- |
1127 #-------------------- |
1106 |
1128 |
1107 sysseek(WBPF,$start_ens+$WBPofs[2]+2,0) || die("$WBRcfn: $!"); # skip velocity data id (assume it is correct) |
1129 sysseek(WBPF,$start_ens+$WBPofs[2]+2,0) || die("$WBPcfn: $!"); # skip velocity data id (assume it is correct) |
1108 for ($bin=0; $bin<$nbins; $bin++) { |
1130 for ($bin=0; $bin<$nbins; $bin++) { |
1109 for ($beam=0; $beam<4; $beam++) { |
1131 for ($beam=0; $beam<4; $beam++) { |
1110 $dta->{ENSEMBLE}[$ens]->{VELOCITY}[$bin][$beam] = defined($dta->{ENSEMBLE}[$ens]->{VELOCITY}[$bin][$beam]) |
1132 $dta->{ENSEMBLE}[$ens]->{VELOCITY}[$bin][$beam] = defined($dta->{ENSEMBLE}[$ens]->{VELOCITY}[$bin][$beam]) |
1111 ? round($dta->{ENSEMBLE}[$ens]->{VELOCITY}[$bin][$beam]*1000) |
1133 ? round($dta->{ENSEMBLE}[$ens]->{VELOCITY}[$bin][$beam]*1000) |
1112 : 0x8000; |
1134 : 0x8000; |
1118 |
1140 |
1119 #-------------------- |
1141 #-------------------- |
1120 # Correlation Data |
1142 # Correlation Data |
1121 #-------------------- |
1143 #-------------------- |
1122 |
1144 |
1123 sysseek(WBPF,$start_ens+$WBPofs[3]+2,0) || die("$WBRcfn: $!"); |
1145 sysseek(WBPF,$start_ens+$WBPofs[3]+2,0) || die("$WBPcfn: $!"); |
1124 for ($bin=0; $bin<$nbins; $bin++) { |
1146 for ($bin=0; $bin<$nbins; $bin++) { |
1125 for ($beam=0; $beam<4; $beam++) { |
1147 for ($beam=0; $beam<4; $beam++) { |
1126 $buf = pack('C',$dta->{ENSEMBLE}[$ens]->{CORRELATION}[$bin][$beam]); |
1148 $buf = pack('C',$dta->{ENSEMBLE}[$ens]->{CORRELATION}[$bin][$beam]); |
1127 my($nw) = syswrite(WBPF,$buf,1); |
1149 my($nw) = syswrite(WBPF,$buf,1); |
1128 $nw == 1 || die("$WBPcfn: $nw bytes written ($!)"); |
1150 $nw == 1 || die("$WBPcfn: $nw bytes written ($!)"); |
1131 |
1153 |
1132 #-------------------- |
1154 #-------------------- |
1133 # Echo Intensity Data |
1155 # Echo Intensity Data |
1134 #-------------------- |
1156 #-------------------- |
1135 |
1157 |
1136 sysseek(WBPF,$start_ens+$WBPofs[4]+2,0) || die("$WBRcfn: $!"); |
1158 sysseek(WBPF,$start_ens+$WBPofs[4]+2,0) || die("$WBPcfn: $!"); |
1137 |
1159 |
1138 for ($bin=0; $bin<$nbins; $bin++) { |
1160 for ($bin=0; $bin<$nbins; $bin++) { |
1139 for ($beam=0; $beam<4; $beam++) { |
1161 for ($beam=0; $beam<4; $beam++) { |
1140 $buf = pack('C',$dta->{ENSEMBLE}[$ens]->{ECHO_AMPLITUDE}[$bin][$beam]); |
1162 $buf = pack('C',$dta->{ENSEMBLE}[$ens]->{ECHO_AMPLITUDE}[$bin][$beam]); |
1141 my($nw) = syswrite(WBPF,$buf,1); |
1163 my($nw) = syswrite(WBPF,$buf,1); |
1145 |
1167 |
1146 #-------------------- |
1168 #-------------------- |
1147 # Percent Good Data |
1169 # Percent Good Data |
1148 #-------------------- |
1170 #-------------------- |
1149 |
1171 |
1150 sysseek(WBPF,$start_ens+$WBPofs[5]+2,0) || die("$WBRcfn: $!"); |
1172 sysseek(WBPF,$start_ens+$WBPofs[5]+2,0) || die("$WBPcfn: $!"); |
1151 |
1173 |
1152 for ($i=0,$bin=0; $bin<$nbins; $bin++) { |
1174 for ($i=0,$bin=0; $bin<$nbins; $bin++) { |
1153 for ($beam=0; $beam<4; $beam++,$i++) { |
1175 for ($beam=0; $beam<4; $beam++,$i++) { |
1154 $buf = pack('C',$dta->{ENSEMBLE}[$ens]->{PERCENT_GOOD}[$bin][$beam]); |
1176 $buf = pack('C',$dta->{ENSEMBLE}[$ens]->{PERCENT_GOOD}[$bin][$beam]); |
1155 my($nw) = syswrite(WBPF,$buf,1); |
1177 my($nw) = syswrite(WBPF,$buf,1); |
1162 # - scan through remaining data types |
1184 # - scan through remaining data types |
1163 #----------------------------------------- |
1185 #----------------------------------------- |
1164 |
1186 |
1165 my($nxt); |
1187 my($nxt); |
1166 for ($nxt=6; $nxt<$ndt; $nxt++) { # scan until BT found |
1188 for ($nxt=6; $nxt<$ndt; $nxt++) { # scan until BT found |
1167 sysseek(WBPF,$start_ens+$WBPofs[$nxt],0) || die("$WBRcfn: $!"); |
1189 sysseek(WBPF,$start_ens+$WBPofs[$nxt],0) || die("$WBPcfn: $!"); |
1168 sysread(WBPF,$buf,2) == 2 || die("$WBRcfn: $!"); |
1190 sysread(WBPF,$buf,2) == 2 || die("$WBPcfn: $!"); |
1169 $id = unpack('v',$buf); |
1191 $id = unpack('v',$buf); |
1170 last if ($id == 0x0600); |
1192 last if ($id == 0x0600); |
1171 } |
1193 } |
1172 |
1194 |
1173 unless ($nxt == $ndt) { # BT found |
1195 unless ($nxt == $ndt) { # BT found |
1174 sysseek(WBPF,14,1) || die("$WBRcfn: $!"); # skip BT config |
1196 sysseek(WBPF,14,1) || die("$WBPcfn: $!"); # skip BT config |
1175 # NOT YET IMPLEMENTED |
1197 for ($beam=0; $beam<4; $beam++) { # BT range low bytes (2 per beam) |
1176 } |
1198 $buf = pack('v',round($dta->{ENSEMBLE}[$ens]->{BT_RANGE}[$beam] * 100) & 0xFFFF); |
1177 |
1199 my($nw) = syswrite(WBPF,$buf,2); |
|
1200 $nw == 2 || die("$WBPcfn: $nw bytes written ($!)"); |
|
1201 } |
|
1202 |
|
1203 for ($beam=0; $beam<4; $beam++) { # BT velocities |
|
1204 $buf = pack('v',unpack('S',pack('s', |
|
1205 defined($dta->{ENSEMBLE}[$ens]->{BT_VELOCITY}[$beam]) |
|
1206 ? round($dta->{ENSEMBLE}[$ens]->{BT_VELOCITY}[$beam]*1000) |
|
1207 : 0x8000))); |
|
1208 my($nw) = syswrite(WBPF,$buf,2); |
|
1209 $nw == 2 || die("$WBPcfn: $nw bytes written ($!)"); |
|
1210 } |
|
1211 |
|
1212 for ($beam=0; $beam<4; $beam++) { # BT correlation |
|
1213 $buf = pack('C',$dta->{ENSEMBLE}[$ens]->{BT_CORRELATION}[$beam]); |
|
1214 my($nw) = syswrite(WBPF,$buf,1); |
|
1215 $nw == 1 || die("$WBPcfn: $nw bytes written ($!)"); |
|
1216 } |
|
1217 |
|
1218 for ($beam=0; $beam<4; $beam++) { # BT evaluation amp of matching filter |
|
1219 $buf = pack('C',$dta->{ENSEMBLE}[$ens]->{BT_EVAL_AMPLITUDE}[$beam]); |
|
1220 my($nw) = syswrite(WBPF,$buf,1); |
|
1221 $nw == 1 || die("$WBPcfn: $nw bytes written ($!)"); |
|
1222 } |
|
1223 |
|
1224 for ($beam=0; $beam<4; $beam++) { # BT percent good |
|
1225 $buf = pack('C',$dta->{ENSEMBLE}[$ens]->{BT_PERCENT_GOOD}[$beam]); |
|
1226 my($nw) = syswrite(WBPF,$buf,1); |
|
1227 $nw == 1 || die("$WBPcfn: $nw bytes written ($!)"); |
|
1228 } |
|
1229 |
|
1230 sysseek(WBPF,33,1) || die("$WBPcfn: $!"); # BT range high bytes (1 per beam) |
|
1231 for ($beam=0; $beam<4; $beam++) { |
|
1232 $buf = pack('C',(round($dta->{ENSEMBLE}[$ens]->{BT_RANGE}[$beam]*100) & 0xFF0000) >> 16); |
|
1233 my($nw) = syswrite(WBPF,$buf,1); |
|
1234 $nw == 1 || die("$WBPcfn: $nw bytes written ($!)"); |
|
1235 } |
|
1236 |
|
1237 } # if BT found |
1178 |
1238 |
1179 #---------------- |
1239 #---------------- |
1180 # Update Checksum |
1240 # Update Checksum |
1181 #---------------- |
1241 #---------------- |
1182 |
1242 |