Skip to content
Snippets Groups Projects
Commit b6369e53 authored by Federico Felici's avatar Federico Felici
Browse files

Upgrade/cleanup mainly to SCDclass_expcode and related things

parent 63ea2e57
No related branches found
No related tags found
No related merge requests found
......@@ -20,6 +20,12 @@ classdef SCD
SCDconf_setSIMconf; % set conf for simulation
end
function H=setup(expcode)
% load and setup
H=SCD.load(expcode);
H.setup;
end
function H=init(expcode,shot)
assert(nargin==2,'must supply 2 inputs to init(expcode,shot)')
H=SCD.load(expcode);
......
......@@ -251,7 +251,7 @@ classdef SCDclass_algo
end
function callinits(obj,shot)
function callinits(obj)
% call initialization functions that set fixed parameters
if ~isempty(obj.stdinits)
for ii=1:numel(obj.stdinits)
......@@ -269,9 +269,7 @@ classdef SCDclass_algo
initcmd=sprintf('%s(obj);', initfunction);
[value{1:nout}] = eval(initcmd);
elseif isa(initfunction,'function_handle')
if nargin(initfunction)==2
argins = {obj,shot};
elseif nargin(initfunction)==1
if nargin(initfunction)==1
argins={obj};
elseif nargin(initfunction)==0
argins = {};
......
......@@ -352,7 +352,8 @@ classdef SCDclass_expcode
nodestr=sprintf('node%02d',inode);
obj.nodes(inode).varalgo(icpu) = varalgo;
obj.nodes(inode).wrapper{icpu} = wrappername;
obj.nodes(inode).cpuactive(icpu) = 1;
obj.nodes(inode).cpuactive(icpu) = true;
obj.nodes(inode).active = true;
%% save in wrapper list
tempwrapper=cell(10,1);
......@@ -555,6 +556,7 @@ classdef SCDclass_expcode
function actualizewavegens(obj,shot)
obj.mdscontainer.modeltoactualize=obj.modeltoactualize;
obj.mdscontainer.actualizewavegens(shot);
end
function printinits(obj)
if(~isempty(obj.stdinits))
......@@ -564,7 +566,7 @@ classdef SCDclass_expcode
end
end
function callinits(obj,~)
function callinits(obj)
if(~isempty(obj.algoobjlist))
for ii=1:numel(obj.algoobjlist)
if nargin==1
......@@ -657,12 +659,8 @@ classdef SCDclass_expcode
nodeinfo=obj.nodes(inode);
for icpu = 1:nodeinfo.ncpu
if nodeinfo.cpuactive(icpu)
if inode~=1
compileslx_list = [compileslx_list,...
SCDclass_expcode.getslxname(inode,icpu)]; %#ok<AGROW>
else
warning('Do not compile node %d thread %d since this is just a dummy',inode,icpu);
end
end
end
end
......@@ -704,9 +702,11 @@ classdef SCDclass_expcode
methods (Access = private)
function obj=printlog(obj,str)
function obj=printlog(obj,str,varargin)
% printlog, allows sprintf()-like expressions
if obj.loadverbose==1
fprintf('Expcode %d, %s\n', obj.maincode, str);
fprintf('Expcode %d, ', obj.maincode, str);
fprintf(str,varargin{:}); fprintf('\n');
end
end
......@@ -762,7 +762,7 @@ classdef SCDclass_expcode
nodeddsourcesok={};
nodeddsourcesokitems=0;
for ii=1:numel(nodeddsources)
if(strcmp(nodeddsources{ii}(1:7),'SCDwrap'))
if startsWith(nodeddsources{ii},'SCDwrap')
temp={nodeddsources{ii}, 0};
nodeddsourcesok=[nodeddsourcesok; temp];
nodeddsourcesokitems=nodeddsourcesokitems+1;
......@@ -772,20 +772,17 @@ classdef SCDclass_expcode
reqsourcesok={};
reqsourcesokitems=0;
for ii=1:numel(reqsources)
if(strcmp(reqsources{ii}(1:7),'SCDwrap'))
if startsWith(reqsources{ii},'SCDwrap')
temp={reqsources{ii}, 1};
reqsourcesok=[reqsourcesok; temp];
reqsourcesokitems=reqsourcesokitems+1;
else
str=sprintf('Proposed wrapper data dictionary %s does not begin with SCDwrap, ignoring it.', reqsources{ii});
warning(str);
%obj.printlog(str);
warning('Proposed wrapper data dictionary %s does not begin with SCDwrap, ignoring it.', reqsources{ii});
end
end
% Finding which data sources to eliminate and which to add
if(nodeddsourcesokitems>0 && reqsourcesokitems>0)
if (nodeddsourcesokitems>0 && reqsourcesokitems>0)
for ii=1:nodeddsourcesokitems
todel=1;
for jj=1:reqsourcesokitems
......@@ -813,8 +810,7 @@ classdef SCDclass_expcode
if(nodeddsourcesokitems>0)
for ii=1:nodeddsourcesokitems
if(nodeddsourcesok{ii,2}==1)
str=sprintf('Removing wrapper data source %s from %s', char(nodeddsourcesok{ii,1}), datadictname);
obj.printlog(str);
obj.printlog('Removing wrapper data source %s from %s', char(nodeddsourcesok{ii,1}), datadictname);
removeDataSource(nodedd, char(nodeddsourcesok{ii,1}));
end
end
......@@ -824,8 +820,7 @@ classdef SCDclass_expcode
if(reqsourcesokitems>0)
for ii=1:reqsourcesokitems
if(reqsourcesok{ii,2}==1)
str=sprintf('Adding wrapper data source %s to %s', char(reqsourcesok{ii,1}), datadictname);
obj.printlog(str);
obj.printlog('Adding wrapper data source %s to %s', char(reqsourcesok{ii,1}), datadictname);
addDataSource(nodedd, char(reqsourcesok{ii,1}));
end
end
......@@ -893,8 +888,7 @@ classdef SCDclass_expcode
if(tcvddsourcesokitems>0)
for ii=1:tcvddsourcesokitems
if(tcvddsourcesok{ii,2}==1)
str=sprintf('Removing algorithm data source %s', char(tcvddsourcesok{ii,1}));
obj.printlog(str);
obj.printlog('Removing algorithm data source %s', char(tcvddsourcesok{ii,1}));
removeDataSource(tcvdd, char(tcvddsourcesok{ii,1}));
end
end
......@@ -904,8 +898,7 @@ classdef SCDclass_expcode
if(reqsourcesokitems>0)
for ii=1:reqsourcesokitems
if(reqsourcesok{ii,2}==1)
str=sprintf('Adding algorithm data source %s', char(reqsourcesok{ii,1}));
obj.printlog(str);
obj.printlog('Adding algorithm data source %s', char(reqsourcesok{ii,1}));
addDataSource(tcvdd, char(reqsourcesok{ii,1}));
end
end
......@@ -942,7 +935,6 @@ classdef SCDclass_expcode
else
warning('SCDclass_expcode:setupwrappers','not supported node%02d cpu',inode);
end
case {2,3,4,6,7}
if(obj.wrapperlist{ii}{2}>=1 && obj.wrapperlist{ii}{2}<=4)
obj.nodes(inode).varalgo(obj.wrapperlist{ii}{2})=obj.wrapperlist{ii}{3};
......@@ -950,10 +942,8 @@ classdef SCDclass_expcode
else
warning('SCDclass_expcode:setupwrappers','not supported node%02d cpu',inode);
end
otherwise
warning('SCDclass_expcode:setupwrappers','not supported node');
end
end
......@@ -988,27 +978,43 @@ classdef SCDclass_expcode
function obj = buildworkspacesimstructnode(obj,inode,dd)
node = obj.nodes(inode);
try % get existing SCDsimdata
if evalin('base','exist(''SCDsimdata'',''var'')');
SCDsimdata = evalin('base','SCDsimdata');
catch ME
if strcmp(ME.identifier,'MATLAB:UndefinedFunction')
SCDsimdata = struct(); % assign here if empty
else
rethrow(ME);
end
else
SCDsimdata = struct(); % assign here if empty
end
if node.haswavegen
for ithread = 1:node.ncpu
% get whatever is in data dictionary template in wrappers
simstructname = sprintf('SCDnode%02d%02d_simdata',inode,ithread);
fprintf(' setting up %s\n',simstructname);
try
simstruct = dd.getEntry(simstructname).getValue;
catch
warning('%s not found in data dictionary, auto-generate from bus definition',simstructname)
wgbusname = sprintf('WG%02d%02dbus',inode,ithread);
simstruct = SCDconf_createsimdatastruct(dd,wgbusname);
wgbusname = sprintf('WG%02d%02dbus',inode,ithread);
fprintf(' setting up %s',simstructname);
if dd.exist(simstructname)
simstruct = dd.getEntry(simstructname).getValue;
mybus=dd.getEntry(wgbusname).getValue; % get from data dictionary
if ~isstruct(simstruct) || ~isfield(simstruct,'wavegen')
fprintf('.. loaded simstruct wavegen is not compatible');
regenerate = true;
elseif SCDconf_structbuscmp(simstruct.wavegen,mybus)
fprintf('... loaded WG from data dictionary\n');
regenerate=false;
else
fprintf('... loaded WG structure from dd does not match bus definition...');
regenerate=true;
end
else
regenerate=true;
fprintf('... could not find %s in data dictionary',simstructname);
end
if regenerate
simstruct.wavegen = SCDconf_createstructfrombus(dd,wgbusname); % structure to match
%ddsource = dd.find('Name',wgbusname).DataSource; % dd containing bus
%wrapdd=Simulink.data.dictionary.open(ddsource).getSection('Design Data');
%wrapdd.addEntry(simstructname,simstruct)
fprintf('... re-generated from bus %s\n',wgbusname')
end
SCDsimdata.(simstructname) = simstruct;
end
......@@ -1019,7 +1025,7 @@ classdef SCDclass_expcode
if node.hasadc
adcbusname = sprintf('ADC%02dbus',inode);
fprintf(' setting up %s.adc\n',simstructname);
SCDsimdata.(simstructname).adc = SCDconf_createsimdatastruct(dd,adcbusname);
SCDsimdata.(simstructname).adc = SCDconf_createstructfrombus(dd,adcbusname);
end
if node.hasethercat
......@@ -1027,18 +1033,16 @@ classdef SCDclass_expcode
ethercatbusname = 'ETHCAT1IN';
fprintf(' setting up %s.ethercat\n',simstructname);
SCDsimdata.(simstructname).ethercat = ...
SCDconf_createsimdatastruct(dd,ethercatbusname);
SCDconf_createstructfrombus(dd,ethercatbusname);
end
% add also RFM
RFMbusname = 'RFMINbus';
SCDsimdata.rfm = SCDconf_createsimdatastruct(dd,RFMbusname);
SCDsimdata.rfm = SCDconf_createstructfrombus(dd,RFMbusname);
% assign result in base workspace
assignin('base','SCDsimdata',SCDsimdata);
end
end
end
......
......@@ -46,36 +46,32 @@ classdef SCDclass_mdswgsigsingle < SCDclass_mdswg
end
value=obj.getdata();
baseparam=obj.wavegenbasestruct;
structparam=obj.wavegentarget;
wgentryval=evalin('base',baseparam);
baseparam=obj.wavegenbasestruct; % name of base workspace structure
structparam=obj.wavegentarget; % name of target field
wgentryval = evalin('base',baseparam); % structure of wavegen in base workspace
getcurrenttssize =sprintf('ddtssamples=numel(wgentryval.%s.Time);',structparam);
eval(getcurrenttssize);
if(ddtssamples~=numel(value.Time))
% the dd timeseries has different dims w.r.t. the signals
% to be loaded, we have to load the timeseries as it is
assigncmd =sprintf('wgentryval.%s=value;',structparam);
eval(assigncmd);
else
% the dd timeseries has the same size than the signals
% to be loaded, we can do a partial loading
assigncmdtime =sprintf('wgentryval.%s.Time=value.Time;',structparam);
assigncmddata =sprintf('wgentryval.%s.Data(:,%d)=value.Data;',structparam,obj.destidx);
assert(isfield(wgentryval,structparam),...
'Wavegen field %s does not exist in target structure %s. ',structparam,baseparam)
eval(assigncmdtime);
eval(assigncmddata);
% assign field from wavegen entry value
ddtssamples=numel(wgentryval.(structparam).Time);
if ddtssamples~=numel(value.Time)
% the dd timeseries has different dims w.r.t. the signals
% to be loaded, we have to load the timeseries as it is
wgentryval.(structparam)=value;
else
% the dd timeseries has the same size than the signals
% to be loaded, we can do a partial loading
wgentryval.(structparam).Time=value.Time;
wgentryval.(structparam).Data(:,obj.destidx)=value.Data;
end
assignin('base','temp',wgentryval);
assigncmd=sprintf('%s=temp;',baseparam);
assigncmd=sprintf('%s=temp;',baseparam);
evalin('base',assigncmd);
evalin('base','clear temp');
end
function value=getdata(obj)
......
......@@ -7,8 +7,7 @@ classdef test_expcodes < matlab.unittest.TestCase
end
properties(ClassSetupParameter)
%expcode_number = {'1','1005','1010'}; % list of expcodes to test
expcode_number = {'1','1005'}; % list of expcodes to test
expcode = {'1','1005','1006'}; % list of expcodes to test
end
methods(TestClassSetup)
......@@ -27,10 +26,10 @@ classdef test_expcodes < matlab.unittest.TestCase
SCDconf_setSIMconf; % set ConfigurationSettings for Simulation
end
function setup_expcode(testCase,expcode_number)
function setup_expcode(testCase,expcode)
% get this expcode object from expcode object container
fprintf('\n=== Testing expcode %s ===\n',expcode_number);
testCase.expcode_obj = getbymaincode(testCase.SCDexps,str2double(expcode_number));
fprintf('\n=== Testing expcode %s ===\n',expcode);
testCase.expcode_obj = getbymaincode(testCase.SCDexps,str2double(expcode));
end
end
......@@ -92,10 +91,12 @@ classdef test_expcodes < matlab.unittest.TestCase
end
end
function test_expcode_compile_all(testCase)
testCase.expcode_obj.compile; % compile whole tcv.slx with this expcode
function test_expcode_sim(testCase)
fprintf('\n === Testing Simulink simulation of tcv.slx for expcode %d: %s === \n',testCase.expcode_obj.maincode)
testCase.expcode_obj.sim; % simulate whole tcv.slx with this expcode
end
function test_build(testCase)
testCase.expcode_obj.build;
end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment