From 2ef1e13bd612c9c2ce8446e102a87f9cf0169148 Mon Sep 17 00:00:00 2001 From: Sven Czarnian Date: Tue, 12 Oct 2021 22:27:55 +0200 Subject: [PATCH] extend the worker thread --- aman/AMAN.py | 4 +-- aman/sys/Worker.py | 70 ++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/aman/AMAN.py b/aman/AMAN.py index dc760b5..610b256 100644 --- a/aman/AMAN.py +++ b/aman/AMAN.py @@ -50,7 +50,7 @@ class AMAN: sys.stderr.write('No aircraft performance data found!') sys.exit(-1) else: - print('Parsed PerformanceData.ini. Extracted ' + str(len(self.aircraftPerformance.aircrafts)) + ' aircrafts') + print('Parsed PerformanceData.ini. Extracted ' + str(len(self.aircraftPerformance.Aircrafts)) + ' aircrafts') self.weather = Weather() self.weather.acquire(self.systemConfig.Weather) @@ -65,7 +65,7 @@ class AMAN: # initialize the worker thread worker = Worker() - worker.acquire(icao, airportConfig) + worker.acquire(icao, airportConfig, self.weather, self.aircraftPerformance) self.workers.append(worker) print('Started worker for ' + icao) diff --git a/aman/sys/Worker.py b/aman/sys/Worker.py index 97fb6ee..4a0a031 100644 --- a/aman/sys/Worker.py +++ b/aman/sys/Worker.py @@ -2,8 +2,14 @@ from threading import Thread, Lock import time +from aman.com import Weather from aman.config.Airport import Airport +from aman.sys.aco.Configuration import Configuration +from aman.sys.WeatherModel import WeatherModel +from aman.sys.RecedingHorizonControl import RecedingHorizonControl +from aman.types.Inbound import Inbound +from aman.types.PerformanceData import PerformanceData class Worker(Thread): def __init__(self): @@ -12,19 +18,26 @@ class Worker(Thread): self.icao = None self.configuration = None self.arrivalRoutes = None + self.performanceData = None self.updateLock = None self.reportQueue = {} + self.weatherModel = None + self.RecedingHorizonControl = None def __del__(self): self.release() - def acquire(self, icao : str, configuration : Airport): + def acquire(self, icao : str, configuration : Airport, weather : Weather, performance : PerformanceData): self.stopThread = None self.icao = icao self.configuration = configuration - self.arrivalRoutes = configuration.gngData.arrivalRoutes + self.sequencingConfiguration = self.configuration.DefaultSequencing + self.performanceData = performance + self.arrivalRoutes = configuration.GngData.arrivalRoutes self.updateLock = Lock() self.reportQueue = {} + self.weatherModel = WeatherModel(self.configuration.GaforId, weather) + self.RecedingHorizonControl = RecedingHorizonControl(self.configuration.RecedingHorizonControl) self.start() def acquireLock(self): @@ -45,9 +58,54 @@ class Worker(Thread): while None == self.stopThread: time.sleep(1) counter += 1 - if 0 != (counter % 60): + if 0 != (counter % 10): continue - # TODO handle the report queue and update internal information - # TODO execute planning, etc. - continue + self.acquireLock() + + # perform some book-keeping + self.RecedingHorizonControl.cleanupWindows() + + # update the aircraft information in RHC + for callsign in self.reportQueue: + report = self.reportQueue[callsign] + + if 0 != report.distanceToIAF and '' != report.initialApproachFix: + inbound = Inbound(report, self.sequencingConfiguration, self.configuration.GngData, self.performanceData, self.weatherModel) + if None != inbound.PlannedRunway and None != inbound.PlannedStar: + self.RecedingHorizonControl.update(inbound) + else: + print('Unable to find all data of ' + report.aircraft.callsign) + + self.reportQueue.clear() + + if 0 != len(self.RecedingHorizonControl.Windows): + print('FCFS run:') + for window in self.RecedingHorizonControl.Windows: + for inbound in window.Inbounds: + print(' ' + inbound.Report.aircraft.callsign + ': ' + str(inbound.EstimatedArrivalTime)) + + # get the last landing aircrafts per runway before the RHC stage to check for constraints + # this is required to handle the overlap between windows + preceedingInbounds = {} + for runway in self.sequencingConfiguration.ActiveArrivalRunways: + inbound = self.RecedingHorizonControl.lastFixedInboundOnRunway(runway.Runway.name) + if None != inbound: + preceedingInbounds[runway.Runway.name] = inbound + + # search the ACO relevant aircrafts + relevantInbounds = self.RecedingHorizonControl.optimizationRelevantInbounds() + if None != relevantInbounds: + print('Relevant inbounds: ' + str(len(relevantInbounds))) + + # configure the ACO run + acoConfig = Configuration(self.sequencingConfiguration, 5 * len(relevantInbounds), 5 * len(relevantInbounds)) + if 0 != len(preceedingInbounds): + acoConfig.PreceedingInbounds = preceedingInbounds + acoConfig.Inbounds = relevantInbounds + # TODO perform the ACO run + # TODO update the RHC stages based on the ACO run result + else: + print('No relevant inbounds found for the optimization in ' + self.icao) + + self.releaseLock()