예제 #1
0
    def process_frames(self):

        self.frame_header = Struct('<LLQQL')

        while self._run:

            if (self.ready_channel.poll(100)):

                ready_msg = self.ready_channel.recv()
                ready_decoded = IpcMessage(from_str=ready_msg)

                if ready_decoded.get_msg_type(
                ) == 'notify' and ready_decoded.get_msg_val() == 'frame_ready':

                    frame_number = ready_decoded.get_param('frame')
                    buffer_id = ready_decoded.get_param('buffer_id')
                    self.logger.debug(
                        "Got frame ready notification for frame %d buffer ID %d"
                        % (frame_number, buffer_id))

                    if not self.config.bypass_mode:
                        self.handle_frame(frame_number, buffer_id)

                    release_msg = IpcMessage(msg_type='notify',
                                             msg_val='frame_release')
                    release_msg.set_param('frame', frame_number)
                    release_msg.set_param('buffer_id', buffer_id)
                    self.release_channel.send(release_msg.encode())

                    self.frames_received += 1

                elif ready_decoded.get_msg_type(
                ) == 'notify' and ready_decoded.get_msg_val(
                ) == 'buffer_config':

                    shared_buffer_name = ready_decoded.get_param(
                        'shared_buffer_name')
                    self.logger.debug(
                        'Got shared buffer config notification with name %s' %
                        (shared_buffer_name))

                else:

                    self.logger.error(
                        "Got unexpected message on ready notification channel: %s"
                        % (ready_decoded))

        self.logger.info("Frame processing thread interrupted, terminating")
예제 #2
0
    def _send_message(self, msg, timeout):
        msg.set_msg_id(self.message_id)
        self.message_id = (self.message_id + 1) % self.MESSAGE_ID_MAX
        self.logger.debug("Sending control message:\n%s", msg.encode())
        with self._lock:
            self.ctrl_channel.send(msg.encode())
            expected_id = msg.get_msg_id()
            id = None
            while not id == expected_id:
                pollevts = self.ctrl_channel.poll(timeout)

                if pollevts == zmq.POLLIN:
                    reply = IpcMessage(from_str=self.ctrl_channel.recv())
                    id = reply.get_msg_id()
                    if not id == expected_id:
                        self.logger.warn("Dropping reply message with id [" +
                                         str(id) + "] as was expecting [" +
                                         str(expected_id) + "]")
                        continue
                    if reply.is_valid() and reply.get_msg_type(
                    ) == IpcMessage.ACK:
                        self.logger.debug("Request successful: %s", reply)
                        return True, reply.attrs
                    else:
                        self.logger.debug("Request unsuccessful")
                        return False, reply.attrs
                else:
                    self.logger.warning("Received no response")
                    return False, None
예제 #3
0
def test_valid_ipc_msg_from_string():

    # Instantiate a valid message from a JSON string

    json_str = """
                {\"msg_type\":\"cmd\",
                \"msg_val\":\"status\",
                \"timestamp\" : \"2015-01-27T15:26:01.123456\",
                \"id\":322,
                \"params\" : {
                    \"paramInt\" : 1234,
                    \"paramStr\" : \"testParam\",
                    \"paramDouble\" : 3.1415
                  }
                }

             """

    # Instantiate a valid message from the JSON string
    the_msg = IpcMessage(from_str=json_str)

    # Check the message is indeed valid
    assert_true(the_msg.is_valid())

    # Check that all attributes are as expected
    assert_equals(the_msg.get_msg_type(), "cmd")
    assert_equals(the_msg.get_msg_val(), "status")
    assert_equals(the_msg.get_msg_timestamp(), "2015-01-27T15:26:01.123456")
    assert_equals(the_msg.get_msg_id(), 322)

    # Check that all parameters are as expected
    assert_equals(the_msg.get_param("paramInt"), 1234)
    assert_equals(the_msg.get_param("paramStr"), "testParam")
    assert_equals(the_msg.get_param("paramDouble"), 3.1415)

    # Check valid message throws an exception on missing parameter
    with assert_raises(IpcMessageException) as cm:
         missingParam = the_msg.get_param("missingParam")
    ex = cm.exception
    assert_equals(ex.msg, 'Missing parameter missingParam')

    # Check valid message can fall back to default value if parameter missing
    defaultParamValue = 90210
    assert_equals(the_msg.get_param("missingParam", defaultParamValue), defaultParamValue)
예제 #4
0
def test_round_trip_from_empty_msg():

    # Instantiate an empty message
    the_msg = IpcMessage()

    # Set the message type and value
    msg_type = "cmd"
    the_msg.set_msg_type(msg_type)
    msg_val = "reset"
    the_msg.set_msg_val(msg_val)
    msg_id = 61616
    the_msg.set_msg_id(msg_id)

     # Define and set some parameters
    paramInt1 = 1234;
    paramInt2 = 901201;
    paramInt3 = 4567;
    paramStr = "paramString"

    the_msg.set_param('paramInt1', paramInt1)
    the_msg.set_param('paramInt2', paramInt2)
    the_msg.set_param('paramInt3', paramInt3)
    the_msg.set_param('paramStr',  paramStr)

    # Retrieve the encoded version
    the_msg_encoded = the_msg.encode()

    # Create another message from the encoded version
    msg_from_encoded = IpcMessage(from_str=the_msg_encoded)

    # Validate the contents of all attributes and parameters of the new message
    assert_equal(msg_from_encoded.get_msg_type(), msg_type)
    assert_equal(msg_from_encoded.get_msg_val(),  msg_val)
    assert_equal(msg_from_encoded.get_msg_timestamp(), the_msg.get_msg_timestamp())
    assert_equal(msg_from_encoded.get_msg_id(), the_msg.get_msg_id())
    assert_equal(msg_from_encoded.get_param('paramInt1'), paramInt1)
    assert_equal(msg_from_encoded.get_param('paramInt2'), paramInt2)
    assert_equal(msg_from_encoded.get_param('paramInt3'), paramInt3)
    assert_equal(msg_from_encoded.get_param('paramStr'), paramStr)