コード例 #1
0
ファイル: test_transport.py プロジェクト: PX4-Works/pyuavcan
    def test_multiple_bytes(self):
        bits = transport.bits_from_bytes(bytearray("\x00\xFF"))
        self.assertEqual(bits, "0000000011111111")

        bits = transport.bits_from_bytes(bytearray("\xFF\x00"))
        self.assertEqual(bits, "1111111100000000")

        bits = transport.bits_from_bytes(bytearray("\x00\x00\xAA\x55\xFF\xFF"))
        self.assertEqual(
            bits, "000000000000000010101010010101011111111111111111")
コード例 #2
0
    def test_multiple_bytes(self):
        bits = transport.bits_from_bytes(bytearray(b"\x00\xFF"))
        self.assertEqual(bits, "0000000011111111")

        bits = transport.bits_from_bytes(bytearray(b"\xFF\x00"))
        self.assertEqual(bits, "1111111100000000")

        bits = transport.bits_from_bytes(bytearray(b"\x00\x00\xAA\x55\xFF\xFF"))
        self.assertEqual(
            bits, "000000000000000010101010010101011111111111111111")
コード例 #3
0
ファイル: test_transport.py プロジェクト: PX4-Works/pyuavcan
    def test_single_byte(self):
        bits = transport.bits_from_bytes(bytearray("\x00"))
        self.assertEqual(bits, "00000000")

        bits = transport.bits_from_bytes(bytearray("\xA5"))
        self.assertEqual(bits, "10100101")

        bits = transport.bits_from_bytes(bytearray("\xFF"))
        self.assertEqual(bits, "11111111")

        bits = transport.bits_from_bytes(bytearray("\x0F"))
        self.assertEqual(bits, "00001111")

        bits = transport.bits_from_bytes(bytearray("\xF0"))
        self.assertEqual(bits, "11110000")
コード例 #4
0
    def test_single_byte(self):
        bits = transport.bits_from_bytes(bytearray(b"\x00"))
        self.assertEqual(bits, "00000000")

        bits = transport.bits_from_bytes(bytearray(b"\xA5"))
        self.assertEqual(bits, "10100101")

        bits = transport.bits_from_bytes(bytearray(b"\xFF"))
        self.assertEqual(bits, "11111111")

        bits = transport.bits_from_bytes(bytearray(b"\x0F"))
        self.assertEqual(bits, "00001111")

        bits = transport.bits_from_bytes(bytearray(b"\xF0"))
        self.assertEqual(bits, "11110000")
コード例 #5
0
    def _recv_frame(self, dev, message):
        frame_id, frame_data, ext_id = message
        if not ext_id:
            return

        frame = transport.Frame(frame_id, frame_data)
        # logging.debug("Node._recv_frame(): got {0!s}".format(frame))

        transfer_frames = self.transfer_manager.receive_frame(frame)
        if not transfer_frames:
            return

        dtid = transfer_frames[0].data_type_id
        if transfer_frames[0].transfer_priority == \
                transport.TransferPriority.SERVICE:
            kind = dsdl.parser.CompoundType.KIND_SERVICE
        else:
            kind = dsdl.parser.CompoundType.KIND_MESSAGE
        datatype = uavcan.DATATYPES.get((dtid, kind))
        if not datatype:
            logging.debug(("Node._recv_frame(): unrecognised data type " +
                           "ID {0:d} for kind {1:d}").format(dtid, kind))
            return

        transfer = transport.Transfer()
        transfer.from_frames(transfer_frames, datatype_crc=datatype.base_crc)

        if transfer.is_message():
            payload = datatype()  # Broadcast or unicast
        elif transfer.is_request():
            payload = datatype(mode="request")
        else:  # transfer.is_response()
            payload = datatype(mode="response")

        payload.unpack(transport.bits_from_bytes(transfer.payload))

        logging.info("Node._recv_frame(): received {0!r}".format(payload))

        # If it's a node info request, keep track of the status of each node
        if payload.type == uavcan.protocol.NodeStatus:
            self.node_info[transfer.source_node_id] = {
                "uptime": payload.uptime_sec,
                "status": payload.status_code,
                "timestamp": time.time()
            }

        if transfer.is_response() and transfer.dest_node_id == self.node_id:
            # This is a reply to a request we sent. Look up the original
            # request and call the appropriate callback
            requests = self.outstanding_requests.keys()
            for key in requests:
                if transfer.is_response_to(self.outstanding_requests[key]):
                    # Call the request's callback and remove it from the
                    # active list
                    if key in self.outstanding_request_callbacks:
                        self.outstanding_request_callbacks[key]((payload, transfer))
                        del self.outstanding_request_callbacks[key]
                    del self.outstanding_requests[key]
                    del self.outstanding_request_timestamps[key]
                    break
        elif transfer.is_broadcast() or transfer.dest_node_id == self.node_id:
            # This is a request, a unicast or a broadcast; look up the
            # appropriate handler by data type ID
            for handler in self.handlers:
                if handler[0] == datatype:
                    kwargs = handler[2] if len(handler) == 3 else {}
                    h = handler[1](payload, transfer, self, **kwargs)
                    h._execute()
コード例 #6
0
ファイル: test_transport.py プロジェクト: PX4-Works/pyuavcan
 def test_empty(self):
     bits = transport.bits_from_bytes(bytearray(""))
     self.assertEqual(bits, "")
コード例 #7
0
 def test_empty(self):
     bits = transport.bits_from_bytes(bytearray(b""))
     self.assertEqual(bits, "")
コード例 #8
0
ファイル: node.py プロジェクト: PX4-Works/pyuavcan
    def _recv_frame(self, dev, message):
        frame_id, frame_data, ext_id = message
        if not ext_id:
            return

        frame = transport.Frame(frame_id, frame_data)
        # logging.debug("Node._recv_frame(): got {0!s}".format(frame))

        transfer_frames = self.transfer_manager.receive_frame(frame)
        if not transfer_frames:
            return

        dtid = transfer_frames[0].data_type_id
        if transfer_frames[0].transfer_priority == \
                transport.TransferPriority.SERVICE:
            kind = dsdl.parser.CompoundType.KIND_SERVICE
        else:
            kind = dsdl.parser.CompoundType.KIND_MESSAGE
        datatype = uavcan.DATATYPES.get((dtid, kind))
        if not datatype:
            logging.debug(("Node._recv_frame(): unrecognised data type " +
                           "ID {0:d} for kind {1:d}").format(dtid, kind))
            return

        transfer = transport.Transfer()
        transfer.from_frames(transfer_frames, datatype_crc=datatype.base_crc)

        if transfer.is_message():
            payload = datatype()  # Broadcast or unicast
        elif transfer.is_request():
            payload = datatype(mode="request")
        else:  # transfer.is_response()
            payload = datatype(mode="response")

        payload.unpack(transport.bits_from_bytes(transfer.payload))

        # If it's a node info request, keep track of the status of each node
        if payload.type == uavcan.protocol.NodeStatus:
            self.node_info[transfer.source_node_id] = {
                "uptime": payload.uptime_sec,
                "status": payload.status_code,
                "timestamp": time.time()
            }
            logging.debug(
                "Node._recv_frame(): got node info {0!r}".format(
                self.node_info[transfer.source_node_id]))

        if transfer.is_response() and transfer.dest_node_id == self.node_id:
            # This is a reply to a request we sent. Look up the original
            # request and call the appropriate callback
            requests = self.outstanding_requests.keys()
            for key in requests:
                if transfer.is_response_to(self.outstanding_requests[key]):
                    # Call the request's callback and remove it from the
                    # active list
                    if key in self.outstanding_request_callbacks:
                        self.outstanding_request_callbacks[key]((payload, transfer))
                        del self.outstanding_request_callbacks[key]
                    del self.outstanding_requests[key]
                    del self.outstanding_request_timestamps[key]
                    break
        elif transfer.is_broadcast() or transfer.dest_node_id == self.node_id:
            # This is a request, a unicast or a broadcast; look up the
            # appropriate handler by data type ID
            for handler in self.handlers:
                if handler[0] == datatype:
                    kwargs = handler[2] if len(handler) == 3 else {}
                    h = handler[1](payload, transfer, self, **kwargs)
                    h._execute()