#!/usr/bin/env python import glob import os import sys from aman.com import AircraftReport_pb2 from aman.com.Euroscope import Euroscope from aman.com.Weather import Weather from aman.config.AircraftPerformance import AircraftPerformance from aman.config.Airport import Airport from aman.config.System import System from aman.sys.Worker import Worker class AMAN: def findConfigPath(): envvar = os.environ.get('AMAN_CONFIG_PATH') if None == envvar: print('No AMAN_CONFIG_PATH in environment variables found. Using execution directory.') path = os.getcwd() else: print('AMAN_CONFIG_PATH found.') path = envvar print('Config-path: ' + path) return path def __init__(self): # default initialization of members self.systemConfig = None self.aircraftPerformance = None self.receiver = None self.weather = None self.workers = [] self.inbounds = {} def __del__(self): self.release() def aquire(self): configPath = AMAN.findConfigPath() # read all system relevant configuration files self.systemConfig = System(os.path.join(configPath, 'System.ini')) print('Parsed System.ini') # read the aircraft performance data self.aircraftPerformance = AircraftPerformance(os.path.join(configPath, 'PerformanceData.ini')) if None == self.aircraftPerformance: sys.stderr.write('No aircraft performance data found!') sys.exit(-1) else: print('Parsed PerformanceData.ini. Extracted ' + str(len(self.aircraftPerformance.aircrafts)) + ' aircrafts') self.weather = Weather() self.weather.acquire(self.systemConfig.Weather) # find the airport configurations and create the workers airportsPath = os.path.join(os.path.join(configPath, 'airports'), '*.ini') for file in glob.glob(airportsPath): icao = os.path.splitext(os.path.basename(file))[0] print('Parsing planner configuration for ' + icao) airportConfig = Airport(file, icao) # initialize the worker thread worker = Worker() worker.acquire(icao, airportConfig) self.workers.append(worker) print('Started worker for ' + icao) # create the EuroScope receiver self.receiver = Euroscope() self.receiver.acquire(configPath, self.systemConfig.Server, self) def release(self): if None != self.receiver: self.receiver.release() self.receiver = None if None != self.weather: self.weather.release() self.weather = None if None != self.workers: for worker in self.workers: worker.release() self.workers = None def updateAircraftReport(self, report : AircraftReport_pb2.AircraftReport): # find the correct worker for the inbound for worker in self.workers: if worker.icao == report.destination: worker.acquireLock() worker.reportQueue[report.aircraft.callsign] = report worker.releaseLock() break