parse the runway assignments
This commit is contained in:
@@ -1,13 +1,14 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import configparser
|
||||
from datetime import timedelta
|
||||
import glob
|
||||
import os
|
||||
import sys
|
||||
|
||||
from aman.config.RHC import RHC
|
||||
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.types.Waypoint import Waypoint
|
||||
|
||||
@@ -173,6 +174,91 @@ class Airport:
|
||||
# register the arrival route
|
||||
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):
|
||||
config = configparser.ConfigParser()
|
||||
config.read(filepath)
|
||||
@@ -224,3 +310,15 @@ class Airport:
|
||||
# get the default sequencing data
|
||||
self.parseDefaultSequencingConfiguration(icao, 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