From dcfa2632fb7d524a1cea48b8a6ea31d1c67eda95 Mon Sep 17 00:00:00 2001 From: Durk Talsma Date: Mon, 3 Jan 2011 09:59:48 +0100 Subject: [PATCH] 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. --- configure.ac | 1 + scripts/perl/Makefile.am | 3 +- scripts/perl/traffic/Makefile.am | 3 + scripts/perl/traffic/conf2xml.pl | 117 +++++++++++++++++++++++++++++++ scripts/perl/traffic/xml2conf.pl | 91 ++++++++++++++++++++++++ 5 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 scripts/perl/traffic/Makefile.am create mode 100644 scripts/perl/traffic/conf2xml.pl create mode 100644 scripts/perl/traffic/xml2conf.pl diff --git a/configure.ac b/configure.ac index 5f0dae1a8..75ef75a4f 100644 --- a/configure.ac +++ b/configure.ac @@ -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 \ diff --git a/scripts/perl/Makefile.am b/scripts/perl/Makefile.am index aee2d7baa..9538e129c 100644 --- a/scripts/perl/Makefile.am +++ b/scripts/perl/Makefile.am @@ -1 +1,2 @@ -SUBDIRS = examples +SUBDIRS = examples \ + traffic diff --git a/scripts/perl/traffic/Makefile.am b/scripts/perl/traffic/Makefile.am new file mode 100644 index 000000000..b14050c96 --- /dev/null +++ b/scripts/perl/traffic/Makefile.am @@ -0,0 +1,3 @@ +EXTRA_DIST = \ + conf2xml.pl \ + xml2conf.pl diff --git a/scripts/perl/traffic/conf2xml.pl b/scripts/perl/traffic/conf2xml.pl new file mode 100644 index 000000000..0305ebd11 --- /dev/null +++ b/scripts/perl/traffic/conf2xml.pl @@ -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 " \n"; + print XMLFILE " $_[0]\n"; + print XMLFILE " $_[1]\n"; + print XMLFILE " $_[2]\n"; + print XMLFILE " \n"; + print XMLFILE " $_[3]\n"; + if ($_[4] =~ /[0-6]/) { print XMLFILE " \n" } + else { print XMLFILE " \n" }; + print XMLFILE " \n"; + print XMLFILE " $_[6]\n"; + print XMLFILE " \n"; + print XMLFILE " $_[7]\n"; + if ($_[8] =~ /[0-6]/) { print XMLFILE " \n" } + else { print XMLFILE " \n" }; + print XMLFILE " \n"; + if (($_[4] =~ /[0-6]/) && ($_[8] =~ /[0-6]/)) { print XMLFILE " WEEK\n" } + else { print XMLFILE " 24Hr\n" }; + print XMLFILE " \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 "\n"; + print XMLFILE "\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 " \n"; + print XMLFILE " $token[12]\n"; + print XMLFILE " $token[6]\n"; + print XMLFILE " $token[5]\n"; + print XMLFILE " $token[1]\n"; + print XMLFILE " $token[3]$token[5]\n"; + print XMLFILE " $token[4]\n"; + print XMLFILE " $token[7]\n"; + print XMLFILE " $token[8]\n"; + print XMLFILE " $token[9]\n"; + print XMLFILE " $token[10]\n"; + print XMLFILE " $token[2]\n"; + print XMLFILE " $token[11]\n"; + print XMLFILE " \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 "\n"; + close XMLFILE; +# print "Closing $outname\n"; +} diff --git a/scripts/perl/traffic/xml2conf.pl b/scripts/perl/traffic/xml2conf.pl new file mode 100644 index 000000000..e66da0841 --- /dev/null +++ b/scripts/perl/traffic/xml2conf.pl @@ -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"; +}