#!/usr/bin/perl -w
#
# TrkDB-GPil.pdb -> Extended POT Format
# Nowral
# 01/10/13
# Modified by Y. Hashimoto
# 07/31/01
#
# initialize
use Time::Local;
use File::Basename;
$t0 = timelocal(0,0,0,31,11,89); # 31-12-89 0:00
$ds = 180 / 2147483648; # degree / semicircle = 180 / 2^31
$h0 = unpack("N", pack("H8", "69045951")); # unknown altitude = 1.0e25
$cwd = (fileparse($0, ''))[1];

# file loop begin
foreach $oldargv (sort @ARGV) {
print "-"x70, "\n", (fileparse($oldargv, ''))[0], "\n";
open(IN, $oldargv);
binmode IN;

# pdb_header
read(IN, $_, 32);
/^([^\x00]+)/;
$name = $1;
read(IN, $_, 46);
my($attr,$ver,$cdt,$mdt,$bdt,$mnm,$aid,$sid,$typ,$crtr,$isd,$nrl,$nrd)
 = unpack("nnNNNNNNA4A4NNn", $_);
unless($typ eq "Trks" && $crtr eq "GPil") {
  print "Not GPilotS Track File!\n";
  next;
}

# pdb_rec_header
foreach $i (1 .. $nrd) {
  read(IN, $_, 8); #
  my($ofs, $attr, $uid) = unpack("NHH3", $_);
  push(@strts, $ofs);
}
push(@strts, -s $oldargv);

# track loop begin
foreach $i (1 .. $nrd) {
  seek(IN, $strts[$i-1], 0);

  read(IN, $_, 8);
# internal track header # Custom_Trk_Hdr_Type
  read(IN, $_, 256); # track name
  /^([^\x00]+)/;
  $name = $1;
  read(IN, $_, 24);
  my($dspl, $clr, $lfid, $num, $latmin, $latmax, $lonmin, $lonmax)
   = unpack("ccnnNNNNH4", $_);
  $num = ($strts[$i]-$strts[$i-1]-288)/18 unless $num;
  printf "%d) [%04X] ---> \"%s\" (%d)\n", $i, $strts[$i-1], $name, $num;

# output file
  $name =~ tr/:\\\//\./; # file name
  $newargv = $cwd . $name . ".pot";
  open(OUT, ">$newargv") || die "Couldn't open $newargv\: $^E";
  binmode OUT;
  print OUT "Dat=WGS84/WGS84/0/0/0/0/0\x0d\x0a"; # POT header

# body output
  $trn = 0; # track number
  foreach my $j (1 .. $num) {
    read(IN, $_, 18);
    my($b, $l, $t, $alt, $fnt) = unpack("NNNNCC", $_);
    $alt = ($alt==$h0) ? 0 : unpack("f", pack("L", $alt));
    $trn++ if $fnt;
    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
     = localtime($t+$t0);
    $mon = (qw(JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC))[$mon];
    print OUT "ORD=POI/tex=";
    print OUT "/ido=", &deg2pdms($b*$ds), "/kei=", &deg2pdms($l*$ds);
    printf OUT "/altitude=%05d", $alt;
    printf OUT "/pdate=%02d-%s-%02d", $mday, $mon, ($year+1900)%100;
    printf OUT "/ptime=%02d:%02d:%02d", $hour, $min, $sec;
    print OUT "/col=14/lev=8/adr=$trn\x0d\x0a";
  }

# track loop end
  close(OUT);
}

# file loop end
close(IN);
}
print "-"x70, "\n";

#die "The Unhappy End";
exit(0);


sub deg2pdms { # POT format of position
  my($d) = @_;
  my($sgn, $m, $s, $sf);
  $d -=360 if $d>180; # longitude
  if($d<0) {
    $sgn = -1;
    $d *= -1;
  }
  else{ $sgn = +1; }
  $sf = int($d*36000 + 0.5);
  $s = int($sf/10) % 60;
  $m = int($sf/600) % 60;
  $d = int($sf/36000);
  $sf %= 10;
  sprintf("%04d\'%02d\'%02d\'%d", $d*$sgn, $m, $s, $sf);
}