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

通讯编程文档

开发平台:

Matlab

  1. function  [sys, x0, str, ts]  = eyediasi(t,x,u,flag,...
  2.     timeRange, boundary, storeLength, eyeLine, scatterLine, twoDLine)
  3. %EYEDIASI Simulink eye diagram and scatter plot.
  4. %   [SYS, X0, STR, TS]  = ...
  5. %       EYEDIASI(T,X,U,FLAG,TIMERANGE,BOUNDARY,STORELENGTH,EYELINE,SCATTERLINE,TWODLINE)
  6. %
  7. %   This M-file is designed to be used in a Simulink S-function block.
  8. %   It plots an eye diagram against time and the scatter plot.
  9. %   The parameter for the block of this figure are:
  10. %
  11. %   timeRange     Time range ( and offset if it is a two element variable)
  12. %   boundary     Lower and upper boundary of the Y axis.
  13. %   storeLength  Keep number of traces in storage for print purpose.
  14. %   eyeLine      Line type for eye-pattern diagram (0 for no such plot)
  15. %   scatterLine  Symbol type for scatter plot (0 for no such plot)
  16. %   twoDLine     Line type for 2-D trace plot (for 2-D signal only, 0 for no such plot)
  17. %   
  18. %   This file takes scalar input and trigger signal input
  19. %   or a 2 dimensional vector input and trigger signal input.
  20. %
  21. %   Set this M-file up in an S-function block.
  22. %   Set the function parameter up as a four element vector
  23. %   which defines the axis of the graph. The line type must be in
  24. %   quotes.
  25. %
  26. %   See also PLOT, SFUNYST, SFUNXY, EYESAMPL
  27. %       Copyright 1996-2001 The MathWorks, Inc.
  28. %       $Revision: 1.27 $ $Date: 2001/04/05 04:38:00 $ 
  29. switch flag,
  30.   %%%%%%%%%%%%%%%%%%
  31.   % Initialization %
  32.   %%%%%%%%%%%%%%%%%%
  33.   case 0,
  34.   [sys,x0,ts] = mdlInitializeSizes(...
  35.       timeRange, boundary, storeLength, eyeLine, scatterLine, twoDLine);
  36.   SetBlockCallbacks(gcbh);
  37.   
  38.   %%%%%%%%%%
  39.   % Update %
  40.   %%%%%%%%%%
  41.   case 2,
  42.   sys = mdlUpdate(t,x,u,...
  43.       timeRange, boundary, storeLength, eyeLine, scatterLine, twoDLine);
  44.   
  45.   %%%%%%%%%%%%%%%%%%%
  46.   % Next Sample Hit %
  47.   %%%%%%%%%%%%%%%%%%%
  48.   case 4,
  49.   sys = mdlGetTimeOfNextVarHit(t, x, u);
  50.   
  51.   %%%%%%%%%%%%%%%%%%%
  52.   % Unhandled flags %
  53.   %%%%%%%%%%%%%%%%%%%
  54.   case {1, 3, 9 }
  55.     sys=[];
  56.   %%%%%%%%%
  57.   % Start %
  58.   %%%%%%%%%
  59.   case 'Start'
  60.   LocalBlockStartFcn
  61.   %%%%%%%%
  62.   % Stop %
  63.   %%%%%%%%
  64.   case 'Stop'
  65.   LocalBlockStopFcn
  66.   %%%%%%%%%%%%%%
  67.   % NameChange %
  68.   %%%%%%%%%%%%%%
  69.   case 'NameChange'
  70.   LocalBlockNameChangeFcn
  71.     
  72.   %%%%%%%%%%%%%
  73.   % Load,Copy %
  74.   %%%%%%%%%%%%%
  75.   case { 'LoadBlock', 'CopyBlock' }
  76.   LocalBlockLoadCopyFcn
  77.     
  78.   %%%%%%%%%%%%%%%
  79.   % DeleteBlock %
  80.   %%%%%%%%%%%%%%%
  81.   case 'DeleteBlock'
  82.   LocalBlockDeleteFcn
  83.     
  84.   %%%%%%%%%%%%%%%%
  85.   % DeleteFigure %
  86.   %%%%%%%%%%%%%%%%
  87.   case 'DeleteFigure'
  88.   LocalFigureDeleteFcn
  89.   %%%%%%%%%%%%%%%%%%%%
  90.   % Unexpected flags %
  91.   %%%%%%%%%%%%%%%%%%%%
  92.   otherwise
  93.   if ischar(flag),
  94.     errmsg=sprintf('Unhandled flag: ''  %s''', flag);
  95.   else
  96.     errmsg=sprintf('Unhandled flag:  %d', flag);
  97.   end
  98.   
  99.   error(errmsg);
  100.   
  101. end
  102. % end eyediasi
  103. %
  104. %=============================================================================
  105. % mdlInitializeSizes
  106. % Return the sizes, initial conditions, and sample times for the S-function.
  107. %=============================================================================
  108. %
  109. function [sys,x0,ts] = mdlInitializeSizes(...
  110. timeRange, boundary, storeLength, eyeLine, scatterLine, twoDLine);
  111. %
  112. % call simsizes for a sizes structure, fill it in and convert it to a sizes array.
  113. %
  114. sizes = simsizes;
  115. sizes.NumContStates  = 0;
  116. sizes.NumDiscStates  = 3;   % 3 discrete states
  117. sizes.NumOutputs     = 0;
  118. sizes.NumInputs      = -1;  % dynamically sized input vector
  119. sizes.DirFeedthrough = 0;   % the meter does not have direct feedthrough
  120. sizes.NumSampleTimes = 1;
  121. sys = simsizes(sizes);
  122. %
  123. % initialize the initial condition
  124. %
  125. x0 = [0, 0, 0];  % figure handle, u[last] input, last_mod_time
  126. % x(1), the figure handle.
  127. ts = [-1, 0];
  128. %
  129. % str is always an empty matrix
  130. %
  131. str = [];
  132. % end mdlInitializeSizes
  133. %
  134. %============================================================================
  135. % mdlGetTimeOfNextVarHit
  136. % Return the time of the next hit for this block. Note that the result 
  137. % is absolute time.
  138. %============================================================================
  139. %
  140. function sys = mdlGetTimeOfNextVarHit(t, x, u);  
  141. sys = [];
  142. % end mdlGetTimeOfNextVarHit
  143. %
  144. %=============================================================================
  145. % mdlUpdate
  146. % Handle discrete state updates, sample time hits, and major time step
  147. % requirements.
  148. %=============================================================================
  149. %
  150. function sys = mdlUpdate(t,x,u,...
  151.    timeRange, boundary, storeLength, eyeLine, scatterLine, twoDLine);
  152. %
  153. % Locate the figure window associated with this block. If it's not a valid
  154. % handle (it may have been closed by the user), then return.
  155. %
  156. figureHandle = GetEyediasiFigure(gcbh);
  157. if ~ishandle(figureHandle)
  158.   return;
  159. end;  
  160. threshold = .2;
  161. eye_plot = ~((eyeLine(1)==0) + (eyeLine(1)=='0'));
  162. scatter_plot = ~((scatterLine(1)==0) + (scatterLine(1) == '0'));
  163. two_d_plot = ~((twoDLine(1)==0) + (twoDLine(1) == '0'));
  164. len_u = length(u)-1;
  165. if two_d_plot & (len_u ~= 2)
  166.   sl_name = get_param(0,'CurrentSystem'); 
  167.   sl_name_gcs = sl_name;
  168.   block = get_param(sl_name, 'CurrentBlock'); 
  169.   error(['Please set 2-D plot line type to be zero in block ',...
  170.   sl_name, '/', block]);
  171.   if len_u > 2
  172.     error('The input signal length is limited to two.')
  173.   end;
  174. end;
  175. plot_type = eye_plot + scatter_plot + two_d_plot;
  176. % in case of no plot
  177. if plot_type <= 0
  178.   return;
  179. end;
  180. if length(timeRange) < 2
  181.   timeRange(2) = 0;
  182. else
  183.   timeRange(2) = rem(rem(timeRange(2), timeRange(1)) + ...
  184.       timeRange(1), timeRange(1));
  185. end;
  186. % initialize the figure
  187. if x(1) == 0
  188.   h_fig = x(1);
  189.   % Initialize graph
  190.   sl_name = gcs;
  191.   block = get_param(sl_name,'CurrentBlock'); 
  192.   sl_name_gcs = sl_name;
  193.   if ~isempty(find(sl_name=='/'))
  194.     sl_name = sl_name(find(sl_name=='/')+1 : length(sl_name));
  195.   end;    
  196.   [n_b, m_b]= size(block);
  197.   if n_b < 1
  198.     error('Cannot delete block while simulating');
  199.   elseif n_b > 1
  200.     error('Something wrong in get_param, You don''t have the current Simulink')
  201.   end;
  202.   
  203.   %  generate a new figure here.
  204.   x(1) = figureHandle;
  205.   if plot_type == 1
  206.     %open a single window figure
  207.     delete(allchild(x(1)));
  208.     figurePosition = get(x(1),'Position');
  209.     figurePosition(3) = 360;
  210.     set(x(1), ...
  211. 'Visible','on',...
  212. 'Position', figurePosition );   
  213.     plt(1) = axes('Unit','norm',...
  214. 'Pos',[.08, .08 .87,.87],...
  215. 'Clipping', 'on',...
  216. 'Parent', x(1),...
  217. 'NextPlot','Add' ,...
  218. 'HandleVisibility', 'off');
  219.   elseif plot_type == 2
  220.     % open a double window figure
  221.     delete(allchild(x(1)));
  222.     figurePosition = get(x(1),'Position');
  223.     figurePosition(3) = 660;
  224.     set(x(1), ...
  225. 'Visible','on',...
  226. 'Position', figurePosition );   
  227.     plt(1) = axes('Unit','norm',...
  228. 'Pos',[.08, .08 .8/2,.87],...
  229. 'Clipping', 'on',...
  230. 'Parent', x(1),...
  231. 'NextPlot','Add',...
  232. 'HandleVisibility', 'Off');
  233.     plt(2) = axes('Unit','norm',...
  234. 'Pos',[.08+.5, .08 .8/2,.87],...
  235. 'Parent', x(1),...
  236. 'NextPlot','Add',...
  237. 'HandleVisibility', 'Off');
  238.   elseif plot_type == 3
  239.     % open a three window figure
  240.     delete(allchild(x(1)));
  241.     figurePosition = get(x(1),'Position');
  242.     figurePosition(3) = 960;
  243.     set(x(1), ...
  244. 'Visible','on',...
  245. 'Position', figurePosition );   
  246.     plt(1) = axes('Unit','norm',...
  247. 'Pos',[.04, .08 .79/3,.87],...
  248. 'Parent', x(1), ...
  249. 'Clipping', 'on',...
  250. 'NextPlot','Add',...
  251. 'HandleVisibility', 'Off');
  252.     plt(2) = axes('Unit','norm',...
  253. 'Parent', x(1), ...
  254. 'Pos',[.04+1/3, .08 .79/3,.87],...
  255. 'NextPlot','Add',...
  256. 'HandleVisibility', 'Off');
  257.     plt(3) = axes('Unit','norm',...
  258. 'Parent', x(1), ...
  259. 'Pos',[.04+2/3, .08 .79/3,.87],...
  260. 'NextPlot','Add',...
  261. 'HandleVisibility', 'Off');
  262.   end;   
  263.   i = 1;
  264.   if eye_plot
  265.     eye_plot = plt(i);
  266.     i = i+1;
  267.     set(x(1),'CurrentAxes',eye_plot);
  268.     ax = [];
  269.     lines = eyeLine;
  270.     for j = 1:len_u+1;
  271.       [col, lines] = strtok(lines, '/');
  272.       if length(col) <= 1
  273. col = 'k-';
  274.       end;
  275.       if lower(col(1)) == 'n'
  276. ax(j) = 0
  277.       else
  278. [linest, markst] = LineTypeSeparation(col(2:length(col)));
  279. ax(j) = plot(0,0,col,...    
  280.     'Erasemode','none',...
  281.     'Color',col(1),...
  282.     'Parent', eye_plot, ...
  283.     'LineStyle',linest,...
  284.     'Marker', markst);
  285. set(ax(j), 'XData', [],...
  286.     'YData', []);
  287.       end;
  288.     end;
  289.     
  290.     set(eye_plot,'Xlim',...
  291. [rem(timeRange(2)/timeRange(1),1)*timeRange(1),...
  292.     timeRange(1)+timeRange(2)], ...
  293. 'Ylim',[boundary(1), boundary(2)],...
  294. 'Clipping', 'on');
  295.     set(eye_plot,'UserData',[ax, 0  ]);
  296.     %                        |   | |==>space for time points
  297.     %                        |   |==> number of NaN added
  298.     %                        |===> have size of length(u)
  299.   end;
  300.   if (scatter_plot)
  301.     scatter_plot = plt(i);
  302.     i = i + 1;
  303.     set(x(1),'CurrentAxes',scatter_plot);
  304.     ax = [];
  305.     lines = scatterLine;
  306.     for j = 1:len_u
  307.       [col, lines] = strtok(lines, '/');
  308.       if length(col) <= 1
  309. col = 'k-';
  310.       end;
  311.       if ((len_u == 2) & (j == 2))
  312. ax(j) = 0;
  313.       else
  314. if lower(col(1)) == 'n'
  315.   ax(j) = 0
  316. else
  317.   [linest, markst] = LineTypeSeparation(col(2:length(col)));
  318.   ax(j) = plot(0,0,col,...
  319.       'Erasemode','none',...
  320.       'Parent', scatter_plot, ...
  321.       'Color',col(1),...
  322.       'LineStyle',linest,...
  323.       'Marker', markst);
  324.   if col(2) == '.'
  325.     set(ax(j), 'MarkerSize', 10);
  326.   end;
  327.   set(ax(j), 'XData', [], 'YData', []);
  328. end;
  329.       end;
  330.     end;
  331.     if len_u == 2
  332.       set(scatter_plot,...
  333.   'Xlim',[boundary(1), boundary(2)], ...
  334.   'Ylim',[boundary(1), boundary(2)]);
  335.     else
  336.       set(scatter_plot,...
  337.   'Xlim',[-1, 1],...
  338.   'Ylim',[boundary(1), boundary(2)]);
  339.     end;
  340.     set(scatter_plot,...
  341. 'UserData',[ax, abs(scatterLine)]);
  342.   end;
  343.   if two_d_plot
  344.     two_d_plot = plt(i);
  345.     % This case, length(u) must be 3
  346.     set(x(1),'CurrentAxes',two_d_plot);
  347.     set(two_d_plot,'Xlim',[boundary(1), boundary(2)], ...
  348. 'Ylim',[boundary(1), boundary(2)]);
  349.     [col, lines] = strtok(twoDLine, '/');
  350.     if length(col) <= 1
  351.       col = 'k-';
  352.     end;
  353.     [linest, markst] = LineTypeSeparation(col(2:length(col)));
  354.     ax = plot(0,0,col,...
  355. 'Erasemode','none',...
  356. 'Parent', two_d_plot,...
  357. 'Color',col(1),...
  358. 'Marker', markst, ...
  359. 'LineStyle',linest);
  360.     set(two_d_plot,...
  361. 'Xlim',[boundary(1), boundary(2)], ...
  362. 'Ylim',[boundary(1), boundary(2)]);
  363.     set(ax, 'XData', [], 'YData', []);
  364.     set(two_d_plot,'UserData',[ax, 0 abs(twoDLine)]);
  365.   end;
  366.   set(x(1),'UserData',[eye_plot, scatter_plot, two_d_plot, timeRange, boundary, abs(eyeLine)]);
  367.   %                    1         2             3           4           6         8
  368.   set_param(sl_name_gcs, 'userdata', x(1));
  369. elseif x(1) < 0
  370.   % figure has been closed.
  371.   return;
  372. end;
  373. plot_flag_test = allchild(0);
  374. if isempty(plot_flag_test)
  375.   sys = x;
  376.   return;
  377. elseif isempty(find(plot_flag_test == x(1)))
  378.   x(1) = -1;
  379.   sys = x;
  380.   return;
  381. end;
  382.       
  383. handles = get(x(1), 'UserData');
  384. len_u = length(u) - 1;
  385. changed_boundary   = 0;
  386. if max(boundary ~= handles(6:7)) > 0
  387.   changed_boundary = 1;
  388. end;
  389. triggered = 0;
  390. if (u(len_u+1) >= threshold) & (x(2) < threshold)
  391.   triggered = 1;
  392. end;
  393. x(2) = u(len_u+1);
  394. if handles(1) & eye_plot
  395.   %eye_pattern plot
  396.   sub_han = get(handles(1),'UserData');
  397.   changed_timeRange = 0;
  398.   if max(timeRange ~= handles(4:5)) > 0
  399.     changed_timeRange = 1;
  400.   end;
  401.   if changed_boundary
  402.     set(handles(1), 'Ylim', boundary);
  403.   end;
  404.   if changed_timeRange
  405.     %this is a complicated process. Deal it later.
  406.   end;
  407.   len_h_userdata = length(handles);
  408.   changed_line_type = 0;
  409.   if (length(eyeLine) ~= len_h_userdata-7)
  410.     changed_line_type = 1;
  411.   elseif max(abs(eyeLine) ~= handles(8:len_h_userdata))
  412.     changed_line_type = 1;
  413.   else
  414.     changed_line_type = 0;      
  415.   end;
  416.   if changed_line_type
  417.     lines = eyeLine;
  418.     for i = 1 : len_u+1
  419.       [col, lines] = strtok(lines, '/');
  420.       if length(col) <= 1
  421. col = 'k-';
  422.       end;
  423.       if sub_han(i)
  424. [linest, markst] = LineTypeSeparation(col(2:length(col)));
  425. set(sub_han(i),...
  426.     'Color', col(1),...
  427.     'LineStyle', linest,...
  428.     'Marker', markst);
  429.       end;
  430.     end;
  431.     set(x(1),'UserData',[handles(1:7), abs(eyeLine)]);
  432.   end;
  433.   mod_time = rem((t - timeRange(2))/timeRange(1), 1) ...
  434.       * timeRange(1) + timeRange(2);
  435.   last_time = x(3);
  436.   if ~handles(3) 
  437.     x(3) = mod_time;
  438.   end;
  439.   if (mod_time < last_time)
  440.     if storeLength <= 0
  441.       storeLength = 1;
  442.     end
  443.     %hit the boundary of switching point.
  444.     pre_point = mod_time + timeRange(1);
  445.     aft_point = mod_time;
  446.     ind = [];
  447.     if sub_han(len_u+2) >= storeLength
  448.       ind = find(isnan(sub_han(len_u+3:length(sub_han))));
  449.       sub_han(len_u+3:ind(max(1, length(ind)-storeLength))) = [];
  450.       sub_han(len_u+2) = sum(isnan(sub_han(len_u+3:length(sub_han))));
  451.     end;
  452.     sub_han(len_u + 2) = sub_han(len_u + 2) + 1;
  453.     sub_han = [sub_han t NaN t];
  454.     set(handles(1),'UserData',sub_han);
  455.     for i = 1 : len_u
  456.       if sub_han(i)
  457. tmp_x = get(sub_han(i), 'XData');
  458. tmp_y = get(sub_han(i), 'YData');
  459. if ~isempty(ind)
  460.   tmp_x(1:ind(max(1, length(ind)-storeLength))-len_u-2) = [];
  461.   tmp_y(1:ind(max(1, length(ind)-storeLength))-len_u-2) = [];
  462. end;
  463. set(sub_han(i), 'XData',[tmp_x, pre_point, NaN, aft_point],...
  464.     'YData',[tmp_y, u(i),      NaN, u(i)]);
  465.       end;
  466.     end;
  467.   else
  468.     set(handles(1), 'UserData',[get(handles(1), 'UserData') t])
  469.     for i = 1 : len_u
  470.       if sub_han(i)
  471. set(sub_han(i), 'XData', [get(sub_han(i), 'XData'), mod_time], ...
  472.     'YData', [get(sub_han(i), 'YData'), u(i)]);
  473.       end;
  474.     end;
  475.   end;
  476.   
  477.   if triggered & sub_han(len_u) & (t > 0)
  478.     if storeLength <= 0
  479.       storeLength = 1;
  480.     end
  481.     tmp_x = get(sub_han(len_u + 1), 'XData');
  482.     tmp_y = get(sub_han(len_u + 1), 'YData');
  483.     if length(tmp_x) > 3*storeLength
  484.       tmp_x(1:3) = [];
  485.       tmp_y(1:3) = [];
  486.     end;
  487.     tmp_x = [tmp_x, mod_time, mod_time, NaN];
  488.     tmp_y = [tmp_y, get(handles(1), 'YLim'), NaN];
  489.     set(sub_han(len_u + 1), 'XData', tmp_x, 'YData', tmp_y);
  490.   end;
  491. end;
  492. if handles(2) & triggered & (t>0) & scatter_plot
  493.   if storeLength <= 0
  494.     storeLength = 1;
  495.   end    
  496.   %scatter plot
  497.   sub_han = get(handles(2), 'UserData');
  498.   if changed_boundary
  499.     set(handles(2), 'Ylim', boundary);
  500.     if len_u == 2
  501.       set(handles(2), 'Xlim', boundary);
  502.     end;
  503.   end;
  504.   len_h_userdata = length(sub_han);
  505.   changed_line_type = 0;
  506.   if (length(scatterLine) ~= len_h_userdata - len_u)
  507.     changed_line_type = 1;
  508.   elseif max(abs(scatterLine) ~= sub_han(len_u+1:len_h_userdata))
  509.     changed_line_type = 1;
  510.   end;
  511.   if changed_line_type
  512.     lines = scatterLine;
  513.     for i = 1 : len_u
  514.       [col, lines] = strtok(lines, '/');
  515.       if length(col) <= 1
  516. col = 'k-';
  517.       end;
  518.       if ~((i == 2) & (len_u == 2))
  519. [linest, markst] = LineTypeSeparation(col(2:length(col)));
  520. set(sub_han(i),...
  521.     'Color',col(1),...
  522.     'LineStyle', linest,...
  523.     'Marker', markst);
  524. if col(2) == '.'
  525.   set(sub_han(i), 'MarkerSize', 10);
  526. else
  527.   set(sub_han(i), 'MarkerSize', 6);
  528. end;
  529.       end;
  530.     end;
  531.     set(handles(2), 'UserData',[sub_han(1:len_u), abs(scatterLine)]);
  532.   end;
  533.   if len_u == 2
  534.     tmp_x = get(sub_han(1), 'XData');
  535.     tmp_y = get(sub_han(1), 'YData');
  536.     if length(tmp_x) > 2*storeLength
  537.       tmp_x(1:2) = [];
  538.       tmp_y(1:2) = [];
  539.     end;
  540.     tmp_x = [tmp_x, u(1), NaN];
  541.     tmp_y = [tmp_y, u(2), NaN];
  542.     set(sub_han(1), 'XData', tmp_x, 'YData', tmp_y);
  543.   else
  544.     for i = 1 : len_u
  545.       tmp_x = get(sub_han(i), 'XData');
  546.       tmp_y = get(sub_han(i), 'YData');
  547.       if length(tmp_x) > 2*storeLength
  548. tmp_x(1:2) = [];
  549. tmp_y(1:2) = [];
  550.       end;
  551.       tmp_x = [tmp_x, 0, NaN];
  552.       tmp_y = [tmp_y, u(i), NaN];
  553.       set(sub_han(i), 'XData', tmp_x, 'YData', tmp_y);
  554.     end;
  555.   end;
  556. end;
  557. if handles(3) & two_d_plot
  558.   %2-d eye_plot
  559.   sub_han = get(handles(3), 'UserData');
  560.   if changed_boundary
  561.     set(handles(3), 'Xlim', boundary, 'Ylim', boundary);
  562.   end;
  563.   len_h_userdata = length(sub_han);
  564.   changed_line_type = 0;
  565.   if (length(twoDLine) ~= len_h_userdata - 2)
  566.     changed_line_type = 1;
  567.   elseif max(abs(twoDLine) ~= sub_han(3:len_h_userdata))
  568.     changed_line_type = 1;
  569.   end;
  570.   if changed_line_type
  571.     [col, lines] = strtok(twoDLine, '/');
  572.     if length(col) <= 1
  573.       col = 'k-';
  574.     end;
  575.     [linest, markst] = LineTypeSeparation(col(2:length(col)));
  576.     set(sub_han(1),...
  577. 'Color',col(1),...
  578. 'LineStyle',linest,...
  579. 'Marker', markst);
  580.     set(handles(3), 'UserData',[sub_han(1:2), abs(twoDLine)]);
  581.   end;
  582.   mod_time = rem((t - timeRange(2))/timeRange(1),1)...
  583.       * timeRange(1) + timeRange(2);
  584.   last_time = x(3);
  585.   x(3) = mod_time;
  586.   if mod_time < last_time
  587.     if storeLength <= 0
  588.       storeLength = 1;
  589.     end                
  590.     tmp_x = get(sub_han(1),'XData');
  591.     tmp_y = get(sub_han(1),'YData');
  592.     if sub_han(2) >= storeLength
  593.       ind = find(isnan(tmp_x));
  594.       tmp_x(1:ind(1)) = [];
  595.       tmp_y(1:ind(1)) = [];
  596.     end;
  597.     tmp_x = [tmp_x u(1) NaN u(1)];
  598.     tmp_y = [tmp_y u(2) NaN u(2)];
  599.     set(handles(3),'UserData',[sub_han(1) sum(isnan(tmp_x)) abs(twoDLine)])
  600.     set(sub_han(1),'XData',tmp_x,'YData',tmp_y);
  601.   else
  602.     set(sub_han(1), 'XData', [get(sub_han(1), 'XData'), u(1)], ...
  603. 'YData', [get(sub_han(1), 'YData'), u(2)]);
  604.   end;
  605.   drawnow;
  606. end;
  607. sys = x;
  608. % end mdlUpdate
  609. %
  610. %=============================================================================
  611. % LocalFigureDeleteFcn
  612. % This is the Graph figure window's DeleteFcn.  The figure window is
  613. % being deleted, update the Graph block's UserData to reflect the change.
  614. %=============================================================================
  615. %
  616. function LocalFigureDeleteFcn
  617. %
  618. % Get the block associated with this figure and set it's figure to -1
  619. %
  620. SetEyediasiFigure(gcbh, get_param(gcbh,'userdata'));
  621. close(gcbf);
  622. % end LocalFigureDeleteFcn
  623. %
  624. %=============================================================================
  625. % LocalBlockStartFcn
  626. % Function that is called when the simulation starts.  Initialize the
  627. % Graph scope figure.
  628. %=============================================================================
  629. %
  630. function LocalBlockStartFcn
  631. %
  632. % get the figure associated with this block, create a figure if it doesn't
  633. % exist
  634. %
  635. figureHandle = GetEyediasiFigure(gcbh);
  636. if ~ishandle(figureHandle),
  637.   figureHandle = CreateEyediasiFigure;
  638. end
  639. ud = get(figureHandle,'UserData');
  640. set(figureHandle,'UserData',ud);
  641. % end LocalBlockStartFcn
  642. %
  643. %=============================================================================
  644. % LocalBlockStopFcn
  645. % At the end of the simulation, set the line's X and Y data to contain
  646. % the complete set of points that were acquire during the simulation.
  647. % Recall that during the simulation, the lines are only small segments from
  648. % the last time step to the current one.
  649. %=============================================================================
  650. %
  651. function LocalBlockStopFcn
  652. %
  653. % Locate the figure window associated with this block. If it's not a valid
  654. % handle (it may have been closed by the user), then return.
  655. %
  656. figureHandle=GetEyediasiFigure(gcbh);
  657. if ishandle(figureHandle),
  658.   %
  659.   % Get UserData of the figure.
  660.   %
  661.   ud = get(figureHandle,'UserData');
  662.   % Currently do nothing in LocalBlockStopFcn
  663. end
  664. % end LocalBlockStopFcn
  665. %
  666. %=============================================================================
  667. % LocalBlockNameChangeFcn
  668. % Function that handles name changes on the Bit-Error Meter.
  669. %=============================================================================
  670. %
  671. function LocalBlockNameChangeFcn
  672. %
  673. % the figure handle is stored in the block's UserData
  674. %
  675. figureHandle = GetEyediasiFigure(gcbh);
  676. if ishandle(figureHandle),
  677.   set(figureHandle,'Name',get_param(gcbh,'Name'));
  678. end
  679. % end LocalBlockNameChangeFcn
  680. %
  681. %=============================================================================
  682. % LocalBlockLoadCopyFcn
  683. % Function that initializes the Bit-Error Meter's UserData when it is
  684. % loaded from an mdl file and when it is copied.
  685. %=============================================================================
  686. %
  687. function LocalBlockLoadCopyFcn
  688. SetEyediasiFigure(gcbh,[]);
  689. % end LocalBlockLoadCopyFcn
  690. %
  691. %=============================================================================
  692. % LocalBlockDeleteFcn
  693. % Function that handles the Bit-Error Meter's deletion from a block
  694. % diagram.
  695. %=============================================================================
  696. %
  697. function LocalBlockDeleteFcn
  698. %
  699. % the figure handle is stored in the block's UserData
  700. %
  701. figureHandle = GetEyediasiFigure(gcbh);
  702. if ishandle(figureHandle),
  703.   delete(figureHandle);
  704.   SetEyediasiFigure(gcbh,[]);
  705. end
  706. % end LocalBlockDeleteFcn
  707. %
  708. %=============================================================================
  709. % GetEyediasiFigure
  710. % Retrieves the figure window associated with this S-function Bit-Error Meter
  711. % from the block's parent subsystem's UserData.
  712. %=============================================================================
  713. %
  714. function figureHandle=GetEyediasiFigure(block)
  715. if strcmp(get_param(block,'BlockType'),'S-Function'),
  716.   block=get_param(block,'Parent');
  717. end
  718. ud = get_param(block,'UserData');
  719. if ishandle(ud)
  720.    figureHandle = ud;
  721. else
  722.   if isempty(ud)
  723.     ud.figureHandle = [];
  724.     set_param(block,'UserData', ud);
  725.   end;  
  726.   figureHandle = ud.figureHandle;
  727. end;
  728. if isempty(figureHandle),
  729.   figureHandle = -1;
  730. end
  731. % end GetEyediasiFigure
  732. %
  733. %=============================================================================
  734. % SetEyediasiFigure
  735. % Stores the figure window associated with this S-function Bit-Error Meter
  736. % in the block's parent subsystem's UserData.
  737. %=============================================================================
  738. %
  739. function SetEyediasiFigure(block,figureHandle)
  740. if strcmp(get_param(block,'BlockType'),'S-Function'),
  741.   block=get_param(block,'Parent');
  742. end
  743. ud = get_param(block,'UserData');
  744. ud.figureHandle = figureHandle;
  745. set_param(block,'UserData',ud);
  746. % end SetEyediasiFigure
  747. %
  748. %=============================================================================
  749. % CreateEyediasiFigure
  750. % Creates the figure window associated with this S-function Bit-Error Meter.
  751. %=============================================================================
  752. %
  753. function figureHandle=CreateEyediasiFigure
  754. %
  755. % create the figure and the axes
  756. %
  757. a = allchild(0);
  758. b = findobj(a, 'Name', get_param(gcbh,'Name'));
  759. if isempty(b)
  760.    figureHandle = figure(...
  761.       'Units',        'points',...
  762.       'Position',     [10 10 360 350],...
  763.       'NumberTitle',  'off',...
  764.       'Name',         get_param(gcbh,'Name'),...
  765.       'Visible',      'off', ...      
  766.       'IntegerHandle','off',...
  767.       'DeleteFcn',    'eyediasi([],[],[],''DeleteFigure'')'...
  768.       );
  769. else
  770.   figureHandle = b;
  771. end;
  772. set(0, 'CurrentFigure', figureHandle);
  773. %
  774. % store the block's handle in the figure's UserData
  775. %
  776. ud.Block = gcbh;
  777. %ud.figureHandle = figureHandle;
  778. %
  779. % squirrel the figure handle away in the current block, and put the
  780. % various handles into the figure's UserData
  781. %
  782. SetEyediasiFigure(gcbh,figureHandle);
  783. set(figureHandle,'HandleVisibility','callback','UserData',ud);
  784. % end CreateEyediasiFigure
  785. %
  786. %=============================================================================
  787. % SetBlockCallbacks
  788. % This sets the callbacks of the block if it is not a reference.
  789. %=============================================================================
  790. %
  791. function SetBlockCallbacks(block)
  792. %
  793. % the actual source of the block is the parent subsystem
  794. %
  795. block=get_param(block,'Parent');
  796. %
  797. % if the block isn't linked, issue a warning, and then set the callbacks
  798. % for the block so that it has the proper operation
  799. %
  800. if strcmp(get_param(block,'LinkStatus'),'none'),
  801. %  warnmsg=sprintf(['The Eye-Pattern diagram block ''%s'' should be replaced with a ' ...
  802. %                   'new version from the com_sour block library'],...
  803. %                   block);
  804. %  warning(warnmsg);
  805.   callbacks={
  806.     'CopyFcn',       'eyediasi([],[],[],''CopyBlock'')' ;
  807.     'DeleteFcn',     'eyediasi([],[],[],''DeleteBlock'')' ;
  808.     'LoadFcn',       'eyediasi([],[],[],''LoadBlock'')' ;
  809.     'StartFcn',      'eyediasi([],[],[],''Start'')' ;
  810.     'StopFcn'        'eyediasi([],[],[],''Stop'')' ;
  811.     'NameChangeFcn', 'eyediasi([],[],[],''NameChange'')' ;
  812.   };
  813.   for i=1:length(callbacks)
  814.     if ~strcmp(get_param(block,callbacks{i,1}),callbacks{i,2})
  815.       set_param(block,callbacks{i,1},callbacks{i,2});
  816.     end
  817.   end
  818. end
  819. % end SetBlockCallbacks
  820. %
  821. %===============================================================
  822. % Local Function
  823. % This is used to separate the line type and mark type.
  824. %===============================================================
  825. %
  826. function [linest, markst] = LineTypeSeparation(linetype)
  827. % take out the marks
  828. linest = linetype;
  829. linidx = [findstr(linetype, '.'), ...
  830.           findstr(linetype, 'o'), ...
  831.           findstr(linetype, 'x'), ...
  832.           findstr(linetype, '+'), ...
  833.           findstr(linetype, '*'), ...
  834.           findstr(linetype, 's'), ...
  835.           findstr(linetype, 'd'), ...
  836.           findstr(linetype, 'v'), ...
  837.           findstr(linetype, '^'), ...
  838.           findstr(linetype, '<'), ...
  839.           findstr(linetype, '>'), ...
  840.           findstr(linetype, 'p'), ...
  841.           findstr(linetype, 'h')];
  842. markst = 'none';
  843. if ~isempty(linidx)
  844.   markst = linetype(linidx);
  845.   linest(linidx) = [];
  846. end;
  847. if isempty(linest)
  848.   linest = 'none';
  849. end;
  850. %%%%%%%%%%%%%%%%%%%%%%%%
  851. %   End of EYEDIASI.M  %
  852. %%%%%%%%%%%%%%%%%%%%%%%%