#!/usr/bin/perl -w
#
# TrkDB-GPil.pdb -> GPSy Extended Format
# Nowral
# 01/10/1
#
# initialize
use Time::Local;
$t0 = timelocal(0,0,0,31,11,89); # 31-12-89 0:00
$t0 += 9 * 3600; # Japanese Standard Time
$ds = 180 / 2147483648; # degree / semicircle = 180 / 2^31
$h0 = unpack("f", pack("H8", "69045951")); # unknown altitude = 1.0e25

# file loop begin
foreach $oldargv (sort @ARGV) {
print "-"x70, "\n";
printf "%s\n", ( split(":", $oldargv) )[-1];
open(IN, $oldargv);

# pdb_header
read(IN, $_, 78);
($name,$attr,$ver,$cdt,$mdt,$bdt,$mnm,$aid,$sid,$typ,$crtr,$isd,$nrl,$nrd)
 = unpack("A32nnNNNNNNA4A4NNn", $_);
$name =~ s/\x00.*$//;
unless($typ eq "Trks" && $crtr eq "GPil") {
  print "Not GPilotS Track File!\n";
  next;
}

# pdb_rec_header
foreach $i (1 .. $nrd) {
  read(IN, $_, 8); #
  ($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);
  $name = unpack("A*", $_);# track name
  $name =~ s/\x00.*$//;
  read(IN, $_, 24);
  ($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
  $newargv = $name;
  $newargv =~ tr/:\\/\./; # file name
#  while(-e $newargv) { $newargv .= "~"; } # file doubled?
  open(OUT, ">$newargv") || die "Couldn't open $newargv\: $^E";
  MacPerl::SetFileInfo('GPSy', 'TEXT', $newargv);

# GPSy header
  print OUT "GPSy3 Track     (version 3.38r3)\tNUMBER\tNAME\tCOMMENT",
   "\tDATE\tLAT/NORTHING\tLON/EASTING\tZONE\tALT\tCOORD\tDATUM\tICON\tPROX\n";
  print OUT "#\tRecords:\t$num\n";

# body output
  $trn = 0; # track number
  foreach $j (1 .. $num) {
# decode position, time, altitude, new_track # Custom_Trk_Point_Type
    read(IN, $_, 18);
    ($b, $l, $t, $alt, $fnt) = unpack("NNNfCC", $_);
    $trn++ if $fnt;
    print OUT join("\t", (
     "T", $trn, " ", "", $t ? &formd($t+$t0) : "-",
     &deg2gdms($b*$ds), &deg2gdms($l*$ds), "-",
      sprintf("% .1f", $alt==$h0 ? 0 : $alt),
     "DMS", "WGS 84", "0", "0.00"
     ) ), "\n";
  }
# track loop end
  close(OUT);
}

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

#MacPerl::Quit(2);
die "The Unhappy End";



sub formd { # GPSy format of date
  my($t) = @_;
  my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t);
  return sprintf("%d/%d/%04d %d:%02d:%02d",
   $mon+1,$mday,$year+1900,$hour,$min,$sec);
}

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