www.pudn.com > communication-systems-using-MATLAB-m-files.rar > eyediasi.m


function  [sys, x0, str, ts]  = eyediasi(t,x,u,flag,... 
    timeRange, boundary, storeLength, eyeLine, scatterLine, twoDLine) 
%EYEDIASI Simulink eye diagram and scatter plot. 
%   [SYS, X0, STR, TS]  = ... 
%       EYEDIASI(T,X,U,FLAG,TIMERANGE,BOUNDARY,STORELENGTH,EYELINE,SCATTERLINE,TWODLINE) 
% 
%   This M-file is designed to be used in a Simulink S-function block. 
%   It plots an eye diagram against time and the scatter plot. 
%   The parameter for the block of this figure are: 
% 
%   timeRange     Time range ( and offset if it is a two element variable) 
%   boundary     Lower and upper boundary of the Y axis. 
%   storeLength  Keep number of traces in storage for print purpose. 
%   eyeLine      Line type for eye-pattern diagram (0 for no such plot) 
%   scatterLine  Symbol type for scatter plot (0 for no such plot) 
%   twoDLine     Line type for 2-D trace plot (for 2-D signal only, 0 for no such plot) 
%    
%   This file takes scalar input and trigger signal input 
%   or a 2 dimensional vector input and trigger signal input. 
% 
%   Set this M-file up in an S-function block. 
%   Set the function parameter up as a four element vector 
%   which defines the axis of the graph. The line type must be in 
%   quotes. 
% 
%   See also PLOT, SFUNYST, SFUNXY, EYESAMPL 
 
%       Copyright 1996-2001 The MathWorks, Inc. 
%       $Revision: 1.27 $ $Date: 2001/04/05 04:38:00 $  
 
switch flag, 
 
  %%%%%%%%%%%%%%%%%% 
  % Initialization % 
  %%%%%%%%%%%%%%%%%% 
  case 0, 
  [sys,x0,ts] = mdlInitializeSizes(... 
      timeRange, boundary, storeLength, eyeLine, scatterLine, twoDLine); 
  SetBlockCallbacks(gcbh); 
   
  %%%%%%%%%% 
  % Update % 
  %%%%%%%%%% 
  case 2, 
  sys = mdlUpdate(t,x,u,... 
      timeRange, boundary, storeLength, eyeLine, scatterLine, twoDLine); 
   
  %%%%%%%%%%%%%%%%%%% 
  % Next Sample Hit % 
  %%%%%%%%%%%%%%%%%%% 
  case 4, 
  sys = mdlGetTimeOfNextVarHit(t, x, u); 
   
  %%%%%%%%%%%%%%%%%%% 
  % Unhandled flags % 
  %%%%%%%%%%%%%%%%%%% 
  case {1, 3, 9 } 
    sys=[]; 
 
  %%%%%%%%% 
  % Start % 
  %%%%%%%%% 
  case 'Start' 
  LocalBlockStartFcn 
 
  %%%%%%%% 
  % Stop % 
  %%%%%%%% 
  case 'Stop' 
  LocalBlockStopFcn 
 
  %%%%%%%%%%%%%% 
  % NameChange % 
  %%%%%%%%%%%%%% 
  case 'NameChange' 
  LocalBlockNameChangeFcn 
     
  %%%%%%%%%%%%% 
  % Load,Copy % 
  %%%%%%%%%%%%% 
  case { 'LoadBlock', 'CopyBlock' } 
  LocalBlockLoadCopyFcn 
     
  %%%%%%%%%%%%%%% 
  % DeleteBlock % 
  %%%%%%%%%%%%%%% 
  case 'DeleteBlock' 
  LocalBlockDeleteFcn 
     
  %%%%%%%%%%%%%%%% 
  % DeleteFigure % 
  %%%%%%%%%%%%%%%% 
  case 'DeleteFigure' 
  LocalFigureDeleteFcn 
 
  %%%%%%%%%%%%%%%%%%%% 
  % Unexpected flags % 
  %%%%%%%%%%%%%%%%%%%% 
  otherwise 
  if ischar(flag), 
    errmsg=sprintf('Unhandled flag: '' 	%s''', flag); 
  else 
    errmsg=sprintf('Unhandled flag: 	%d', flag); 
  end 
   
  error(errmsg); 
   
end 
 
% end eyediasi 
 
% 
%============================================================================= 
% mdlInitializeSizes 
% Return the sizes, initial conditions, and sample times for the S-function. 
%============================================================================= 
% 
function [sys,x0,ts] = mdlInitializeSizes(... 
	timeRange, boundary, storeLength, eyeLine, scatterLine, twoDLine); 
 
% 
% call simsizes for a sizes structure, fill it in and convert it to a sizes array. 
% 
sizes = simsizes; 
 
sizes.NumContStates  = 0; 
sizes.NumDiscStates  = 3;   % 3 discrete states 
sizes.NumOutputs     = 0; 
sizes.NumInputs      = -1;  % dynamically sized input vector 
sizes.DirFeedthrough = 0;   % the meter does not have direct feedthrough 
sizes.NumSampleTimes = 1; 
 
sys = simsizes(sizes); 
 
% 
% initialize the initial condition 
% 
x0 = [0, 0, 0]; 			% figure handle, u[last] input, last_mod_time 
 
% x(1), the figure handle. 
ts = [-1, 0]; 
 
% 
% str is always an empty matrix 
% 
str = []; 
 
% end mdlInitializeSizes 
 
% 
%============================================================================ 
% mdlGetTimeOfNextVarHit 
% Return the time of the next hit for this block. Note that the result  
% is absolute time. 
%============================================================================ 
% 
function sys = mdlGetTimeOfNextVarHit(t, x, u);   
 
sys = []; 
 
% end mdlGetTimeOfNextVarHit 
 
% 
%============================================================================= 
% mdlUpdate 
% Handle discrete state updates, sample time hits, and major time step 
% requirements. 
%============================================================================= 
% 
function sys = mdlUpdate(t,x,u,... 
   timeRange, boundary, storeLength, eyeLine, scatterLine, twoDLine); 
 
% 
% Locate the figure window associated with this block. If it's not a valid 
% handle (it may have been closed by the user), then return. 
% 
figureHandle = GetEyediasiFigure(gcbh); 
if ~ishandle(figureHandle) 
  return; 
end;   
 
threshold = .2; 
eye_plot = ~((eyeLine(1)==0) + (eyeLine(1)=='0')); 
scatter_plot = ~((scatterLine(1)==0) + (scatterLine(1) == '0')); 
two_d_plot = ~((twoDLine(1)==0) + (twoDLine(1) == '0')); 
len_u = length(u)-1; 
 
if two_d_plot & (len_u ~= 2) 
  sl_name = get_param(0,'CurrentSystem');  
  sl_name_gcs = sl_name; 
  block = get_param(sl_name, 'CurrentBlock');  
  error(['Please set 2-D plot line type to be zero in block ',... 
	  sl_name, '/', block]); 
  if len_u > 2 
    error('The input signal length is limited to two.') 
  end; 
end; 
 
plot_type = eye_plot + scatter_plot + two_d_plot; 
% in case of no plot 
if plot_type <= 0 
  return; 
end; 
 
if length(timeRange) < 2 
  timeRange(2) = 0; 
else 
  timeRange(2) = rem(rem(timeRange(2), timeRange(1)) + ... 
      timeRange(1), timeRange(1)); 
end; 
 
% initialize the figure 
if x(1) == 0 
  h_fig = x(1); 
  % Initialize graph 
  sl_name = gcs; 
  block = get_param(sl_name,'CurrentBlock');  
  sl_name_gcs = sl_name; 
  if ~isempty(find(sl_name=='/')) 
    sl_name = sl_name(find(sl_name=='/')+1 : length(sl_name)); 
  end;     
 
  [n_b, m_b]= size(block); 
  if n_b < 1 
    error('Cannot delete block while simulating'); 
  elseif n_b > 1 
    error('Something wrong in get_param, You don''t have the current Simulink') 
  end; 
   
  %  generate a new figure here. 
  x(1) = figureHandle; 
  if plot_type == 1 
    %open a single window figure 
    delete(allchild(x(1))); 
    figurePosition = get(x(1),'Position'); 
    figurePosition(3) = 360;	 
    set(x(1), ... 
	'Visible','on',... 
	'Position', figurePosition );	   
    plt(1) = axes('Unit','norm',... 
	'Pos',[.08, .08 .87,.87],... 
	'Clipping', 'on',... 
	'Parent', x(1),... 
	'NextPlot','Add' ,... 
	'HandleVisibility', 'off'); 
  elseif plot_type == 2 
    % open a double window figure 
    delete(allchild(x(1))); 
    figurePosition = get(x(1),'Position'); 
    figurePosition(3) = 660;	 
    set(x(1), ... 
	'Visible','on',... 
	'Position', figurePosition );	   
    plt(1) = axes('Unit','norm',... 
	'Pos',[.08, .08 .8/2,.87],... 
	'Clipping', 'on',... 
	'Parent', x(1),... 
	'NextPlot','Add',... 
	'HandleVisibility', 'Off'); 
    plt(2) = axes('Unit','norm',... 
	'Pos',[.08+.5, .08 .8/2,.87],... 
	'Parent', x(1),... 
	'NextPlot','Add',... 
	'HandleVisibility', 'Off'); 
  elseif plot_type == 3 
    % open a three window figure 
    delete(allchild(x(1))); 
    figurePosition = get(x(1),'Position'); 
    figurePosition(3) = 960;	 
    set(x(1), ... 
	'Visible','on',... 
	'Position', figurePosition );	   
    plt(1) = axes('Unit','norm',... 
	'Pos',[.04, .08 .79/3,.87],... 
	'Parent', x(1), ... 
	'Clipping', 'on',... 
	'NextPlot','Add',... 
	'HandleVisibility', 'Off'); 
    plt(2) = axes('Unit','norm',... 
	'Parent', x(1), ... 
	'Pos',[.04+1/3, .08 .79/3,.87],... 
	'NextPlot','Add',... 
	'HandleVisibility', 'Off'); 
    plt(3) = axes('Unit','norm',... 
	'Parent', x(1), ... 
	'Pos',[.04+2/3, .08 .79/3,.87],... 
	'NextPlot','Add',... 
	'HandleVisibility', 'Off'); 
  end;    
 
  i = 1; 
  if eye_plot 
    eye_plot = plt(i); 
    i = i+1; 
    set(x(1),'CurrentAxes',eye_plot); 
    ax = []; 
    lines = eyeLine; 
    for j = 1:len_u+1; 
      [col, lines] = strtok(lines, '/'); 
      if length(col) <= 1 
	col = 'k-'; 
      end; 
      if lower(col(1)) == 'n' 
	ax(j) = 0 
      else 
	[linest, markst] = LineTypeSeparation(col(2:length(col))); 
	ax(j) = plot(0,0,col,...     
	    'Erasemode','none',... 
	    'Color',col(1),... 
	    'Parent', eye_plot, ... 
	    'LineStyle',linest,... 
	    'Marker', markst); 
	set(ax(j), 'XData', [],... 
	    'YData', []); 
      end; 
    end; 
     
    set(eye_plot,'Xlim',... 
	[rem(timeRange(2)/timeRange(1),1)*timeRange(1),... 
	    timeRange(1)+timeRange(2)], ... 
	'Ylim',[boundary(1), boundary(2)],... 
	'Clipping', 'on'); 
    set(eye_plot,'UserData',[ax, 0  ]); 
    %                        |   | |==>space for time points 
    %                        |   |==> number of NaN added 
    %                        |===> have size of length(u) 
  end; 
  if (scatter_plot) 
    scatter_plot = plt(i); 
    i = i + 1; 
    set(x(1),'CurrentAxes',scatter_plot); 
    ax = []; 
    lines = scatterLine; 
    for j = 1:len_u 
      [col, lines] = strtok(lines, '/'); 
      if length(col) <= 1 
	col = 'k-'; 
      end; 
      if ((len_u == 2) & (j == 2)) 
	ax(j) = 0; 
      else 
	if lower(col(1)) == 'n' 
	  ax(j) = 0 
	else 
	  [linest, markst] = LineTypeSeparation(col(2:length(col))); 
	  ax(j) = plot(0,0,col,... 
	      'Erasemode','none',... 
	      'Parent', scatter_plot, ... 
	      'Color',col(1),... 
	      'LineStyle',linest,... 
	      'Marker', markst); 
	  if col(2) == '.' 
	    set(ax(j), 'MarkerSize', 10); 
	  end; 
	  set(ax(j), 'XData', [], 'YData', []); 
	end; 
      end; 
    end; 
    if len_u == 2 
      set(scatter_plot,... 
	  'Xlim',[boundary(1), boundary(2)], ... 
	  'Ylim',[boundary(1), boundary(2)]); 
    else 
      set(scatter_plot,... 
	  'Xlim',[-1, 1],... 
	  'Ylim',[boundary(1), boundary(2)]); 
    end; 
    set(scatter_plot,... 
	'UserData',[ax, abs(scatterLine)]); 
  end; 
  if two_d_plot 
    two_d_plot = plt(i); 
    % This case, length(u) must be 3 
    set(x(1),'CurrentAxes',two_d_plot); 
    set(two_d_plot,'Xlim',[boundary(1), boundary(2)], ... 
	'Ylim',[boundary(1), boundary(2)]); 
    [col, lines] = strtok(twoDLine, '/'); 
    if length(col) <= 1 
      col = 'k-'; 
    end; 
    [linest, markst] = LineTypeSeparation(col(2:length(col))); 
    ax = plot(0,0,col,... 
	'Erasemode','none',... 
	'Parent', two_d_plot,... 
	'Color',col(1),... 
	'Marker', markst, ... 
	'LineStyle',linest); 
    set(two_d_plot,... 
	'Xlim',[boundary(1), boundary(2)], ... 
	'Ylim',[boundary(1), boundary(2)]); 
    set(ax, 'XData', [], 'YData', []); 
    set(two_d_plot,'UserData',[ax, 0 abs(twoDLine)]); 
  end; 
  set(x(1),'UserData',[eye_plot, scatter_plot, two_d_plot, timeRange, boundary, abs(eyeLine)]); 
  %                    1         2             3           4           6         8 
  set_param(sl_name_gcs, 'userdata', x(1)); 
elseif x(1) < 0 
  % figure has been closed. 
  return; 
end; 
 
plot_flag_test = allchild(0); 
if isempty(plot_flag_test) 
  sys = x; 
  return; 
elseif isempty(find(plot_flag_test == x(1))) 
  x(1) = -1; 
  sys = x; 
  return; 
end; 
       
handles = get(x(1), 'UserData'); 
len_u = length(u) - 1; 
changed_boundary   = 0; 
if max(boundary ~= handles(6:7)) > 0 
  changed_boundary = 1; 
end; 
 
triggered = 0; 
if (u(len_u+1) >= threshold) & (x(2) < threshold) 
  triggered = 1; 
end; 
x(2) = u(len_u+1); 
 
if handles(1) & eye_plot 
  %eye_pattern plot 
  sub_han = get(handles(1),'UserData'); 
  changed_timeRange = 0; 
  if max(timeRange ~= handles(4:5)) > 0 
    changed_timeRange = 1; 
  end; 
  if changed_boundary 
    set(handles(1), 'Ylim', boundary); 
  end; 
  if changed_timeRange 
    %this is a complicated process. Deal it later. 
  end; 
  len_h_userdata = length(handles); 
  changed_line_type = 0; 
  if (length(eyeLine) ~= len_h_userdata-7) 
    changed_line_type = 1; 
  elseif max(abs(eyeLine) ~= handles(8:len_h_userdata)) 
    changed_line_type = 1; 
  else 
    changed_line_type = 0;       
  end; 
  if changed_line_type 
    lines = eyeLine; 
    for i = 1 : len_u+1 
      [col, lines] = strtok(lines, '/'); 
      if length(col) <= 1 
	col = 'k-'; 
      end; 
      if sub_han(i) 
	[linest, markst] = LineTypeSeparation(col(2:length(col))); 
	set(sub_han(i),... 
	    'Color', col(1),... 
	    'LineStyle', linest,... 
	    'Marker', markst); 
      end; 
    end; 
    set(x(1),'UserData',[handles(1:7), abs(eyeLine)]); 
  end; 
  mod_time = rem((t - timeRange(2))/timeRange(1), 1) ... 
      * timeRange(1) + timeRange(2); 
  last_time = x(3); 
  if ~handles(3)  
    x(3) = mod_time; 
  end; 
  if (mod_time < last_time) 
    if storeLength <= 0 
      storeLength = 1; 
    end 
    %hit the boundary of switching point. 
    pre_point = mod_time + timeRange(1); 
    aft_point = mod_time; 
    ind = []; 
    if sub_han(len_u+2) >= storeLength 
      ind = find(isnan(sub_han(len_u+3:length(sub_han)))); 
      sub_han(len_u+3:ind(max(1, length(ind)-storeLength))) = []; 
      sub_han(len_u+2) = sum(isnan(sub_han(len_u+3:length(sub_han)))); 
    end; 
    sub_han(len_u + 2) = sub_han(len_u + 2) + 1; 
    sub_han = [sub_han t NaN t]; 
    set(handles(1),'UserData',sub_han); 
    for i = 1 : len_u 
      if sub_han(i) 
	tmp_x = get(sub_han(i), 'XData'); 
	tmp_y = get(sub_han(i), 'YData'); 
	if ~isempty(ind) 
	  tmp_x(1:ind(max(1, length(ind)-storeLength))-len_u-2) = []; 
	  tmp_y(1:ind(max(1, length(ind)-storeLength))-len_u-2) = []; 
	end; 
	set(sub_han(i), 'XData',[tmp_x, pre_point, NaN, aft_point],... 
	    'YData',[tmp_y, u(i),      NaN, u(i)]); 
      end; 
    end; 
  else 
    set(handles(1), 'UserData',[get(handles(1), 'UserData') t]) 
    for i = 1 : len_u 
      if sub_han(i) 
	set(sub_han(i), 'XData', [get(sub_han(i), 'XData'), mod_time], ... 
	    'YData', [get(sub_han(i), 'YData'), u(i)]); 
      end; 
    end; 
  end; 
   
  if triggered & sub_han(len_u) & (t > 0) 
    if storeLength <= 0 
      storeLength = 1; 
    end 
    tmp_x = get(sub_han(len_u + 1), 'XData'); 
    tmp_y = get(sub_han(len_u + 1), 'YData'); 
    if length(tmp_x) > 3*storeLength 
      tmp_x(1:3) = []; 
      tmp_y(1:3) = []; 
    end; 
    tmp_x = [tmp_x, mod_time, mod_time, NaN]; 
    tmp_y = [tmp_y, get(handles(1), 'YLim'), NaN]; 
    set(sub_han(len_u + 1), 'XData', tmp_x, 'YData', tmp_y); 
  end; 
end; 
 
if handles(2) & triggered & (t>0) & scatter_plot 
  if storeLength <= 0 
    storeLength = 1; 
  end     
  %scatter plot 
  sub_han = get(handles(2), 'UserData'); 
  if changed_boundary 
    set(handles(2), 'Ylim', boundary); 
    if len_u == 2 
      set(handles(2), 'Xlim', boundary); 
    end; 
  end; 
  len_h_userdata = length(sub_han); 
  changed_line_type = 0; 
  if (length(scatterLine) ~= len_h_userdata - len_u) 
    changed_line_type = 1; 
  elseif max(abs(scatterLine) ~= sub_han(len_u+1:len_h_userdata)) 
    changed_line_type = 1; 
  end; 
  if changed_line_type 
    lines = scatterLine; 
    for i = 1 : len_u 
      [col, lines] = strtok(lines, '/'); 
      if length(col) <= 1 
	col = 'k-'; 
      end; 
      if ~((i == 2) & (len_u == 2)) 
	[linest, markst] = LineTypeSeparation(col(2:length(col))); 
	set(sub_han(i),... 
	    'Color',col(1),... 
	    'LineStyle', linest,... 
	    'Marker', markst); 
	if col(2) == '.' 
	  set(sub_han(i), 'MarkerSize', 10); 
	else 
	  set(sub_han(i), 'MarkerSize', 6); 
	end; 
      end; 
    end; 
    set(handles(2), 'UserData',[sub_han(1:len_u), abs(scatterLine)]); 
  end; 
  if len_u == 2 
    tmp_x = get(sub_han(1), 'XData'); 
    tmp_y = get(sub_han(1), 'YData'); 
    if length(tmp_x) > 2*storeLength 
      tmp_x(1:2) = []; 
      tmp_y(1:2) = []; 
    end; 
    tmp_x = [tmp_x, u(1), NaN]; 
    tmp_y = [tmp_y, u(2), NaN]; 
    set(sub_han(1), 'XData', tmp_x, 'YData', tmp_y); 
  else 
    for i = 1 : len_u 
      tmp_x = get(sub_han(i), 'XData'); 
      tmp_y = get(sub_han(i), 'YData'); 
      if length(tmp_x) > 2*storeLength 
	tmp_x(1:2) = []; 
	tmp_y(1:2) = []; 
      end; 
      tmp_x = [tmp_x, 0, NaN]; 
      tmp_y = [tmp_y, u(i), NaN]; 
      set(sub_han(i), 'XData', tmp_x, 'YData', tmp_y); 
    end; 
  end; 
end; 
 
if handles(3) & two_d_plot 
  %2-d eye_plot 
  sub_han = get(handles(3), 'UserData'); 
  if changed_boundary 
    set(handles(3), 'Xlim', boundary, 'Ylim', boundary); 
  end; 
  len_h_userdata = length(sub_han); 
  changed_line_type = 0; 
  if (length(twoDLine) ~= len_h_userdata - 2) 
    changed_line_type = 1; 
  elseif max(abs(twoDLine) ~= sub_han(3:len_h_userdata)) 
    changed_line_type = 1; 
  end; 
  if changed_line_type 
    [col, lines] = strtok(twoDLine, '/'); 
    if length(col) <= 1 
      col = 'k-'; 
    end; 
    [linest, markst] = LineTypeSeparation(col(2:length(col))); 
    set(sub_han(1),... 
	'Color',col(1),... 
	'LineStyle',linest,... 
	'Marker', markst); 
    set(handles(3), 'UserData',[sub_han(1:2), abs(twoDLine)]); 
  end; 
  mod_time = rem((t - timeRange(2))/timeRange(1),1)... 
      * timeRange(1) + timeRange(2); 
  last_time = x(3); 
  x(3) = mod_time; 
  if mod_time < last_time 
    if storeLength <= 0 
      storeLength = 1; 
    end                 
    tmp_x = get(sub_han(1),'XData'); 
    tmp_y = get(sub_han(1),'YData'); 
    if sub_han(2) >= storeLength 
      ind = find(isnan(tmp_x)); 
      tmp_x(1:ind(1)) = []; 
      tmp_y(1:ind(1)) = []; 
    end; 
    tmp_x = [tmp_x u(1) NaN u(1)]; 
    tmp_y = [tmp_y u(2) NaN u(2)]; 
    set(handles(3),'UserData',[sub_han(1) sum(isnan(tmp_x)) abs(twoDLine)]) 
    set(sub_han(1),'XData',tmp_x,'YData',tmp_y); 
  else 
    set(sub_han(1), 'XData', [get(sub_han(1), 'XData'), u(1)], ... 
	'YData', [get(sub_han(1), 'YData'), u(2)]); 
  end; 
  drawnow; 
end; 
sys = x; 
 
% end mdlUpdate 
 
% 
%============================================================================= 
% LocalFigureDeleteFcn 
% This is the Graph figure window's DeleteFcn.  The figure window is 
% being deleted, update the Graph block's UserData to reflect the change. 
%============================================================================= 
% 
function LocalFigureDeleteFcn 
 
% 
% Get the block associated with this figure and set it's figure to -1 
% 
SetEyediasiFigure(gcbh, get_param(gcbh,'userdata')); 
close(gcbf); 
 
% end LocalFigureDeleteFcn 
 
% 
%============================================================================= 
% LocalBlockStartFcn 
% Function that is called when the simulation starts.  Initialize the 
% Graph scope figure. 
%============================================================================= 
% 
function LocalBlockStartFcn 
 
% 
% get the figure associated with this block, create a figure if it doesn't 
% exist 
% 
figureHandle = GetEyediasiFigure(gcbh); 
if ~ishandle(figureHandle), 
  figureHandle = CreateEyediasiFigure; 
end 
 
ud = get(figureHandle,'UserData'); 
set(figureHandle,'UserData',ud); 
 
% end LocalBlockStartFcn 
 
% 
%============================================================================= 
% LocalBlockStopFcn 
% At the end of the simulation, set the line's X and Y data to contain 
% the complete set of points that were acquire during the simulation. 
% Recall that during the simulation, the lines are only small segments from 
% the last time step to the current one. 
%============================================================================= 
% 
function LocalBlockStopFcn 
 
% 
% Locate the figure window associated with this block. If it's not a valid 
% handle (it may have been closed by the user), then return. 
% 
figureHandle=GetEyediasiFigure(gcbh); 
if ishandle(figureHandle), 
  % 
  % Get UserData of the figure. 
  % 
  ud = get(figureHandle,'UserData'); 
  % Currently do nothing in LocalBlockStopFcn 
 
end 
 
% end LocalBlockStopFcn 
 
% 
%============================================================================= 
% LocalBlockNameChangeFcn 
% Function that handles name changes on the Bit-Error Meter. 
%============================================================================= 
% 
function LocalBlockNameChangeFcn 
 
% 
% the figure handle is stored in the block's UserData 
% 
figureHandle = GetEyediasiFigure(gcbh); 
if ishandle(figureHandle), 
  set(figureHandle,'Name',get_param(gcbh,'Name')); 
end 
 
% end LocalBlockNameChangeFcn 
 
% 
%============================================================================= 
% LocalBlockLoadCopyFcn 
% Function that initializes the Bit-Error Meter's UserData when it is 
% loaded from an mdl file and when it is copied. 
%============================================================================= 
% 
function LocalBlockLoadCopyFcn 
 
SetEyediasiFigure(gcbh,[]); 
 
% end LocalBlockLoadCopyFcn 
 
% 
%============================================================================= 
% LocalBlockDeleteFcn 
% Function that handles the Bit-Error Meter's deletion from a block 
% diagram. 
%============================================================================= 
% 
function LocalBlockDeleteFcn 
 
% 
% the figure handle is stored in the block's UserData 
% 
figureHandle = GetEyediasiFigure(gcbh); 
if ishandle(figureHandle), 
  delete(figureHandle); 
  SetEyediasiFigure(gcbh,[]); 
end 
 
% end LocalBlockDeleteFcn 
 
% 
%============================================================================= 
% GetEyediasiFigure 
% Retrieves the figure window associated with this S-function Bit-Error Meter 
% from the block's parent subsystem's UserData. 
%============================================================================= 
% 
function figureHandle=GetEyediasiFigure(block) 
 
if strcmp(get_param(block,'BlockType'),'S-Function'), 
  block=get_param(block,'Parent'); 
end 
 
ud = get_param(block,'UserData'); 
if ishandle(ud) 
   figureHandle = ud; 
else 
  if isempty(ud) 
    ud.figureHandle = []; 
    set_param(block,'UserData', ud); 
  end;   
  figureHandle = ud.figureHandle; 
end; 
 
if isempty(figureHandle), 
  figureHandle = -1; 
end 
 
% end GetEyediasiFigure 
 
% 
%============================================================================= 
% SetEyediasiFigure 
% Stores the figure window associated with this S-function Bit-Error Meter 
% in the block's parent subsystem's UserData. 
%============================================================================= 
% 
function SetEyediasiFigure(block,figureHandle) 
 
if strcmp(get_param(block,'BlockType'),'S-Function'), 
  block=get_param(block,'Parent'); 
end 
 
ud = get_param(block,'UserData'); 
ud.figureHandle = figureHandle; 
set_param(block,'UserData',ud); 
 
% end SetEyediasiFigure 
 
% 
%============================================================================= 
% CreateEyediasiFigure 
% Creates the figure window associated with this S-function Bit-Error Meter. 
%============================================================================= 
% 
function figureHandle=CreateEyediasiFigure 
 
% 
% create the figure and the axes 
% 
 
a = allchild(0); 
b = findobj(a, 'Name', get_param(gcbh,'Name')); 
if isempty(b) 
   figureHandle = figure(... 
      'Units',        'points',... 
      'Position',     [10 10 360 350],... 
      'NumberTitle',  'off',... 
      'Name',         get_param(gcbh,'Name'),... 
      'Visible',      'off', ...       
      'IntegerHandle','off',... 
      'DeleteFcn',    'eyediasi([],[],[],''DeleteFigure'')'... 
      ); 
else 
  figureHandle = b; 
end; 
set(0, 'CurrentFigure', figureHandle); 
 
% 
% store the block's handle in the figure's UserData 
% 
ud.Block = gcbh; 
%ud.figureHandle = figureHandle; 
 
% 
% squirrel the figure handle away in the current block, and put the 
% various handles into the figure's UserData 
% 
SetEyediasiFigure(gcbh,figureHandle); 
set(figureHandle,'HandleVisibility','callback','UserData',ud); 
 
% end CreateEyediasiFigure 
 
% 
%============================================================================= 
% SetBlockCallbacks 
% This sets the callbacks of the block if it is not a reference. 
%============================================================================= 
% 
function SetBlockCallbacks(block) 
 
% 
% the actual source of the block is the parent subsystem 
% 
block=get_param(block,'Parent'); 
 
% 
% if the block isn't linked, issue a warning, and then set the callbacks 
% for the block so that it has the proper operation 
% 
if strcmp(get_param(block,'LinkStatus'),'none'), 
%  warnmsg=sprintf(['The Eye-Pattern diagram block ''%s'' should be replaced with a ' ... 
%                   'new version from the com_sour block library'],... 
%                   block); 
%  warning(warnmsg); 
 
  callbacks={ 
    'CopyFcn',       'eyediasi([],[],[],''CopyBlock'')' ; 
    'DeleteFcn',     'eyediasi([],[],[],''DeleteBlock'')' ; 
    'LoadFcn',       'eyediasi([],[],[],''LoadBlock'')' ; 
    'StartFcn',      'eyediasi([],[],[],''Start'')' ; 
    'StopFcn'        'eyediasi([],[],[],''Stop'')' ; 
    'NameChangeFcn', 'eyediasi([],[],[],''NameChange'')' ; 
  }; 
 
  for i=1:length(callbacks) 
    if ~strcmp(get_param(block,callbacks{i,1}),callbacks{i,2}) 
      set_param(block,callbacks{i,1},callbacks{i,2}); 
    end 
  end 
end 
 
% end SetBlockCallbacks 
 
% 
%=============================================================== 
% Local Function 
% This is used to separate the line type and mark type. 
%=============================================================== 
% 
function [linest, markst] = LineTypeSeparation(linetype) 
 
% take out the marks 
linest = linetype; 
linidx = [findstr(linetype, '.'), ... 
          findstr(linetype, 'o'), ... 
          findstr(linetype, 'x'), ... 
          findstr(linetype, '+'), ... 
          findstr(linetype, '*'), ... 
          findstr(linetype, 's'), ... 
          findstr(linetype, 'd'), ... 
          findstr(linetype, 'v'), ... 
          findstr(linetype, '^'), ... 
          findstr(linetype, '<'), ... 
          findstr(linetype, '>'), ... 
          findstr(linetype, 'p'), ... 
          findstr(linetype, 'h')]; 
markst = 'none'; 
if ~isempty(linidx) 
  markst = linetype(linidx); 
  linest(linidx) = []; 
end; 
if isempty(linest) 
  linest = 'none'; 
end; 
 
%%%%%%%%%%%%%%%%%%%%%%%% 
%   End of EYEDIASI.M  % 
%%%%%%%%%%%%%%%%%%%%%%%%