AMAN.py 3.4 KB

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