Files
aman-sys/aman/AMAN.py
2021-10-15 18:09:43 +02:00

101 lines
3.4 KiB
Python

#!/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.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 = []
# initialize the random number generator
random.seed(time.time())
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