From d03196a5657b12c8d8f32e83825fe5879f68e237 Mon Sep 17 00:00:00 2001
From: galperti <cristian.galperti@epfl.ch>
Date: Wed, 22 Jun 2022 15:12:12 +0200
Subject: [PATCH] algo 1 added

---
 .../algo_cfgtemplate1_harness_run.m           |  69 ++++++++++++++++++
 algos/cfs-template/algo_cfstemplate1.slx      | Bin 0 -> 20609 bytes
 .../algo_cfstemplate1_harness.slx             | Bin 0 -> 15277 bytes
 .../algo_cfstemplate1_inBus_def.m             |  33 +++++++++
 algos/cfs-template/algo_cfstemplate1_loadfp.m |   6 ++
 algos/cfs-template/algo_cfstemplate1_loadtp.m |  11 +++
 .../algo_cfstemplate1_outBus_def.m            |  35 +++++++++
 .../algo_cfstemplate1_signal_buses.m          |  47 ++++++++++++
 algos/cfs-template/algo_cfstemplate1_test.m   |   7 ++
 algos/cfs-template/algoobj_cfstemplate1.m     |  42 +++++++++++
 10 files changed, 250 insertions(+)
 create mode 100644 algos/cfs-template/algo_cfgtemplate1_harness_run.m
 create mode 100644 algos/cfs-template/algo_cfstemplate1.slx
 create mode 100644 algos/cfs-template/algo_cfstemplate1_harness.slx
 create mode 100644 algos/cfs-template/algo_cfstemplate1_inBus_def.m
 create mode 100644 algos/cfs-template/algo_cfstemplate1_loadfp.m
 create mode 100644 algos/cfs-template/algo_cfstemplate1_loadtp.m
 create mode 100644 algos/cfs-template/algo_cfstemplate1_outBus_def.m
 create mode 100644 algos/cfs-template/algo_cfstemplate1_signal_buses.m
 create mode 100644 algos/cfs-template/algo_cfstemplate1_test.m
 create mode 100644 algos/cfs-template/algoobj_cfstemplate1.m

diff --git a/algos/cfs-template/algo_cfgtemplate1_harness_run.m b/algos/cfs-template/algo_cfgtemplate1_harness_run.m
new file mode 100644
index 0000000..c24b026
--- /dev/null
+++ b/algos/cfs-template/algo_cfgtemplate1_harness_run.m
@@ -0,0 +1,69 @@
+function algo_template_harness_run(obj)
+% run harness and check the result
+
+% load tunable control parameters from mds
+shot = 100; % shot reference
+obj.actualize(shot);
+
+% Input Data - must be structure of timeseries matching input bus structure
+% time = 0:obj.gettiming.dt:1;
+% data = single(sin(2*pi*time*10)');
+% % NB: these struct name and types must match the corresponding data bus
+% tsStructData = struct('simple_signal',timeseries(data,time,'Name','Test Input Data'));
+
+% SimIn object to customize configuration of Simulation run for test
+SimIn = Simulink.SimulationInput([obj.getname '_harness']);
+
+% Create template Input dataset for this model
+% Dataset = createInputDataset(obj.getname);
+
+% assign input data signal to Simulink.Signal object
+% DataIn = Simulink.SimulationData.Signal;
+% DataIn.Values = tsStructData;
+
+% assign as first element in input data set
+% isig = find(contains(Dataset.getElementNames,'signal_in')); % find input signal index
+% Dataset = Dataset.setElement(isig,DataIn); %#ok<FNDSB>
+% SimIn.ExternalInput = Dataset; % assign this as external input for simulation
+
+% Custom parameters for this run to save outport data
+SimIn = SimIn.setModelParameter('SaveOutput','on'); % set to save outport signals
+SimIn = SimIn.setModelParameter('SignalLogging','on'); % set to save log signals
+SimIn = SimIn.setModelParameter('OutputSaveName','SimOut');
+SimIn = SimIn.setModelParameter('SaveFormat','Dataset');
+SimIn = SimIn.setModelParameter('StartTime',num2str(obj.gettiming().t_start));
+SimIn = SimIn.setModelParameter('StopTime',num2str(obj.gettiming().t_stop));
+SimIn = SimIn.setModelParameter('FixedStep',num2str(obj.gettiming().dt));
+
+% simulate - simulate only single types to save time
+result = sim(SimIn);
+
+% check output port data
+tp = Simulink.data.evalinGlobal(obj.getname,'algo_template_tp.Value');
+fp = Simulink.data.evalinGlobal(obj.getname,'algo_template_fp');
+
+input = evalin('base','algo_template_inbus1');
+input1  = input.signal1.Data;
+input2  = input.signal2.Data;
+
+output1 = result.simout.signal1.Data;
+output2 = result.simout.signal2.Data;
+
+size(input1)
+size(output1)
+
+maxerror1 = 0.1;
+maxerror2 = 0.1; 
+assert(max(abs(output1 - input1.*tp.gain))<maxerror1,'Wrong output 1!');
+assert(max(abs(output2 - (input2.*tp.refmodel.gain+fp.refmodel.offset)))<maxerror2,'Wrong output 2!');
+
+% check logs which contain a SCDsignal type data
+% logsout = result.logsout;
+% 
+% signal    = logsout.getElement('SCDsignal type bus').Values.Value;
+% Quality   = logsout.getElement('SCDsignal type bus').Values.QualityTag;
+% State     = logsout.getElement('SCDsignal type bus').Values.ProductionState;
+% 
+% assert(all(State  .Data == ProductionState.RUNNING),'ProductionState must be RUNNING');
+% assert(all(Quality.Data == QualityTag.GOOD        ),'QualityTag must be RUNNING'     );
+end
diff --git a/algos/cfs-template/algo_cfstemplate1.slx b/algos/cfs-template/algo_cfstemplate1.slx
new file mode 100644
index 0000000000000000000000000000000000000000..2759c85d3e689413b87a5c682b8a256cc4371ef1
GIT binary patch
literal 20609
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
IG^C;VAAvxzGynhq

literal 0
HcmV?d00001

diff --git a/algos/cfs-template/algo_cfstemplate1_harness.slx b/algos/cfs-template/algo_cfstemplate1_harness.slx
new file mode 100644
index 0000000000000000000000000000000000000000..6beba1d4535228191471cd1460a5ca438f669736
GIT binary patch
literal 15277
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

literal 0
HcmV?d00001

diff --git a/algos/cfs-template/algo_cfstemplate1_inBus_def.m b/algos/cfs-template/algo_cfstemplate1_inBus_def.m
new file mode 100644
index 0000000..9cf6ec1
--- /dev/null
+++ b/algos/cfs-template/algo_cfstemplate1_inBus_def.m
@@ -0,0 +1,33 @@
+% Bus object: SCDalgo_template_inBus 
+clear elems;
+elems(1) = Simulink.BusElement;
+elems(1).Name = 'signal1';
+elems(1).Dimensions = 1;
+elems(1).DimensionsMode = 'Fixed';
+elems(1).DataType = 'single';
+elems(1).SampleTime = -1;
+elems(1).Complexity = 'real';
+elems(1).Min = [];
+elems(1).Max = [];
+elems(1).DocUnits = '';
+elems(1).Description = '';
+
+elems(2) = Simulink.BusElement;
+elems(2).Name = 'signal2';
+elems(2).Dimensions = 1;
+elems(2).DimensionsMode = 'Fixed';
+elems(2).DataType = 'single';
+elems(2).SampleTime = -1;
+elems(2).Complexity = 'real';
+elems(2).Min = [];
+elems(2).Max = [];
+elems(2).DocUnits = '';
+elems(2).Description = '';
+
+algo_template_inBus = Simulink.Bus;
+algo_template_inBus.HeaderFile = '';
+algo_template_inBus.Description = '';
+algo_template_inBus.DataScope = 'Auto';
+algo_template_inBus.Alignment = -1;
+algo_template_inBus.Elements = elems;
+clear elems;
diff --git a/algos/cfs-template/algo_cfstemplate1_loadfp.m b/algos/cfs-template/algo_cfstemplate1_loadfp.m
new file mode 100644
index 0000000..2fd64eb
--- /dev/null
+++ b/algos/cfs-template/algo_cfstemplate1_loadfp.m
@@ -0,0 +1,6 @@
+function fp = algo_template_loadfp(obj)
+
+%% Load other fixed parameters
+fp.timing = obj.gettiming;
+fp.refmodel.offset = 1; % a fixed parameter
+end
\ No newline at end of file
diff --git a/algos/cfs-template/algo_cfstemplate1_loadtp.m b/algos/cfs-template/algo_cfstemplate1_loadtp.m
new file mode 100644
index 0000000..1c08d92
--- /dev/null
+++ b/algos/cfs-template/algo_cfstemplate1_loadtp.m
@@ -0,0 +1,11 @@
+function TP = algo_template_loadtp()
+% Setup tunable control params
+
+TP.enable           = true;
+TP.gain             = single(2);
+TP.refmodel.gain    = single(4); % another gain used in referenced model
+TP.rowvect          = int32([1 2 3]);
+TP.colvect          = int16([1 2 3]');
+TP.matrix           = int8([1 2; 3 4]);
+
+end
diff --git a/algos/cfs-template/algo_cfstemplate1_outBus_def.m b/algos/cfs-template/algo_cfstemplate1_outBus_def.m
new file mode 100644
index 0000000..3acb8cd
--- /dev/null
+++ b/algos/cfs-template/algo_cfstemplate1_outBus_def.m
@@ -0,0 +1,35 @@
+% Bus object: SCDalgo_template_outBus 
+clear elems;
+elems(1) = Simulink.BusElement;
+elems(1).Name = 'signal1';
+elems(1).Dimensions = 1;
+elems(1).DimensionsMode = 'Fixed';
+%elems(1).DataType = 'Bus:SCDBus_single_11_Vector';
+elems(1).DataType = 'single';
+elems(1).SampleTime = -1;
+elems(1).Complexity = 'real';
+elems(1).Min = [];
+elems(1).Max = [];
+elems(1).DocUnits = '';
+elems(1).Description = '';
+
+elems(2) = Simulink.BusElement;
+elems(2).Name = 'signal2';
+elems(2).Dimensions = 1;
+elems(2).DimensionsMode = 'Fixed';
+%elems(2).DataType = 'Bus:SCDBus_int32_Scalar';
+elems(2).DataType = 'single';
+elems(2).SampleTime = -1;
+elems(2).Complexity = 'real';
+elems(2).Min = [];
+elems(2).Max = [];
+elems(2).DocUnits = '';
+elems(2).Description = '';
+
+algo_template_outBus = Simulink.Bus;
+algo_template_outBus.HeaderFile = '';
+algo_template_outBus.Description = '';
+algo_template_outBus.DataScope = 'Auto';
+algo_template_outBus.Alignment = -1;
+algo_template_outBus.Elements = elems;
+clear elems;
diff --git a/algos/cfs-template/algo_cfstemplate1_signal_buses.m b/algos/cfs-template/algo_cfstemplate1_signal_buses.m
new file mode 100644
index 0000000..82c52b2
--- /dev/null
+++ b/algos/cfs-template/algo_cfstemplate1_signal_buses.m
@@ -0,0 +1,47 @@
+function [busNames,Buses] = algo_template_signal_buses()
+% [busNames,Buses] = SCDalgo_template_signal_buses()
+% Define some buses needed for the template
+
+%% Define signal buses for various SCDsignal types
+% Data examples for which to create buses
+D = {...
+  ones(11,1,'single'),...
+  ones(3,3,'single'),...
+  int32(1)};
+
+% Create buses for these signals and add them to the list
+[Buses,busNames] = deal(cell(numel(D),1)); % init
+for ii = 1:numel(D)
+  mydata = D{ii};
+  mysig = SCDsignal(mydata); % create SCDsignal object for this data example
+  mybus = mysig.createBus; % create Bus for this signal using object method
+  % Store
+  Buses{ii} = mybus;
+  busNames{ii} = mybus.Description;
+end
+
+%% Add output structure: a bus that includes only SCDsignal data types
+
+% First add 3 busElements for the three signals defined above
+for ii=1:3
+elems(ii) = Simulink.BusElement;
+elems(ii).Name = sprintf('signal%d',ii);
+elems(ii).Dimensions = 1;
+elems(ii).DimensionsMode = 'Fixed';
+elems(ii).DataType = sprintf('Bus: %s',busNames{ii});
+end
+
+% Define output bus with these elements
+outBus = Simulink.Bus;
+outBus.HeaderFile = '';
+outBus.Description = '';
+outBus.DataScope = 'Auto';
+outBus.Alignment = -1;
+outBus.Elements = elems;
+clear elems;
+
+% append to list
+busNames{end+1} = 'algo_template_bus1';
+Buses{end+1}    = outBus; 
+
+end
diff --git a/algos/cfs-template/algo_cfstemplate1_test.m b/algos/cfs-template/algo_cfstemplate1_test.m
new file mode 100644
index 0000000..d37df45
--- /dev/null
+++ b/algos/cfs-template/algo_cfstemplate1_test.m
@@ -0,0 +1,7 @@
+classdef algo_template_test < SCDalgo_test
+  
+  properties
+    algoobj = algoobj_template();
+  end
+  
+end
\ No newline at end of file
diff --git a/algos/cfs-template/algoobj_cfstemplate1.m b/algos/cfs-template/algoobj_cfstemplate1.m
new file mode 100644
index 0000000..80ce3b8
--- /dev/null
+++ b/algos/cfs-template/algoobj_cfstemplate1.m
@@ -0,0 +1,42 @@
+function obj = algoobj_cfstemplate1()
+
+%% Doublets SPC controller algorithm
+obj = SCDclass_algo('algo_cfstemplate1');
+
+%% Timing of the algorithm
+obj=obj.settiming(-1,1e-3,1.0);
+
+%% Fixed parameters init functions 
+obj=obj.addfpinitfcn('algo_cfstemplate1_loadfp','algo_cfstemplate1_fp');
+
+%% Tunable parameters structure name
+obj=obj.addtunparamstruct('algo_cfstemplate1_tp', @()algo_cfstemplate1_loadtp(), false);
+
+%% Tunable parameters
+parshot=10;
+obj=obj.addparameter(SCDclass_mdsparnumeric('kb1','enable'          ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot)); 
+obj=obj.addparameter(SCDclass_mdsparnumeric('ks1','gain'            ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot)); 
+obj=obj.addparameter(SCDclass_mdsparnumeric('kv1','rowvect'         ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot));
+obj=obj.addparameter(SCDclass_mdsparnumeric('kv2','colvect'         ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot));
+obj=obj.addparameter(SCDclass_mdsparnumeric('km1','matrix'          ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot));
+
+%% Wavegens
+obj=obj.addwavegenbasetruct('algo_cfstemplate1_inbus');
+obj=obj.addwavegen(SCDclass_mdswgsigsingle( 'ai.ch001','signal1'        ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot));
+obj=obj.addwavegen(SCDclass_mdswgsigsingle( 'ai.ch002','signal2'        ,'srcsrv','spcpc171.epfl.ch','srctree','martetest','shot',parshot));
+
+
+%% Buses
+obj = obj.addbus('algo_template_inBus', 'algo_template_inBus_def' );
+obj = obj.addbus('algo_template_outBus', 'algo_template_outBus_def' );
+ % function handle that returns cell arays of buses and busnames to be
+ % registered
+obj = obj.addbus('',@() algo_template_signal_buses());
+
+%% Tasks
+
+%% Print (optional)
+obj.printinfo;
+
+end
+
-- 
GitLab