0
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 1 function [childrenHandles] = findchildren(parentHandle,varargin)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 2 % This function retrieves the handles of all blocks children of a given
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 3 % parent block, whose handle is received as input.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 4 %
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 5 % $Id: findchildren.m,v 1.2 2008/08/17 04:32:33 nicola Exp $
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 6
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 7
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 8
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 9 lineHandles = get(parentHandle,'LineHandles');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 10
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 11 if isempty(lineHandles) % the parent block given has no output: it's an ending.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 12 childrenHandles = [];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 13 return;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 14 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 15 lineOut1 = lineHandles.Outport; % this is the handle of the line coming out from the parent block.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 16
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 17
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 18 childrenHandles = get(lineOut1,'DstBlockHandle'); % these are the handles of all children blocks.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 19
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 20 if(iscell(childrenHandles)), childrenHandles = cell2mat(childrenHandles); end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 21
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 22 % Check if the parent given can be effectively a child (used when the
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 23 % findchildren function is called recursively, checking the output of a
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 24 % subsystem):
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 25 if nargin>1 && strcmp(varargin{1},'all'), childrenHandles = [parentHandle; childrenHandles]; end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 26
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 27 for i=numel(childrenHandles):-1:1
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 28
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 29 if strcmp(get(childrenHandles(i),'BlockType'),'SubSystem') && numel(get(childrenHandles(i),'Blocks'))==3 && numel(utils.prog.find_in_models(childrenHandles(i),'LookUnderMasks','all','BlockType','M-S-Function','FunctionName','ltpdasim'))==1
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 30 % then this block is a susbsystem containing a ltpdasim function block. It's a real child. The handle must be substituted with the one of the inner function block.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 31 childrenHandles(i) = utils.prog.find_in_models(childrenHandles(i),'LookUnderMasks','all','BlockType','M-S-Function','FunctionName','ltpdasim');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 32
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 33 elseif strcmp(get(childrenHandles(i),'BlockType'),'M-S-Function') && strcmp(get(childrenHandles(i),'FunctionName'),'ltpdasim')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 34 % then this block is a ltpdasim function block. It's a real child. The research do not go deeper into this branch, since this child will create a new ltpda obj.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 35
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 36 elseif strcmp(get(childrenHandles(i),'BlockType'),'SubSystem') && numel(get(childrenHandles(i),'Blocks'))==3 && numel(utils.prog.find_in_models(childrenHandles(i),'LookUnderMasks','all','BlockType','M-S-Function'))==1
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 37 % this is a block containing a LTPDA function, but not using ltpdasim. The ltpda obj pass through, the research must look further.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 38 followingChildren = utils.prog.findchildren(childrenHandles(i));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 39 childrenHandles = [childrenHandles;followingChildren];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 40 childrenHandles(i)= [];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 41
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 42 elseif strcmp(get(childrenHandles(i),'BlockType'),'M-S-Function') && ~strcmp(get(childrenHandles(i),'FunctionName'),'ltpdasim')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 43 % then this block is a function block (NOT ltpdasim). It can be ignored.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 44 childrenHandles(i)= [];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 45
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 46 elseif strcmp(get(childrenHandles(i),'BlockType'),'Terminator')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 47 % this is a false child: the terminator do not need the output of the
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 48 % parent block.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 49 childrenHandles(i)= [];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 50
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 51 elseif strcmp(get(childrenHandles(i),'BlockType'),'Mux')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 52 % this transfer the parent block output to other following blocks: the research must go deeper.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 53 followingChildren = utils.prog.findchildren(childrenHandles(i));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 54 childrenHandles = [childrenHandles;followingChildren];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 55 childrenHandles(i)= [];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 56
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 57 elseif strcmp(get(childrenHandles(i),'BlockType'),'Goto')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 58 % this transfer the parent block output to other following blocks; the research must go deeper.
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 59 allFromBlocks = utils.prog.find_in_models(bdroot,'LookUnderMasks','all','BlockType','From','GotoTag',get(childrenHandles(i),'GotoTag'));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 60 for j=1:numel(allFromBlocks)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 61 fromHandle = get_param(allFromBlocks{j},'Handle');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 62 followingChildren = utils.prog.findchildren(fromHandle);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 63 childrenHandles = [childrenHandles;followingChildren];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 64 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 65 childrenHandles(i)= [];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 66
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 67 elseif strcmp(get(childrenHandles(i),'BlockType'),'SubSystem')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 68 % this is a common subsystem: the research must look for all children blocks contained:
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 69 subsystemHandle = childrenHandles(i);
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 70 portConnectivity = get(subsystemHandle,'PortConnectivity');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 71 portHandles = get(subsystemHandle,'PortHandles');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 72 for portIndex=1:numel(portHandles.Inport)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 73 if portConnectivity(portIndex).SrcBlock == parentHandle, break; end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 74 end % the port n° <portIndex> is the one connected to the parent block
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 75 portHandles = find_system(subsystemHandle,'LookUnderMasks','all','BlockType','Inport','Port',num2str(portIndex));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 76 for j=1:numel(portHandles)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 77 followingChildren = utils.prog.findchildren(portHandles(j));
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 78 childrenHandles = [childrenHandles;followingChildren];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 79 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 80 childrenHandles(i)= [];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 81
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 82 elseif strcmp(get(childrenHandles(i),'BlockType'),'Outport')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 83 % the line exits a subsystem: the research must continue in the upper level:
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 84 portIndex = get(childrenHandles(i),'Port');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 85 subsystemHandle = get_param(get(childrenHandles(i),'Parent'),'Handle');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 86 portConnectivity = get(subsystemHandle,'PortConnectivity');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 87 for j=1:size(portConnectivity,1)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 88 if strcmp(portConnectivity(j).Type,portIndex) && isempty(portConnectivity(j).SrcBlock)
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 89 destinationBlock = portConnectivity(j).DstBlock;
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 90 break
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 91 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 92 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 93 followingChildren = utils.prog.findchildren(destinationBlock,'all');
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 94 childrenHandles = [childrenHandles;followingChildren];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 95 childrenHandles(i)= [];
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 96
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 97 else
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 98 disp('--- Unknown case, please update function ''utils.prog.findchildren''')
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 99 disp(['The unknown block is: ',getfullname(childrenHandles(i))])
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 100 disp(['The block has type: ',get(childrenHandles(i),'BlockType')])
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 101
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 102 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 103
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 104 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 105
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 106 end
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 107
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 108
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 109
Daniele Nicolodi <nicolodi@science.unitn.it>
parents:
diff
changeset
+ − 110