Check for new messages on sockets and respond accordingly.


        .. versionchanged:: 0.11.3
            Update routes table by setting ``df_routes`` property of
            :attr:`parent.canvas_slave`.

        .. versionchanged:: 0.12
            Update ``dynamic_electrode_state_shapes`` layer of
            :attr:`parent.canvas_slave` when dynamic electrode actuation states
            change.

        .. versionchanged:: 0.13
            Update local global, electrode, and route command lists in response
            to ``microdrop.command_plugin`` messages.

def check_sockets(self):
        '''
        Check for new messages on sockets and respond accordingly.


        .. versionchanged:: 0.11.3
            Update routes table by setting ``df_routes`` property of
            :attr:`parent.canvas_slave`.

        .. versionchanged:: 0.12
            Update ``dynamic_electrode_state_shapes`` layer of
            :attr:`parent.canvas_slave` when dynamic electrode actuation states
            change.

        .. versionchanged:: 0.13
            Update local global, electrode, and route command lists in response
            to ``microdrop.command_plugin`` messages.
        '''
        try:
            msg_frames = (self.command_socket
                          .recv_multipart(zmq.NOBLOCK))
        except zmq.Again:
            pass
        else:
            self.on_command_recv(msg_frames)

        try:
            msg_frames = (self.subscribe_socket
                          .recv_multipart(zmq.NOBLOCK))
            source, target, msg_type, msg_json = msg_frames

            if ((source == 'microdrop.device_info_plugin') and
                (msg_type == 'execute_reply')):
                msg = json.loads(msg_json)
                if msg['content']['command'] == 'get_device':
                    data = decode_content_data(msg)
                    if data is not None:
                        self.parent.on_device_loaded(data)
            elif ((source == 'microdrop.electrode_controller_plugin') and
                (msg_type == 'execute_reply')):
                msg = json.loads(msg_json)
                if msg['content']['command'] in ('set_electrode_state',
                                                 'set_electrode_states'):
                    data = decode_content_data(msg)
                    if data is None:
                        print msg
                    else:
                        #self.emit('electrode-states-updated', data)
                        self.parent.on_electrode_states_updated(data)
                elif msg['content']['command'] == 'get_channel_states':
                    data = decode_content_data(msg)
                    if data is None:
                        print msg
                    else:
                        #self.emit('electrode-states-set', data)
                        self.parent.on_electrode_states_set(data)
            elif ((source == 'droplet_planning_plugin') and
                  (msg_type == 'execute_reply')):
                msg = json.loads(msg_json)
                if msg['content']['command'] in ('add_route', ):
                    self.execute_async('droplet_planning_plugin',
                                       'get_routes')
                elif msg['content']['command'] in ('get_routes', ):
                    data = decode_content_data(msg)
                    self.parent.canvas_slave.df_routes = data
            elif ((source == 'microdrop.command_plugin') and
                  (msg_type == 'execute_reply')):
                msg = json.loads(msg_json)

                if msg['content']['command'] in ('get_commands',
                                                 'unregister_command',
                                                 'register_command'):
                    df_commands = decode_content_data(msg).set_index('namespace')

                    for group_i, df_i in df_commands.groupby('namespace'):
                        register = getattr(self.parent.canvas_slave,
                                           'register_%s_command' % group_i,
                                           None)
                        if register is None:
                            continue
                        else:
                            for j, command_ij in df_i.iterrows():
                                register(command_ij.command_name,
                                         title=command_ij.title,
                                         group=command_ij.plugin_name)
                                _L().debug('registered %s command: `%s`',
                                           group_i, command_ij)
            else:
                self.most_recent = msg_json
        except zmq.Again:
            pass
        except:
            logger.error('Error processing message from subscription '
                         'socket.', exc_info=True)

        return True