Mercurial > hg > ltpda
diff m-toolbox/m/gui/gltpda/pan1main.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/pan1main.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,900 @@ +function pan1main(varargin) +% This is the function for the main panel of the GUI LTPDA, the package of +% data analysis functions developed for the LISA Pathfinder Mission / LISA +% Technology Package. +% +% $Id: pan1main.m,v 1.57 2010/08/02 18:30:20 ingo Exp $ + +global LTPDAinvar LTPDAoutvar currentsystem gl loop selBlocks + +% Initialize the list of AOs: +InputObjList=''; % OutputObjList=''; +UpdateListbox(); +set(gcf,'NextPlot','new'); + +selBlocks = []; +scaleX = getappdata(0, 'ltpda_gui_scalefactor'); +guiFontSize = round(8*scaleX); + +alltimers = timerfindall; +stop(alltimers(2)); +set(alltimers(2),'TimerFcn',@ContinuousCheck,'Period',.5); +start(alltimers(2)); +set(gcf,'NextPlot','new') +set(gcf,'CloseRequestFcn',{@AskConfirm,'close'}) + +%% + +currPanel = varargin{1}; +if nargin>1, runSim = varargin{2}; else runSim = 0; end +panelDimens = get(currPanel, 'Position'); +backColor = get(currPanel, 'BackgroundColor'); + + uicontrol('Parent',currPanel,'TooltipString','login/logout','Units','pixels','HorizontalAlignment','center','Position',[60 panelDimens(4)*0.925 40 20],'String','log','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@LogoutCallback,'Style','pushbutton'); + uicontrol('Parent',currPanel,'BackgroundColor',backColor,'TooltipString','username','Units','pixels','HorizontalAlignment','left','Position',[110 panelDimens(4)*0.93 150 15],'String',getappdata(0,'ltpda_repo_user'),'FontSize',guiFontSize+1,'Style','text'); + currsystem = bdroot; + if isempty(currsystem) || isempty(find_system(currsystem,'FindAll','on','Type','Annotation','Tag','ltpda model')), currsystem = 'None'; end + uicontrol('Parent',currPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Units','pixels','Position',[230 panelDimens(4)*0.93 300 15],'String',['Current system: ',currsystem],'FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Tag','currsystem','Style','text'); + + + AnalysPanPos = [.005 .8 .990 .111]; + hanalysisPanel = uipanel('Parent',currPanel,'Title',' Analyses Control ','BackgroundColor',backColor,'FontSize',guiFontSize-1,'Units','normalized','Position',AnalysPanPos); + nbuttons = 3; + buttonWidth = (AnalysPanPos(3)-.01*(nbuttons))/nbuttons; + buttonPos = [AnalysPanPos(1) .2 buttonWidth .6]; + uicontrol('Parent',hanalysisPanel,'Units','pixels','Units','normalized','Position',buttonPos,'String','New model','TooltipString','Create a new LTPDA Simulink model','HorizontalAlignment','center','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@hNewButtonCallback,'Style','pushbutton'); + buttonPos(1) = buttonPos(1)+buttonWidth+.0125; + uicontrol('Parent',hanalysisPanel,'Units','pixels','Units','normalized','Position',buttonPos,'String','Open model','TooltipString','Open an existing LTPDA Simulink model','HorizontalAlignment','center','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@hOpenCallback,'Style','pushbutton'); + buttonPos(1) = buttonPos(1)+buttonWidth+.0125; + uicontrol('Parent',hanalysisPanel,'Units','pixels','Units','normalized','Position',buttonPos,'String','Save model','TooltipString','Save the currently selected LTPDA Simulink model','HorizontalAlignment','center','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@hSaveCallback,'Style','pushbutton'); + clear AnalysPanPos nbuttons buttonWidth buttonPos + + + DataPanPos = [.005 .1633 .990 .615]; + hDataPanel = uipanel('Parent',currPanel,'Title',' Data Control ','BackgroundColor',backColor,'FontSize',guiFontSize-1,'Units','normalized','Position',DataPanPos); + nbuttons = 3; + buttonWidth = (DataPanPos(3)-.01*(nbuttons))/nbuttons; + buttonPos = [DataPanPos(1) .9 buttonWidth .08]; + uicontrol('Parent',hDataPanel,'Units','normalized','HorizontalAlignment','center','Position',buttonPos,'String','Clear all input','TooltipString','Clear from memory the entire list of input objects','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',{@AskConfirm,'clear'},'Style','pushbutton'); + buttonPos(1) = buttonPos(1)+buttonWidth+.0125; +% uicontrol('Parent',hDataPanel,'Units','normalized','HorizontalAlignment','center','Position',buttonPos,'String','Load','TooltipString','Load data from file','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@hLoadDataButtonCallback,'Style','pushbutton'); +% buttonPos(1) = buttonPos(1)+buttonWidth+.0125; +% uicontrol('Parent',hDataPanel,'Units','normalized','HorizontalAlignment','center','Position',buttonPos,'String','Remove','TooltipString','Clear the selected object from memory','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@hRemoveButtonCallback,'Style','pushbutton'); +% buttonPos(1) = buttonPos(1)+buttonWidth+.0125; +% uicontrol('Parent',hDataPanel,'Units','normalized','HorizontalAlignment','center','Position',buttonPos,'String','Create','FontSize',guiFontSize,'Visible','on','Enable','off','UserData',InputObjList,'Callback',@hExploreButtonCallback,'Style','pushbutton'); +% buttonPos(1) = buttonPos(1)+buttonWidth+.0125; +% uicontrol('Parent',hDataPanel,'Units','normalized','HorizontalAlignment','center','Position',buttonPos,'String','Edit','FontSize',guiFontSize,'Visible','on','Enable','off','UserData',InputObjList,'Callback',@hExploreButtonCallback,'Style','pushbutton'); +% buttonPos(1) = buttonPos(1)+buttonWidth+.0125; + uicontrol('Parent',hDataPanel,'Units','normalized','HorizontalAlignment','center','Position',buttonPos,'String','Report','TooltipString','Report','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@hReportButtonCallback,'Style','pushbutton'); + buttonPos(1) = buttonPos(1)+buttonWidth+.0125; + hExploreButton = uicontrol('Parent',hDataPanel,'Units','normalized','HorizontalAlignment','center','Position',buttonPos,'String','Explore','TooltipString','Explore the selected objects with the LTPDA Explorer','FontSize',guiFontSize,'Visible','on','Enable','on','UserData',InputObjList,'Callback',@hExploreButtonCallback,'Style','pushbutton'); + clear nbuttons buttonWidth buttonPos + nbuttons = 3; + buttonWidth = (DataPanPos(3)-.01*(nbuttons))/nbuttons; + buttonPos = [DataPanPos(1) .8 buttonWidth .08]; + uicontrol('Parent',hDataPanel,'Units','normalized','HorizontalAlignment','center','Position',buttonPos,'String','Export to workspace','TooltipString','Export the selected objects from LTPDA to MATLAB workspace','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@hExportButtonCallback,'Style','pushbutton'); + buttonPos(1) = buttonPos(1)+buttonWidth+.0125; + uicontrol('Parent',hDataPanel,'Units','normalized','HorizontalAlignment','center','Position',buttonPos,'String','Save workspace','TooltipString','Save the LTPDA Workspace as .MAT file','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@SaveWorkspaceCallback,'Style','pushbutton'); + buttonPos(1) = buttonPos(1)+buttonWidth+.0125; + uicontrol('Parent',hDataPanel,'Units','normalized','HorizontalAlignment','center','Position',buttonPos,'String','Load workspace','TooltipString','Load a workspace from a .MAT file','FontSize',guiFontSize,'Visible','on','Enable','on','Callback',@LoadWorkspaceCallback,'Style','pushbutton'); + clear nbuttons buttonWidth buttonPos + + + nlists = 2; + listWidth = (DataPanPos(3)-.01*(nlists))/nlists; + listPos = [.01 .03 listWidth .7]; + InputObjList = uicontrol('Parent',hDataPanel,'BackgroundColor',[0.95,0.95,0.95],'HorizontalAlignment','center','Units','normalized','Position',listPos,'String',listInput,'Value',1,'Max',10,'Min',1,'FontSize',guiFontSize,'FontWeight','normal','Visible','on','Enable','on','Callback',@hListObjsCallback,'Tag','InputObjList','Style','listbox'); + set(hExploreButton,'UserData',InputObjList); + listPos(1) = listPos(1)+listWidth+.01; + % Info panel: + uicontrol('Parent',hDataPanel,'BackgroundColor',[0.94,0.94,1],'Style','listbox','HorizontalAlignment', 'left','Fontsize', guiFontSize,'Units','pixels','Units','normalized','Position',listPos,'Tag','infoPanel'); + hListObjsCallback(InputObjList,1); + clear DataPanPos nlists listWidth listPos + + + hExecutionPanel = uipanel('Parent',currPanel,'Title',' Execution control ','BackgroundColor',[1,1,1],'FontSize',guiFontSize-1,'Units','normalized','Position',[.0125 .0222 .975 .121]); + if isempty(getappdata(0,'maintainresults')), setappdata(0,'maintainresults',0); end + uicontrol('Parent',hExecutionPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Units','normalized','Position',[.03 .3 .3 .5],'Value',getappdata(0,'maintainresults'),'String',' Maintain all results','FontSize',guiFontSize+1,'TooltipString','Enable this if you want to maintain the results from all blocks at the end of the analysis calculation','ForeGroundColor','black','Visible','on','Enable','off','Callback','setappdata(0,''maintainresults'',get(gco,''Value''))','Style','checkbox','Tag','enableCheckbox'); + GUIprefs = getappdata(0, 'GUIpreferences'); + if ~isfield(GUIprefs,'CAD'), GUIprefs.CAD = 0; setappdata(0, 'GUIpreferences',GUIprefs); end + uicontrol('Parent',hExecutionPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Units','normalized','Position',[.3 .3 .3 .5],'Value',GUIprefs.CAD,'String',' Quick design mode','FontSize',guiFontSize+1,'TooltipString','To enable quick model drawing: each copied block will be replaced by an hollow block and automatically connected','ForeGroundColor','black','Visible','on','Enable','off','Callback','GUIprefs.Copied=0; GUIprefs.CAD=get(gco,''Value'');setappdata(0, ''GUIpreferences'',GUIprefs); if get(gco,''Value''), ltpdagui(''Redraw'',2); end;','Style','checkbox','Tag','enableCheckbox'); + if ~isfield(GUIprefs,'Detach'), GUIprefs.Detach = 0; setappdata(0, 'GUIpreferences',GUIprefs); end + uicontrol('Parent',hExecutionPanel,'BackgroundColor',backColor,'HorizontalAlignment','left','Units','normalized','Position',[.6 .3 .3 .5],'Value',GUIprefs.Detach,'String',' Detach panel','FontSize',guiFontSize+1,'TooltipString','','ForeGroundColor','black','Visible','on','Enable','off','Callback','GUIprefs.Detach=get(gco,''Value'');setappdata(0, ''GUIpreferences'',GUIprefs);try close(findobj(''Tag'',''parampanelFigure'')); catch, end;','Style','checkbox','Tag','enableCheckbox'); + +if runSim == 1, StartExec(); end + +%% + +% ======================================================================== +% ======================================================================== +% ============================== FUNCTIONS =============================== +% ======================================================================== +% ======================================================================== + +%% + %---------------------------------------------------------------------- + function ContinuousCheck(varargin) + % This is the function to execute a continuous timer check + + % Keep alive the first timer: + alltimers = timerfindall; + if strcmp(get(alltimers(1),'Running'),'off'), start(alltimers(1)); end + + currsys = bdroot; + if ~isempty(currsys) && ~isempty(find_system(currsys,'FindAll','on','Type','Annotation','Tag','ltpda model')) + set(findobj('Tag', 'currsystem'), 'String', ['Current system: ',currsys]) + set(findobj('Tag', 'enableCheckbox'), 'enable', 'on') + else + set(findobj('Tag', 'currsystem'), 'String', 'Current system: None') + set(findobj('Tag', 'enableCheckbox'), 'enable', 'off') + end + + nestBlock = find_system(bdroot,'BlockType','SubSystem','Tag','nestedloops'); + if ~isempty(nestBlock), set(findobj('String',' Enable nested loops'),'Value',1); else set(findobj('String',' Enable nested loops'),'Value',0); end + + end + %---------------------------------------------------------------------- + +%% + %---------------------------------------------------------------------- + function LogoutCallback(varargin) + % Callback function: run when the user click the "Logout" button + setappdata(0,'ltpda_repo_pass',''); + userID = getappdata(0,'ltpda_repo_user'); + if isempty(userID), userID = ''; end + [userID passwd] = utils.mysql.logindlg(userID,''); + setappdata(0,'ltpda_repo_user',userID) + setappdata(0,'ltpda_repo_pass',passwd) + ltpdagui('Redraw',1); + end + %---------------------------------------------------------------------- + + %---------------------------------------------------------------------- + function AskConfirm(varargin) + % Whenever the user click the Reset Parameters button + + if strcmp(varargin{3},'close'), set(gcf,'Visible','off'); end + + % Ask for confirmation: + screenSize = get(0,'ScreenSize'); + backColor = [1 1 1]; + position = [(screenSize(3)-250)/2,(screenSize(4)-160)/2,250,160]; + confirmFig = figure('Position',position,'Name','Please confirm','Tag','ConfirmReset','Resize','off','NumberTitle','off','Toolbar','none','Menubar','none'); + % Text + uicontrol('Parent',confirmFig,'BackgroundColor',backColor,'HorizontalAlignment','center','Position',[0 position(4)-40 position(3) 20],'String','Are you sure?','FontName','Times New Roman','FontSize',13,'FontWeight','normal','Visible','on','Style','text'); + % Button Yes + dimension = position; + logosize = [77 95]; + dimension = [50 , dimension(4)-logosize(2)-50 , logosize]; + yesbut = axes('Parent',confirmFig,'Units','pixels','Position',dimension,'Tag','Yes'); + image(imread('buttonyes2.jpg'),'Parent',yesbut,'ButtonDownFcn','set(findobj(''Tag'',''ConfirmReset''),''UserData'',0); uiresume;','Tag','YesButton'); + axis(yesbut,'off'); + % Button No + dimension = position; + logosize = [77 95]; + dimension = [127 , dimension(4)-logosize(2)-50 , logosize]; + nobut = axes('Parent',confirmFig,'Units','pixels','Position',dimension,'Tag','No'); + image(imread('buttonno2.jpg'),'Parent',nobut,'ButtonDownFcn','set(findobj(''Tag'',''ConfirmReset''),''UserData'',1); uiresume;','Tag','NoButton'); + axis(nobut,'off'); + + uiwait; + + if get(confirmFig,'UserData'), delete(confirmFig); set(findobj('Tag','LTPDAGUI'),'Visible','on'); return; end + + if strcmp(varargin{3},'close') + delete(confirmFig); + disp('Closing LTPDA GUI...'); + delete(timerfindall); + clear global LTPDAinvar LTPDAoutvar; + setappdata(0,'ltpda_repo_user',''); setappdata(0,'ltpda_repo_pass',''); + closereq + elseif strcmp(varargin{3},'clear') + delete(confirmFig); + LTPDAinvar={}; + set(InputObjList,'Value',1) + set(findobj('Tag', 'infoPanel'), 'String', '') + set_param(find_system(bdroot,'FindAll','on','Type','Annotation','Tag','ltpda model'),'UserData',''); + UpdateListbox(); + end + + end + %---------------------------------------------------------------------- + +%% +% %---------------------------------------------------------------------- +% function hLoadDataButtonCallback(varargin) +% % Callback function: run when the user click the "Add data" button +% +% filenames = uipickfiles('REFilter','.txt'); +% if ~isempty(filenames) && ~isnumeric(filenames(1,1)) +% y = size(filenames,2); +% for j=1:y +% ext = filenames{j}(end-2:end); +% if strcmpi(ext,'mat') +% varlist = whos('-file',filenames{j}); +% for k=1:numel(varlist) +% newObj = load(filenames{j},varlist(k).name); %#ok<NASGU> +% newObj = eval(['newObj.',varlist(k).name]); +% if isa(newObj,'ltpda_uo') +% LTPDAinvar = [LTPDAinvar; {newObj,1,'From file'} ]; +% disp(' + 1 Obj added to the global variable LTPDAinvar') +% end +% end +% elseif strcmpi(ext,'xml') +% newObj = utils.xml.xmlread(xmlread(filenames{j})); +% if isa(newObj,'ltpda_uo') +% LTPDAinvar = [LTPDAinvar; {newObj,1,'From file'} ]; +% disp(sprintf(' + 1 %s added to the global variable LTPDAinvar',class(newObj))) +% end +% else +% try +% newObj = {ao(filenames{j}),1,'From file'}; +% LTPDAinvar = [LTPDAinvar; {newObj,1,'From file'} ]; +% disp(' + 1 AO added to the global variable LTPDAinvar') +% catch +% disp([' *** Impossible to load file ',filenames{j}]) +% end +% end +% end +% UpdateListbox(); +% end +% +% end +% %---------------------------------------------------------------------- +% +% %---------------------------------------------------------------------- +% function hRemoveButtonCallback(varargin) +% % Callback function: run when the user click the "Remove data" button +% +% index_selected = get(InputObjList,'Value'); +% listObjs = get(InputObjList,'String'); +% if ~strcmp(listObjs,'The memory is empty') +% for i=1:numel(index_selected) +% objSelect = str2double(strtok(listObjs{index_selected(i),1},'.')); +% LTPDAinvar{objSelect,1} = []; +% end +% UpdateListbox(); +% end +% set(findobj('Tag', 'infoPanel'), 'String', '') +% +% end +% %---------------------------------------------------------------------- + + %---------------------------------------------------------------------- + function hExportButtonCallback(varargin) + % Callback function: run when the user click the "Export data" button + + currSelObjs = get(InputObjList,'Value'); + listObjs = get(InputObjList,'String'); + if ~strcmp(listObjs,'The memory is empty') + selectedObjs = {}; + for i=1:numel(currSelObjs) + objSelect = str2double(strtok(listObjs{currSelObjs(i),1},'.')); + selectedObjs = [selectedObjs,LTPDAinvar(objSelect,1)]; + end + if ~isempty(selectedObjs) + for i=1:numel(selectedObjs) + objName = [class(selectedObjs{i}),'_',selectedObjs{i}.name]; + objName = genvarname(objName,evalin('base','who')); + assignin('base', objName, selectedObjs{i}); + disp(['Saved to workspace with name ',objName]) + end + end + end + + end + %---------------------------------------------------------------------- + + %---------------------------------------------------------------------- + function hExploreButtonCallback(varargin) + % Callback function: run when the user click the "Update list" button + + currSelObjs = get(InputObjList,'Value'); + listObjs = get(InputObjList,'String'); + if ~strcmp(listObjs,'The memory is empty') + selectedObjs = {}; + for i=1:numel(currSelObjs) + objSelect = str2double(strtok(listObjs{currSelObjs(i),1},'.')); + selectedObjs = [selectedObjs,LTPDAinvar(objSelect,1)]; + end + + if ~isempty(selectedObjs) + ltpda_explorer(selectedObjs); + else + ltpda_explorer(LTPDAinvar); + end + + UpdateListbox(); + end + + end + %---------------------------------------------------------------------- + + %---------------------------------------------------------------------- + function hReportButtonCallback(varargin) + % Callback function: run when the user click the "Update list" button + + currSelObjs = get(InputObjList,'Value'); + listObjs = get(InputObjList,'String'); + if ~strcmp(listObjs,'The memory is empty') + selectedObjs = {}; + for i=1:numel(currSelObjs) + objSelect = str2double(strtok(listObjs{currSelObjs(i),1},'.')); + selectedObjs = [selectedObjs,LTPDAinvar(objSelect,1)]; + end + + if ~isempty(selectedObjs) + report(selectedObjs,'dir',[cd,'\Reports']); + else + ltpda_explorer(LTPDAinvar); + end + + UpdateListbox(); + end + + end + %---------------------------------------------------------------------- + + %---------------------------------------------------------------------- + function SaveWorkspaceCallback(varargin) + % Callback function: run when the user click the "Save all" + % button + + try + [FileName,PathName] = uiputfile('*.mat','Save Workspace As'); + if ~isa(FileName,'double'), save(strcat(PathName,FileName),'LTPDAinvar','LTPDAoutvar'); disp('Workspace saved'); end + catch + end + end + %---------------------------------------------------------------------- + + %---------------------------------------------------------------------- + function LoadWorkspaceCallback(varargin) + % Callback function: run when the user click the "Load workspace" + % button + + try + [FileName,PathName] = uigetfile('*.mat','Load Workspace'); + temp = load(strcat(PathName,FileName),'LTPDAinvar'); + LTPDAinvar = [LTPDAinvar ; temp.LTPDAinvar]; + temp = load(strcat(PathName,FileName),'LTPDAoutvar'); + LTPDAoutvar = [LTPDAoutvar ; temp.LTPDAoutvar]; + disp('Workspace loaded') + clear temp + UpdateListbox() + catch + end + end + %---------------------------------------------------------------------- + +%% + %---------------------------------------------------------------------- + function UpdateListbox(varargin) + % Updates the listboxes + + %================================== + % Update the list of active AOs + xx = size(LTPDAinvar,1); + listInput=cell(xx,1); + if xx>0 + for j=1:xx + listInput{j,1} = num2str(j); + [rows,columns] = size(LTPDAinvar{j,1}); + if (rows>1 && columns==1) || (rows==1 && columns>1), listInput{j,1} = [listInput{j,1}, ' .(Vector ',num2str(rows),'x',num2str(columns),') ']; + elseif rows>1 && columns>1, listInput{j,1} = [listInput{j,1}, ' .(Matrix ',num2str(rows),'x',num2str(columns),') ']; + end + if isempty(LTPDAinvar{j,1}), listInput{j,1} = []; + else + switch class(LTPDAinvar{j,1}) + case 'ao' + anobject = LTPDAinvar{j,1}; + aoname = anobject.name; + aocreated = char(anobject.created); + listInput{j,1} = [listInput{j,1}, ' . AO .' , aoname , '__' , aocreated]; + case 'plist' + paramNumb = nparams(LTPDAinvar{j,1}); + objcreated = char(LTPDAinvar{j,1}.created); + listInput{j,1}=[listInput{j,1}, ' . PLIST .',num2str(paramNumb),' params','__',objcreated]; + case {'pzmodel','miir','mfir'} + objcreated = char(LTPDAinvar{j,1}.created); + listInput{j,1}=[listInput{j,1}, ' . ',upper(class(LTPDAinvar{j,1})),' .__',objcreated]; + case 'double' + if numel(LTPDAinvar{j,1})==1, objclass = ' . Scalar .__ '; + elseif size(LTPDAinvar{j,1},1)==1 || size(LTPDAinvar{j,1},2)==1, objclass = ' . Vector .__ '; + else objclass = ' . Matrix .__ '; + end + listInput{j,1}=[listInput{j,1}, objclass, mat2str(LTPDAinvar{j,1})]; + otherwise + listInput{j,1}=[listInput{j,1}, ' . ',upper(class(LTPDAinvar{j,1}))]; + end + end + end + for j=xx:-1:1, if isempty(listInput{j,1}), listInput(j,:)=[]; end; end + else + listInput{1,1}='The workspace is empty'; + end + + InputObjList = findobj('Tag','InputObjList'); + if ~isempty(InputObjList) + set(InputObjList,'Value',1) + set(InputObjList,'String',listInput) + end + + end + %---------------------------------------------------------------------- + + %---------------------------------------------------------------------- + function hListObjsCallback(hObject, varargin) + % This callback is called whenever the user double click upon one of + % the AOs in use. + + if ~isempty(varargin{1}) && varargin{1}==1 && size(LTPDAinvar,1)>0 + val = get(hObject, 'Value'); + if length(val) == 1 + objLines = get(hObject, 'String'); + selVal = str2double(deblank(strtok(objLines{val}))); + if isempty(objLines) || isempty(LTPDAinvar{selVal ,1}) || (isnumeric(LTPDAinvar{selVal ,1}) && numel(LTPDAinvar{selVal ,1})>1) + objtxt = ''; + else + objtxt = display(LTPDAinvar{selVal,1}); + end + else + objtxt = ''; + end + set(findobj('Tag', 'infoPanel'), 'String', objtxt) + elseif size(LTPDAinvar,1)>0 + if strcmp(get(gcf,'SelectionType'),'normal') + val = get(hObject, 'Value'); + if length(val) == 1 + objLines = get(hObject, 'String'); + objnumb = str2double(deblank(strtok(objLines{val}))); + try + objtxt = display(LTPDAinvar{objnumb}); + catch + if isa(LTPDAinvar{objnumb},'double') || isa(LTPDAinvar{objnumb},'logical'), objtxt = mat2str(LTPDAinvar{objnumb}); + elseif isa(LTPDAinvar{objnumb},'char'), objtxt = LTPDAinvar{objnumb,1}; + else objtxt = class(LTPDAinvar{objnumb}); + end + end + if isempty(LTPDAinvar{objnumb,1}), objtxt=''; end + else + objtxt = ''; + end + set(findobj('Tag', 'infoPanel'), 'String', objtxt) + end + + if strcmp(get(gcf,'SelectionType'),'open') && ~isempty(get(hObject, 'String')) && ~isempty(find_system(bdroot,'FindAll','on','Type','Annotation','Tag','ltpda model')) + val = get(hObject, 'Value'); + objLines = get(hObject, 'String'); + number = deblank(strtok(objLines{val})); + if isempty(LTPDAinvar{str2double(number),1}), return; end + set_param(utils.prog.gcbsh,'Selected','off'); + newBlkHandle=add_block('ltpda_library/Input/Object from list', strcat(bdroot,'/AO1'),'MakeNameUnique', 'on'); + children=get_param(newBlkHandle,'Blocks'); + inputblock=strcat(get(newBlkHandle,'Path'),'/',get(newBlkHandle,'Name'),'/',children{1}); + set_param(inputblock,'Value',number ); + % Set the MaskDisplay = n� of input: + set_param(newBlkHandle,'LinkStatus','inactive'); + set_param(newBlkHandle,'MaskDisplay',sprintf('disp(''%s'')',num2str(number))); + % Modify the block annotation: + objName = LTPDAinvar{str2double(number),1}.name; + if numel(objName)>3 && strcmpi(objName,'none'), objName = class(LTPDAinvar{str2double(number),1}); end + if numel(objName)>20, objName = ['...',LTPDAinvar{str2double(number),1}.name(end-20:end)]; end + set_param(newBlkHandle,'AttributesFormatString',[number,': ',objName]); + set_param(newBlkHandle,'Selected','on'); + + end + end + + end + %---------------------------------------------------------------------- + +%% + %---------------------------------------------------------------------- + function hNewButtonCallback(varargin) + % Callback function: run when the user click the "New model" button. + % It starts also the timer associated to the continuous selection check + % (this must be changed in order to allow multiple system execution). + + hour = datestr(now,13); % HH:MM:SS + hour(3:4) = hour(4:5);hour(5:6)=hour(7:8); + currentsystem = strcat(genvarname(strrep(getappdata(0,'ltpda_repo_user'),'.','_')),'_',datestr(now,7),datestr(now,5),datestr(now,11),'_',hour(1:6)); + if ~isempty(find_system('Name',currentsystem)), return; end + simulink + new_system(currentsystem) + open_system(currentsystem) + + systemHandle = get_param(gcs,'Handle'); + evalin('base','load ltpdaSimConfigSet.mat;'); + ltpdaSimConfigSet = evalin('base','ltpdaSimConfigSet'); + attachConfigSetCopy(systemHandle, ltpdaSimConfigSet); + setActiveConfigSet(systemHandle, 'LTPDA'); + detachConfigSet(systemHandle, 'Configuration'); + evalin('base','clear ltpdaSimConfigSet;'); + + set(systemHandle,'Location',[200 100 1100 600]); + set(systemHandle,'Toolbar','OFF'); + + caption = [gcs,'/1']; + libraryNote = add_block('built-in/Note',caption,'Position', [100 0 0 400]); + guiNote = add_block('built-in/Note',caption,'Position', [100 0 0 430]); + set_param(guiNote,'ClickFcn','ltpdagui(''Redraw'',2); figure(findobj(''Tag'',''LTPDAGUI''))') + set_param(libraryNote,'ClickFcn','simulink') + set_param(guiNote,'Text',' GUI ','FontSize',14,'HorizontalAlignment','center','BackgroundColor','[0.686275, 0.686275, 0.847059]','DropShadow','on') + set_param(libraryNote,'Text',' Library ','FontSize',14,'HorizontalAlignment','center','BackgroundColor','[0.870588, 0.870588, 0.937255]','DropShadow','on') + + mainNote = add_block('built-in/Note',caption,'Position', [200 0 0 400],'UserData',1); + caption1 = [' Analysis designed by ',getappdata(0,'ltpda_repo_user')]; + caption2 = ['created (UTC): ',char(time)]; + caption3 = [' IP: ',char(getHostAddress(java.net.InetAddress.getLocalHost))]; + caption4 = [' OS: ',computer]; + caption5 = ['MATLAB ver: ',getappdata(0, 'matlab_version')]; + caption6 = [' LTPDA ver: ',getappdata(0, 'ltpda_version')]; + caption = strvcat(caption1,caption2,caption3,caption4,caption5,caption6); %#ok<VCAT> + set_param(mainNote, 'HorizontalAlignment','left','Text',caption,'Tag','ltpda model') + ltpdaClickFcn = 'load_system(''ltpda_library''); blk = add_block(''ltpda_library/Commonly Used Blocks/hollow'', strcat(bdroot,''/func1''),''MakeNameUnique'', ''on''); set(blk,''LinkStatus'',''inactive'',''MaskDisplay'',''disp(''''hollow'''')''); set(utils.prog.find_in_models(blk,''LookUnderMasks'',''all'',''BlockType'',''M-S-Function'',''FunctionName'',''ltpdasim''),''Tag'','''',''Name'',''hollow''); set(blk,''Selected'',''on'');set(find_system(bdroot,''FindAll'',''on'',''Type'',''Annotation'',''Tag'',''ltpda model''),''Selected'',''off''); ltpdagui(''callback'',1,''redraw'',2);'; + set_param(mainNote,'ClickFcn',ltpdaClickFcn) + + end + %---------------------------------------------------------------------- + + %---------------------------------------------------------------------- + function hSaveCallback(varargin) + % This callback is called whenever the user click the 'Save' button to + % store the current model on disk. + + if ~isempty(bdroot) && ~isempty(find_system(bdroot,'FindAll','on','Type','Annotation','Tag','ltpda model')) + inputBlockHandles = get_param(find_system(bdroot,'AncestorBlock','ltpda_library/Input/Object from list'),'handle'); + for i=1:numel(inputBlockHandles) + children = get_param(inputBlockHandles{i},'Blocks'); + inputblock = strcat(get(inputBlockHandles{i},'Path'),'/',get(inputBlockHandles{i},'Name'),'/',children{1}); + currIndex(i) = str2double(get_param(inputblock,'Value')); + if currIndex(i)~=0 + objcommand = string(LTPDAinvar{currIndex(i)}); + set_param(inputBlockHandles{i},'Description',objcommand); + end + end + + oldName = bdroot; + if ~isempty(oldName) && ~isempty(find_system(oldName,'FindAll','on','Type','Annotation','Tag','ltpda model')) + try + try cd(getappdata(0,'DefaultAnalysesDirectory')); catch, end + [fileName,filePath] = uiputfile([oldName,'.mdl'],'Choose destination folder'); + fileName = [filePath,fileName]; + save_system(oldName,fileName) + try cd(getappdata(0,'DefaultDataDirectory')); catch, end + catch + end + end + end + + end + %---------------------------------------------------------------------- + + %---------------------------------------------------------------------- + function hOpenCallback(varargin) + % This callback is called whenever the user click the 'Open' button, to + % retrieve a previously saved model from disk. + + try + try cd(getappdata(0,'DefaultAnalysesDirectory')); catch, end + [fileName,filePath] = uigetfile('.mdl','Choose source file'); + try cd(getappdata(0,'DefaultDataDirectory')); catch, end + fileName = [filePath,fileName]; + open_system(fileName) + simulink + + % Load the globals into memory: + globBlock = find_system(bdroot,'BlockType','SubSystem','Tag','globals'); + if ~isempty(globBlock), gl = get_param(globBlock{1},'UserData'); end + + % Load the nested loop variable into memory: + nestBlock = find_system(bdroot,'BlockType','SubSystem','Tag','nestedloops'); + if ~isempty(nestBlock), loop = get_param(nestBlock{1},'UserData'); set(findobj('String',' Enable nested loops'),'Value',1); end + + % Update the indexes inside 'Object from list': + inputBlockHandles = get_param(find_system(gcs,'AncestorBlock','ltpda_library/Input/Object from list'),'handle'); + for i=1:numel(inputBlockHandles) + objcommand = get_param(inputBlockHandles{i},'Description'); + if ~isempty(objcommand) + xx = size(LTPDAinvar,1); + objcommand = ['LTPDAinvar{',num2str(xx+1),',1}=',objcommand,';LTPDAinvar{',num2str(xx+1),',2}=0']; + eval(objcommand); + + % Update the pointer inside the input block and the annotation: + children = get_param(inputBlockHandles{i},'Blocks'); + inputblock = strcat(get(inputBlockHandles{i},'Path'),'/',get(inputBlockHandles{i},'Name'),'/',children{1}); + set_param(inputblock,'Value',num2str(xx+1)) + set_param(inputBlockHandles{i},'AttributesFormatString',num2str(xx+1)); + end + end + + UpdateListbox() + catch + end + + + end + %---------------------------------------------------------------------- + +%% + %---------------------------------------------------------------------- + function StartExec(varargin) + % This callback is called whenever the user click the 'Start' button. + + if isempty(bdroot) || isempty(find_system(bdroot,'FindAll','on','Type','Annotation','Tag','ltpda model')), return; end + button = findobj('Tag','StartButton'); + set(button,'CData',imread('startred.jpg'),'ButtonDownFcn',''); + + % Check availability of inputs expected by the model: + inputBlocks = find_system(bdroot,'Tag','input'); + missInputs = {}; + for nn = 1:numel(inputBlocks) + innerBlocks = get_param(inputBlocks{nn},'Blocks'); + inputVal = str2double(get_param([inputBlocks{nn},'/',innerBlocks{1}],'Value')); + if inputVal>size(LTPDAinvar,1) || isempty(LTPDAinvar{inputVal,1}) % one expected input is missing + missInputs = [missInputs;{['The block ''',inputBlocks{nn},''' expects input n�',num2str(inputVal)]}]; + end + end + if ~isempty(missInputs) + screenSize = get(0,'ScreenSize'); + backColor = [1 1 1]; + position = [(screenSize(3)-400)/2,(screenSize(4)-160)/2,400,160]; + inputMissFig = figure('Position',position,'Name','Input missing','Resize','off','NumberTitle','off','Toolbar','none','Menubar','none','CloseRequestFcn','uiresume; closereq'); + uicontrol('Parent',inputMissFig,'BackgroundColor',backColor,'HorizontalAlignment','center','Position',[50 position(4)-90 position(3)-60 50],'String',{'The model expects an input, but';'none is loaded.'},'FontName','Times New Roman','FontSize',13,'FontWeight','normal','Visible','on','Style','text'); + uicontrol('Parent',inputMissFig,'BackgroundColor',backColor,'Units','pixels','HorizontalAlignment','center','Position',[70 30 310 20],'String',missInputs,'Value',1,'Visible','on','Style','popup') + logosize = [40 40]; + nobut = axes('Parent',inputMissFig,'Units','pixels','Position',[10 , position(4)-logosize(2)-60 , logosize],'Tag','No'); + image(imread('startred.jpg'),'Parent',nobut); + axis(nobut,'off'); + uiwait; + set(button,'CData',imread('startgreen.jpg'),'ButtonDownFcn','ltpdagui(''redraw'',1.1);'); + return; + end + + disp('============================') + disp(' Beginning the analysis') + disp('============================') + stop(timerfindall) + drawnow + currSystem = bdroot; + allBlocks = find_system(currSystem,'LookUnderMasks','all'); + for i=2:numel(allBlocks), set_param(allBlocks{i},'LinkStatus','inactive'); set_param(allBlocks{i},'MaskVariables',''); end + addterms(currSystem) + + % Check if it's a partial execution: + if ismember('executionList',evalin('base','who')), partialExecution = 1; else partialExecution = 0; end + + % Clear the previous execution history: + if ~partialExecution, set_param(find_system(bdroot,'FindAll','on','Type','Annotation','Tag','ltpda model'),'UserData',''); end + + % Set all objects present at the startup to be maintained: + if size(LTPDAinvar,1)>0, LTPDAinvar(:,2) = {1}; end + + % Load the globals from the current model: + globBlock = find_system(bdroot,'BlockType','SubSystem','Tag','globals'); + if ~isempty(globBlock), gl = get_param(globBlock{1},'UserData'); end + + executionTime = []; + nestBlock = find_system(currSystem,'SearchDepth',1,'BlockType','SubSystem','Tag','nestedloops'); + + % Check for nested loops: + if ~isempty(nestBlock) && str2double(get_param(nestBlock{1},'Description')) + disp(' Execution in nested loops') + disp('============================') + paramLoop = get_param(nestBlock{1},'UserData'); + % To disable unused nested loop parameters: + allfuncBlocks = utils.prog.find_in_models(gcs,'LookUnderMasks','all','BlockType','M-S-Function','FunctionName','ltpdasim'); + paramLoopnumb = size(paramLoop,1); + enabledNestedParams = get_param(nestBlock,'MaskDescription'); + if ~isempty(enabledNestedParams{1}), eval(enabledNestedParams{1}); + else enabledNestedParams = ones(1,paramLoopnumb); + end + usedParamsLoop = zeros(paramLoopnumb,1); + for mmm = 1:paramLoopnumb + for nnn = 1:numel(allfuncBlocks) + if ~isempty(findstr(get_param(get_param(allfuncBlocks{nnn},'parent'),'Description'),paramLoop{mmm,3})), usedParamsLoop(mmm)=1; break; end + end + end + for mmm = paramLoopnumb:-1:1 + if ~usedParamsLoop(mmm) || ~enabledNestedParams(mmm) + % then the mmm-th line in paramLoop must be removed + ii = mmm+1; + while ii <= paramLoopnumb && paramLoop{ii,2} > paramLoop{mmm,2} + paramLoop{ii,2} = paramLoop{ii,2}-1; + ii = ii+1; + end + if ~usedParamsLoop(mmm), disp(sprintf(' Parameter %s has been ignored for nested loops, being unused.',paramLoop{mmm,3})) + else disp(sprintf(' Parameter %s has been ignored for nested loops, being disabled.',paramLoop{mmm,3})) + end + paramLoop(mmm,:) = []; + usedParamsLoop(mmm) =[]; + paramLoopnumb = paramLoopnumb-1; + end + end + if ~isempty(paramLoop), useNestedLoop = 1; else useNestedLoop =0; end + else useNestedLoop =0; + end + + try + if useNestedLoop + % ================================================================== + % Execution with nested loops + % ================================================================== + + % paramLoop has 6 columns: + % n� | order | parameter's name | n� of iterations | range settings | cell arrays of values + % + % Example: n� order appearance + % paramLoop={ 1 1 ... x------- + % 2 2 ... .x------ + % 3 3 ... ..x----- + % 4 2 ... .x------ + % 5 3 ... ..x----- + % 6 1 ... x------- + + branches=[]; + + for ii=1:paramLoopnumb, if ii==paramLoopnumb || paramLoop{ii+1,2}<=paramLoop{ii,2}, branches=[branches,ii]; end; end + % 'branches' contains the ordinal number of those rows which do not have + % a children row, ie. the following rows have higher order. + % In the example above, branches = [ 3 , 5 , 6 ]; + + family={}; + numbIter={}; + for ii=1:numel(branches) + currOrder=paramLoop{branches(ii),2}; + family{ii,1} = 0; + numbIter{ii,1} = 1; + for jj=branches(ii):-1:1 + if paramLoop{jj,2}==currOrder + family{ii,currOrder+1} = jj; + family{ii,1} = family{ii,1}+1; + numbIter{ii,currOrder+1} = paramLoop{jj,4}; + numbIter{ii,1} = numbIter{ii,1}*paramLoop{jj,4}; + currOrder = paramLoop{jj,2}-1; + end + end + end + totalIter = sum(cell2mat(numbIter(:,1))); + currIter = 0; + % 'family' contains all the parents information for each branch: the + % first column contains how many parents there are. In the example: + % family = { 3 1 2 3 + % 3 1 4 5 + % 1 6 } + % Similarly, numbIter contains the number of iteration necessary to + % complete each param. The first column contains the total for each + % branch/row. + % numbIter = { 40 2 4 5 + % 36 2 6 3 + % 10 10 } + + for ii=1:numel(branches) + x = family{ii,1}; % x = how many params to change in this branch + status = ones(1,x); % status shows the current step in the loop; + % [2,3,5] means that we've executed the 2nd value for the first param, + % the 3rd for the second param, and the 5th for the third param. + + for iter = 1:numbIter{ii,1} + % ============================================================== + % Here goes what must be executed + % ============================================================== + currIter = currIter+1; + disp([' ..... starting loop ',num2str(currIter),', ',num2str(totalIter-currIter),' more to go.']) + statusString = ' ***** Executing now with '; + setappdata(0,'loopStatus',[totalIter currIter]) + progressBar(executionTime); + drawnow + + for mm=1:size(paramLoop,1) + if isempty(paramLoop{mm,7}), disp(['*** Error: default value not set for parameter ',paramLoop{mm,3}]); return; end + eval([paramLoop{mm,3},'=',paramLoop{mm,7},';']) + end + for nn=1:numel(status) + value = paramLoop{family{ii,nn+1},6}{status(nn)}; + if ~ischar(value), value = mat2str(value); end + eval([paramLoop{family{ii,nn+1},3},'=', value ,';']) + statusString = [statusString, paramLoop{family{ii,nn+1},3}(6:end) , ' = ' , value ,'; ']; + end + disp(statusString) + startingTime = now; + + % ============================================================== + varargout = sim(currSystem); %#ok<NASGU> + % ============================================================== + + executionTime = [executionTime; now-startingTime]; + + % Check if the user wants to stop the execution: + lastChar = get(findobj('Name','LTPDA Progress Bar'),'CurrentCharacter'); + if ~isempty(lastChar) && strcmp(lastChar,'x'), break; end + + for jj=x:-1:1 + if status(jj)<numbIter{ii,jj+1} % then we still have to complete iterations on i-th row + status(jj)=status(jj)+1; + if jj~=x % if we've just increased a line which is not the last one, reset the lower lines + for kk=jj+1:x + status(kk)=1; + end + end + break + end + end + end + end % End of execution with nested loops + else % Execution without nested loops + if ~isempty(nestBlock) && ~str2double(get_param(nestBlock{1},'Description')) + % Nested loops are set but disabled + disp('*** Nested loops, while set, are disabled; using default values.') + paramLoop = get_param(nestBlock{1},'UserData'); + for mm=1:size(paramLoop,1) + if isempty(paramLoop{mm,7}), disp(['*** Error: default value not set for parameter ',paramLoop{mm,3}]); return; end + % Setting every nested loops variable = default + eval([paramLoop{mm,3},'=',paramLoop{mm,7},';']) + disp([' ',paramLoop{mm,3},' = ',paramLoop{mm,7}]) + end + end + setappdata(0,'loopStatus',[]); + progressBar(); + drawnow + % ============================================================== + varargout = sim(currSystem); %#ok<NASGU> + % ============================================================== + end + + close(findobj('Name','LTPDA Progress Bar')) + + % Remove final results (intermediate were removed during analysis, as + % soon as they became not useful anymore): + if ~getappdata(0,'maintainresults') % && ~partialExecution + for i=size(LTPDAinvar,1):-1:1 + if LTPDAinvar{i,2}==0 + LTPDAinvar(i,:)=[]; + % Update the execution history: + ltpda_annotation = find_system(bdroot,'FindAll','on','Type','Annotation','Tag','ltpda model'); + execHistory = get_param(ltpda_annotation,'UserData'); + for paramLoopnumb=1:size(execHistory,1) + for yy=3:size(execHistory,2), + if execHistory{paramLoopnumb,yy} == i, execHistory{paramLoopnumb,yy} = -1; end + if execHistory{paramLoopnumb,yy} > i, execHistory{paramLoopnumb,yy} = execHistory{paramLoopnumb,yy}-1; end + end + if execHistory{paramLoopnumb,1} == i, execHistory{paramLoopnumb,1} = -1; end + if execHistory{paramLoopnumb,1} > i, execHistory{paramLoopnumb,1} = execHistory{paramLoopnumb,1}-1; end + end + set_param(ltpda_annotation,'UserData',execHistory); + + end + end + end + + UpdateListbox(); + set(button,'CData',imread('startgreen.jpg'),'ButtonDownFcn','ltpdagui(''redraw'',1.1);'); + evalin('base','clear executionList'); + disp('============================') + disp(' Analysis concluded') + disp('============================') + start(timerfindall) + + % ================================== + catch ME + % ================================== + + % Remove anyway intermediate results: + keepRes = getappdata(0,'maintainresults'); + if ~keepRes, for i=size(LTPDAinvar,1):-1:1, if LTPDAinvar{i,2}==0, LTPDAinvar(i,:)=[]; end; end; end + + UpdateListbox(); + close(findobj('Name','LTPDA Progress Bar')) + set(button,'CData',imread('startgreen.jpg'),'ButtonDownFcn','ltpdagui(''redraw'',1.1);'); + evalin('base','clear executionList'); + start(timerfindall) + + rethrow(ME) + end + + end + %---------------------------------------------------------------------- +%% + +end \ No newline at end of file