#!/usr/bin/perl
#
# 差分で修正
# Nowral
# 99/9/6
#
use Time::Local;

# 基準ファイル選択
($orgf, $relf) = $ARGV[0] =~ /^r/ ? ($ARGV[0], $ARGV[1]) : ($ARGV[1], $ARGV[0]);
$as = 1;
while($as == 1) {
  ($orgfn) = ($orgf =~ /([^:]*)$/);
  ($relfn) = ($relf =~ /([^:]*)$/);
  $as = MacPerl::Answer("基準ファイル: $orgfn\n修正ファイル: $relfn",
   "OK", "Exchange", "Cancel") || exit;
  if($as==1) { ($orgf, $relf) = ($relf, $orgf); }
}
print "# 基準ファイル: $orgfn\n";
print "# 修正ファイル: $relfn\n";

# 原点計算
undef($zn, @t, @x, @y, @h, $n, $sx, $sy, $sh);
open(IN, $orgf);
while(<IN>){
  if(/^T\t/) {
    @ed = split("\t");
    if($ed[9] ne "UTM") { die "Not UTM!\n"; }
    $ed[7] =~ /^(\d+)/;
    if(! defined $zn) { $zn = $1; }
    if($1 != $zn) { die "Different Zone!"; } 

    ++$n;
    $ed[4] =~ /(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/;
    push(@t, timelocal($6, $5, $4, $2, $1-1, $3-1900)); # 時刻
    push(@x, $ed[5]); # 緯度
    $sx += $ed[5];
    push(@y, $ed[6]); # 経度
    $sy += $ed[6];
    push(@h, $ed[8]); # 高度
    $sh += $ed[8];
  }
}
($xav, $yav, $hav) = ($sx/$n, $sy/$n, $sh/$n);
printf "# 基準ファイル開始時刻: %s\n", &formd($t[0]);
printf "# 基準ファイル終了時刻: %s\n", &formd($t[$#t]);
printf "# 基準ファイルデータ数: %d\n", $n;

# 補正と出力
$newargv = $relf . ".ad";
open(OUT, ">$newargv");
&MacPerl'SetFileInfo('GPSy', 'TEXT', $newargv);

# <どこからどこまでのデータを補正したか?
undef($i, $n);
open(IN, $relf);
# ループ
while(<IN>) {
  if(/^T\t/) {
    @ed = split("\t");
    if($ed[9] ne "UTM") { die "Not UTM!\n"; }
    $ed[7] =~ /^(\d+)/;
    if($1 != $zn) { die "Different Zone!"; } 

    $ed[4] =~ /(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/;
    $t1 = timelocal($6, $5, $4, $2, $1-1, $3-1900);
    if($t[$i] > $t1) { next; }
    while($t[$i+1]<=$t1 && $i<$#t) { ++$i; }
    if($i >= $#t) { last; }

    ++$n;
    $u = ($t[$i+1]-$t1) / ($t[$i+1]-$t[$i]);
    $ed[5] = sprintf("%7.0f", $ed[5] + $xav - $u*$x[$i] - (1-$u)*$x[$i+1]);
    $ed[6] = sprintf("%7.0f", $ed[6] + $yav - $u*$y[$i] - (1-$u)*$y[$i+1]);
    $ed[8] = sprintf( "%.1f", $ed[8] + $hav - $u*$h[$i] - (1-$u)*$h[$i+1]);

    $_ = join("\t", @ed);
  }
  print OUT;
}
close(IN);
close(OUT);

print "\n";
printf "# 修正データ数: %d\n", $n;

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



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