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 |