#!/usr/bin/env python import glob import os import random import sys import time from aman.com import AircraftReport_pb2 from aman.com.Euroscope import Euroscope from aman.com.Weather import Weather from aman.com.WebUI import WebUI 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 configPath = AMAN.findConfigPath() self.SystemConfig = None self.AircraftPerformance = None self.Receiver = None self.Weather = None self.WebUi = None self.Workers = [] # 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') # create the communication syb self.Weather = Weather(self.SystemConfig.Weather) self.Receiver = Euroscope(configPath, self.SystemConfig.Server, self) # 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(icao, airportConfig, self.Weather, self.AircraftPerformance, self.Receiver) self.Workers.append(worker) print('Started worker for ' + icao) 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