⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbc_rfcomms_client.m

📁 simulink real-time workshop for dragon12 development board from
💻 M
字号:
function [buf_sizestr, RXTXmodestr, RFchannelstr, clientstr, serverAddressstr, clientAddressstr, channelstr, data_type_str, sampletime_str] = ...
          mbc_rfComms_client(sampletime, RXTXmode, RFchannel, clientNum, serverAddress, clientAddress, channel, buf_size, data_type, format, outformat)

MAX_RFCOM_CHANNELS = 127;
MAX_RFCOM_USERCHANNELS = 10;        % 10 channels per client
MAX_BUF_SIZE = 32;

% inactivate link to library...
if(~strcmp(get_param(gcb, 'LinkStatus'), 'inactive'))
	set_param(gcb,'LinkStatus','inactive')
end


% check server address
if( (strcmp(serverAddress(1:2), '0x') == 1) & (length(serverAddress) == 10) )
    
    % general format is ok
    if(~any(setdiff(serverAddress(3:end), ['0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'a' 'b' 'c' 'd' 'e' 'f' 'A' 'B' 'C' 'D' 'E' 'F'])))

        % accept server address
        serverAddressstr = serverAddress;
        
    else
        
        % found illegal characters
    	fprintf ('rfComms_server: Inadmissible server address (not a hexadecimal number).\n');
        
    end
        
else
    
    % overall format not correct
   	fprintf ('rfComms_server: Inadmissible server address (length, might not start with ''0x''.\n');
    
end
    
% check client address
if( (strcmp(clientAddress(1:2), '0x') == 1) & (length(clientAddress) == 10) )
    
    % general format is ok
    if(~any(setdiff(clientAddress(3:end), ['0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'a' 'b' 'c' 'd' 'e' 'f' 'A' 'B' 'C' 'D' 'E' 'F'])))

        % accept client address
        clientAddressstr = clientAddress;
        
    else
        
        % found illegal characters
    	fprintf ('rfComms_server: Inadmissible client address (not a hexadecimal number).\n');
        
    end
        
else
    
    % overall format not correct
   	fprintf ('rfComms_server: Inadmissible client address (length, might not start with ''0x''.\n');
    
end
        

% assemble 'clients' string (display only)
clientstr = num2str(clientNum);

% select client mask
clientmasks = [ 2, 4, 8, 16, 32 ];
clientmask = clientmasks(clientNum);

% turn mask into string
clientmaskstr = num2str(clientmask);


% Check the sample time:
if ((sampletime < 0) & (sampletime ~= -1))
   fprintf ('RFComms_server: Inadmissible sample time !\n');
   sampletime_str = 'invalid';
else
   if(sampletime == -1)
      sampletime_str = 'inherited';
   else
      if(sampletime == 0)
         sampletime_str = 'continuous';
      else
         sampletime_str = [num2str(sampletime) ' s'];
      end
   end
end


% Check channel number
if ((channel < 0) | (channel > MAX_RFCOM_USERCHANNELS))
   channelstr = '???';
   fprintf ('RFComms_server: Inadmissible user channel number !\n');
else
   channelstr = num2str (channel);
end


% Check RFchannel number
if ((RFchannel < 0) | (RFchannel > MAX_RFCOM_CHANNELS))
   RFchannelstr = '???';
   fprintf ('RFComms_server: Inadmissible RF channel number !\n');
else
   RFchannelstr = num2str (RFchannel);
end


% Check the number of inputs and adapt the underlying Simulink block to it:
if (buf_size < 1) | (buf_size > MAX_BUF_SIZE)
   fprintf ('RFComms_server: Inadmissible buffer size!\n');
   buf_sizestr = '???'
else
   buf_sizestr = num2str (buf_size);
end


% set RXTXmode string
RXTXmodelabels = {'RX', 'TX'};
RXTXmodestr = RXTXmodelabels{RXTXmode};


% set data conversion type according to the block parameter 'data_type'
myBlocks = find_system(gcb, 'LookUnderMasks', 'all');
DTC = [];for(i = 1:length(myBlocks)), DTC = [DTC ~isempty(findstr(myBlocks{i},'Data Type Conversion'))]; end, DTC = find(DTC);

% define data_types as text
data_sz_str={'single', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'boolean'};

% get data_type_string
data_type_str = data_sz_str{data_type};


% telegram format (raw / formatted)
formatstr = num2str(format);

if(format == 1)
    
    if (strcmp(RXTXmodestr, 'TX') == 1)
        set_param(gcb, 'MaskVisibilities', {'on', 'on', 'on', 'on', 'on', 'on', 'off', 'on', 'off', 'on', 'off' });
        % set_param(gcb, 'MaskEnables', {'on', 'on', 'on', 'on', 'on', 'on', 'off', 'on', 'off', 'on', 'off' });
    else
        set_param(gcb, 'MaskVisibilities', {'on', 'on', 'on', 'on', 'on', 'on', 'off', 'on', 'off', 'on', 'on' });
        % set_param(gcb, 'MaskEnables', {'on', 'on', 'on', 'on', 'on', 'on', 'off', 'on', 'off', 'on', 'on' });
    end

    channelstr = '-';
    data_type_str = 'uint8';
    
else

    if (strcmp(RXTXmodestr, 'TX') == 1)
        set_param(gcb, 'MaskVisibilities', {'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'off' });
        % set_param(gcb, 'MaskEnables', {'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'off' });
    else
        set_param(gcb, 'MaskVisibilities', {'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on' });
        % set_param(gcb, 'MaskEnables', {'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on', 'on' });
    end

    channelstr = num2str (channel);
    data_type_str = data_sz_str{data_type};
    
end


% prevent accidental format change on hidden input
if (strcmp(RXTXmodestr, 'TX') == 1)
    outformat = 0;
end

% set block parameter of the data conversion block
if(outformat == 1)
    set_param(myBlocks{DTC}, 'DataType', 'double');
else
    set_param(myBlocks{DTC}, 'DataType', data_type_str);
end


% check if each communication channel has only been allocated once
mySendBlocks = get_param(find_system(gcs, 'LookUnderMasks', 'all', 'Name', 'rfComms_server_sfnc'), 'Parent');    % get all rfComms_server blocks
kk = get_param(mySendBlocks, 'format');                                                                          % raw data / formatted data
myRaw = [];
for(i = 1:length(kk))
    if(findstr(kk{i}, 'on'))
        myRaw = [myRaw i];
    end
end

% indices of formatted channels
myFormatted = setdiff([1:length(kk)], myRaw);

% check formatted data for double channel allocation
if(~isempty(myFormatted))

    kk = get_param(mySendBlocks, 'channel');                                                                     % get user channel number
    kk = double(char(kk) - '0');                                                                                 % turn this into numbers...
    kk = kk(myFormatted);                                                                                        % restrict this to the formatted channels
    if(length(unique(kk)) < length(kk))
        % the same channel number has been used more than once...
        disp(['RFComms_client: Warning... at least 2 blocks have been allocated the same user channel number!'])
    end
    
end

% Create resource keywords to be reserved in resource database
modelRTWFields = struct( 'format', formatstr, ...
                         'RXTXmode', RXTXmodestr, ...
                         'serverAddress', serverAddressstr, ...
                         'clientAddress', clientAddressstr, ...
                         'RFchannel', RFchannelstr, ...
                         'ClientNum', num2str(clientNum), ...
                         'clientflagmask', clientmaskstr );

%debug
%modelRTWFields

% Insert modelRTWFields in the I/O block S-Function containing the Tag 'MC9S12target_RFCOMMS'
% to set the block 'Tag' use: 
% >> kk = find_system(gcb, 'FollowLinks', 'on', 'LookUnderMasks', 'all', 'Name', 'rfComms_client_sfnc')
% >> set_param(kk{:}, 'Tag', 'MC9S12target_RFCOMMS')
% ... then save the block / model (fw-09-06)
MC9S12DriverDataBlock = find_system(gcb, 'FollowLinks', 'on', 'LookUnderMasks', 'all', 'Tag', 'MC9S12target_RFCOMMS');
for(i = 1:length(MC9S12DriverDataBlock))
    set_param(MC9S12DriverDataBlock{i}, 'RTWdata', modelRTWFields);
end



% adjust number of block input and/or output ports...

% de-activate link to library...
if(~strcmp(get_param(gcb, 'LinkStatus'), 'inactive'))
    set_param(gcb, 'LinkStatus', 'inactive')
end

switch(RXTXmodestr)
    
    case 'TX'
        
        % TX -> produce block input
        
        % delete output port (if required)
        num_now = length (find_system (gcb, 'LookUnderMasks', 'on', 'BlockType', 'Outport'));
        if (num_now == 1)
            
            % disp('deleting output port...');
            
            delete_line (gcb, 'Data Type Conversion Out/1', 'Out1/1')
            delete_line (gcb, 'rfComms_client_sfnc/1', 'Data Type Conversion Out/1')
            delete_block ([gcb, '/Data Type Conversion Out'])
            delete_block ([gcb, '/Out1'])
            
            % remove the output port of the 'rfComms_client_sfnc' block
            sPars = get_param ([gcb, '/rfComms_client_sfnc'], 'Parameters');
            sPars = strrep(sPars, 'RXTXmode', '1');                           % change parameter 'RXTXmode' to 'RX'
            set_param([gcb, '/rfComms_client_sfnc'], 'Parameters', sPars);    % force input port to disappear
            sPars = strrep(sPars, '1', 'RXTXmode');                           % restore original parameter 'RXTXmode'
            set_param([gcb, '/rfComms_client_sfnc'], 'Parameters', sPars);
            
        end
        
        % add input port (if required)
        num_now = length (find_system (gcb, 'LookUnderMasks', 'on', 'BlockType', 'Inport'));
        if (num_now == 0)
            
            % disp('adding input port...');

            % add an input port to the 'rfComms_client_sfnc' block
            sPars = get_param ([gcb, '/rfComms_client_sfnc'], 'Parameters');
            sPars = strrep(sPars, 'RXTXmode', '1');                           % change parameter 'RXTXmode' to 'RX'
            set_param([gcb, '/rfComms_client_sfnc'], 'Parameters', sPars);    % force input port to disappear
            sPars = strrep(sPars, '1', 'RXTXmode');                           % restore original parameter 'RXTXmode'
            set_param([gcb, '/rfComms_client_sfnc'], 'Parameters', sPars);
            
            % add input block
            add_block ('built-in/Inport', [gcb, '/In1'])
            add_block ('built-in/DataTypeConversion', [gcb, '/Data Type Conversion In'])

            
            % place 'Data Type Conversion' block
            kk = get_param ([gcb, '/Data Type Conversion In'], 'Position');
            ll = get_param ([gcb, '/rfComms_client_sfnc'], 'Position');
            set_param ([gcb, '/Data Type Conversion In'], 'Position',  ...
                       [ll(1)-50-70  ll(2)+floor((ll(4)-ll(2))/2)-floor(35/2) ...
                        ll(1)-50     ll(2)+floor((ll(4)-ll(2))/2)-floor(35/2)+35])
            set_param ([gcb, '/Data Type Conversion In'], 'DataType', data_type_str)
            set_param ([gcb, '/Data Type Conversion In'], 'FontSize', '12')

            % place 'output' block
            kk = get_param ([gcb, '/In1'], 'Position');
            ll = get_param ([gcb, '/Data Type Conversion In'], 'Position');
            set_param ([gcb, '/In1'], 'Position', ...
                       [ll(1)-50-(kk(3)-kk(1))   ll(2)+floor((ll(4)-ll(2))/2)-floor((kk(4)-kk(2))/2) ...
                        ll(1)-50                 ll(2)+floor((ll(4)-ll(2))/2)-floor((kk(4)-kk(2))/2)+(kk(4)-kk(2))])
            set_param ([gcb, '/In1'], 'FontSize', '12')
            
            add_line (gcb, 'Data Type Conversion In/1', 'rfComms_client_sfnc/1')
            add_line (gcb, 'In1/1', 'Data Type Conversion In/1')
            
            % made changes -> save
            %save_system;
            
        end
        
    case 'RX'
        
        % RX -> produce block output
        
        % delete input port (if required)
        num_now = length (find_system (gcb, 'LookUnderMasks', 'on', 'BlockType', 'Inport'));
        if (num_now == 1)
            
            % disp('deleting input port...');
            
            delete_line (gcb, 'In1/1', 'Data Type Conversion In/1')
            delete_line (gcb, 'Data Type Conversion In/1', 'rfComms_client_sfnc/1')
            delete_block ([gcb, '/Data Type Conversion In'])
            delete_block ([gcb, '/In1'])
            
            % remove the input port of the 'Timer Block' block
            sPars = get_param ([gcb, '/rfComms_client_sfnc'], 'Parameters');
            sPars = strrep(sPars, 'RXTXmode', '2');                           % change parameter 'RXTXmode' to 'TX'
            set_param([gcb, '/rfComms_client_sfnc'], 'Parameters', sPars);    % force input port to disappear
            sPars = strrep(sPars, '2', 'RXTXmode');                           % restore original parameter 'RXTXmode'
            set_param([gcb, '/rfComms_client_sfnc'], 'Parameters', sPars);
            
        end
        
        % add output port (if required)
        num_now = length (find_system (gcb, 'LookUnderMasks', 'on', 'BlockType', 'Outport'));
        if (num_now == 0)
            
            % disp('adding output port...');

            % add an output port to the 'rfComms_client_sfnc' block
            sPars = get_param ([gcb, '/rfComms_client_sfnc'], 'Parameters');
            sPars = strrep(sPars, 'RXTXmode', '2');                           % change parameter 'RXTXmode' to 'TX'
            set_param([gcb, '/rfComms_client_sfnc'], 'Parameters', sPars);    % force input port to disappear
            sPars = strrep(sPars, '2', 'RXTXmode');                           % restore original parameter 'RXTXmode'
            set_param([gcb, '/rfComms_client_sfnc'], 'Parameters', sPars);

            % add output block
            add_block ('built-in/Outport', [gcb, '/Out1'])
            add_block ('built-in/DataTypeConversion', [gcb, '/Data Type Conversion Out'])

            % place 'Data Type Conversion' block
            kk = get_param ([gcb, '/Data Type Conversion Out'], 'Position');
            ll = get_param ([gcb, '/rfComms_client_sfnc'], 'Position');
            set_param ([gcb, '/Data Type Conversion Out'], 'Position',  ...
                       [ll(3)+50      ll(2)+floor((ll(4)-ll(2))/2)-floor(35/2) ...
                        ll(3)+50+70   ll(2)+floor((ll(4)-ll(2))/2)-floor(35/2)+35])
            set_param ([gcb, '/Data Type Conversion Out'], 'DataType', 'double')
            set_param ([gcb, '/Data Type Conversion Out'], 'FontSize', '12')

            % place 'output' block
            kk = get_param ([gcb, '/Out1'], 'Position');
            ll = get_param ([gcb, '/Data Type Conversion Out'], 'Position');
            set_param ([gcb, '/Out1'], 'Position', ...
                       [ll(3)+50                 ll(2)+floor((ll(4)-ll(2))/2)-floor((kk(4)-kk(2))/2) ...
                        ll(3)+50+(kk(3)-kk(1))   ll(2)+floor((ll(4)-ll(2))/2)-floor((kk(4)-kk(2))/2)+(kk(4)-kk(2))])
            set_param ([gcb, '/Out1'], 'FontSize', '12')
            
            add_line (gcb, 'rfComms_client_sfnc/1', 'Data Type Conversion Out/1')
            add_line (gcb, 'Data Type Conversion Out/1', 'Out1/1')
            
            % made changes -> save
            %save_system;
            
        end
        
end % switch

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -