#!/usr/bin/perl

use POSIX;
use XML::Parser;

$pi = 4 * atan2(1, 1);

sub handle_start {
	my ($expat, $element, @tags) = @_;
	my %tags = @tags;

	if ($element eq "trkpt") {
		$lat = $tags{'lat'};
		$lon = $tags{'lon'};
	} elsif ($element eq "ele") {
		$state = "ele";
	} elsif ($element eq "time") {
		$state = "time";
	} else {
		$state = "";
	}
}

sub handle_char {
	my ($expat, $string) = @_;

	$text{$state} .= $string;
}

sub handle_end {
	my ($expat, $element) = @_;

	if ($element eq "trkseg" || $element eq "trk") {
		$oldlat = $oldlon = "";
	} elsif ($element eq "trkpt") {
		if ($lat ne "" && $lon ne "" && $oldlat ne "" && $oldlon ne "") {
			if ($lat ne $oldlat || $lon ne $oldlon) {
				print "$oldlat,$oldlon $lat,$lon ";

				$rat = cos(($lat + $oldlat) / 2 * $pi / 180);
				$ang = atan2($lat - $oldlat, ($lon - $oldlon) * $rat);

				printf("8:%d\n", ($ang + $pi) * 256 / (2 * $pi));
			}
		}

		$oldlat = $lat;
		$oldlon = $lon;
		%text = ();
	}
}

if ($#ARGV < 0) {
	$parser = new XML::Parser(Handlers => { Start => \&handle_start,
						End   => \&handle_end,
						Char  => \&handle_char,
					      });

	$parser->parse(*STDIN);
} else {
	for $file (@ARGV) {
		$oldwhen = 0;

		$parser = new XML::Parser(Handlers => { Start => \&handle_start,
							End   => \&handle_end,
							Char  => \&handle_char,
						      });

		$parser->parsefile($file);
	}
}