vehicles_manager.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. class Vehicle:
  2. def __init__(self,
  3. id: str,
  4. name: str,
  5. ap_source_subdir: str,
  6. fw_server_vehicle_sdir: str,
  7. waf_build_command: str,
  8. ) -> None:
  9. self.id = id
  10. self.name = name
  11. self.ap_source_subdir = ap_source_subdir
  12. self.fw_server_vehicle_sdir = fw_server_vehicle_sdir
  13. self.waf_build_command = waf_build_command
  14. def __eq__(self, other):
  15. if isinstance(other, Vehicle):
  16. return self.id == other.id
  17. return False
  18. def __hash__(self):
  19. return hash(self.id)
  20. # Default vehicles configuration
  21. DEFAULT_VEHICLES = [
  22. Vehicle(
  23. id="copter",
  24. name="Copter",
  25. ap_source_subdir="ArduCopter",
  26. fw_server_vehicle_sdir="Copter",
  27. waf_build_command="copter"
  28. ),
  29. Vehicle(
  30. id="plane",
  31. name="Plane",
  32. ap_source_subdir="ArduPlane",
  33. fw_server_vehicle_sdir="Plane",
  34. waf_build_command="plane"
  35. ),
  36. Vehicle(
  37. id="rover",
  38. name="Rover",
  39. ap_source_subdir="Rover",
  40. fw_server_vehicle_sdir="Rover",
  41. waf_build_command="rover"
  42. ),
  43. Vehicle(
  44. id="sub",
  45. name="Sub",
  46. ap_source_subdir="ArduSub",
  47. fw_server_vehicle_sdir="Sub",
  48. waf_build_command="sub"
  49. ),
  50. Vehicle(
  51. id="heli",
  52. name="Heli",
  53. ap_source_subdir="ArduCopter",
  54. fw_server_vehicle_sdir="Copter",
  55. waf_build_command="heli"
  56. ),
  57. Vehicle(
  58. id="blimp",
  59. name="Blimp",
  60. ap_source_subdir="Blimp",
  61. fw_server_vehicle_sdir="Blimp",
  62. waf_build_command="blimp"
  63. ),
  64. Vehicle(
  65. id="tracker",
  66. name="Tracker",
  67. ap_source_subdir="AntennaTracker",
  68. fw_server_vehicle_sdir="AntennaTracker",
  69. waf_build_command="antennatracker"
  70. ),
  71. Vehicle(
  72. id="ap-periph",
  73. name="AP_Periph",
  74. ap_source_subdir="Tools/AP_Periph",
  75. fw_server_vehicle_sdir="AP_Periph",
  76. waf_build_command="AP_Periph"
  77. ),
  78. ]
  79. class VehiclesManager:
  80. __singleton = None
  81. def __init__(self, vehicles: list = DEFAULT_VEHICLES) -> None:
  82. """
  83. Initialize VehiclesManager with a list of vehicles.
  84. Args:
  85. vehicles: List of Vehicle objects. Defaults to DEFAULT_VEHICLES.
  86. """
  87. # Enforce singleton pattern by raising an error if
  88. # an instance already exists.
  89. if VehiclesManager.__singleton:
  90. raise RuntimeError("VehiclesManager must be a singleton.")
  91. self.vehicles = set(vehicles)
  92. VehiclesManager.__singleton = self
  93. def get_all_vehicles(self) -> frozenset:
  94. return frozenset(self.vehicles)
  95. def add_vehicle(self, vehicle: Vehicle) -> None:
  96. return self.vehicles.add(vehicle)
  97. def get_vehicle_by_id(self, vehicle_id: str) -> Vehicle:
  98. if vehicle_id is None:
  99. raise ValueError("vehicle_id is a required parameter.")
  100. return next(
  101. (
  102. vehicle for vehicle in self.get_all_vehicles()
  103. if vehicle.id == vehicle_id
  104. ),
  105. None
  106. )
  107. @staticmethod
  108. def get_singleton() -> "VehiclesManager":
  109. return VehiclesManager.__singleton