sbiterr.m
上传用户:loeagle
上传日期:2013-03-02
资源大小:1236k
文件大小:24k
源码类别:

通讯编程文档

开发平台:

Matlab

  1. function [sys, x0, str, ts] = sbiterr(t,x,u,flag, numLine, K, timeDelay, sampleTime)
  2. % SBITERR: S-function for display symbol and bit error
  3. % This M-file is designed to be used in a Simulink S-function block.
  4. %
  5. %WARNING: This is an obsolete function and may be removed in the future.
  6. % [SYS, X0, STR, TS] = SBITERR(T, X, U, FLAG, NUMLINE, K, TIMEDELAY, SAMPLETIME)
  7. %    NUMLINE:   number of lines on display.
  8. %    K:         bit number. Input/Output are in the range (0, K-1)
  9. %    TIMEDELAY: time delay from Input to Output
  10. %    SAMPLETIME:sample time of the input signal
  11. %
  12. % See also: PlOT, SFUNYST, SFUNXY.
  13. %   Copyright 1996-2001 The MathWorks, Inc.
  14. %       $Revision: 1.31 $
  15. %   Original designed by Wes Wang 1/14/95
  16. %   Rewritten by Jun Wu 09/16/97
  17. switch flag,
  18.   %%%%%%%%%%%%%%%%%%
  19.   % Initialization %
  20.   %%%%%%%%%%%%%%%%%%
  21.   case 0,
  22.     [sys,x0,ts]=mdlInitializeSizes(numLine, K, timeDelay, sampleTime);
  23.     SetBlockCallbacks(gcbh);
  24.   %%%%%%%%%%
  25.   % Update %
  26.   %%%%%%%%%%
  27.   case 2,
  28.     sys=mdlUpdate(t,x,u,numLine, K, timeDelay, sampleTime);
  29.   %%%%%%%%%
  30.   % Start %
  31.   %%%%%%%%%
  32.   case 'Start'
  33.     LocalBlockStartFcn
  34.   %%%%%%%%
  35.   % Stop %
  36.   %%%%%%%%
  37.   case 'Stop'
  38.     LocalBlockStopFcn
  39.   %%%%%%%%%%%%%%
  40.   % NameChange %
  41.   %%%%%%%%%%%%%%
  42.   case 'NameChange'
  43.     LocalBlockNameChangeFcn
  44.     
  45.   %%%%%%%%%%%%%
  46.   % Load,Copy %
  47.   %%%%%%%%%%%%%
  48.   case { 'LoadBlock', 'CopyBlock' }
  49.     LocalBlockLoadCopyFcn
  50.     
  51.   %%%%%%%%%%%%%%%
  52.   % DeleteBlock %
  53.   %%%%%%%%%%%%%%%
  54.   case 'DeleteBlock'
  55.     LocalBlockDeleteFcn
  56.     
  57.   %%%%%%%%%%%%%%%%
  58.   % DeleteFigure %
  59.   %%%%%%%%%%%%%%%%
  60.   case 'DeleteFigure'
  61.   LocalFigureDeleteFcn
  62.   %%%%%%%%%%%%%%%%%%%
  63.   % Unhandled flags %
  64.   %%%%%%%%%%%%%%%%%%%
  65.   case { 3, 9 }
  66.     sys=[];
  67.   %%%%%%%%%%%%%%%%%%%%
  68.   % Unexpected flags %
  69.   %%%%%%%%%%%%%%%%%%%%
  70.   otherwise
  71.     if ischar(flag),
  72.       errmsg=sprintf('Unhandled flag: '' %s''', flag);
  73.     else
  74.       errmsg=sprintf('Unhandled flag:  %d', flag);
  75.     end
  76.     error(errmsg);
  77. end
  78. % end sbiterr
  79. %
  80. %=============================================================================
  81. % mdlInitializeSizes
  82. % Return the sizes, initial conditions, and sample times for the S-function.
  83. %=============================================================================
  84. %
  85. function [sys,x0,ts]=mdlInitializeSizes(numLine, K, timeDelay, sampleTime)
  86. % Keep number of states
  87. numStates = max(0, ceil(timeDelay/sampleTime(1)*(1-10*eps))) + 1;
  88. if timeDelay < 0
  89.   error('Time delay cannot be negative.');
  90. end;
  91. if length(sampleTime) < 1
  92.   error('Sample time cannot be empty.');
  93. elseif length(sampleTime) == 1  
  94.   sampleTime = [sampleTime, 0];
  95. else
  96.   sampleTime = sampleTime(:)';
  97.   sampleTime = sampleTime(1:2);
  98. end;
  99. if rem( timeDelay + sampleTime(2), sampleTime(1) ) == 0
  100.   sampleTime2 = [];
  101.   numSampleTime = 1;
  102. else
  103.   sampleTime2 = [ sampleTime(1), rem( timeDelay + sampleTime(2), sampleTime(1) ) ];
  104.   if sampleTime2(2) / sampleTime2(1) < sqrt(eps)
  105.     sampleTime2(2) = 0;
  106.   end;
  107.   numSampleTime = 2;
  108.   if ( abs(sampleTime(1) - sampleTime2(1)) < sqrt(eps) ) ...
  109. & ( abs(sampleTime(2) - sampleTime2(2)) < sqrt(eps) )
  110.     numSampleTime = 1;
  111.     sampleTime2 = [];
  112.   end;
  113. end;
  114. %
  115. % initialize the array of sample times
  116. %
  117. if sampleTime <= 0
  118.   error('Sample Time for error rate meter has to be larger than zero.');
  119. end;    
  120. ts = [ sampleTime; sampleTime2 ];
  121. %
  122. % call simsizes for a sizes structure, fill it in and convert it to a sizes array.
  123. %
  124. sizes = simsizes;
  125. sizes.NumContStates  = 0;
  126. sizes.NumDiscStates  = numStates + 6;
  127. sizes.NumOutputs     = 0;
  128. sizes.NumInputs      = -1;  % dynamically sized input vector
  129. sizes.DirFeedthrough = 0;   % the meter does not have direct feedthrough
  130. sizes.NumSampleTimes = numSampleTime;
  131. sys = simsizes(sizes);
  132. if isempty(sampleTime2)
  133.   sampleTime2 = sampleTime;
  134. end;
  135. %
  136. % initialize the initial condition
  137. %
  138. x0 = [0; numStates;  % figure number. 0 indicates the first
  139.     zeros(numStates, 1);
  140.     numSampleTime; sampleTime(1);
  141.     sampleTime(2); sampleTime2(2)];  % number of states
  142. %
  143. % str is always an empty matrix
  144. %
  145. str = [];
  146. % end mdlInitializeSizes
  147. %
  148. %=============================================================================
  149. % mdlUpdate
  150. % Handle discrete state updates, sample time hits, and major time step
  151. % requirements.
  152. %=============================================================================
  153. %
  154. function sys=mdlUpdate(t, x, u, numLine, K, timeDelay, sampleTime)
  155. sys = [];
  156. %
  157. % Locate the figure window associated with this block. If it's not a valid
  158. % handle (it may have been closed by the user), then return.
  159. %
  160. figureHandle = GetSBiterrFigure(gcbh);
  161. if ~ishandle(figureHandle)
  162.   return;
  163. end;  
  164. %
  165. %timing control.
  166. %
  167. colorMap = ['blue ';'black';'red  '];
  168. positionNumSampleTime = x(2) + 3;
  169. sampleTime1 = [ x( positionNumSampleTime + [1:2] ) ];
  170. if x(positionNumSampleTime) == 1
  171.   sampleTime2 = sampleTime1;
  172. else
  173.   sampleTime2 = [ x(positionNumSampleTime + [1;3]) ];
  174. end;
  175. relError = rem(t, sampleTime1(1)) / sampleTime1(1);
  176. test1 = abs(relError - sampleTime1(2) /sampleTime1(1));
  177. test2 = abs(relError - sampleTime1(2) /sampleTime1(1));
  178. if (test1 < .0000001) | (abs(test1 - 1)< .0000001)
  179.   % storage part
  180.   if x(2) > 0
  181.     x(3:2+x(2)) = [x(4:2+x(2)); u(1)];
  182.   else
  183.     x(3) = u(1);
  184.   end;
  185.   sys = x;
  186. end;
  187. % get the number of inputs.
  188. inputLength = length(u);
  189. if inputLength < 2
  190.   error('Source or destination is empty.');
  191. end;
  192. if K == 1;
  193.   bitLength = 3;
  194.   hdlRcdLength = 2 * inputLength - 1;
  195. else
  196.   bitLength = 6;
  197.   hdlRcdLength = 4 * inputLength - 2;
  198. end;
  199. % This part is only for giving user a warning about the size of the window
  200. if x(1) == 0
  201.   if numLine >= 40 | inputLength >= 7
  202.     warnmsg=sprintf('Please resize your Bit Error Meter to get a better looking.');
  203.     warning(warnmsg);
  204.   end;
  205. end;  
  206. if (test2 < .0000001) | (abs(test2 - 1)< .0000001)
  207.   % plot part
  208.   if t < timeDelay
  209.     sys = x;
  210.     return;
  211.   end;
  212.   % initialize graph.
  213.   if x(1) == 0  
  214.     sl_name = gcs;
  215.     block = get_param(sl_name, 'CurrentBlock');
  216.     
  217.     [n_b, m_b] = size(block);
  218.     if n_b < 1
  219.       error('Cannot delete block during simulation.')
  220.     elseif n_b > 1
  221.       error('Something wrong in get_param. You don''t have the current Simulink.')
  222.     end;
  223.     
  224.     % test if figure exists
  225.     allFiguresExist = allchild(0);
  226.     new_figure = 1;
  227.     i = 1;
  228.     while ((new_figure) & (i <= length(allFiguresExist)))
  229.       if strcmp(get(allFiguresExist(i), 'Type'), 'figure')
  230. if strcmp(get(allFiguresExist(i), 'Name'), sl_name)
  231.   figureHandle = allFiguresExist(i);
  232.   handles = get(figureHandle,'UserData');
  233.   new_figure = 0;
  234.   % refresh all handles.
  235.   if (length(handles) == 1+length(u) * (num_lin + 2) - ((K>1) + 1)*2)
  236.     %use the old one.
  237.     for ii = 3 : length(handles)
  238.       set(handles(ii), 'String', ' ');
  239.     end
  240.     current_point = 0;
  241.     if K == 1
  242.       h_sym_bit = handles(2 : length(u)*2);
  243.       handleRecord = handles(length(u)*2+1 : length(handleRecord));
  244.       for i = 1 : 2: length(u) * 2
  245. set(h_sym_bit(i) , 'UserData', 0);
  246.       end;
  247.     else
  248.       h_sym_bit = handles(2 : length(u)*4-1);
  249.       handleRecord = handles(length(u)*4 : length(handleRecord));
  250.       t_tras(1) = get(h_sym_bit, 'UserData') + 1;
  251.       t_tras(2) = get(h_sym_bit(length(u)*2), 'UserData') + K;
  252.     end;
  253.     set(figureHandle, 'UserData', [current_point, h_sym_bit, handleRecord]);
  254.     set_param(sl_name, 'userdata', figureHandle);
  255.   else
  256.     delete(get(figureHandle,'child'));
  257.     old_figure = 1;
  258.     new_figure = 1;
  259.   end;
  260. end;
  261.       end;
  262.       i = i + 1;
  263.     end;
  264.      
  265.     % Input/Output
  266.     if numLine < 0
  267.       numLine = 0;
  268.     end;
  269.     totalLine = 1 + numLine + bitLength + 1;
  270.     
  271.     set(figureHandle, ...
  272. 'Visible', 'on');    
  273.     handleAxes = axes(...
  274. 'position', [0 0 1 1],...
  275. 'visible',  'off',...
  276. 'Parent',   figureHandle...
  277. );
  278.   
  279.     tmp_x = [];
  280.     tmp_y = [];
  281.     for ii = 1 : totalLine
  282.       tmp_x = [tmp_x            0             1   NaN];
  283.       tmp_y = [tmp_y  ii/totalLine  ii/totalLine  NaN];
  284.     end;
  285.     
  286.     linePlot = plot(...
  287. tmp_x, tmp_y, 'k-', ...
  288. 'Parent', handleAxes,...
  289. 'linewidth',1);
  290.     set(handleAxes,...
  291. 'Xtick',    [],...
  292. 'Ytick',    []... 
  293. );
  294.   
  295.     for i = 1 : inputLength
  296.       % title string
  297.       if i == 1
  298. titleString = 'Sender';
  299.       else
  300. % only display 8 digits of the amount of receivers      
  301. titleString = ['Receiver',num2str(i-1, 8)];
  302. if inputLength == 2
  303.   titleString = 'Receiver';
  304. end
  305. if numLine > 0
  306.   set(linePlot, ...
  307.       'XData', [get(linePlot, 'XData')    ...
  308.   [1 1]*(i-1)/inputLength           NaN],...
  309.       'YData', [get(linePlot, 'YData') ...
  310.   (totalLine-numLine-1)/totalLine 1 NaN]...
  311.       );
  312. end;
  313.       end;
  314.       
  315.       % set up the title of both of sender and receivers    
  316.       p_beg1 = (i - 1) / inputLength + .001;
  317.       p_wid = 1 / inputLength - .002;
  318.       uicontrol(...
  319.   figureHandle, ...
  320.   'Style',   'text', ...
  321.   'Horiz',   'center',...
  322.   'Unit',    'normalized',...
  323.   'position',[p_beg1, ...
  324.       (totalLine - 1)/totalLine+.001, p_wid, 1/totalLine-.002], ...
  325.   'String',  titleString);
  326.       
  327.       %space for list of transferred number.
  328.       p_beg = (2*i - 1) / 2 / inputLength;
  329.       if numLine > 0
  330. for ii = 1 : numLine
  331.   index = (ii-1) * inputLength;
  332.   handleRecord(index + i) = text(...
  333.       p_beg, (2*totalLine - 2*ii - 1)/2/totalLine, ' ',...
  334.       'Parent', handleAxes);
  335.   set(...
  336.       handleRecord(index + i), ...
  337.       'FontSize', 9,...
  338.       'Color',[0 0 0],...
  339.       'HorizontalA','Center',...
  340.       'VerticalA',  'Middle');
  341. end;
  342. set(handleRecord(1), 'UserData',1);
  343.       elseif numLine == 0
  344. handleRecord = [];
  345.       end;
  346.       
  347.       % transfer error rate 
  348.       if K > 1
  349. len_rate = 2;
  350.       else
  351. len_rate = 1;
  352.       end;
  353.       kk = 0;
  354.       for ii = 1 : len_rate
  355. if i == 1
  356.   if ii == 1
  357.     titleString = 'Symbol Transferred';
  358.     trsf = 1;
  359.     indx = 1;
  360.   else
  361.     titleString = 'Bit Transferred';
  362.     trsf = K;
  363.     indx = inputLength * 2;
  364.   end;
  365.   
  366.   % Symbol/bit transferred title
  367.   uicontrol(...
  368.       figureHandle, ...
  369.       'Style', 'text', ...
  370.       'Units', 'normalized',...
  371.       'Position',[0, ((len_rate - ii) * 3 + 2 + 1)/totalLine+.001,...
  372.   .499, 1/totalLine-.002],...
  373.       'String',titleString, ...
  374.       'BackgroundColor','yellow');
  375.   set(...
  376.       linePlot, ...
  377.       'XData', [get(linePlot, 'XData') .5 .5 NaN],...
  378.       'YData', [get(linePlot, 'YData'),...
  379.   ((len_rate - ii)* 3 + 2 + 1)/totalLine,...
  380.   ((len_rate - ii)* 3 + 3 + 1)/totalLine,...
  381.   NaN]...
  382.       );
  383.   
  384.   % Symbol/bit transferred data
  385.   h_sym_bit(indx) = text(...
  386.       .75, ...
  387.       ((len_rate-ii)*3*2 + 5 + 2)/2/totalLine,...
  388.       num2str(trsf, 8),...
  389.       'Parent', handleAxes);
  390.   set(h_sym_bit(indx),...
  391.       'FontSize', 9,...
  392.       'UserData', 0,...
  393.       'Color',[0 0 0],...
  394.       'HorizontalA','Center',...
  395.       'VerticalA',  'Middle');
  396.   % title for error number
  397.   uicontrol(figureHandle, ...
  398.       'Style', 'text', ...
  399.       'Units', 'normalized',...
  400.       'Position', [p_beg1,...
  401.   ((len_rate - ii) * 3 + 1 + 1)/totalLine+.001, ...
  402.   p_wid, 1/totalLine-.002],...
  403.       'String','Error Number'); 
  404.   % title for error rate
  405.   uicontrol(figureHandle,...
  406.       'Style', 'text',...
  407.       'Units', 'normalized',...
  408.       'Position', [p_beg1, ...
  409.   ((len_rate - ii) * 3 + 1)/totalLine+.001,...
  410.   p_wid, 1/totalLine-.002],...
  411.       'String','Error Rate'); 
  412. else
  413.   %error number
  414.   kk = (i-1)*2 + (inputLength * 2 - 1)*(ii - 1);
  415.   set(linePlot, ...
  416.       'XData', [get(linePlot, 'XData') [p_beg1 p_beg1]-.001 NaN],...
  417.       'YData', [get(linePlot, 'YData'),...
  418.   ((len_rate - ii)* 3 + 1)/totalLine,...
  419.   ((len_rate - ii)* 3 + 2 + 1)/totalLine,...
  420.   NaN]);
  421.   
  422.   h_sym_bit(kk) = text(p_beg, ...
  423.       ((len_rate-ii)*3*2 + 3 + 2)/2/totalLine,...
  424.       '0',...
  425.       'Parent', handleAxes);
  426.   set(h_sym_bit(kk), ...
  427.       'UserData', 0,...
  428.       'FontSize', 9,...
  429.       'Color',[0 0 0],...
  430.       'HorizontalA','Center',...
  431.       'VerticalA',  'Middle');
  432.   %error rate
  433.   h_sym_bit(kk+1) = text(p_beg, ...
  434.       ((len_rate-ii)*3*2 +1 + 2)/2/totalLine, ...
  435.       '0',...
  436.       'Parent', handleAxes);
  437.   set(h_sym_bit(kk+1), ...
  438.       'UserData', 0,...
  439.       'FontSize', 9,...
  440.       'Color',[0 0 0],...
  441.       'HorizontalA','Center',...
  442.       'VerticalA',  'Middle');
  443. end;
  444.       end;
  445.     end;
  446.     set(handleAxes, 'Xlim',[0 1],...
  447. 'Ylim',[0 1])
  448.     current_point = 0;
  449.     set(figureHandle, 'UserData', [current_point, h_sym_bit, handleRecord]);
  450.     
  451.     x(1) = figureHandle;
  452.     tmp1 = uicontrol(...
  453. figureHandle,...
  454. 'Style', 'pushbutton',...
  455. 'Unit', 'normalized',...
  456. 'Position', [0 0 .5 1/totalLine], ...
  457. 'String', 'Reset error count',...
  458. 'Callback',...
  459. ['sbiterrs(gcbf,',num2str(len_rate),',',num2str(inputLength),')']);
  460.     
  461.     tmp1 = uicontrol(...
  462. figureHandle,...
  463. 'Style', 'pushbutton',...
  464. 'Unit', 'normalized',...
  465. 'Position', [.5 0 .5 1/totalLine], ...
  466. 'String', 'Close',...
  467. 'Callback','close(gcbf)');
  468.   elseif x(1) < 0
  469.     %  figure has been closed
  470.     return;
  471.   end;
  472.   
  473.   plot_flag_test = allchild(0);
  474.   if isempty(plot_flag_test)
  475.     return;
  476.   elseif isempty(find(plot_flag_test == x(1)))
  477.     x(1) = -1;
  478.     return;
  479.   end;
  480.   
  481.   inputLength = inputLength;
  482.   handles = get(x(1), 'UserData');
  483.   figureHandle =  x(1);
  484.   current_point = handles(1);
  485.   if K == 1
  486.     h_sym_bit = handles(2 : inputLength*2);
  487.     handleRecord = handles(inputLength*2+1 : length(handles));
  488.     t_tras = get(h_sym_bit(1), 'UserData') + 1;
  489.     set(h_sym_bit(1), 'UserData', t_tras,...
  490. 'String', num2str(t_tras, 8));
  491.   else
  492.     h_sym_bit = handles(2 : inputLength*4-1);
  493.     handleRecord = handles(inputLength*4 : length(handles));
  494.     t_tras(1) = get(h_sym_bit(1), 'UserData') + 1;
  495.     t_tras(2) = get(h_sym_bit(inputLength*2), 'UserData') + K;
  496.     set(h_sym_bit(1), 'UserData', t_tras(1), ...
  497. 'String', num2str(t_tras(1),  8));
  498.     set(h_sym_bit(inputLength*2), 'UserData', t_tras(2), ...
  499. 'String', num2str(t_tras(2), 8));
  500.   end;    
  501.   if numLine > 0
  502.     if current_point == 0
  503.       set(handleRecord(1), 'UserData', rem(get(handleRecord(1), 'UserData') + 1, 2));
  504.     end;
  505.     col = colorMap(get(handleRecord(1), 'UserData') + 1, :);
  506.     next_point = rem(current_point + 1, numLine);
  507.     last_point = rem(current_point-1+numLine, numLine);
  508.   else
  509.     next_point = 0;
  510.     last_point = 0;
  511.   end;
  512.   for i = 1 : inputLength
  513.     if i == 1
  514.       if numLine > 0
  515. set(handleRecord(current_point * inputLength + i), ...
  516.     'String', num2str(x(3), 8), 'Color',col);
  517.       end;
  518.     else
  519.       if numLine > 0
  520. if u(i) == x(3)
  521.   set(handleRecord(current_point * inputLength + i), ...
  522.       'String', num2str(u(i), 8), 'Color',col);
  523. else
  524.   set(handleRecord(current_point * inputLength + i), 'String', ...
  525.       num2str(u(i), 8), 'Color',colorMap(3,:));
  526. end
  527.       end;
  528.       if u(i) ~= x(3)
  529. % in case of error
  530. % number of errors
  531. num = get(h_sym_bit((i-1)*2), 'UserData') + 1;
  532. set(h_sym_bit((i-1)*2), 'UserData', num, 'String', num2str(num, 8));
  533. % errors rate
  534. set(h_sym_bit((i-1)*2+1), 'String', num2str(num/t_tras(1), 8));
  535. if K > 1
  536.   % number
  537.   kk = (i-1)*2 + (inputLength * 2 - 1);
  538.   num = get(h_sym_bit(kk), 'UserData');
  539.   erb = sum(de2bi(flxor(x(3), u(i))));
  540.   erb = erb + num;
  541.   set(h_sym_bit(kk), 'UserData', erb, 'String', num2str(erb, 8));
  542.   % rate
  543.   set(h_sym_bit(kk+1), 'String', num2str(erb/t_tras(2),8));
  544. end;
  545.       else
  546. tmp = get(h_sym_bit((i-1)*2), 'UserData');
  547. if tmp 
  548.   set(h_sym_bit((i-1)*2 + 1), 'String', ...
  549.       num2str(tmp / t_tras(1), 8));
  550. end;
  551. if K > 1
  552.   kk = (i-1)*2 + (inputLength * 2 - 1);
  553.   tmp = get(h_sym_bit(kk), 'UserData');
  554.   if tmp 
  555.     set(h_sym_bit(kk + 1), 'String', ...
  556. num2str(tmp / t_tras(2), 8));
  557.   end
  558. end;
  559.       end;
  560.     end
  561.   end;
  562.   current_point = next_point;
  563.   sys = [figureHandle; x(2:length(x))];
  564.   % save all the current displaying information in figureHandle  
  565.   set(figureHandle, 'UserData', [current_point, h_sym_bit, handleRecord]);
  566.   %second in User data is the current position for the line of handleRecord.
  567. end;  
  568. % end mdlUpdate
  569. %
  570. %=============================================================================
  571. % LocalFigureDeleteFcn
  572. % This is the Graph figure window's DeleteFcn.  The figure window is
  573. % being deleted, update the Graph block's UserData to reflect the change.
  574. %=============================================================================
  575. %
  576. function LocalFigureDeleteFcn
  577. %
  578. % Get the block associated with this figure and set it's figure to -1
  579. %
  580. close(gcbf);
  581. % end LocalFigureDeleteFcn
  582. %
  583. %=============================================================================
  584. % LocalBlockStartFcn
  585. % Function that is called when the simulation starts.  Initialize the
  586. % Graph scope figure.
  587. %=============================================================================
  588. %
  589. function LocalBlockStartFcn
  590. %
  591. % get the figure associated with this block, create a figure if it doesn't
  592. % exist
  593. %
  594. figureHandle = GetSBiterrFigure(gcbh);
  595. if ~ishandle(figureHandle),
  596.   figureHandle = CreateSBiterrFigure;
  597. end
  598. ud = get(figureHandle,'UserData');
  599. set(figureHandle,'UserData',ud);
  600. % end LocalBlockStartFcn
  601. %
  602. %=============================================================================
  603. % LocalBlockStopFcn
  604. % At the end of the simulation, set the line's X and Y data to contain
  605. % the complete set of points that were acquire during the simulation.
  606. % Recall that during the simulation, the lines are only small segments from
  607. % the last time step to the current one.
  608. %=============================================================================
  609. %
  610. function LocalBlockStopFcn
  611. %
  612. % Locate the figure window associated with this block. If it's not a valid
  613. % handle (it may have been closed by the user), then return.
  614. %
  615. figureHandle=GetSBiterrFigure(gcbh);
  616. if ishandle(figureHandle),
  617.   %
  618.   % Get UserData of the figure.
  619.   %
  620.   ud = get(figureHandle,'UserData');
  621.   % Currently do nothing in LocalBlockStopFcn
  622. end
  623. % end LocalBlockStopFcn
  624. %
  625. %=============================================================================
  626. % LocalBlockNameChangeFcn
  627. % Function that handles name changes on the Bit-Error Meter.
  628. %=============================================================================
  629. %
  630. function LocalBlockNameChangeFcn
  631. %
  632. % the figure handle is stored in the block's UserData
  633. %
  634. figureHandle = GetSBiterrFigure(gcbh);
  635. if ishandle(figureHandle),
  636.   set(figureHandle,'Name',get_param(gcbh,'Name'));
  637. end
  638. % end LocalBlockNameChangeFcn
  639. %
  640. %=============================================================================
  641. % LocalBlockLoadCopyFcn
  642. % Function that initializes the Bit-Error Meter's UserData when it is
  643. % loaded from an mdl file and when it is copied.
  644. %=============================================================================
  645. %
  646. function LocalBlockLoadCopyFcn
  647. SetSBiterrFigure(gcbh,[]);
  648. % end LocalBlockLoadCopyFcn
  649. %
  650. %=============================================================================
  651. % LocalBlockDeleteFcn
  652. % Function that handles the Bit-Error Meter's deletion from a block
  653. % diagram.
  654. %=============================================================================
  655. %
  656. function LocalBlockDeleteFcn
  657. %
  658. % the figure handle is stored in the block's UserData
  659. %
  660. figureHandle = GetSBiterrFigure(gcbh);
  661. if ishandle(figureHandle),
  662.   delete(figureHandle);
  663.   SetSBiterrFigure(gcbh,[]);
  664. end
  665. % end LocalBlockDeleteFcn
  666. %
  667. %=============================================================================
  668. % GetSBiterrFigure
  669. % Retrieves the figure window associated with this S-function Bit-Error Meter
  670. % from the block's parent subsystem's UserData.
  671. %=============================================================================
  672. %
  673. function figureHandle=GetSBiterrFigure(block)
  674. if strcmp(get_param(block,'BlockType'),'S-Function'),
  675.   block=get_param(block,'Parent');
  676. end
  677. ud = get_param(block,'UserData');
  678. if ishandle(ud)
  679.   figureHandle = ud;
  680. else
  681.   if isempty(ud)
  682.     ud.figureHandle = [];
  683.     set_param(block,'Userdata', ud);
  684.   end;  
  685.   figureHandle = ud.figureHandle;
  686. end;
  687. if isempty(figureHandle),
  688.   figureHandle = -1;
  689. end
  690. % end GetSBiterrFigure
  691. %
  692. %=============================================================================
  693. % SetSBiterrFigure
  694. % Stores the figure window associated with this S-function Bit-Error Meter
  695. % in the block's parent subsystem's UserData.
  696. %=============================================================================
  697. %
  698. function SetSBiterrFigure(block,figureHandle)
  699. if strcmp(get_param(block,'BlockType'),'S-Function'),
  700.   block=get_param(block,'Parent');
  701. end
  702. ud = get_param(block,'UserData');
  703. ud.figureHandle = figureHandle;
  704. set_param(block,'UserData',ud);
  705. % end SetSBiterrFigure
  706. %
  707. %=============================================================================
  708. % CreateSBiterrFigure
  709. % Creates the figure window associated with this S-function Bit-Error Meter.
  710. %=============================================================================
  711. %
  712. function figureHandle=CreateSBiterrFigure
  713. %
  714. % create the figure and the axes
  715. %
  716. a = allchild(0);
  717. b = findobj(a, 'Name', get_param(gcbh,'Name'));
  718. if isempty(b)
  719.   figureHandle = figure(...
  720.       'Units',        'points',...
  721.       'Position',     [10 20 350 400],...
  722.       'NumberTitle',  'off',...
  723.       'Visible', 'off', ...      
  724.       'Name',         get_param(gcbh,'Name'),...
  725.       'Color',    [1 1 1],...    
  726.       'IntegerHandle','off',...
  727.       'DeleteFcn',    'sbiterr([],[],[],''DeleteFigure'')'...
  728.       );
  729. else
  730.   figureHandle = b;
  731. end;
  732. set(0, 'CurrentFigure', figureHandle);
  733. %
  734. % store the block's handle in the figure's UserData
  735. %
  736. ud.Block = gcbh;
  737. %
  738. % squirrel the figure handle away in the current block, and put the
  739. % various handles into the figure's UserData
  740. %
  741. SetSBiterrFigure(gcbh,figureHandle);
  742. set(figureHandle,'HandleVisibility','callback','UserData',ud);
  743. % end CreateSBiterrFigure
  744. %
  745. %=============================================================================
  746. % SetBlockCallbacks
  747. % This sets the callbacks of the block if it is not a reference.
  748. %=============================================================================
  749. %
  750. function SetBlockCallbacks(block)
  751. %
  752. % the actual source of the block is the parent subsystem
  753. %
  754. block=get_param(block,'Parent');
  755. %
  756. % if the block isn't linked, issue a warning, and then set the callbacks
  757. % for the block so that it has the proper operation
  758. %
  759. if strcmp(get_param(block,'LinkStatus'),'none'),
  760. %  warnmsg=sprintf(['The Bit-Error Meter block ''%s'' should be replaced with a ' ...
  761. %                   'new version from the com_sour block library'],...
  762. %                   block);
  763. %  warning(warnmsg);
  764.   callbacks={
  765.     'CopyFcn',       'sbiterr([],[],[],''CopyBlock'')' ;
  766.     'DeleteFcn',     'sbiterr([],[],[],''DeleteBlock'')' ;
  767.     'LoadFcn',       'sbiterr([],[],[],''LoadBlock'')' ;
  768.     'StartFcn',      'sbiterr([],[],[],''Start'')' ;
  769.     'StopFcn'        'sbiterr([],[],[],''Stop'')' ;
  770.     'NameChangeFcn', 'sbiterr([],[],[],''NameChange'')' ;
  771.   };
  772.   for i=1:length(callbacks)
  773.     if ~strcmp(get_param(block,callbacks{i,1}),callbacks{i,2})
  774.       set_param(block,callbacks{i,1},callbacks{i,2});
  775.     end
  776.   end
  777. end
  778. % end SetBlockCallbacks
  779. %%%%%%%%%%%%%%%%%%%%%%%%
  780. %   End of SBITERR.M   %
  781. %%%%%%%%%%%%%%%%%%%%%%%%