1 #====================================================================== |
1 #====================================================================== |
2 # R D I _ B B _ R E A D . 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 Jun 4 09:43:15 2008 |
4 # dlm: Sun Aug 15 16:35:54 2010 |
5 # (c) 2003 A.M. Thurnherr |
5 # (c) 2003 A.M. Thurnherr |
6 # uE-Info: 44 25 NIL 0 0 72 0 2 4 NIL ofnI |
6 # uE-Info: 47 72 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: |
40 # Aug 31: 2006: - added DAYNO |
40 # Aug 31: 2006: - added DAYNO |
41 # Aug 1, 2007: - BUG: typo in monthLength() |
41 # Aug 1, 2007: - BUG: typo in monthLength() |
42 # Sep 18, 2007: - modified readHeader() readDta() WBRhdr() WBRens() to |
42 # Sep 18, 2007: - modified readHeader() readDta() WBRhdr() WBRens() to |
43 # conserve memory (no large arrays as retvals) |
43 # conserve memory (no large arrays as retvals) |
44 # Jun 4, 2008: - BUG: BB150 code was not considered on Sep 18, 2007 |
44 # Jun 4, 2008: - BUG: BB150 code was not considered on Sep 18, 2007 |
|
45 # Aug 15, 2010: - downgraded "unexpected number of data types" from error to warning |
|
46 # - BUG: WBRcfn had not been set correctly |
|
47 # - modified to allow processing files without time info |
45 |
48 |
46 # FIRMWARE VERSIONS: |
49 # FIRMWARE VERSIONS: |
47 # It appears that different firmware versions generate different file |
50 # It appears that different firmware versions generate different file |
48 # structures. Currently (Sep 2005) these routines have been tested |
51 # structures. Currently (Sep 2005) these routines have been tested |
49 # with the following firmware versions (as reported by [listhdr]): |
52 # with the following firmware versions (as reported by [listhdr]): |
292 read(WBRF,$buf,6) == 6 || die("$WBRcfn: $!\n"); |
295 read(WBRF,$buf,6) == 6 || die("$WBRcfn: $!\n"); |
293 ($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES}) |
296 ($hid,$did,$dta->{ENSEMBLE_BYTES},$dummy,$dta->{NUMBER_OF_DATA_TYPES}) |
294 = unpack('CCvCC',$buf); |
297 = unpack('CCvCC',$buf); |
295 $hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0)); |
298 $hid == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Header",$hid,0)); |
296 $did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Data Source",$did,0)); |
299 $did == 0x7f || die(sprintf($FmtErr,$WBRcfn,"Data Source",$did,0)); |
297 die(sprintf("\n$WBRcfn: WARNING: unexpected number of data types (%d)\n", |
300 printf(STDERR "\n$WBRcfn: WARNING: unexpected number of data types (%d)\n", |
298 $dta->{NUMBER_OF_DATA_TYPES})) |
301 $dta->{NUMBER_OF_DATA_TYPES}) |
299 unless ($dta->{NUMBER_OF_DATA_TYPES} == 6 || |
302 unless ($dta->{NUMBER_OF_DATA_TYPES} == 6 || |
300 $dta->{NUMBER_OF_DATA_TYPES} == 7); |
303 $dta->{NUMBER_OF_DATA_TYPES} == 7); |
301 $dta->{BT_PRESENT} = ($dta->{NUMBER_OF_DATA_TYPES} == 7); |
304 $dta->{BT_PRESENT} = ($dta->{NUMBER_OF_DATA_TYPES} == 7); |
302 |
305 |
303 read(WBRF,$buf,2*$dta->{NUMBER_OF_DATA_TYPES}) |
306 read(WBRF,$buf,2*$dta->{NUMBER_OF_DATA_TYPES}) |
598 ${$E}[$ens]->{SECONDS}); |
601 ${$E}[$ens]->{SECONDS}); |
599 ${$E}[$ens]->{DAYNO} |
602 ${$E}[$ens]->{DAYNO} |
600 = &dayNo(${$E}[$ens]->{YEAR},${$E}[$ens]->{MONTH},${$E}[$ens]->{DAY}, |
603 = &dayNo(${$E}[$ens]->{YEAR},${$E}[$ens]->{MONTH},${$E}[$ens]->{DAY}, |
601 ${$E}[$ens]->{HOUR},${$E}[$ens]->{MINUTE},${$E}[$ens]->{SECONDS}); |
604 ${$E}[$ens]->{HOUR},${$E}[$ens]->{MINUTE},${$E}[$ens]->{SECONDS}); |
602 |
605 |
603 ${$E}[$ens]->{UNIX_TIME} |
606 # when analyzing an STA file from an OS75 SADCP (Poseidion), |
604 = timegm(0,${$E}[$ens]->{MINUTE}, |
607 # I noticed that there is no time information. This causes |
605 ${$E}[$ens]->{HOUR}, |
608 # timegm to bomb. |
606 ${$E}[$ens]->{DAY}, |
609 if (${$E}[$ens]->{MONTH} == 0) { # no time info |
607 ${$E}[$ens]->{MONTH}-1, # NB!!! |
610 ${$E}[$ens]->{UNIX_TIME} = 0; |
608 ${$E}[$ens]->{YEAR}) |
611 ${$E}[$ens]->{SECNO} = 0; |
609 + ${$E}[$ens]->{SECONDS}; |
612 } else { |
610 |
613 ${$E}[$ens]->{UNIX_TIME} |
611 $dayStart = timegm(0,0,0,${$E}[$ens]->{DAY}, |
614 = timegm(0,${$E}[$ens]->{MINUTE}, |
612 ${$E}[$ens]->{MONTH}-1, # NB!!! |
615 ${$E}[$ens]->{HOUR}, |
613 ${$E}[$ens]->{YEAR}) |
616 ${$E}[$ens]->{DAY}, |
614 unless defined($dayStart); |
617 ${$E}[$ens]->{MONTH}-1, # timegm jan==0!!! |
615 ${$E}[$ens]->{SECNO} = ${$E}[$ens]->{UNIX_TIME} - $dayStart; |
618 ${$E}[$ens]->{YEAR}) |
|
619 + ${$E}[$ens]->{SECONDS}; |
|
620 |
|
621 $dayStart = timegm(0,0,0,${$E}[$ens]->{DAY}, |
|
622 ${$E}[$ens]->{MONTH}-1, |
|
623 ${$E}[$ens]->{YEAR}) |
|
624 unless defined($dayStart); |
|
625 ${$E}[$ens]->{SECNO} = ${$E}[$ens]->{UNIX_TIME} - $dayStart; |
|
626 } |
616 |
627 |
617 seek(WBRF,$start_ens+$WBRofs[0]+4,0) # System Config / Fixed Leader |
628 seek(WBRF,$start_ens+$WBRofs[0]+4,0) # System Config / Fixed Leader |
618 || die("$WBRcfn: $!"); |
629 || die("$WBRcfn: $!"); |
619 |
630 |
620 read(WBRF,$buf,5) == 5 || die("$WBRcfn: $!\n"); |
631 read(WBRF,$buf,5) == 5 || die("$WBRcfn: $!\n"); |
772 } # ens loop |
783 } # ens loop |
773 } |
784 } |
774 |
785 |
775 sub readHeader(@) |
786 sub readHeader(@) |
776 { |
787 { |
777 my($WBRcfn,$dta) = @_; |
788 my($fn,$dta) = @_; |
|
789 $WBRcfn = $fn; |
778 open(WBRF,$WBRcfn) || die("$WBRcfn: $!\n"); |
790 open(WBRF,$WBRcfn) || die("$WBRcfn: $!\n"); |
779 WBRhdr($dta); |
791 WBRhdr($dta); |
780 } |
792 } |
781 |
793 |
782 sub readData(@) |
794 sub readData(@) |
783 { |
795 { |
784 my($WBRcfn,$dta) = @_; |
796 my($fn,$dta) = @_; |
|
797 $WBRcfn = $fn; |
785 open(WBRF,$WBRcfn) || die("$WBRcfn: $!\n"); |
798 open(WBRF,$WBRcfn) || die("$WBRcfn: $!\n"); |
786 WBRhdr($dta); |
799 WBRhdr($dta); |
787 WBRens($dta->{N_BINS},$dta->{ENSEMBLE_BYTES}, |
800 WBRens($dta->{N_BINS},$dta->{ENSEMBLE_BYTES}, |
788 $dta->{BT_PRESENT},$dta->{DATA_FORMAT}, |
801 $dta->{BT_PRESENT},$dta->{DATA_FORMAT}, |
789 \@{$dta->{ENSEMBLE}}); |
802 \@{$dta->{ENSEMBLE}}); |