00001 function sfdrawrobot(block) 00002 %MSFUNTMPL A template for an M-file S-function 00003 % The M-file S-function is written as a MATLAB function with the 00004 % same name as the S-function. Replace 'msfuntmpl' with the name 00005 % of your S-function. 00006 % 00007 % It should be noted that the M-file S-function is very similar 00008 % to Level-2 C-Mex S-functions. You should be able to get more 00009 % information for each of the block methods by referring to the 00010 % documentation for C-Mex S-functions. 00011 % 00012 % Copyright 2003-2006 The MathWorks, Inc. 00013 % $Revision: 1.1.6.10 $ 00014 00015 %% 00016 %% The setup method is used to setup the basic attributes of the 00017 %% S-function such as ports, parameters, etc. Do not add any other 00018 %% calls to the main body of the function. 00019 %% 00020 setup(block); 00021 00022 %endfunction 00023 00024 %% Function: setup =================================================== 00025 %% Abstract: 00026 %% Set up the S-function block's basic characteristics such as: 00027 %% - Input ports 00028 %% - Output ports 00029 %% - Dialog parameters 00030 %% - Options 00031 %% 00032 %% Required : Yes 00033 %% C-Mex counterpart: mdlInitializeSizes 00034 %% 00035 function setup(block) 00036 00037 % Register number of ports 00038 block.NumInputPorts = 2; 00039 block.NumOutputPorts = 0; 00040 00041 % Setup port properties to be inherited or dynamic 00042 block.SetPreCompInpPortInfoToDynamic; 00043 block.SetSimViewingDevice(1); 00044 00045 % Override input port properties 00046 block.InputPort(1).DatatypeID = 0; % double 00047 block.InputPort(1).Complexity = 'Real'; 00048 00049 block.InputPort(2).DatatypeID = 0; % double 00050 block.InputPort(2).Complexity = 'Real'; 00051 00052 % Override output port properties 00053 %block.OutputPort(1).DatatypeID = 0; % double 00054 %block.OutputPort(1).Complexity = 'Real'; 00055 00056 % Register parameters 00057 block.NumDialogPrms = 2; 00058 %block.DialogPrmsTunable = {'Tunable','Nontunable','SimOnlyTunable'}; 00059 00060 block.SetAccelRunOnTLC(false); 00061 00062 block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup); 00063 block.RegBlockMethod('ProcessParameters', @ProcessPrms); 00064 block.RegBlockMethod('Start', @Start); 00065 block.RegBlockMethod('Update', @Update); 00066 %endfunction 00067 00068 %% ------------------------------------------------------------------- 00069 %% The local functions below are provided for illustrative purposes 00070 %% to show how you may implement the various block methods listed 00071 %% above. 00072 %% ------------------------------------------------------------------- 00073 00074 function CheckPrms(block) 00075 00076 % a = block.DialogPrm(1).Data; 00077 % if ~strcmp(class(a), 'double') 00078 % error('Invalid parameter'); 00079 % end 00080 00081 %endfunction 00082 00083 function DoPostPropSetup(block) 00084 block.NumDworks = 1; 00085 block.Dwork(1).Name = 'plothandle'; 00086 block.Dwork(1).Dimensions = 5; 00087 block.Dwork(1).DatatypeID = 0; 00088 block.Dwork(1).Complexity = 'Real'; 00089 %endfunction 00090 00091 function Start(block) 00092 area = block.DialogPrm(1).Data.area; 00093 hFig = figure(1); 00094 set(hFig, 'Name', 'Robot'); 00095 set(hFig, 'DoubleBuffer', 'on', 'Tag', 'robotScreen'); 00096 %set(fig, 'Renderer', 'painters'); 00097 %set(fig, 'Color', 'black'); 00098 hold('on'); 00099 fig_axes = get(hFig, 'CurrentAxes'); 00100 block.Dwork(1).Data = zeros(size(block.Dwork(1).Data)); 00101 drawStyle = block.DialogPrm(2).Data; 00102 if drawStyle==0, 00103 axis('equal'); 00104 set(gca, 'XLim', [0,area.w]); 00105 set(gca, 'YLim', [0,area.h]); 00106 cla(fig_axes); 00107 hold on 00108 end 00109 %endfunction 00110 00111 function hc = homog(coords) 00112 hc=[coords ones(size(coords, 1), 1)]; 00113 %endfunction 00114 00115 function Update(block) 00116 figure(1); 00117 desc = block.DialogPrm(1).Data; 00118 robot = desc.robot; 00119 x = block.InputPort(1).Data; 00120 y = block.InputPort(2).Data; 00121 00122 outline=homog(desc.shape.outline); 00123 arrow=homog(desc.shape.arrow); 00124 00125 % Transformations 00126 mid = [ 00127 1 0 -robot.cx 00128 0 1 -robot.cy 00129 0 0 1]'; 00130 trans = [ 00131 cos(x(3)) -sin(x(3)) x(1) 00132 sin(x(3)) cos(x(3)) x(2) 00133 0 0 1]'; 00134 00135 oldPlot = block.Dwork(1).Data; 00136 if any(oldPlot~=0), delete(oldPlot(oldPlot~=0)); end; 00137 00138 outline=outline*mid*trans; 00139 arrow=arrow*mid*trans; 00140 drawStyle = block.DialogPrm(2).Data; 00141 if drawStyle==0, 00142 oldPlot(1) = fill(outline(:,1), outline(:,2), 'c'); 00143 oldPlot(2) = plot(arrow(:,1), arrow(:,2), 'k'); 00144 else 00145 oldPlot(1) = plot(outline(:,1), outline(:,2), drawStyle); 00146 oldPlot(2) = plot(arrow(:,1), arrow(:,2), drawStyle); 00147 end 00148 if any(y~=0), 00149 dir1 = homog(3*[robot.laserx robot.lasery; cos(y(1)) sin(y(1))]); 00150 dir2 = homog(3*[robot.laserx robot.lasery; cos(y(2)) sin(y(2))]); 00151 dir3 = homog(3*[robot.laserx robot.lasery; cos(y(3)) sin(y(3))]); 00152 d = [dir1*trans; 00153 dir2*trans; 00154 dir3*trans]; 00155 oldPlot(3) = plot(d(:,1), d(:,2), 'r'); 00156 end 00157 drawnow 00158 block.Dwork(1).Data = oldPlot; 00159 %endfunction 00160