AMAN.py 3.7 KB

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