def test_iterate_frames_with_multiple_frames(): payload = b'\x00\x00\x00\x00\x00\x00\x00\x00' empty_bytes = b'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x04\x05\x00' + payload (empty_frame, ) = list(_frames.iterate_frames(empty_bytes)) payload = b'\x01\x02\x03\x04\x05\x06\x07\x08' base_bytes = b'\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x08\x09\x08' + payload (base_frame, ) = list(_frames.iterate_frames(base_bytes)) multi_frame = empty_bytes + base_bytes (empty_frame_2, base_frame_2) = list(_frames.iterate_frames(multi_frame)) assert empty_frame == empty_frame_2 assert base_frame == base_frame_2
def test_iterate_frames_with_partial_base_payload(): frame_bytes = b'\xd8\xb7@B\xeb\xff\xd2\x01\x00\x00\x00\x00\x00\x00\x00\x04\x02\x04\x08\x10\x00\x00\x00\x00' (frame, ) = list(_frames.iterate_frames(frame_bytes)) assert repr( frame ) == 'RawFrame(timestamp=0x1d2ffeb4240b7d8, identifier=0x0, type=FrameType.CAN_DATA, len(payload)=4)' # NOQA: E501 assert frame.payload == b'\x02\x04\x08\x10'
def read_raw(self, number_to_read, timeout=constants.TIMEOUT_NONE): """Read raw CAN frames. Args: number_to_read: An integer repesenting the number of raw CAN frames to read. timeout: The time to wait for number to read frames to become available; the 'timeout' is represented as 64-bit floating-point in units of seconds. If 'timeout' is positive, this function waits for 'number_to_read' frames to be received, then returns complete frames up to that number. If the frames do not arrive prior to the 'timeout', an error is returned. If 'timeout' is 'constants.TIMEOUT_INFINITE', this function waits indefinitely for 'number_to_read' frames. If 'timeout' is 'constants.TIMEOUT_NONE', this function does not wait and immediately returns all available frames up to the limit 'number_to_read' specifies. Yields: :any:`nixnet.types.RawFrame` """ # NOTE: If the frame payload excedes the base unit, this will return # less than number_to_read number_of_bytes_to_read = number_to_read * _frames.nxFrameFixed_t.size buffer = self.read_bytes(number_of_bytes_to_read, timeout) for frame in _frames.iterate_frames(buffer): yield frame
def test_iterate_frames_with_base_payload(): payload = b'\x01\x02\x03\x04\x05\x06\x07\x08' base_bytes = b'\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x08\x09\x08' + payload (base_frame, ) = list(_frames.iterate_frames(base_bytes)) assert repr( base_frame ) == 'RawFrame(timestamp=0x6, identifier=0x7, type=FrameType.CAN_DATA, flags=0x8, info=0x9, len(payload)=8)' # NOQA: E501 assert base_frame.payload == b'\x01\x02\x03\x04\x05\x06\x07\x08'
def test_iterate_frames_with_empty_payload(): payload = b'\x00\x00\x00\x00\x00\x00\x00\x00' empty_bytes = b'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x04\x05\x00' + payload (empty_frame, ) = list(_frames.iterate_frames(empty_bytes)) assert repr( empty_frame ) == 'RawFrame(timestamp=0x1, identifier=0x2, type=FrameType.CAN_DATA, flags=0x4, info=0x5)' assert empty_frame.payload == b''
def read_raw(self): """Read raw CAN frames. Yields: :any:`nixnet.types.RawFrame` """ # NOTE: If the frame payload exceeds the base unit, this will return # less than number_to_read number_to_read = len(self) number_of_bytes_to_read = number_to_read * _frames.nxFrameFixed_t.size buffer = self.read_bytes(number_of_bytes_to_read) for frame in _frames.iterate_frames(buffer): yield frame
def read_raw(self, number_to_read, timeout=constants.TIMEOUT_NONE): """Read frames. Valid modes - Frame Input Stream Mode - Frame Input Queued Mode - Frame Input Single-Point Mode Frame: one or more http://zone.ni.com/reference/en-XX/help/372841N-01/nixnet/nxreadframe/ """ # NOTE: If the frame payload excedes the base unit, this will return # less than number_to_read number_of_bytes_to_read = number_to_read * _frames.nxFrameFixed_t.size buffer = self.read_bytes(number_of_bytes_to_read, timeout) for frame in _frames.iterate_frames(buffer): yield frame
def read( self, frame_type=types.XnetFrame): # type: (typing.Type[types.FrameFactory]) -> typing.Iterable[types.Frame] """Read frames. Args: frame_type(:any:`nixnet.types.FrameFactory`): A factory for the desired frame formats. Yields: :any:`nixnet.types.Frame` """ from_raw = typing.cast(typing.Callable[[types.RawFrame], types.Frame], frame_type.from_raw) # NOTE: If the frame payload exceeds the base unit, this will return # less than num_frames num_frames = len(self) num_bytes = num_frames * _frames.nxFrameFixed_t.size buffer = self.read_bytes(num_bytes) for frame in _frames.iterate_frames(buffer): yield from_raw(frame)
def convert_signals_to_frames(self, signals, frame_type=types.XnetFrame): # type: (typing.Iterable[float], typing.Type[types.FrameFactory]) -> typing.Iterable[types.Frame] """Convert signals to frames. The signal values written to the ``signals`` array are written to a raw frame buffer array. For each frame included in the session, one frame is generated in the array that contains the signal values. Signals not present in the session are written as their respective default values; empty space in the frames that signals do not occupy is written with the frame's default payload. The frame header values are filled with appropriate values so that this function's output can be directly written to a Frame Output session. Args: signals(list of float): Values corresponding to signals configured in this session. frame_type(:any:`nixnet.types.FrameFactory`): A factory for the desired frame formats. Yields: :any:`nixnet.types.Frame` """ from_raw = typing.cast(typing.Callable[[types.RawFrame], types.Frame], frame_type.from_raw) # Unlike some session reads, this should be safe from asking to read too much. num_frames_to_read = 5 while True: try: num_bytes_to_read = num_frames_to_read * _frames.nxFrameFixed_t.size buffer = self._convert_signals_to_bytes( signals, num_bytes_to_read) break except errors.XnetError as e: if e.error_type == constants.Err.BUFFER_TOO_SMALL: num_bytes_to_read *= 2 else: raise for frame in _frames.iterate_frames(buffer): yield from_raw(frame)
def read( self, num_frames, timeout=constants.TIMEOUT_NONE, frame_type=types.XnetFrame): # type: (int, float, typing.Type[types.FrameFactory]) -> typing.Iterable[types.Frame] """Read frames. Args: num_frames(int): Number of frames to read. timeout(float): The time in seconds to wait for number to read frame bytes to become available. If 'timeout' is positive, this function waits for 'num_frames' frames to be received, then returns complete frames up to that number. If the frames do not arrive prior to the 'timeout', an error is returned. If 'timeout' is 'constants.TIMEOUT_INFINITE', this function waits indefinitely for 'num_frames' frames. If 'timeout' is 'constants.TIMEOUT_NONE', this function does not wait and immediately returns all available frames up to the limit 'num_frames' specifies. frame_type(:any:`nixnet.types.FrameFactory`): A factory for the desired frame formats. Yields: :any:`nixnet.types.Frame` """ from_raw = typing.cast(typing.Callable[[types.RawFrame], types.Frame], frame_type.from_raw) # NOTE: If the frame payload exceeds the base unit, this will return # less than num_frames num_bytes = num_frames * _frames.nxFrameFixed_t.size buffer = self.read_bytes(num_bytes, timeout) for frame in _frames.iterate_frames(buffer): yield from_raw(frame)
def test_iterate_frames_corrupted_frame(): empty_bytes = b'\x01\x00\x00\x00\x00\x00\x00' with pytest.raises(errors.XnetError): list(_frames.iterate_frames(empty_bytes))