def __init__(self):
     super(Environment, self).__init__()
     self.frame_of_reference = None
     self.origin = None
     self.__droneManager = DroneManager()
     self.drones = []
     self.tasks = []
class Environment(object):
    #Private variables
    __droneManager = None

    """
    """
    def __init__(self):
        super(Environment, self).__init__()
        self.frame_of_reference = None
        self.origin = None
        self.__droneManager = DroneManager()
        self.drones = []
        self.tasks = []

    def addTask(self, task):
        task.environment = self
        self.tasks.append(task)

    def setFrameOfReference(self, frameOfReference):
        self.frame_of_reference = frameOfReference

    def setOrigin(self, origin):
        self.origin = origin

    def addDrone(self, drone):
        drone.setEnvironment(self)
        drone.initialize()
        drone.startControlLoop()
        self.__droneManager.addDrone(drone)

    def stopAllDrones(self):
        self.__droneManager.stopAllDrones()

    #def start(self, timeout=300):
    #    for drone in self.drones:
    #        drone.setEnvironment(self)
    #        drone.initialize()

    def replaceDroneIfNeeded(self, drone, required_capabilities):
        if drone is None or drone.isBatteryLow():
            # dequeue a new drone
            drone = self.__droneManager.getDrone(required_capabilities)
        return drone

    def resetTaskTree(self, taskRoot):
        for subtask in taskRoot.subtasks:
            subtask.state = TaskState.READY
            self.resetTasktree(subtask)
        taskRoot.state = TaskState.READY

    def deleteTaskTree(self, taskRoot):
        self.tasks.remove(taskRoot)

    def getAllDrones(self):
        return self.__droneManager.getAllDrones()