olindgre 2ece01e1d7 Make powertrain-build not overlap with pybuild in site-packages
Change-Id: I7b59f3f04f0f787d35db0b9389f295bf1ad24f56
2024-09-17 10:25:04 +02:00

119 lines
5.0 KiB
Matlab

% Copyright 2024 Volvo Car Corporation
% Licensed under Apache 2.0.
function [res_blk, res_ports] = followLink(startBlock, startPort)
% Follow the links until a block is found
% or multiple paths are encountered
if nargin == 1
tmpDstBlock = getDstBlocks(startBlock);
tmpPort = get(getDstLines(startBlock), 'DstPortHandle');
if iscell(tmpPort)
tmpPort = vertcat(tmpPort{:});
end
else
tmpDstBlock = startBlock;
tmpPort = startPort;
end
while 1
%% Check for invalid handle
if tmpDstBlock < 0
disp(['Warning: Port not connected: ' ...
getPath(startBlock)])
res_blk = -1;
res_ports = -1;
break;
%% If multiple links were found
elseif length(tmpDstBlock) > 1
res_blk = tmpDstBlock;
res_ports = tmpPort;
break;
%% If the block is a inport
elseif strcmp(get_param(tmpDstBlock, 'blocktype'), 'Inport')
tmp=get_param(get_param(tmpDstBlock,'parent'), 'linehandles');
tmpPort=get_param(tmp.Inport(str2num(get_param(tmpDstBlock,'port'))), 'srcporthandle');
tmpDstBlock=get_param(tmp.Inport(str2num(get_param(tmpDstBlock,'port'))), 'srcblockhandle');
%% If the block is a outport
elseif strcmp(get_param(tmpDstBlock, 'blocktype'), 'Outport')
tmpParent=get_param(tmpDstBlock, 'parent');
% If were about to exit a block with an action port. Stop!
ph=get_param(tmpParent, 'PortHandles');
if ~isempty(ph.Ifaction) || ~isempty(ph.Enable)
res_blk = tmpDstBlock;
res_ports = tmpPort;
break;
end
tmp=get_param(tmpParent, 'linehandles');
tmpOutport = tmp.Outport(str2num(get_param(tmpDstBlock, 'port')));
if tmpOutport < 0
% Not connected. Stop!
res_blk = tmpDstBlock;
res_ports = tmpPort;
break;
end
tmpPort=get_param(tmpOutport, 'dstporthandle');
tmpDstBlock=get_param(tmpOutport, 'dstblockhandle');
%% If the block is a From-block
elseif strcmp(get_param(tmpDstBlock, 'blocktype'), 'Goto')
From=find_system(get_param(tmpDstBlock, 'parent'),'lookundermasks', ...
'on','searchdepth',1,'Findall','on', 'blocktype', ...
'From','GotoTag', get_param(tmpDstBlock,'GotoTag'));
if length(From > 0)
tmp=get_param(From, 'linehandles');
tmpLen = length(tmp);
%hanterar att det finns flera from block!!!
if tmpLen > 1
tmpPort = [];
tmpDstBlock = [];
for i=1:tmpLen
tmpPort = [tmpPort; get_param(tmp{i}.Outport, 'dstporthandle')];
tmpDstBlock = [tmpDstBlock; get_param(tmp{i}.Outport, 'dstblockhandle')];
end
else
tmpPort=get_param(tmp.Outport, 'dstporthandle');
tmpDstBlock=get_param(tmp.Outport, 'dstblockhandle');
end
else
disp(['Warning: Goto-block, without from here:' ...
getPath(tmpDstBlock)])
res_blk = -1;
res_ports = -1;
break;
end
%% If non masked subsystem
elseif checkSubsystem(tmpDstBlock) && ~strcmp(get(tmpPort,'PortType'), 'enable')
% kolla om subsystemet är maskat, eller om inporten är en enable port,
% om så är fallet hantera som ett vanligt block
inport=find_system(tmpDstBlock,'lookundermasks','on', ...
'searchdepth', 1, 'FindAll', 'on', ...
'blocktype','Inport', ...
'port', num2str(get(tmpPort,'PortNumber')));
tmpPort=get_param(getDstLines(inport), 'dstporthandle');
tmpDstBlock=getDstBlocks(inport);
else
res_blk = tmpDstBlock;
res_ports = tmpPort;
break;
end
end
end
function follow = checkSubsystem(block)
% checkSubsystem returns a bool
% true if followLink should continue inside the subsystem
% false if followLink should not continue inside the subsystem
follow = false;
% If the block is not a SubSystem, stop.
if strcmp(get_param(block,'blocktype'), 'SubSystem')
if isempty(get_param(block,'MaskType'))
% If the block is not masked, continue
follow = true;
else
blockFields = fields(get(block));
if ismember('FollowLinks', blockFields)
% If the block is masked, but has FollowLinks property
% 'on': continue
follow = strcmp(get_param(block,'FollowLinks'), 'on');
end
end
end
end