www.gusucode.com > robotsimulink 工具箱 matlab源码程序 > robotsimulink/robotslros/+robotics/+slros/+internal/+cgen/ROSModelInfo.m

    classdef ROSModelInfo
    %This class is for internal use only. It may be removed in the future.
    
    %  ROSModelInfo is a utility class that encapsulates information about
    %  ROS blocks in a Simulink model.
    %
    %  See also: cgen.ROSBlockInfo
    
    %   Copyright 2014-2016 The MathWorks, Inc.
    
    properties(SetAccess=private)
        %Model - Name of Simulink model
        Model
        
        %LibraryBlocks - List of ROS publish, subscribe, and blank message blocks in the model
        LibraryBlocks
        
        %ParameterBlocks - List of ROS get / set parameter blocks
        ParameterBlocks
        
        % List of top-level message types in the model (i.e., the
        % message types used in Subscribe, Publish and Blank Message
        % blocks). This list may have duplicates, and it *does not* include
        % nested message types.
        TopLevelMsgTypes
        
        % The name of the ROS node corresponding to the Simulink model
        NodeName
        
        % Info about Subscribe blocks in model (list of cgen.ROSMessageBlockInfo objects)
        SubscriberList = robotics.slros.internal.cgen.ROSMessageBlockInfo.empty
        
        % Info about Publish blocks in model (list of cgen.ROSMessageBlockInfo objects)
        PublisherList = robotics.slros.internal.cgen.ROSMessageBlockInfo.empty
        
        %ParameterGetterList - Info about Get Parameter blocks in model
        %   This is a list of cgen.ROSParameterBlockInfo objects.
        ParameterGetterList = robotics.slros.internal.cgen.ROSParameterBlockInfo.empty
        
        %ParameterSetterList - Info about Set Parameter blocks in model
        %   This is a list of cgen.ROSParameterBlockInfo objects.
        ParameterSetterList = robotics.slros.internal.cgen.ROSParameterBlockInfo.empty        
    end
    
    %%
    methods
        function obj= ROSModelInfo(model)
            obj.Model = model;
            obj.NodeName = model;
            
            [obj.LibraryBlocks, obj.ParameterBlocks, obj.TopLevelMsgTypes] = ...
                robotics.slros.internal.bus.Util.getROSBlocksInModel(model);
            obj = getInfoFromROSBlocks(obj);
        end
        
        function msgTypes = getMessageTypesInModel(obj)
            % returns the unique top-level message types in model
            msgTypes = unique( obj.TopLevelMsgTypes);
        end
    end
    
    %%
    methods(Access=private)
        
        function obj = getInfoFromROSBlocks(obj)
            obj.NodeName = obj.Model;
            [obj.SubscriberList, obj.PublisherList] = ...
                obj.getInfoFromPubSubBlocks;
            [obj.ParameterGetterList, obj.ParameterSetterList] = ...
                obj.getInfoFromParameterBlocks;
        end
        
        function [subList, pubList] = getInfoFromPubSubBlocks(obj)
            %getInfoFromPubSubBlocks Iterate over blocks and extract information from pub/sub blocks
            
            subList = [];
            pubList = [];
            
            for i=1:numel(obj.LibraryBlocks)
                block = obj.LibraryBlocks{i};
                maskType = get_param(block, 'MaskType');
                if strcmpi(maskType, 'ROS Blank Message')
                    continue;
                end
                
                switch lower(maskType)
                    case 'ros publish'
                        sysObjBlock = [block '/SinkBlock'];
                    case 'ros subscribe'
                        sysObjBlock = [block '/SourceBlock'];
                        
                    otherwise
                        assert(false, sprintf('Unexpected mask type %s for block %s', ...
                            maskType, block));
                end
                
                s = robotics.slros.internal.cgen.ROSMessageBlockInfo;
                s.MsgType = get_param(block, 'messageType');
                s.SlBusName = get_param(sysObjBlock, 'SLBusName');
                s.Label = get_param(sysObjBlock, 'BlockId');
                s.Comment = sprintf('For Block %s', block);
                s.CppRosType = robotics.slros.internal.cgen.Util.rosMsgTypeToCppClass(s.MsgType);
                
                % consistency check
                expectedBusName = ...
                    robotics.slros.internal.bus.Util.rosMsgTypeToBusName(s.MsgType, obj.Model);
                assert(strcmpi(s.SlBusName, expectedBusName), ...
                    sprintf('Mismatch: %s, %s', s.SlBusName, expectedBusName));
                
                switch lower(maskType)
                    case 'ros publish'
                        pubList = [pubList s]; %#ok<AGROW>
                    case 'ros subscribe'
                        subList = [subList s]; %#ok<AGROW>
                end
                
            end
        end
        
        function [paramGetList, paramSetList] = getInfoFromParameterBlocks(obj)
            %getInfoFromParameterBlocks Iterate over blocks and extract information from parameter blocks
            
            paramGetList = [];
            paramSetList = [];
            
            for i = 1:numel(obj.ParameterBlocks)
                block = obj.ParameterBlocks{i};
                s = robotics.slros.internal.cgen.ROSParameterBlockInfo;
                
                s.ParamType = get_param(block, 'ParameterType');
                s.Label = get_param(block, 'BlockId');
                s.Comment = sprintf('For Block %s', block);
                
                % Convert from Simulink to C++ type
                s.CppParamType = robotics.slros.internal.sim.DataTypes.simulinkToCpp(s.ParamType);
                
                % Convert from Simulink to ROS C++ type
                parameterType = get_param(block, 'ParameterType');
                
                % Decide if this type corresponds to an array or a scalar
                % parameter.
                s.IsArray = ~robotics.slros.internal.sim.DataTypes.isSimulinkDataTypeScalar(parameterType);
                
                s.ROSCppParamType = robotics.slros.internal.sim.DataTypes.simulinkToROSCpp(s.ParamType, s.IsArray);
                
                maskType = get_param(block, 'MaskType');
                switch lower(maskType)
                    case 'ros get parameter'
                        paramGetList = [paramGetList s]; %#ok<AGROW>
                    case 'ros set parameter'
                        paramSetList = [paramSetList s]; %#ok<AGROW>
                end
            end
        end
        
    end
    
end