#!/usr/bin/perl
#
# NMEAログをGPSy拡張フォーマットに
# Nowral
# 99/9/17
#
use Time::Local;

@files = @ARGV;
foreach $oldargv (@files) {

$newargv = $oldargv . " Track";
open(OUT, ">$newargv");
&MacPerl'SetFileInfo('GPSy', 'TEXT', $newargv);

print OUT "GPSy3 Track     (version 3.21)\tNUMBER\tNAME\tCOMMENT\tDATE\tLAT/NORTHING\tLON/EASTING\tZONE\tALT\tCOORD\tDATUM\tICON\tPROX\n";

$lc = 0;
open(IN, "<$oldargv");
while (<IN>) { /\$GP(GGA|RMC),/ && ++$lc; }
print OUT "#\tRecords:\t$lc\n";

($t1, $l1) = undef;
($mday, $mon, $year) = undef;
$lc = 0;
open(IN, "<$oldargv");
while (<IN>) {
  chomp;
  @ed = split(/,/);
  if($ed[1] ne $t1) { $alt = undef; }

  if($ed[0] eq "\$GPRMC") { # RMC - GPS及びTransitでの最小推奨定義データ
    if($ed[2] ne "A") { next; } # データ有効 = A, データ無効 = V
    $lat = &n2gdms($ed[3]);
    $lon = &n2gdms($ed[5]);
    $ed[9] =~ /(\d\d)(\d\d)(\d\d)/;
    ($mday, $mon, $year) = ($1, $2, $3+($3>80 ? 1900 : 2000)); # Y2K ?
  }
  elsif(! defined $mday) { next; }
  elsif($ed[0] eq "\$GPGGA") { # GGA - GPS測位データ
    if($ed[6] == 0) { next; } # 位置品質   : 0 = 無効
    $lat = &n2gdms($ed[2]);
    $lon = &n2gdms($ed[4]);
    $alt = sprintf("%.01f", $ed[9]+$ed[11]); # 標高+ジオイド高=楕円体高
  }
  else{ next; }

  if($t1 ne $ed[1]) {
    ++$lc;
    print OUT $l1;
  }
  ($hours, $min, $sec) = ($t1 =~ /(\d\d)(\d\d)(\d\d)/);
  $t1 = $ed[1];
  $l1 = sprintf( "T\t1\tTRACK\t\t%s\t%s\t%s\t-\t%s\tDMS\t<NO TRANSLATION>\t0\t0.00\n",
    &formd(timelocal($sec, $min, $hours, $mday, $mon-1, $year) + 32400), # 日本時間
    $lat, $lon, $alt );
}
print OUT $l1;

close(IN);
close(OUT);

print "#\tRecords:\t$lc\n";
}

&MacPerl'Quit(2);
die "The Unhappy End";



sub n2gdms {
  my($sf) = @_;
  my($d, $m, $s) = ($sf =~ /(\d+)(\d\d)(\.\d+)/);
  $sf = int($s*600 + 0.5);
  $s  = int($sf/10);
  $sf %= 10;
  sprintf("%d。%02d\'%02d\.%d\"", $d, $m, $s, $sf);
}

sub formd { # 日付、時刻の表示形式
  my($t) = @_;
  my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t);
  sprintf("%02d/%02d/%04d %02d:%02d:%02d",$mon+1,$mday,$year+1900,$hour,$min,$sec);
}