www.gusucode.com > vnt工具箱matlab源码程序 > vnt/vntblks/vntmasks/private/privatecanslconvertmsgs.m

    function msgStruct = privatecanslconvertmsgs(canMsgObject)
%PRIVATECANSLCONVERTMSGS Converts messages from message objects to structure.
%
%    MSGSTRUCT = PRIVATECANSLCONVERTMSGS(CANMSGOBJECT) Converts CAN messages
%    from message objects, CANMSGOBJECT, to MATLAB structure of arrays, 
%    MSGSTRUCT, as required by Simulink Replay block. 
%
%    CANMSGOBJECT: A valid can.Message object(s). 
%    MSGSTRUCT: CAN Message structure with the following fields.
%    1. ID:         Array of unsigned 8-bit integers (UINT8)
%    2. EXTENDED:   Array of unsigned 8-bit integers (UINT8)
%    3. ID:         Array of unsigned 32-bit integers (UINT32)
%    4. REMOTE:     Array of unsigned 8-bit integers (UINT8)
%    5. ERROR:      Array of unsigned 8-bit integers (UINT8)
%    6. TIMESTAMP:  Array of doubles
%    7. ID:         Array of unsigned 8-bit integers (Row major)

%    SS 03-01-11
%    Copyright 2011-2015 The MathWorks, Inc.

% Check the argument count.
narginchk(1,1);

% Check the object validity.
if ~isa(canMsgObject, 'can.Message') || ~all(isvalid(canMsgObject))
    error(message('vnt:Message:InvalidMessageObject'));   
end

% Create the required structure.
nMsgs = length(canMsgObject);
idField = uint32(zeros(1,nMsgs));
extendedField = uint8(zeros(1,nMsgs));
lengthField = uint8(zeros(1,nMsgs));
remoteField = uint8(zeros(1,nMsgs));
errorField = uint8(zeros(1,nMsgs));
timestampField = zeros(1,nMsgs);
maxCANMessageLength = 8;
dataField = uint8(zeros(maxCANMessageLength,nMsgs));

% Get the array of structures.
tempStruct = [canMsgObject(:).PrivateRawStruct];

% Copy fields to individual arrays.
[idField(:)] = [tempStruct(:).ID];
[extendedField(:)] = [tempStruct(:).Extended];
[remoteField(:)] = [tempStruct(:).Remote];
[errorField(:)] = [tempStruct(:).Error];
[timestampField(:)] = [tempStruct(:).Timestamp];

% Loop to copy data.
for idx = 1:nMsgs
    currentData = tempStruct(idx).Data;
    dataLength = length(currentData);
    lengthField(idx) = dataLength;
    if (dataLength~=0) % Only copy when data exists.
        dataField(1:dataLength,idx) = currentData';
    end
end

% Copy data to structure.
msgStruct = struct('ID', idField, ...
                   'Extended', extendedField, ...
                   'Length', lengthField, ...
                   'Remote', remoteField, ...
                   'Error', errorField, ...
                   'Timestamp', timestampField, ...
                   'Data', dataField);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%