parse the runway assignments

This commit is contained in:
Sven Czarnian
2021-11-16 12:34:46 +01:00
parent 219ff481c3
commit 03483953c5

View File

@@ -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]