예제 #1
0
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
예제 #2
0
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'
예제 #3
0
    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
예제 #4
0
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'
예제 #5
0
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''
예제 #6
0
    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
예제 #7
0
    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
예제 #8
0
    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)
예제 #9
0
    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)
예제 #10
0
    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)
예제 #11
0
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))