parse the runway assignments
This commit is contained in:
@@ -1,13 +1,14 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
import configparser
|
import configparser
|
||||||
|
from datetime import timedelta
|
||||||
import glob
|
import glob
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from aman.config.RHC import RHC
|
from aman.config.RHC import RHC
|
||||||
from aman.config.AirportSequencing import AirportSequencing
|
from aman.config.AirportSequencing import AirportSequencing
|
||||||
from aman.config.RunwaySequencing import RunwaySequencing
|
from aman.config.RunwaySequencing import RunwaySequencing, RunwayAssignmentType
|
||||||
from aman.formats.SctEseFormat import SctEseFormat
|
from aman.formats.SctEseFormat import SctEseFormat
|
||||||
from aman.types.Waypoint import Waypoint
|
from aman.types.Waypoint import Waypoint
|
||||||
|
|
||||||
@@ -173,6 +174,91 @@ class Airport:
|
|||||||
# register the arrival route
|
# register the arrival route
|
||||||
self.ArrivalRouteConstraints[star] = waypoints
|
self.ArrivalRouteConstraints[star] = waypoints
|
||||||
|
|
||||||
|
def parseAssignment(assignment : str):
|
||||||
|
elements = list(filter(None, assignment.split(':')))
|
||||||
|
retval = {}
|
||||||
|
type = None
|
||||||
|
|
||||||
|
index = 0
|
||||||
|
while index < len(elements):
|
||||||
|
if 0 == index % 2:
|
||||||
|
if 'A' == elements[index]:
|
||||||
|
type = RunwayAssignmentType.AircraftType
|
||||||
|
elif 'G' == elements[index]:
|
||||||
|
type = RunwayAssignmentType.GateAssignment
|
||||||
|
else:
|
||||||
|
sys.stderr.write('Invalid assignment type: ' + elements[index])
|
||||||
|
sys.exit(-1)
|
||||||
|
else:
|
||||||
|
if None == type:
|
||||||
|
sys.stderr.write('No assignment type defined')
|
||||||
|
sys.exit(-1)
|
||||||
|
|
||||||
|
if type not in retval:
|
||||||
|
retval.setdefault(type, [])
|
||||||
|
|
||||||
|
retval[type].append(elements[index])
|
||||||
|
type = None
|
||||||
|
index += 1
|
||||||
|
|
||||||
|
return retval
|
||||||
|
|
||||||
|
def findRunway(self, icao : str, name : str):
|
||||||
|
for runway in self.GngData.Runways[icao]:
|
||||||
|
if name == runway.Name:
|
||||||
|
return runway
|
||||||
|
|
||||||
|
sys.stderr.write('Unable to find runway ' + name + ' in the sequencing data for ' + icao)
|
||||||
|
raise Exception()
|
||||||
|
#sys.exit(-1)
|
||||||
|
|
||||||
|
def updateRunwayAssignment(dictionary, runway, assignments):
|
||||||
|
if runway not in dictionary:
|
||||||
|
dictionary.setdefault(runway, {})
|
||||||
|
|
||||||
|
for key in assignments:
|
||||||
|
if key not in dictionary[runway]:
|
||||||
|
dictionary[runway].setdefault(key, assignments[key])
|
||||||
|
else:
|
||||||
|
dictionary[runway][key].extend(assignments[key])
|
||||||
|
|
||||||
|
def parseRunwayAssignment(self, icao : str, planning):
|
||||||
|
self.RunwayAssignmentsShall = {}
|
||||||
|
self.RunwayAssignmentsShould = {}
|
||||||
|
self.RunwayAssignmentsMay = {}
|
||||||
|
self.MaxDelayShould = 10
|
||||||
|
self.MaxDelayMay = 5
|
||||||
|
shouldFound = False
|
||||||
|
mayFound = False
|
||||||
|
|
||||||
|
for key in planning:
|
||||||
|
if True == key.startswith('shallassign'):
|
||||||
|
runway = self.findRunway(icao, key.replace('shallassign', '').upper())
|
||||||
|
assignments = Airport.parseAssignment(planning[key])
|
||||||
|
Airport.updateRunwayAssignment(self.RunwayAssignmentsShall, runway, assignments)
|
||||||
|
elif True == key.startswith('shouldassign'):
|
||||||
|
runway = self.findRunway(icao, key.replace('shouldassign', '').upper())
|
||||||
|
assignments = Airport.parseAssignment(planning[key])
|
||||||
|
Airport.updateRunwayAssignment(self.RunwayAssignmentsShould, runway, assignments)
|
||||||
|
shouldFound = True
|
||||||
|
elif True == key.startswith('mayassign'):
|
||||||
|
runway = self.findRunway(icao, key.replace('mayassign', '').upper())
|
||||||
|
assignments = Airport.parseAssignment(planning[key])
|
||||||
|
Airport.updateRunwayAssignment(self.RunwayAssignmentsMay, runway, assignments)
|
||||||
|
mayFound = True
|
||||||
|
|
||||||
|
# find the max delays
|
||||||
|
if True == shouldFound:
|
||||||
|
if 'maxdelayshould' not in planning:
|
||||||
|
sys.stderr.write('maxDelayShould needs to be defined')
|
||||||
|
sys.exit(-1)
|
||||||
|
self.MaxDelayShould = timedelta(minutes=int(planning['maxdelayshould']))
|
||||||
|
if True == mayFound:
|
||||||
|
if 'maxdelaymay' not in planning:
|
||||||
|
sys.stderr.write('maxDelaymay needs to be defined')
|
||||||
|
sys.exit(-1)
|
||||||
|
self.MaxDelayMay = timedelta(minutes=int(planning['maxdelaymay']))
|
||||||
|
|
||||||
def __init__(self, filepath : str, icao : str):
|
def __init__(self, filepath : str, icao : str):
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config.read(filepath)
|
config.read(filepath)
|
||||||
@@ -224,3 +310,15 @@ class Airport:
|
|||||||
# get the default sequencing data
|
# get the default sequencing data
|
||||||
self.parseDefaultSequencingConfiguration(icao, planningConfig)
|
self.parseDefaultSequencingConfiguration(icao, planningConfig)
|
||||||
self.parseConstraints(planningConfig)
|
self.parseConstraints(planningConfig)
|
||||||
|
self.parseRunwayAssignment(icao, planningConfig)
|
||||||
|
self.assignmentUpdate(self.DefaultSequencing)
|
||||||
|
|
||||||
|
def assignmentUpdate(self, sequenceConfig : AirportSequencing):
|
||||||
|
# initializes the default sequence data
|
||||||
|
for active in sequenceConfig.ActiveArrivalRunways:
|
||||||
|
if active.Runway in self.RunwayAssignmentsShall:
|
||||||
|
active.ShallAssignments = self.RunwayAssignmentsShall[active.Runway]
|
||||||
|
if active.Runway in self.RunwayAssignmentsShould:
|
||||||
|
active.ShouldAssignments = self.RunwayAssignmentsShould[active.Runway]
|
||||||
|
if active.Runway in self.RunwayAssignmentsMay:
|
||||||
|
active.MayAssignments = self.RunwayAssignmentsMay[active.Runway]
|
||||||
|
|||||||
Reference in New Issue
Block a user