classdef SCDclass_algo %SCD algorithm handling object % The class holds all information and % methods for handling a Simulink % algorithm properties (Access = private) modelname % Name of the model mdscontainer % Container class for MDS+ interface objects taskcontainer % Container class for init and term tasks exportedtps % List of tunable parameters variable to be exported datadictionary % Name of the used data dictionary stdinits % Standard inits scripts for fixed parameters timing % Timing info structure end methods %% Constructor function obj=SCDclass_algo(name) % Empty algorithm constructor obj.modelname=name; obj.mdscontainer = SCDclass_mdsobjcontainer; obj.taskcontainer = SCDclass_taskcontainer; obj.exportedtps = {}; obj.stdinits = {}; obj.datadictionary = ''; obj.timing.t_start=0; obj.timing.t_stop=1; obj.timing.dt=1e-3; % Standard data dictionary equal to algorithm name, % overriddable by the setter method obj=obj.setdatadictionary([name '.sldd']); end %% Print infos function printinfo(obj) fprintf('*****************************************************\n'); fprintf('* SCD algorithm: ''%s''\n',obj.modelname); fprintf('*****************************************************\n'); if(~isempty(obj.datadictionary)) fprintf('* Data dictionary:\n %s\n',obj.datadictionary); else fprintf('* Data dictionary:\n base workspace\n'); end if numel(obj.exportedtps)>0 fprintf('* Tunable params structs:\n'); for ii=1:numel(obj.exportedtps) fprintf(' %s\n',obj.exportedtps{ii}); end end fprintf('* Tunable params objects:\n') obj.printparameters; fprintf('* Wavegen objects:\n'); obj.printwavegens; fprintf('* Tasks objects:\n'); obj.printtasks; fprintf('* Fixed parameters inits:\n'); obj.printinits; fprintf('*****************************************************\n'); end %% General purpose getters function out = getname(obj) out=obj.modelname; end function out = getmdscontainer(obj) out=obj.mdscontainer; end function out = gettaskcontainer(obj) out=obj.taskcontainer; end function out = gettiming(obj) out=obj.timing; end function out = getinits(obj) out=obj.stdinits; end %% Data dictionary setter and getter function obj = setdatadictionary(obj, datadict) obj.datadictionary=datadict; end function out = getdatadictionary(obj) out = obj.datadictionary; end %% Tunable parameters structures handling functions function out = getexportedtps(obj) out = obj.exportedtps; end function obj = addtunparamstruct(obj, structname) if(~ismember(structname, obj.exportedtps)) obj.exportedtps{end+1}=structname; else error('SCDclass_algo:addtunparamsstruct','Tunable parameter struct already present, cannot add!'); end end function obj = buildworkspacetpstruct(obj) % this funtion builds a workspace structures containing % replicas of all tunable parameters structurea in the data % dictionaries, this structure is the one actually used % for loading simulation wavegen data % It is better not to use directly data dictionaries structures % to avoid flooding dds with big sim data sets (and % conseguently the SCD SVN itself if(isempty(obj.datadictionary)) warning('SCDclass_algo:buildworkspacetpstruct','Methods ignored for this object, data dictionary isn''t configured'); return; end dd=SCDconf_getdatadict(obj.datadictionary); for ii=1:numel(obj.exportedtps) simstructnamedd=sprintf('%s_tmpl',char(obj.exportedtps(ii))); simstructnamews=char(obj.exportedtps(ii)); simstruct=dd.getEntry(simstructnamedd).getValue; assignstr=sprintf('%s=temp;',simstructnamews); assignin('base','temp',simstruct); evalin('base',assignstr); end evalin('base','clear temp;'); end %% MDS container methods forwarders function obj = addparameter(obj, param) obj.mdscontainer=obj.mdscontainer.addparameter(param); obj.mdscontainer=obj.mdscontainer.bindlastparameter(obj.modelname, obj.datadictionary, obj.exportedtps); end function obj = printparameters(obj) obj.mdscontainer=obj.mdscontainer.printparameters; end function obj = actualizeparameters(obj, shot) obj.mdscontainer=obj.mdscontainer.actualizeparameters(shot); end function obj = addwavegen(obj, wavegen) obj.mdscontainer=obj.mdscontainer.addwavegen(wavegen); obj.mdscontainer=obj.mdscontainer.bindlastwavegen(obj.modelname, obj.datadictionary, obj.timing); end function obj = printwavegens(obj) obj.mdscontainer=obj.mdscontainer.printwavegens; end function obj = actualizewavegens(obj, shot) obj.mdscontainer=obj.mdscontainer.actualizewavegens(shot); end function obj = cleanwavegens(obj) obj.mdscontainer=obj.mdscontainer.cleanwavegens; end %function obj = bindparameters(obj) % obj.mdscontainer=obj.mdscontainer.bindparameters(obj.modelname, obj.datadictionary, obj.exportedtps); %end % This method has only sense in the expcode context %function obj = buildworkspacesimstruct(obj) % obj.mdscontainer=obj.mdscontainer.buildworkspacesimstruct; %end %% Task container methods forwarders function obj = addtask(obj, task) obj.taskcontainer=obj.taskcontainer.addtask(task); obj.taskcontainer=obj.taskcontainer.bindlasttask(obj.modelname, obj.datadictionary); end function obj = printtasks(obj) obj.taskcontainer=obj.taskcontainer.printtasks; end %% Wavegen timing structure setters % function obj = setwavegentimingsources(obj, tstart, dt, tstop) % assert(ischar(tstart), 'SCDclass_algo.setwavegentimingsources first parameter must be a char array'); % assert(ischar(dt), 'SCDclass_algo.setwavegentimingsources first parameter must be a char array'); % assert(ischar(tstop), 'SCDclass_algo.setwavegentimingsources first parameter must be a char array'); % % obj.wavegentiming.t_start=tstart; % obj.wavegentiming.dt=dt; % obj.wavegentiming.t_stop=tstop; % end %% Timing information function obj = settiming(obj, t_start, dt, t_stop) obj.timing.t_start=t_start; obj.timing.dt=dt; obj.timing.t_stop=t_stop; end %% Fixed inits function obj = addfpinitfcn(obj, fcnname, targetstruct) if(~isempty(obj.stdinits)) for ii=1:numel(obj.stdinits) if(strcmp(char(obj.stdinits{ii}{2}),targetstruct)) warning('SCDclass_algo:addfpinitfcn','A function driving the structure %s has already been added, ignoring.\d',targetstruct) return; end end end temp=cell(10,1); temp{1}=fcnname; temp{2}=targetstruct; obj.stdinits{end+1}=temp; end function printinits(obj) if(~isempty(obj.stdinits)) for ii=1:numel(obj.stdinits) fprintf('%s -> %s\n',char(obj.stdinits{ii}{1}),char(obj.stdinits{ii}{2})); end end end function callinits(obj) if(~isempty(obj.stdinits)) for(ii=1:numel(obj.stdinits)) fprintf('Calling init function ''%s'', assigning its output to ''%s'' ...\n',char(obj.stdinits{ii}{1}),char(obj.stdinits{ii}{2})); initcmd=sprintf('[fp]=%s(obj);', char(obj.stdinits{ii}{1})); eval(initcmd); Simulink.data.assigninGlobal(obj.modelname, char(obj.stdinits{ii}{2}), fp); end end end end end