Пример #1
0
    def __init__(self):

        # Initialise the logging module with log messages directed to stdout
        #logging.basicConfig(format='%(asctime)s %(levelname)s FrameProcessor - %(message)s', level=logging.DEBUG)
        #ch = logging.StreamHandler(sys.stdout)
        #logging.addHandler(ch)

        # create logger
        self.logger = logging.getLogger('frame_processor')
        self.logger.setLevel(logging.DEBUG)
        
        # create console handler and set level to debug
        ch = logging.StreamHandler(sys.stdout)
        ch.setLevel(logging.DEBUG)
        
        # create formatter
        formatter = logging.Formatter('%(asctime)s %(levelname)s %(name)s - %(message)s')
        
        # add formatter to ch
        ch.setFormatter(formatter)
        
        # add ch to logger
        self.logger.addHandler(ch)

        # Instantiate a configuration container object, which will be populated
        # with sensible default values
        self.config = FrameProcessorConfig("FrameProcessor", "FrameProcessor - test harness to simulate operation of FrameProcessor application")
                
        # Create the appropriate IPC channels
        self.ctrl_channel = IpcChannel(IpcChannel.CHANNEL_TYPE_REQ)
        self.ready_channel = IpcChannel(IpcChannel.CHANNEL_TYPE_SUB)
        self.release_channel = IpcChannel(IpcChannel.CHANNEL_TYPE_PUB)
        
        # Map the shared buffer manager
        try:
            self.shared_buffer_manager = SharedBufferManager(self.config.sharedbuf, boost_mmap_mode=self.config.boost_mmap_mode)
        except SharedBufferManagerException as e:
            self.logger.error("Failed to create shared buffer manager: %s" % str(e))
            
        self.frame_decoder = PercivalEmulatorFrameDecoder(self.shared_buffer_manager)
        
        # Zero frames recevied counter
        self.frames_received = 0
        
        # Create the thread to handle frame processing
        self.frame_processor = threading.Thread(target=self.process_frames)
        self.frame_processor.daemon = True
    
        self._run = True
Пример #2
0
    def run(self):

        self.logger.info("Frame processor starting up")

        # Connect the IPC channels
        self.ctrl_channel.connect(self.config.ctrl_endpoint)
        self.ready_channel.connect(self.config.ready_endpoint)
        self.release_channel.connect(self.config.release_endpoint)

        # Ready channel subscribes to all topics
        self.ready_channel.subscribe(b'')

        # Map the shared buffer manager - quit if this fails
        if not self.map_shared_buffer():
            self._run = False
            return

        self.logger.info(
            "Mapped shared buffer manager ID %d with %d buffers of size %d" %
            (self.shared_buffer_manager.get_manager_id(),
             self.shared_buffer_manager.get_num_buffers(),
             self.shared_buffer_manager.get_buffer_size()))

        if self.config.sensortype == 'percivalemulator':
            self.frame_decoder = PercivalEmulatorFrameDecoder(
                self.shared_buffer_manager)
            self.logger.debug(
                'Loaded frame decoder for PERCIVAL emulator sensor type')
        elif self.config.sensortype == 'excalibur':
            self.frame_decoder = ExcaliburFrameDecoder(
                self.shared_buffer_manager)
            self.logger.debug('Loaded frame decoder for EXCALIBUR sensor type')
        else:
            self.frame_decoder = None
            self.logger.error("Unrecognised sensor type specified: %s" %
                              self.config.sensortype)
            return

        # Launch the frame processing thread
        self.frame_processor.start()

        try:
            while self._run:

                if self.config.frames and self.frames_received >= self.config.frames:
                    self.logger.info(
                        "Specified number of frames (%d) received, terminating"
                        % self.config.frames)
                    self._run = False
                else:
                    msg = IpcMessage(msg_type='cmd', msg_val='status')
                    #self.logger.debug("Sending status command message")
                    self.ctrl_channel.send(msg.encode())

                    reply = self.ctrl_channel.recv()
                    reply_decoded = IpcMessage(from_str=reply)

                    #self.logger.debug("Got reply, msg_type = " + reply_decoded.get_msg_type() + " val = " + reply_decoded.get_msg_val())
                    time.sleep(1)

        except KeyboardInterrupt:

            self.logger.info("Got interrupt, terminating")
            self._run = False

        self.frame_processor.join()
        self.logger.info("Frame processor shutting down")