#!/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 = [] 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.Weather, self.AircraftPerformance) 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