123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #!/usr/bin/env python
- import glob
- import os
- import random
- import sys
- from threading import Lock
- import time
- 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
- configPath = AMAN.findConfigPath()
- self.SystemConfig = None
- self.AircraftPerformance = None
- self.Receiver = None
- self.Weather = None
- self.WebUi = None
- self.Workers = []
- self.WorkersLock = Lock()
- # 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)
- self.acquireLock()
- # 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)
- self.releaseLock()
- # initialize the random number generator
- random.seed(time.time())
- def acquireLock(self):
- if None != self.WorkersLock:
- self.WorkersLock.acquire()
- def releaseLock(self):
- if None != self.WorkersLock:
- self.WorkersLock.release()
- def updateAircraftReport(self, report : AircraftReport_pb2.AircraftReport):
- self.acquireLock()
- # 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
- self.releaseLock()
- def findAirport(self, icao : str):
- self.acquireLock()
- airport = None
- for worker in self.Workers:
- if icao == worker.Icao:
- airport = worker
- break
- self.releaseLock()
- return airport
|