AMAN.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #!/usr/bin/env python
  2. import glob
  3. import os
  4. import sys
  5. from aman.com import AircraftReport_pb2
  6. from aman.com.Euroscope import Euroscope
  7. from aman.com.Weather import Weather
  8. from aman.config.AircraftPerformance import AircraftPerformance
  9. from aman.config.Airport import Airport
  10. from aman.config.System import System
  11. from aman.sys.Worker import Worker
  12. class AMAN:
  13. def findConfigPath():
  14. envvar = os.environ.get('AMAN_CONFIG_PATH')
  15. if None == envvar:
  16. print('No AMAN_CONFIG_PATH in environment variables found. Using execution directory.')
  17. path = os.getcwd()
  18. else:
  19. print('AMAN_CONFIG_PATH found.')
  20. path = envvar
  21. print('Config-path: ' + path)
  22. return path
  23. def __init__(self):
  24. # default initialization of members
  25. self.SystemConfig = None
  26. self.AircraftPerformance = None
  27. self.Receiver = None
  28. self.Weather = None
  29. self.Workers = []
  30. def __del__(self):
  31. self.release()
  32. def aquire(self):
  33. configPath = AMAN.findConfigPath()
  34. # read all system relevant configuration files
  35. self.SystemConfig = System(os.path.join(configPath, 'System.ini'))
  36. print('Parsed System.ini')
  37. # read the aircraft performance data
  38. self.AircraftPerformance = AircraftPerformance(os.path.join(configPath, 'PerformanceData.ini'))
  39. if None == self.AircraftPerformance:
  40. sys.stderr.write('No aircraft performance data found!')
  41. sys.exit(-1)
  42. else:
  43. print('Parsed PerformanceData.ini. Extracted ' + str(len(self.AircraftPerformance.Aircrafts)) + ' aircrafts')
  44. self.Weather = Weather()
  45. self.Weather.acquire(self.SystemConfig.Weather)
  46. # find the airport configurations and create the workers
  47. airportsPath = os.path.join(os.path.join(configPath, 'airports'), '*.ini')
  48. for file in glob.glob(airportsPath):
  49. icao = os.path.splitext(os.path.basename(file))[0]
  50. print('Parsing planner configuration for ' + icao)
  51. airportConfig = Airport(file, icao)
  52. # initialize the worker thread
  53. worker = Worker()
  54. worker.acquire(icao, airportConfig, self.Weather, self.AircraftPerformance)
  55. self.Workers.append(worker)
  56. print('Started worker for ' + icao)
  57. # create the EuroScope receiver
  58. self.Receiver = Euroscope()
  59. self.Receiver.acquire(configPath, self.SystemConfig.Server, self)
  60. def release(self):
  61. if None != self.Receiver:
  62. self.Receiver.release()
  63. self.Receiver = None
  64. if None != self.Weather:
  65. self.Weather.release()
  66. self.Weather = None
  67. if None != self.Workers:
  68. for worker in self.Workers:
  69. worker.release()
  70. self.Workers = None
  71. def updateAircraftReport(self, report : AircraftReport_pb2.AircraftReport):
  72. # find the correct worker for the inbound
  73. for worker in self.Workers:
  74. if worker.Icao == report.destination:
  75. worker.acquireLock()
  76. worker.ReportQueue[report.aircraft.callsign] = report
  77. worker.releaseLock()
  78. break