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

通讯编程文档

开发平台:

Matlab

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