diff --git a/algos/template/algo_template_loadtp.m b/algos/template/algo_template_loadtp.m index 6be2a3b655373e04f506ec48bb14bd3b4df148c5..80347de0cf4265881cebcc3eea6bb41ec6f76607 100644 --- a/algos/template/algo_template_loadtp.m +++ b/algos/template/algo_template_loadtp.m @@ -1,6 +1,9 @@ function TP = algo_template_loadtp() % Setup tunable control params -TP.gain = single(2); -TP.refmodel.gain = 4; % another gain used in referenced model +TP.gain = single(2); +TP.refmodel.gain = 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/template/algoobj_template.m b/algos/template/algoobj_template.m index afd744f5b7c67dc7fdfb72f276801d49bb2b650b..90a1ea875e5361b4a038fcc7334cb9dd5c9d6c4f 100644 --- a/algos/template/algoobj_template.m +++ b/algos/template/algoobj_template.m @@ -13,6 +13,11 @@ obj=obj.addfpinitfcn('algo_template_loadfp','algo_template_fp'); obj=obj.addtunparamstruct('algo_template_tp', @()algo_template_loadtp()); %% Tunable parameters +obj=obj.addparameter(SCDclass_mdsparnumeric('ks1','gain' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest')); +obj=obj.addparameter(SCDclass_mdsparnumeric('ks2','refmodel.gain' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest')); +obj=obj.addparameter(SCDclass_mdsparnumeric('kv1','rowvect' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest')); +obj=obj.addparameter(SCDclass_mdsparnumeric('kv2','colvect' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest')); +obj=obj.addparameter(SCDclass_mdsparnumeric('km1','matrix' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest')); %% Wavegens diff --git a/classes/SCDclass_mdspar.m b/classes/SCDclass_mdspar.m index 7b7d3a700cbfc895ee94084f54815f9c6bd2fa5c..0c7545f00280d62ab252c01c831f4586a0866451 100644 --- a/classes/SCDclass_mdspar.m +++ b/classes/SCDclass_mdspar.m @@ -172,7 +172,10 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous end function [obj,value]=getdatacommon(obj, shot) - obj=obj.actualizegetcmd('mdsvalue(''%s'')', shot); + % TODO: this depends upon selected MATLAB - MDSplus interface + % mdsipmex mdsvalueraw to return uncast MDSplus data + % python interface mdsvalue returns incast MDSplus data + obj=obj.actualizegetcmd('mdsvalueraw(''%s'')', shot); value=eval(obj.getcommand); if(~isnumeric(value) && ~isa(obj,'SCDclass_mdsparenum')) % TODO: better handle this exception diff --git a/classes/SCDclass_mdsparnumeric.m b/classes/SCDclass_mdsparnumeric.m new file mode 100644 index 0000000000000000000000000000000000000000..03f93ae65a5a939edf54f942b7b01e29553dae9b --- /dev/null +++ b/classes/SCDclass_mdsparnumeric.m @@ -0,0 +1,97 @@ +classdef SCDclass_mdsparnumeric < SCDclass_mdspar + % General purpose numeric loader MDS+ parameter class + + properties + end + + + methods + + function obj=SCDclass_mdsparnumeric(srctdimodel, destparam, varargin) + obj@SCDclass_mdspar(); + % Constructor parser customization definitions here + obj=obj.parseconstructorcommon(srctdimodel, destparam, varargin); + % Constructor parser customization results here + obj.classname=mfilename; + obj.marteclassname='MDSParameter'; + end + + function actualizedata(obj, shot) + obj=obj.preactualizecommon(shot); + if ~obj.actualizable, return; end + + %%% Actualization checks %%% + % dimensions + sourcedim=size(obj.value); + targetdim=Simulink.data.evalinGlobal(obj.modelname,sprintf('size(%s)',obj.assignvar)); + + actchk=true; + if numel(sourcedim)~=numel(targetdim) + warning('SCDDScore:mdsparnumeric','%s: number of dimensions not matching, actualization skipped!',obj.modelparam); + % TODO bette handle output ? + sourcedim + targetdim + actchk=false; + end + % handle vector transposition + if numel(sourcedim)==2 && ~isscalar(obj.value) + if (sourcedim(1)==1 && targetdim(2)==1) || (sourcedim(2)==1 && targetdim(1)==1) + % we've a vector to transpose + obj.value=obj.value'; + sourcedim=size(obj.value); + % TODO: in the new implementation, use obj.value for + % actualization and not an evaluated command ? + obj.assignstring=sprintf('%s=%s'';',obj.assignvar,obj.getcommand); + end + end + if actchk && ~any(sourcedim == targetdim) + warning('SCDDScore:mdsparnumeric','%s: dimensions not matching, actualization skipped!',obj.modelparam); + % TODO bette handle output ? + sourcedim + targetdim + actchk=false; + end + + % type + sourceclass=class(obj.value); + targetclass=Simulink.data.evalinGlobal(obj.modelname,sprintf('class(%s)',obj.assignvar)); + if actchk && ~strcmp(sourceclass,targetclass) + warning('SCDDScore:mdsparnumeric','%s: Data types not matching, actualization skipped!',obj.modelparam); + % TODO bette handle output ? + sourceclass + targetclass + actchk=false; + end + + % MARTe2 checks matrix orientation, but MDSplus - MATLBA + % interface do not provide in information (matrix + % orientation) to do this. Or, probably, I misunderstood and + % matrix orientation is always preserved + + + + obj.caststring=sprintf('%s=%s;',obj.assignvar,obj.assignvar); + if actchk + obj.postactualizecommon(shot); + end + end + + function [obj, value] = getdata(obj, shot) + [obj,value]=obj.getdatacommon(shot); + end + + function printinfo(obj) + obj.printinfocommon; + end + + function entrystring = genMARTe2entry(obj, shot) + entrystring=obj.genMARTe2entrycommon(shot); + entrystring=[entrystring ' }']; + end + + function out = casttomds(obj, in) + out = in; + end + end +end +