1
0
Fork 0

Traffic tools. Conversion scripts to convert between xml and plain text format. Initial version of conf2xml.pl by me. Updated and modified by Mike Nieber. xml2conf.pl by Mike Nieber.

This commit is contained in:
Durk Talsma 2011-01-03 09:59:48 +01:00
parent 4428b7358c
commit dcfa2632fb
5 changed files with 214 additions and 1 deletions

View file

@ -837,6 +837,7 @@ AC_CONFIG_FILES([ \
scripts/debug/Makefile \
scripts/perl/Makefile \
scripts/perl/examples/Makefile \
scripts/perl/traffic/Makefile \
scripts/python/Makefile \
src/Makefile \
src/Include/Makefile \

View file

@ -1 +1,2 @@
SUBDIRS = examples
SUBDIRS = examples \
traffic

View file

@ -0,0 +1,3 @@
EXTRA_DIST = \
conf2xml.pl \
xml2conf.pl

View file

@ -0,0 +1,117 @@
#!/usr/bin/perl -w
sub parseTime {
# print "Parsing time @_\n";
#die;
my $timeStr = $_[0];
@timeArray = split(":", $timeStr);
# print STDERR "TimeArray: @timeArray\n";
return ($timeArray[0] + $timeArray[1]/60.0);
}
sub writeFlight {
print XMLFILE " <flight>\n";
print XMLFILE " <callsign>$_[0]</callsign>\n";
print XMLFILE " <required-aircraft>$_[1]</required-aircraft>\n";
print XMLFILE " <fltrules>$_[2]</fltrules>\n";
print XMLFILE " <departure>\n";
print XMLFILE " <port>$_[3]</port>\n";
if ($_[4] =~ /[0-6]/) { print XMLFILE " <time>$_[4]/$_[5]:00</time>\n" }
else { print XMLFILE " <time>$_[5]:00</time>\n" };
print XMLFILE " </departure>\n";
print XMLFILE " <cruise-alt>$_[6]</cruise-alt>\n";
print XMLFILE " <arrival>\n";
print XMLFILE " <port>$_[7]</port>\n";
if ($_[8] =~ /[0-6]/) { print XMLFILE " <time>$_[8]/$_[9]:00</time>\n" }
else { print XMLFILE " <time>$_[9]:00</time>\n" };
print XMLFILE " </arrival>\n";
if (($_[4] =~ /[0-6]/) && ($_[8] =~ /[0-6]/)) { print XMLFILE " <repeat>WEEK</repeat>\n" }
else { print XMLFILE " <repeat>24Hr</repeat>\n" };
print XMLFILE " </flight>\n";
return;
}
@inputfiles = glob("???.conf");
while ($infile = shift(@inputfiles)) {
open (CONF, $infile) or die "Unable to open input configuration file";
($outname = $infile) =~ s/conf/xml/;
print "Opening $outname\n";
open XMLFILE, ">$outname";
while ($buf = readline(CONF)) {
push @DataList, $buf;
}
close (CONF);
print XMLFILE "<?xml version=\"1.0\"?>\n";
print XMLFILE "<trafficlist>\n";
while ($dataline = shift(@DataList)) {
# print STDERR "Dataline: $dataline\n";
@token = split(" ", $dataline);
if (scalar(@token) > 0) {
# print STDERR "Token: @token\n";
if ($token[0] eq "AC")
{
print XMLFILE " <aircraft>\n";
print XMLFILE " <model>$token[12]</model>\n";
print XMLFILE " <livery>$token[6]</livery>\n";
print XMLFILE " <airline>$token[5]</airline>\n";
print XMLFILE " <home-port>$token[1]</home-port>\n";
print XMLFILE " <required-aircraft>$token[3]$token[5]</required-aircraft>\n";
print XMLFILE " <actype>$token[4]</actype>\n";
print XMLFILE " <offset>$token[7]</offset>\n";
print XMLFILE " <radius>$token[8]</radius>\n";
print XMLFILE " <flighttype>$token[9]</flighttype>\n";
print XMLFILE " <performance-class>$token[10]</performance-class>\n";
print XMLFILE " <registration>$token[2]</registration>\n";
print XMLFILE " <heavy>$token[11]</heavy>\n";
print XMLFILE " </aircraft>\n";
}
if ($token[0] eq "FLIGHT") {
$weekdays = $token[3];
if (!(($weekdays =~ /^(0|\.)?(1|\.)?(2|\.)?(3|\.)?(4|\.)?(5|\.)?(6|\.)?$/) || ($weekdays eq "DAILY"))) {
die "Syntax Error! Check days $weekdays for flight no. $token[1]!\n";
}
if ($token[4] !~ /^(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])$/) {
die "Syntax Error! Check departure time $token[4] for flight no. $token[1]!\n"
}
if ($token[6] !~ /^(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])$/) {
die "Syntax Error! Check arrival time $token[6] for flight no. $token[1]!\n"
}
# print STDERR "Weekdays: $weekdays\n";
if ($weekdays =~ /^(0|\.)?(1|\.)?(2|\.)?(3|\.)?(4|\.)?(5|\.)?(6|\.)?$/) {
# print STDERR "Weekly for flight no. $token[1]\n";
# print STDERR "Day: $_\n";
@day = split(//, $weekdays);
foreach (@day) {
if ($_ eq "\.") {
next;
} else {
$depTime = parseTime($token[4]);
# print STDERR "depTime: $depTime\n";
$arrTime = parseTime($token[6]);
# print STDERR "arrTime: $arrTime\n";
$depDay = $_ + 1;
if ($depDay > 6) { $depDay = 0 };
$arrDay = $depDay;
if ($depTime > $arrTime) { $arrDay++ };
if ($arrDay > 6) { $arrDay = 0 };
# print STDERR "depDay: $depDay, arrDay: $arrDay\n";
writeFlight ($token[1], $token[9], $token[2], $token[5], $depDay, $token[4], $token[8], $token[7], $arrDay, $token[6]);
}
}
}
elsif ($weekdays eq "DAILY") {
# print STDERR "Daily flights for flight no. $token[1]\n";
$depTime = parseTime($token[4]);
$arrTime = parseTime($token[6]);
writeFlight ($token[1], $token[9], $token[2], $token[5], 7, $token[4], $token[8], $token[7], 7, $token[6]);
}
else {
die "System Error! Can't find days to place a flight!\n";
}
}
}
}
print XMLFILE "</trafficlist>\n";
close XMLFILE;
# print "Closing $outname\n";
}

View file

@ -0,0 +1,91 @@
#!/usr/bin/perl -w
use strict;
use warnings;
# DEBUG
# use Data::Dumper;
# print Dumper($data) . "\n";
# END
use Switch;
use XML::LibXML;
my $parser = XML::LibXML->new();
my $doc = $parser->load_xml(location => './CEB.xml');
my $data;
# reformatting days
# According to http://wiki.flightgear.org/index.php/Interactive_Traffic
# 0 = Sunday and 6 = saturday
# For convenience we switch here to "classical" numbering
# where 0 = Monday and 6 = sunday
sub parseDay {
my $day;
$day = substr($_[0],0,1);
switch ($day) {
case 0 {$day="......6"} # Sunday
case 1 {$day="0......"} # Monday
case 2 {$day=".1....."} # Tuesday
case 3 {$day="..2...."} # Wednesday
case 4 {$day="...3..."} # Thrusday
case 5 {$day="....4.."} # Friday
case 6 {$day=".....5."} # Saturday
else {$day="0123456"} # Daily
};
return $day;
}
# reformatting times
sub parseTime {
return substr($_[0],2,5);
}
print "# AC Homeport Registration RequiredAC AcTyp Airline Livery Offset Radius Flighttype PerfClass Heavy Model\n";
# get aircraft data
foreach $data ($doc->findnodes('/trafficlist/aircraft')) {
my $AcMdl = $data->findnodes('./model');
my $AcLvy = $data->findnodes('./livery');
my $AcAln = $data->findnodes('./airline');
my $AcHp = $data->findnodes('./home-port');
my $AcReq = $data->findnodes('./required-aircraft');
my $AcTyp = $data->findnodes('./actype');
my $AcO = $data->findnodes('./offset');
my $AcRad = $data->findnodes('./radius');
my $AcFt = $data->findnodes('./flighttype');
my $AcPrf = $data->findnodes('./performance-class');
my $AcReg = $data->findnodes('./registration');
my $AcHvy = $data->findnodes('./heavy');
print "AC $AcHp $AcReg $AcReq $AcTyp $AcAln $AcLvy $AcO $AcRad $AcFt $AcPrf $AcHvy $AcMdl\n";
}
print "\n# FLIGHT Callsign Flightrule Days DeparTime DepartPort ArrivalTime ArrivalPort Altitude RequiredAc\n# 0 = Monday, 6 = Sunday\n";
# get flight data
foreach $data ($doc->findnodes('/trafficlist/flight')) {
my $FlRep = $data->findnodes('repeat');
my $FlDepPrt = $data->findnodes('departure/port');
my $FlArrPrt = $data->findnodes('arrival/port');
my $FlCs = $data->findnodes('callsign');
my $FlFr = $data->findnodes('fltrules');
my $FlCa = $data->findnodes('cruise-alt');
my $FlReq = $data->findnodes('required-aircraft');
my $FlDepDay = $data->findnodes('departure/time');
my $FlDepTime = $data->findnodes('departure/time');
my $FlArrDay = $data->findnodes('arrival/time');
my $FlArrTime = $data->findnodes('arrival/time');
my $FlDays = ".......";
# handle flights depending on weekly or daily schedule
if (lc($FlRep) eq "week") {
$FlDays = parseDay($FlDepTime);
$FlDepTime = parseTime($FlDepTime);
$FlArrTime = parseTime($FlArrTime);
} elsif (lc($FlRep) eq "24hr") {
$FlDepDay = $data->findnodes('departure/time');
$FlDepTime = substr($data->findnodes('departure/time'),0,5);
$FlArrDay = $data->findnodes('arrival/time');
$FlArrTime = substr($data->findnodes('arrival/time'),0,5);
$FlDays = "0123456";
} else {
die "Error! No proper repetition found in XML!\n";
}
# output data
print "FLIGHT $FlCs $FlFr $FlDays $FlDepTime $FlDepPrt $FlArrTime $FlArrPrt $FlCa $FlReq\n";
}