Beispiel #1
0
    def setUp(self):
        self.uri = uri_helper.uri_from_env(default='radio://0/80/2M/E7E7E7E7E7')

        self.cf_mock = MagicMock(spec=Crazyflie)
        self.cf_mock.connected = Caller()
        self.cf_mock.connection_failed = Caller()
        self.cf_mock.disconnected = Caller()

        self.cf_mock.open_link = AsyncCallbackCaller(
            cb=self.cf_mock.connected,
            args=[self.uri],
            delay=0.2
        ).trigger

        self.close_link_mock = AsyncCallbackCaller(
            cb=self.cf_mock.disconnected,
            args=[self.uri],
            delay=0.2
        )
        self.cf_mock.close_link = self.close_link_mock.trigger

        # Mock the behaviour that param values are updated(downloaded) after connection
        self.param_mock = MagicMock(spec=Param)
        self.param_mock.all_updated = Caller()
        self.cf_mock.param = self.param_mock

        # Register a callback to be called when connected. Use it to trigger a callback
        # to trigger the call to the param.all_updated() callback
        self.cf_mock.connected.add_callback(self._connected_callback)

        self.sut = SyncCrazyflie(self.uri, cf=self.cf_mock)
Beispiel #2
0
    def __init__(self, crazyflie=None):
        """Instantiate class and connect callbacks"""
        self.mems = []
        # Called when new memories have been added
        self.mem_added_cb = Caller()
        # Called when new data has been read
        self.mem_read_cb = Caller()

        self.mem_write_cb = Caller()

        self.cf = crazyflie
        self.cf.add_port_callback(CRTPPort.MEM, self._new_packet_cb)

        self._refresh_callback = None
        self._fetch_id = 0
        self.nbr_of_mems = 0
        self._ow_mem_fetch_index = 0
        self._elem_data = ()
        self._read_requests = {}
        self._read_requests_lock = Lock()
        self._write_requests = {}
        self._write_requests_lock = Lock()
        self._ow_mems_left_to_update = []

        self._getting_count = False
Beispiel #3
0
    def __init__(self, crazyflie, logconf):
        self.dataReceived = Caller()
        self.error = Caller()

        self.logconf = logconf
        self.blockId = LogEntry.blockIdCounter
        LogEntry.blockIdCounter += 1
        self.cf = crazyflie
        self.period = logconf.getPeriod() / 10
        self.blockCreated = False
Beispiel #4
0
    def __init__(self, crazyflie, logconf):
        """Initialize the entry"""
        self.data_received = Caller()
        self.error = Caller()

        self.logconf = logconf
        self.block_id = LogEntry.block_idCounter
        LogEntry.block_idCounter += 1
        self.cf = crazyflie
        self.period = logconf.getPeriod() / 10
        self.block_created = False
Beispiel #5
0
    def setUp(self):
        self.cf_mock = MagicMock(spec=Crazyflie)
        self.cf_mock.disconnected = Caller()

        self.log_mock = MagicMock(spec=Log)
        self.cf_mock.log = self.log_mock

        self.log_config_mock = MagicMock(spec=LogConfig)
        self.log_config_mock.data_received_cb = Caller()

        self.sut = SyncLogger(self.cf_mock, self.log_config_mock)
    def setUp(self):
        self.uri = 'radio://0/60/2M'

        self.cf_mock = MagicMock(spec=Crazyflie)
        self.cf_mock.connected = Caller()
        self.cf_mock.connection_failed = Caller()
        self.cf_mock.disconnected = Caller()

        self.cf_mock.open_link = AsyncCallbackCaller(cb=self.cf_mock.connected,
                                                     args=[self.uri]).trigger

        self.sut = SyncCrazyflie(self.uri, self.cf_mock)
Beispiel #7
0
    def __init__(self, crazyflie=None):
        self.log_blocks = []
        # Called with newly created blocks
        self.block_added_cb = Caller()

        self.cf = crazyflie
        self.toc = None
        self.cf.add_port_callback(CRTPPort.LOGGING, self._new_packet_cb)

        self.toc_updated = Caller()
        self.state = IDLE
        self.fake_toc_crc = 0xDEADBEEF
    def __init__(self, cf: Crazyflie) -> None:
        self._cf = cf
        self._cf.connected.add_callback(self._connected)
        self._cf.disconnected.add_callback(self._disconnected)

        self.data_received_cb = Caller()
        self.error_cb = Caller()

        # The pose is an array containing
        # X, Y, Z, roll, pitch, yaw
        # roll, pitch and yaw in degrees
        self.pose = self.NO_POSE
Beispiel #9
0
 def add_update_callback(self, group, name=None, cb=None):
     """
     Add a callback for a specific parameter name. This callback will be
     executed when a new value is read from the Crazyflie.
     """
     if not name:
         if not group in self.group_update_callbacks:
             self.group_update_callbacks[group] = Caller()
         self.group_update_callbacks[group].add_callback(cb)
     else:
         paramname = "{}.{}".format(group, name)
         if not paramname in self.param_update_callbacks:
             self.param_update_callbacks[paramname] = Caller()
         self.param_update_callbacks[paramname].add_callback(cb)
Beispiel #10
0
    def __init__(self, crazyflie=None):
        """Instantiate class and connect callbacks"""
        # Called when new memories have been added
        self.mem_added_cb = Caller()
        # Called when new data has been read
        self.mem_read_cb = Caller()

        self.mem_write_cb = Caller()

        self.cf = crazyflie
        self.cf.add_port_callback(CRTPPort.MEM, self._new_packet_cb)
        self.cf.disconnected.add_callback(self._disconnected)
        self._write_requests_lock = Lock()

        self._clear_state()
Beispiel #11
0
 def __init__(self, period, callback):
     self._callbacks = Caller()
     self._callbacks.add_callback(callback)
     self._started = False
     self._period = period
     self._timer = Timer(period, self._expired)
     self._timer.daemon = True
Beispiel #12
0
 def __init__(self, crazyflie):
     """
     Initialize the console and register it to receive data from the copter.
     """
     self.receivedChar = Caller()
     self.cf = crazyflie
     self.cf.add_port_callback(CRTPPort.CONSOLE, self.incoming)
    def __init__(self, crazyflie):
        self.cf = crazyflie
        self.param_update_callbacks = {}
        self.group_update_callbacks = {}
        self.all_update_callback = Caller()
        self.param_updater = None

        self.param_updater = _ParamUpdater(self.cf, self._param_updated)
        self.param_updater.start()

        self.cf.disconnected.add_callback(self.param_updater.close)

        self.all_updated = Caller()
        self._have_updated = False

        self.values = {}
Beispiel #14
0
    def __init__(self, parent=None):
        super(QtCore.QObject, self).__init__(parent)
        self.parent = parent
        self.useBaro = False  # Using barometer for current recovery
        self.useBaroNext = False  # Use barometer for next recovery
        self.falling = False  # Free fall Recovery active
        self.kill = False
        self.boostMSec = 45  # Max thrust for first 30ms. State also keeps track of mode, see step()
        self.nr = 0  # step nr during non baro mode
        self.falloff = FallOff(self)

        # why the hell do we mix signals like this?
        self.auto_input_updated = Caller()
        self.althold_updated = Caller()

        self.timerOut = QtCore.QTimer()
    def __init__(self, crazyflie):
        """
        Initialize the console and register it to receive data from the copter.
        """

        self.receivedChar = Caller()
        """
        This member variable is used to setup a callback that will be called
        when text is received from the CONSOLE port of CRTP (0).

        Example:
        ```python
        [...]

        def log_console(self, text):
            self.log_file.write(text)

        [...]

        self.cf.console.receivedChar.add_callback(self.log_console)
        ```
        """

        self.cf = crazyflie
        self.cf.add_port_callback(CRTPPort.CONSOLE, self._incoming)
Beispiel #16
0
    def __init__(self, crazyflie=None):
        """
        Initialize the Extpos object.
        """
        self._cf = crazyflie

        self.receivedLocationPacket = Caller()
        self._cf.add_port_callback(CRTPPort.LOCALIZATION, self._incoming)
Beispiel #17
0
class ConfigManager():
    """ Singleton class for managing input processing """
    conf_needs_reload = Caller()
    configs_dir = sys.path[1] + "/input"

    __metaclass__ = Singleton

    def __init__(self):
        """Initialize and create empty config list"""
        self._list_of_configs = []

    def get_config(self, config_name):
        """Get the configuration for an input device."""
        try:
            idx = self._list_of_configs.index(config_name)
            return self._input_config[idx]
        except:
            return None

    def get_list_of_configs(self):
        """Reload the configurations from file"""
        try:
            configs = [
                os.path.basename(f)
                for f in glob.glob(self.configs_dir + "/[A-Za-z]*.json")
            ]
            self._input_config = []
            self._list_of_configs = []
            for conf in configs:
                logger.info("Parsing [%s]", conf)
                json_data = open(self.configs_dir + "/%s" % conf)
                data = json.load(json_data)
                new_input_device = {}
                for a in data["inputconfig"]["inputdevice"]["axis"]:
                    axis = {}
                    axis["scale"] = a["scale"]
                    axis["type"] = a["type"]
                    axis["key"] = a["key"]
                    axis["name"] = a["name"]
                    try:
                        ids = a["ids"]
                    except:
                        ids = [a["id"]]
                    for id in ids:
                        locaxis = copy.deepcopy(axis)
                        if "ids" in a:
                            if id == a["ids"][0]:
                                locaxis["scale"] = locaxis["scale"] * -1
                        locaxis["id"] = id
                        # 'type'-'id' defines unique index for axis
                        index = "%s-%d" % (a["type"], id)
                        new_input_device[index] = locaxis
                self._input_config.append(new_input_device)
                json_data.close()
                self._list_of_configs.append(conf[:-5])
        except Exception as e:
            logger.warning("Exception while parsing inputconfig file: %s ", e)
        return self._list_of_configs
Beispiel #18
0
    def setUp(self):
        self.uri = uri_helper.uri_from_env(
            default='radio://0/80/2M/E7E7E7E7E7')

        self.cf_mock = MagicMock(spec=Crazyflie)
        self.cf_mock.connected = Caller()
        self.cf_mock.connection_failed = Caller()
        self.cf_mock.disconnected = Caller()

        self.cf_mock.open_link = AsyncCallbackCaller(cb=self.cf_mock.connected,
                                                     args=[self.uri],
                                                     delay=0.2).trigger

        self.close_link_mock = AsyncCallbackCaller(
            cb=self.cf_mock.disconnected, args=[self.uri], delay=0.2)
        self.cf_mock.close_link = self.close_link_mock.trigger

        self.sut = SyncCrazyflie(self.uri, self.cf_mock)
Beispiel #19
0
    def __init__(self, name, period_in_ms):
        """Initialize the entry"""
        self.data_received_cb = Caller()
        self.error_cb = Caller()
        self.started_cb = Caller()
        self.added_cb = Caller()
        self.err_no = 0

        self.id = 0
        self.cf = None
        self.period = int(period_in_ms / 10)
        self.period_in_ms = period_in_ms
        self._added = False
        self._started = False
        self.valid = False
        self.variables = []
        self.default_fetch_as = []
        self.name = name
Beispiel #20
0
    def add_update_callback(self, paramname, cb):
        """
        Add a callback for a specific parameter name. This callback will be
        executed when a new value is read from the Crazyflie.
        """
        if ((paramname in self.paramUpdateCallbacks) is False):
            self.paramUpdateCallbacks[paramname] = Caller()

        self.paramUpdateCallbacks[paramname].add_callback(cb)
Beispiel #21
0
 def __init__(self):
     self.cf = None
     self.menu = None
     self.logConfigReader = None
     self.referenceHeight = 0.400
     self.hover_input_updated = Caller()
     self.useReferenceHeight = False
     self.inputType = 0
     self.inputTimer = 0.000
     self.sinewaveFrequency = 1.0 # 1s
Beispiel #22
0
    def __init__(self, name, period_in_ms):
        """Initialize the entry"""
        self.data_received_cb = Caller()
        self.error_cb = Caller()
        self.started_cb = Caller()
        self.added_cb = Caller()
        self.err_no = 0

        self.id = LogConfig._config_id_counter
        LogConfig._config_id_counter = (LogConfig._config_id_counter + 1) % 255
        self.cf = None
        self.period = period_in_ms / 10
        self.period_in_ms = period_in_ms
        self._added = False
        self._started = False
        self.valid = False
        self.variables = []
        self.default_fetch_as = []
        self.name = name
Beispiel #23
0
    def __init__(self, crazyflie=None):
        self.logBlocks = []

        self.cf = crazyflie

        self.cf.add_port_callback(CRTPPort.LOGGING, self._new_packet_cb)

        self.tocUpdated = Caller()
        self.state = IDLE
        self.fakeTOCCRC = 0xBABEBABA
Beispiel #24
0
    def __init__(self,
                 drone_id: str,
                 radio_id: int = 0,
                 channel: int = 80,
                 address: str = "E7E7E7E7E7",
                 data_rate: str = "2M"):
        """ Initializes the drone with the given uri."""

        # Initialize public variables
        self.id: str = drone_id
        self.var_x: float = 0
        self.var_y: float = 0
        self.var_z: float = 0
        self.pos_x: float = 0
        self.pos_y: float = 0
        self.pos_z: float = 0
        self.yaw: float = 0
        self.battery_voltage: float = 0
        self.is_connected: bool = False
        self.status: DroneState = DroneState.OFFLINE
        self.link_uri: str = "radio://" + str(radio_id) + "/" + str(
            channel) + "/" + data_rate + "/" + address

        # Initialize limits
        self._max_velocity: float = 0.2
        self._min_duration: float = 1
        self._max_yaw_rotations: float = 1
        self._arena: Arena = Arena()

        # Event to asynchronously wait for the connection
        self._connect_event = threading.Event()

        # Initialize the crazyflie
        self._cf = Crazyflie(rw_cache='./cache')

        # Initialize the callbacks
        self._cf.connected.add_callback(self._connected)
        self._cf.disconnected.add_callback(self._disconnected)
        self._cf.connection_failed.add_callback(self._connection_failed)
        self._cf.connection_lost.add_callback(self._connection_lost)

        # Initialize events
        self.drone_lost = Caller()

        # Define the log configuration
        self._log_config_1 = LogConfig(name='DroneLog_1', period_in_ms=500)
        self._log_config_1.add_variable('kalman.varPX', 'float')
        self._log_config_1.add_variable('kalman.varPY', 'float')
        self._log_config_1.add_variable('kalman.varPZ', 'float')
        self._log_config_1.add_variable('pm.vbat', 'float')
        self._log_config_2 = LogConfig(name='DroneLog_2', period_in_ms=500)
        self._log_config_2.add_variable('kalman.stateX', 'float')
        self._log_config_2.add_variable('kalman.stateY', 'float')
        self._log_config_2.add_variable('kalman.stateZ', 'float')
        self._log_config_2.add_variable('stabilizer.yaw', 'float')
Beispiel #25
0
    def __init__(self, do_device_discovery=True):
        # TODO: Should be OS dependant
        self.inputdevice = PyGameReader()

        self.maxRPAngle = 0
        self.thrustDownSlew = 0
        self.thrustSlewEnabled = False
        self.slewEnableLimit = 0
        self.maxYawRate = 0
        self.detectAxis = False
        self.emergencyStop = False

        self.oldThrust = 0

        self._trim_roll = Config().get("trim_roll")
        self._trim_pitch = Config().get("trim_pitch")

        # TODO: The polling interval should be set from config file
        self.readTimer = PeriodicTimer(0.01, self.readInput)

        if do_device_discovery:
            self._discovery_timer = PeriodicTimer(1.0,
                                                  self._do_device_discovery)
            self._discovery_timer.start()

        self._available_devices = {}

        # Check if user config exists, otherwise copy files
        if not os.path.isdir(ConfigManager().configs_dir):
            logger.info("No user config found, copying dist files")
            os.makedirs(ConfigManager().configs_dir)
            for f in glob.glob(sys.path[0] +
                               "/cfclient/configs/input/[A-Za-z]*.json"):
                shutil.copy2(f, ConfigManager().configs_dir)

        ConfigManager().get_list_of_configs()

        self.input_updated = Caller()
        self.rp_trim_updated = Caller()
        self.emergency_stop_updated = Caller()
        self.device_discovery = Caller()
        self.device_error = Caller()
Beispiel #26
0
    def _clear_state(self):
        self.mems = []
        # Called when new memories have been added
        self.mem_added_cb = Caller()

        # Called to signal completion of read or write
        self.mem_read_cb = Caller()
        self.mem_read_failed_cb = Caller()
        self.mem_write_cb = Caller()
        self.mem_write_failed_cb = Caller()

        self._refresh_callback = None
        self._fetch_id = 0
        self.nbr_of_mems = 0
        self._ow_mem_fetch_index = 0
        self._elem_data = ()
        self._read_requests = {}
        self._write_requests = {}
        self._ow_mems_left_to_update = []
        self._getting_count = False
Beispiel #27
0
    def __init__(self, crazyflie):
        self.toc = Toc()

        self.cf = crazyflie
        self._useV2 = False
        self.param_update_callbacks = {}
        self.group_update_callbacks = {}
        self.all_update_callback = Caller()
        self.param_updater = None

        self.param_updater = _ParamUpdater(
            self.cf, self._useV2, self._param_updated, crazyflie.on_params_flushed)
        self.param_updater.start()

        self.cf.disconnected.add_callback(self._disconnected)

        self.all_updated = Caller()
        self.is_updated = False

        self.values = {}
Beispiel #28
0
    def __init__(self, name, period_in_ms):
        """Initialize the entry"""
        self.data_received_cb = Caller()
        self.error_cb = Caller()
        self.started_cb = Caller()
        self.added_cb = Caller()
        self.err_no = 0

        # These 3 variables are set by the log subsystem when the bock is added
        self.id = 0
        self.cf = None
        self.useV2 = False

        self.period = int(period_in_ms / 10)
        self.period_in_ms = period_in_ms
        self._added = False
        self._started = False
        self.valid = False
        self.variables = []
        self.default_fetch_as = []
        self.name = name
 def __init__(self):
     self.cf = None
     self.menu = None
     self.logConfigReader = None
     self.referenceHeight = 0.400
     self.hover_input_updated = Caller()
     self.useReferenceHeight = False
     self.inputType = 0
     self.inputTimer = 0.000
     self.sinewaveFrequency = 1.0  # 1s
     self.mainUI = None
     self.plotTab = None
     self.pose_logger = None
     self.connectivity_manager = None
     self.init_time = time.time()
Beispiel #30
0
    def setUp(self):
        self.cf_mock = MagicMock(spec=Crazyflie)

        self.log_config_mock = MagicMock(spec=LogConfig)
        self.log_config_mock.data_received_cb = Caller()

        self.log_mock = MagicMock(spec=Log)
        self.cf_mock.log = self.log_mock

        self.front_data = 2345
        self.back_data = 2345
        self.left_data = 123
        self.right_data = 5432
        self.up_data = 3456
        self.down_data = 1212
        self.log_data = {
            self.FRONT: self.front_data,
            self.BACK: self.back_data,
            self.LEFT: self.left_data,
            self.RIGHT: self.right_data,
            self.UP: self.up_data,
            self.DOWN: self.down_data,
        }