No BSD License  

Highlights from
Simulink LED

image thumbnail
from Simulink LED by Po Hu
Make a status display of signal in Simulink.

SimulinkLED_mSfcn4(block)
function SimulinkLED_mSfcn4(block)
% Level-2 M file S-Function
%
% Simulink LED
%
% Used to display status of signal.
%
% --------------------------------------------------------------
% 'Outport' Checkbox is for displaying the current value,
% the user can connect the outport with a display block,
% the value from the outport of LED is equal to the inport.
%
% The range syntax:       (-inf 1]
%                         (0.5  0.7)
%                         [0 1]
%                         (2 inf)
%
% please make sure that the '-inf' and 'inf' are always with
% brackets '(' and ')'.
%
% Hint:
% Using with only one Range (should be Range1),
% please leave Range2 being empty.
% --------------------------------------------------------------
%
% version 1.2
% Po.Hu
% 30.04.2006
%
% version 1.4
% Add shape option
% Po.Hu
% 03.08.2006

setup(block);

%endfunction

function setup(block)

%% Register number of dialog parameters
block.NumDialogPrms = 7;


%% Register number of input and output ports
block.NumInputPorts = 1;

%% Setup functional port properties to dynamically
%% inherited.
block.SetPreCompInpPortInfoToDynamic;
outportflag = block.DialogPrm(1).Data;
if outportflag == 1
    block.SetPreCompOutPortInfoToDynamic;
    block.NumOutputPorts = 1;
else
    block.NumOutputPorts = 0;
end

block.InputPort(1).DirectFeedthrough = true;

%% Set block sample time to inherited
block.SampleTimes = [-1 0];

%% Run accelerator on TLC
block.SetAccelRunOnTLC(true);

%% Register methods

block.RegBlockMethod('Outputs', @Output);

%endfunction

function Output(block)

% Outport Active
outportflag = block.DialogPrm(1).Data;
if outportflag == 1
    block.OutputPort(1).Data = block.InputPort(1).Data;
end


range1    = block.DialogPrm(3).Data;
color1    = block.DialogPrm(4).Data;
range2    = block.DialogPrm(5).Data;
color2    = block.DialogPrm(6).Data;
colorRest = block.DialogPrm(7).Data;



color1    = lower(color1);
color2    = lower(color2);
colorRest = lower(colorRest);


% convert Color Strings to Color Numbers
color1No  = colorStr2colorNo(color1);
color2No  = colorStr2colorNo(color2);
colorRestNo = colorStr2colorNo(colorRest);


if range1 == '0'
    error('The first range should not be empty!')
    return
end
% This part is very important for convertion of string to numeric
valueRange1 = sscanf(range1, '%c %f %f %c');

% range syntax check
if ~isequal(size(valueRange1,1), 4)
    error(['Range syntax error. Please check your range settings' ])
end


% check border
if valueRange1(2) > valueRange1(3)
    error('The border of the range is wrong, max < min !');
    return
end


% set block color
if isempty(range2)

    if eval([num2str(block.InputPort(1).Data), signcheck(valueRange1(1)), num2str(valueRange1(2))])...
            && eval([num2str(block.InputPort(1).Data), signcheck(valueRange1(4)), num2str(valueRange1(3))])
        currentMDisplay = get_param(block.BlockHandle, 'MaskDisplay');
        currentColor = ['[',currentMDisplay(12:16),']'];
        if ~isequal(currentColor,color1No)
            set_param(block.BlockHandle,'MaskDisplay',['patch(x,y,',color1No,');patch([rx],[ry],[cw]);']);
            % set_param(block.BlockHandle, 'Backgroundcolor',color1)
            %             MDisplay2 = ['disp(','''',range1,'''',')'];
            %             set_param(block.BlockHandle, 'MaskDisplay', MDisplay2);
            set_param(block.BlockHandle,'Description',['-ranges-',sprintf('\n'),range1]);
        end
        % set_param(block.BlockHandle, 'MaskDisplay', MDisplay)
    else
        currentMDisplay = get_param(block.BlockHandle, 'MaskDisplay');
        currentColor = ['[',currentMDisplay(12:16),']'];
        if ~isequal(currentColor,colorRestNo)
            set_param(block.BlockHandle,'MaskDisplay',['patch(x,y,',colorRestNo,');patch([rx],[ry],[cw]);']);
            % set_param(block.BlockHandle, 'Backgroundcolor',colorRest)
            %             MDisplay2 = ['disp(','''','other','''',')'];
            %             set_param(block.BlockHandle, 'MaskDisplay', MDisplay2);
            set_param(block.BlockHandle,'Description',['-ranges-',sprintf('\n'),'Other']);
        end
        %         set_param(block.BlockHandle, 'MaskDisplay', MDisplay)
    end
else
    % This part is very important for convertion of string to numeric
    valueRange2 = sscanf(range2, '%c %f %f %c');

    % range syntax check
    if ~isequal(size(valueRange2,1), 4)
        error(['Range syntax error. Please check your range settings' ])
    end

    % check border
    if valueRange2(2) > valueRange2(3)
        error('The border of the range is wrong, max < min !');
        return
    end
    if eval([num2str(block.InputPort(1).Data), signcheck(valueRange1(1)), num2str(valueRange1(2))])...
            && eval([num2str(block.InputPort(1).Data), signcheck(valueRange1(4)), num2str(valueRange1(3))]);
        currentMDisplay = get_param(block.BlockHandle, 'MaskDisplay');
        currentColor = ['[',currentMDisplay(12:16),']'];
        if ~isequal(currentColor,color1No)
            set_param(block.BlockHandle,'MaskDisplay',['patch(x,y,',color1No,');patch([rx],[ry],[cw]);']);
            %set_param(block.BlockHandle, 'Backgroundcolor',color1)
            %             MDisplay2 = ['disp(','''',range1,'''',')'];
            %             set_param(block.BlockHandle, 'MaskDisplay', MDisplay2);
            set_param(block.BlockHandle,'Description',['-ranges-',sprintf('\n'),range1]);
        end
        %         set_param(block.BlockHandle, 'MaskDisplay', MDisplay)

    elseif eval([num2str(block.InputPort(1).Data), signcheck(valueRange2(1)), num2str(valueRange2(2))])...
            && eval([num2str(block.InputPort(1).Data), signcheck(valueRange2(4)), num2str(valueRange2(3))]);
        currentMDisplay = get_param(block.BlockHandle, 'MaskDisplay');
        currentColor = ['[',currentMDisplay(12:16),']'];
        if ~isequal(currentColor,color2No)
            set_param(block.BlockHandle,'MaskDisplay',['patch(x,y,',color2No,');patch([rx],[ry],[cw]);']);
            %set_param(block.BlockHandle, 'Backgroundcolor',color2)
            %             MDisplay2 = ['disp(','''',range2,'''',')'];
            %             set_param(block.BlockHandle, 'MaskDisplay', MDisplay2);
            set_param(block.BlockHandle,'Description',['-ranges-',sprintf('\n'),range2]);
        end
        %         set_param(block.BlockHandle, 'MaskDisplay', MDisplay)
    else
        currentMDisplay = get_param(block.BlockHandle, 'MaskDisplay');
        currentColor = ['[',currentMDisplay(12:16),']'];
        if ~isequal(currentColor,colorRestNo)
            set_param(block.BlockHandle,'MaskDisplay',['patch(x,y,',colorRestNo,');patch([rx],[ry],[cw]);']);
            %set_param(block.BlockHandle, 'Backgroundcolor',colorRest)
            %             MDisplay2 = ['disp(','''','other','''',')'];
            %             set_param(block.BlockHandle, 'MaskDisplay', MDisplay2);
            set_param(block.BlockHandle,'Description',['-ranges-',sprintf('\n'), 'other']);
        end
        %         set_param(block.BlockHandle, 'MaskDisplay', MDisplay)
    end
end
%endfunction


function sign = signcheck(value)

switch char(value)
    case '('
        sign = '>';
    case '['
        sign = '>=';
    case ')'
        sign = '<';
    case ']'
        sign = '<=';
    otherwise
        error('The brekets can not be identified!')
end
%endfunction

function colorNo = colorStr2colorNo(colorStr)
% convert color string to color number(string array) format.
switch colorStr
    case 'black'
        colorNo = '[0 0 0]';
    case 'white'
        colorNo = '[1 1 1]';
    case 'red'
        colorNo = '[1 0 0]';
    case 'green'
        colorNo = '[0 1 0]';
    case 'blue'
        colorNo = '[0 0 1]';
    case 'yellow'
        colorNo = '[1 1 0]';
    case 'magenta'
        colorNo = '[1 0 1]';
    case 'cyan'
        colorNo = '[0 1 1]';
    case 'gray'
        colorNo = '[0.5 0.5 0.5]';
    otherwise
        error('Color(string) is not identified')
end
%endfunction

function colorStr = colorNo2colorStr(colorNo)
% convert color number to color string format.

colorNo = num2str(colorNo); % convert to String

switch colorNo
    case '0  0  0'
        colorStr = 'black';
    case '1  1  1'
        colorStr = 'white';
    case '1  0  0'
        colorStr = 'red';
    case '0  1  0'
        colorStr = 'green';
    case '0  0  1'
        colorStr = 'blue';
    case '1  1  0'
        colorStr = 'yellow';
    case '1  0  1'
        colorStr = 'magenta';
    case '0  1  1'
        colorStr = 'cyan';
    case '0.5  0.5  0.5'
        colorStr = 'gray';
    otherwise
        error('Color(number) is not identified')
end
%endfunction







Contact us at files@mathworks.com