#!/usr/bin/perl
#
# トラックログの差を求める
# Nowral
# 99/9/13
#
use Time::Local;
($fa, $fb) = sort @ARGV;

# 読み込み <毎秒で補足
($t0, $x0, $y0, $h0, $na0) = undef;
open(IN, $fa);
while(<IN>){
  if(/^T\t/) {
    ++$na0;
    ($t1, $x1, $y1, $h1) = &gdec($_);
    if(! defined $t0) { ($t0, $ta0) = ($t1-1, $t1); }
    ($dt, $dx, $dy, $dh) = ($t1-$t0, $x1-$x0, $y1-$y0, $h1-$h0);
    for(1..$dt) {
      $u = $_ / $dt;
      push(@xa, $x0+$u*$dx);
      push(@ya, $y0+$u*$dy);
      push(@ha, $h0+$u*$dh);
    }
    ($t0, $x0, $y0, $h0) = ($t1, $x1, $y1, $h1);
  }
}
$na = $t1 - $ta0;

($t0, $x0, $y0, $h0, $nb0) = undef;
open(IN, $fb);
while(<IN>){
  if(/^T\t/) {
    ++$nb0;
    ($t1, $x1, $y1, $h1) = &gdec($_);
    if(! defined $t0) { ($t0, $tb0) = ($t1-1, $t1); }
    ($dt, $dx, $dy, $dh) = ($t1-$t0, $x1-$x0, $y1-$y0, $h1-$h0);
    for(1..$dt) {
      $u = $_ / $dt;
      push(@xb, $x0+$u*$dx);
      push(@yb, $y0+$u*$dy);
      push(@hb, $h0+$u*$dh);
    }
    ($t0, $x0, $y0, $h0) = ($t1, $x1, $y1, $h1);
  }
}
$nb = $t1 - $tb0;
close(IN);

if($na>3*$na0 || $nb>3*$nb0) { die "Time interval is too large!\n"; }

# すり合わせ
$newargv = "match.log";
open(OUT, ">$newargv");
&MacPerl'SetFileInfo('ttxt', 'TEXT', $newargv);
$fh = select(OUT);

# A: slide, B: fixed
# fig.1
#    0            $na
# A: +-------------+  ->
#          0       :        $nb
# B:       +-------+---------+
#    -     0       :
#    +-$ba-+       :
#          0       +
#          +->$ib->+
#         $oh     $ot
#
# fig.2
#                0            $na
# A:             +-------------+  ->
#          0     :          $nb
# B:       +-----+-----------+
#          0     +           :
#          +-$ba-+           :
#               $ba          +
#                +->$ib->->->+
#               $oh         $ot
#
print "dt\ts2av\tno\tds2av\n";
($s1, $s1m, $s2m, $s3m) = undef;
foreach $ba (-$na..$nb) {
  $s2 = 0;
  $oh = 0>$ba ? 0 : $ba;
  $ot = $ba+$na<$nb ? $ba+$na : $nb;
  foreach $ib ($oh..$ot) {
    $s2 += ($xa[$ib-$ba]-$xb[$ib])**2 + ($ya[$ib-$ba]-$yb[$ib])**2;
  }
  $no = $ot - $oh + 1;
  $s2 /= $no;

  if($s3m == -1) { $s3m = $s2; }
  if( (! defined $s2m) || ($s2m > $s2) ) {
    ($s1m, $s2m, $s3m, $bam) = ($s1, $s2, -1, $ba); 
  }
  print join("\t", $ba-$ta0+$tb0, $s2, $no, $s2-$s1), "\n";
  $s1 = $s2;
}
#if($s3m == -1) { $s3m = $s2; }
$ba = $bam;

# 出力
$newargv = "match.log2";
open(OUT, ">$newargv");
&MacPerl'SetFileInfo('ttxt', 'TEXT', $newargv);

print "ib\tlata\tlona\tlatb\tlonb\n";
$oh = 0>$ba ? 0 : $ba;
$ot = $ba+$na<$nb ? $ba+$na : $nb;
foreach $ib ($oh..$ot) {
#  print join( "\t", (&formd($ta0+$ib-$ba), &deg2dms($xa[$ib-$ba]), &deg2dms($ya[$ib-$ba])
#    , &formd($tb0+$ib), &deg2dms($xb[$ib]), &deg2dms($yb[$ib])) ), "\n";
    print join("\t", ($ib, $xa[$ib-$ba], $ya[$ib-$ba], $xb[$ib], $yb[$ib])), "\n";
}
close(OUT);

# 集計
select($fh);

print "\n";
printf "# ログA         : %s\n", (split(/:/, $fa))[-1];
printf "# ログA 開始時刻: %s\n", &formd($ta0);
printf "# ログA 終了時刻: %s\n", &formd($ta0+$na);
printf "# ログA データ数: %d (%d)\n", $na+1, $na0;

print "\n";
printf "# ログB         : %s\n", (split(/:/, $fb))[-1];
printf "# ログB 開始時刻: %s\n", &formd($tb0);
printf "# ログB 終了時刻: %s\n", &formd($tb0+$nb);
printf "# ログB データ数: %d (%d)\n", $nb+1, $nb0;

print "\n";
$dt = $ba + $tb0 - $ta0 + ($s1m-$s3m) / ($s1m+$s3m-2*$s2m) / 2;
print join("\n",($ba+$tb0-$ta0,$s1m,$s2m,$s3m)),"\n";
if($dt<0) { printf "ログAはログBより %.1f 秒進んでいます。\n", -$dt; }
else      { printf "ログAはログBより %.1f 秒遅れています。\n",  $dt; }

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



sub gdec {
  my($l1) = @_;
  my($date, $latd, $lond);
  my(@ed) = split(/\t/, $l1);
  if($ed[9] ne "DMS") { die "Not DMS !"; }
  $ed[4] =~ /(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/; # 時刻
  $date = timelocal($6, $5, $4, $2, $1-1, $3-1900);
  $ed[5] =~ /(\d+)。(\d+)'(\d+\.\d+)"/; # 緯度
  $latd = $1 + $2/60 +$3/3600;
  $ed[6] =~ /(\d+)。(\d+)'(\d+\.\d+)"/; # 経度
  $lond = $1 + $2/60 +$3/3600;
  ($date, $latd, $lond, $ed[8]);
}

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

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