#!/bin/env perl
#
##  Copyright (c) 1995-2005 University Corporation for Atmospheric Research
## All rights reserved
#
my $pkgdoc = <<'EOD';
#/**----------------------------------------------------------------------    
# @file       dump_opnGps.pl
# ASCII dump of one opnGps file (high rate open loop data file)
# 
# @author     Doug Hunt
# @since      4/11/2005
# @version    $URL: svn://ursa.cosmic.ucar.edu/branches/cdaac_3.1/src/BJutils/dump_opnGps.pl $ $Id: dump_opnGps.pl 12107 2009-12-14 17:37:07Z cosmicops $
# @cdaacTask
# @usage      dump_opnGps.pl opnGps_file [--prn=#] [--[no]onesec]
# @           If --onesec is specified (default = --noonesec) then only print one second header
# @           do not print high rate data.
# @           If --prn is specified, dump only data from this PRN.  Otherwise dump all data.
# -----------------------------------------------------------------------*/
EOD

$|++;

use lib qw (. /ops/tools/lib);
use strict;
use warnings;
use Getopt::Long;

if (@ARGV < 1) {
  print $pkgdoc;
  exit -1;
}

my $infile  = shift;

# Handle command-line options
my $userprn = 0;
my $onesec  = 0;
GetOptions (
	    "prn=s"     => \$userprn,  # Only dump data from this PRN
	    "onesec!"   => \$onesec,   # Only dump one-second portion of data
	    ) || die "Cannot parse command line options!";

# Time stamp on input file
my $inpath = $infile;

open (IN, $inpath) || die "Cannot read $inpath";

my $offset = 0;
seek (IN, -32*6, 2);  # seek past trailer block and offsets block
read (IN, my $idx = '', 4*32);
my @offsets = unpack ("l*", $idx);

read (IN, my $trailer = '', 2*32);
my ($version, $hrFormat, $oneSecFormat) = unpack ("Ca31a32", $trailer);

$hrFormat =~ s/\0//g;     # get rid of trailing nulls
$oneSecFormat =~ s/\0//g;

# Find out the length of the high rate records from the
# format string packed in the trailer.
my $hrlen = length (pack ($hrFormat, (0) x 100)); # 100 is just an arbitrarily large number

# Find out the length of the header records from the
# format string packed in the trailer.
my $hdrlen = length (pack ($oneSecFormat, (0) x 100)); # 100 is just an arbitrarily large number

if ($userprn) {
  $offset = $offsets[$userprn-1];
}

if ($offset < 0) {
  print "No data in $infile for $userprn\n";
  exit;
}

seek (IN, $offset, 0); # find start of PRN section.

if ($onesec) {
  printf "%2s %10s %12s %12s %8s %7s %8s %7s\n", qw(prn time carange p2range datalen ant trkstatus flystatus);
} else {
  printf "%3s %-14s %7s %5s %9s %9s %15s %15s %9s %5s %5s %9s %-10s %9s %-10s\n",
    qw(prn time datalen ant trkstatus flystatus carange l1 l2 snr1 snr2 ca_model dfaz p2_model dfaz2);
}

while (1) {
  my $bytes = read (IN, my $hdr = '', $hdrlen);
  last unless ($bytes == $hdrlen);
  my ($rate, $prn, $th, $carange, $datalen, $ant, $trkstatus, $flystatus, $p2range) = unpack ($oneSecFormat, $hdr);
  last unless ($prn > 0 and $prn < 33);
  last if ($userprn && ($prn != $userprn));
  if ($onesec) {
    $p2range = -999 unless (defined($p2range));
    printf "%2d %10d %12.3f %12.3f   len%03d   ant%02d    trk%02d   fly%02d\n", $prn, $th, $carange, $p2range, $datalen, $ant, $trkstatus, $flystatus;
  }

  for (my $i=0;$i<$rate;$i++) {
    read (IN, my $rec = '', $hrlen);
    my ($tdel, $l1, $l2, $snr1, $snr2, $ca_model, $dfaz, $p2_model, $dfaz2) = unpack ($hrFormat, $rec);
    $ca_model = -999 unless (defined($ca_model));
    $dfaz     = -999 unless (defined($dfaz));
    $p2_model = -999 unless (defined($p2_model));
    $dfaz2    = -999 unless (defined($dfaz2));
    if (!$onesec) {
      printf "%3d %14.4f  len%03d ant%02d     trk%02d     fly%02d %15.3f %15.3f %9.3f %5d %5d %9.3f %10.5f %9.3f %10.5f\n",
        $prn, $th + $tdel, $datalen, $ant, $trkstatus, $flystatus, $carange, $l1, $l2, 
          $snr1, $snr2, $ca_model, $dfaz, $p2_model, $dfaz2;
    }
  }
}

close IN;

