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")
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")
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")
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")
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()
def test_empty(self): bits = transport.bits_from_bytes(bytearray("")) self.assertEqual(bits, "")
def test_empty(self): bits = transport.bits_from_bytes(bytearray(b"")) self.assertEqual(bits, "")
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()