Mercurial > hg > ltpda
diff m-toolbox/m/gui/gltpda/g_UpdateInports.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/m/gui/gltpda/g_UpdateInports.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,116 @@ +function g_UpdateInports(varargin) + % Update the MaskDisplay and the number of inports when the user + % changes the params from Simulink. + + global params + + paramKey = varargin{1}; + if numel(paramKey)>7 && strcmpi(paramKey(1:7),'addPar_'), paramKey(1:7)=[]; end + + % List of parameters coming from Simulink: + simKey = {}; + for i=1:nparams(params) + if isa(params.params(i).val,'char') && strcmp(params.params(i).val,'-->') + name = params.params(i).key; + try if strcmpi(name(1:7),'addPar_'), name(1:7)=[]; end; catch, end + simKey{end+1} = name; + elseif isa(params.params(i).val,'cell') && isa(params.params(i).val{1},'char') && strcmp(params.params(i).val{1},'-->') + name = params.params(i).key; + try if strcmpi(name(1:7),'addPar_'), name(1:7)=[]; end; catch, end + simKey{end+1} = name; + end + end + + % =================================================================== + % If varargin{2}==2 no block has been added or subtracted, just + % renamed an existing param; the only thing to perform is update the + % drawing command. + if varargin{2}~=2 + + % Remove ALL inner inport blocks. + if varargin{2}==-1, simKey2remove = [simKey,{paramKey}]; else simKey2remove = simKey; end + + for i=1:numel(simKey2remove) + try %#ok<ALIGN> + block2delete = utils.prog.find_in_models(gcb,'SearchDepth',1,'LookUnderMasks','all','Name',lower(simKey2remove{i})); + if numel(block2delete)>1, block2delete(1)=[]; end + blockLines = get_param(block2delete{1},'LineHandles'); + if (blockLines.Outport(1)~=-1 && ~isempty(blockLines.Outport(1))), delete_line(blockLines.Outport(1)); end + delete_block(block2delete); + catch, end + end + + % Add ALL inner inport blocks anew: + for i=1:numel(simKey) + newBlock = add_block('simulink/Sources/In1', [gcb,'/Inport1'],'MakeNameUnique','on'); + nameAlreadyPresent = utils.prog.find_in_models(gcb,'SearchDepth',1,'LookUnderMasks','all','Name',lower(simKey{i})); + if ~isempty(nameAlreadyPresent) + for j=1:numel(nameAlreadyPresent) + if ~strcmp(nameAlreadyPresent{j},gcb), + set_param(nameAlreadyPresent{j},'Name',[lower(simKey{i}),'_fun']); + end + end + end + set(newBlock,'Name',lower(simKey{i})) + end + + % Now update the inner structure of lines and mux. + muxblock = find_system(gcb,'SearchDepth',1,'LookUnderMasks','all','BlockType','Mux'); + try %#ok<ALIGN> + muxLines = get_param(muxblock{1},'LineHandles'); + for k=1:numel(muxLines.Inport), if (muxLines.Inport(k)~=-1 && ~isempty(muxLines.Inport(k))), delete_line(muxLines.Inport(k)); end + end + for k=1:numel(muxLines.Outport), if (muxLines.Outport(k)~=-1 && ~isempty(muxLines.Outport(k))), delete_line(muxLines.Outport(k)); end + end + catch, end + delete_block(muxblock); + + inports = find_system(gcb,'SearchDepth',1,'LookUnderMasks','all','BlockType','Inport'); + fakeInp = find_system(gcb,'SearchDepth',1,'LookUnderMasks','all','BlockType','Ground'); + inports = [fakeInp;inports]; + if numel(inports)>1 + muxblock = add_block('built-in/Mux', [gcb,'/Mux']); + set(muxblock,'Position',[70 , 10 , 73 , 150]) + set(muxblock,'Inputs',num2str(numel(inports))) + end + for k=1:numel(inports) + inports{k}=get_param(inports{k},'Handle'); + blkLines = get(inports{k},'LineHandles'); + for j=1:numel(blkLines.Outport), if (blkLines.Outport(j)~=-1 && ~isempty(blkLines.Outport(j))), delete_line(blkLines.Outport(j)); end + end + set(inports{k},'Position',[10 , 10+30*(k-1) , 30 , 30+30*(k-1)]) + set(inports{k},'Tag',num2str(k)) + if numel(inports)>1 + add_line(gcb,[get(inports{k},'Name'),'/1'],[get(muxblock,'Name'),'/',num2str(k)]); + end + end + funcBlock = find_system(gcb,'SearchDepth',1,'LookUnderMasks','all','BlockType','M-S-Function'); + funcBlock = get_param(funcBlock,'Name'); + if numel(inports)>1 + add_line(gcb,[get(muxblock,'Name'),'/1'],[funcBlock{1},'/1']); + else + add_line(gcb,[get(inports{1},'Name'),'/1'],[funcBlock{1},'/1']); + end + + end + % =================================================================== + + % Updating the drawing command for the block Mask: + fakeInp = find_system(gcb,'SearchDepth',1,'LookUnderMasks','all','BlockType','Ground'); + drawingCom = ''; + if numel(simKey)>0 % then there are params 'from simulink' added + if numel(fakeInp)>0 || strcmp(get_param(gcbh,'Tag'),'arithmetic'), currInp=1; else currInp=str2double(get(findobj('Tag','numbDataInputs'),'String'))+1; end + for nn=1:numel(simKey) + drawingCom = [drawingCom,'port_label(''input'',',num2str(currInp),',''',lower(simKey{1}),''');']; + simKey(1) = []; + currInp = currInp+1; + end + else % then the only inport is the regular one + funcBlock = find_system(gcb,'SearchDepth',1,'LookUnderMasks','all','BlockType','M-S-Function'); + funcName = get_param(funcBlock{1},'Tag'); + if numel(funcName)>6 && strcmp(funcName(1:6),'ltpda_'), funcName(1:6)=[]; end + drawingCom = strcat('disp(''',lower(funcName),''')'); + end + set(gcbh,'MaskDisplay',drawingCom) + +end