vehicles_manager.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. class Vehicle:
  2. def __init__(self,
  3. name: str,
  4. waf_build_command: str,
  5. ) -> None:
  6. self.name = name
  7. self.waf_build_command = waf_build_command
  8. def __eq__(self, other):
  9. if isinstance(other, Vehicle):
  10. return self.name == other.name
  11. return False
  12. def __hash__(self):
  13. return hash(self.name)
  14. # Default vehicles configuration
  15. DEFAULT_VEHICLES = [
  16. Vehicle(name="Copter", waf_build_command="copter"),
  17. Vehicle(name="Plane", waf_build_command="plane"),
  18. Vehicle(name="Rover", waf_build_command="rover"),
  19. Vehicle(name="Sub", waf_build_command="sub"),
  20. Vehicle(name="Heli", waf_build_command="heli"),
  21. Vehicle(name="Blimp", waf_build_command="blimp"),
  22. Vehicle(name="Tracker", waf_build_command="antennatracker"),
  23. Vehicle(name="AP_Periph", waf_build_command="AP_Periph"),
  24. ]
  25. class VehiclesManager:
  26. __singleton = None
  27. def __init__(self, vehicles: list = DEFAULT_VEHICLES) -> None:
  28. """
  29. Initialize VehiclesManager with a list of vehicles.
  30. Args:
  31. vehicles: List of Vehicle objects. Defaults to DEFAULT_VEHICLES.
  32. """
  33. # Enforce singleton pattern by raising an error if
  34. # an instance already exists.
  35. if VehiclesManager.__singleton:
  36. raise RuntimeError("VehiclesManager must be a singleton.")
  37. self.vehicles = set(vehicles)
  38. VehiclesManager.__singleton = self
  39. def get_all_vehicle_names_sorted(self) -> list:
  40. return sorted([v.name for v in self.vehicles])
  41. def get_all_vehicles(self) -> frozenset:
  42. return frozenset(self.vehicles)
  43. def add_vehicle(self, vehicle: Vehicle) -> None:
  44. return self.vehicles.add(vehicle)
  45. def get_vehicle_from_name(self, vehicle_name: str) -> Vehicle:
  46. if vehicle_name is None:
  47. raise ValueError("vehicle_name is a required parameter.")
  48. return next(
  49. (
  50. vehicle for vehicle in self.get_all_vehicles()
  51. if vehicle.name == vehicle_name
  52. ),
  53. None
  54. )
  55. @staticmethod
  56. def get_singleton() -> "VehiclesManager":
  57. return VehiclesManager.__singleton