109 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.6 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.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
 | |
|         self.SystemConfig = None
 | |
|         self.AircraftPerformance = None
 | |
|         self.Receiver = None
 | |
|         self.Weather = None
 | |
|         self.WebUi = 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)
 | |
|         self.WebUi = WebUI()
 | |
|         self.WebUi.acquire(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()
 | |
|             worker.acquire(icao, airportConfig, self.Weather, self.AircraftPerformance, self.WebUi)
 | |
|             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.Workers:
 | |
|             for worker in self.Workers:
 | |
|                 worker.release()
 | |
|         self.Workers = None
 | |
| 
 | |
|         if None != self.Receiver:
 | |
|             self.Receiver.release()
 | |
|         self.Receiver = None
 | |
| 
 | |
|         if None != self.Weather:
 | |
|             self.Weather.release()
 | |
|         self.Weather = None
 | |
| 
 | |
|         if None != self.WebUi:
 | |
|             self.WebUi.release()
 | |
|         self.WebUi = 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 |