#!/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=", °2pdms($b*$ds), "/kei=", °2pdms($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);
}