eyediasi.m
上传用户:loeagle
上传日期:2013-03-02
资源大小:1236k
文件大小:26k
- 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 %
- %%%%%%%%%%%%%%%%%%%%%%%%