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