diff --git a/algos/template/algo_template_loadtp.m b/algos/template/algo_template_loadtp.m index 80347de0cf4265881cebcc3eea6bb41ec6f76607..1bc8b55a86d02267203ab1ea19509aa920898e96 100644 --- a/algos/template/algo_template_loadtp.m +++ b/algos/template/algo_template_loadtp.m @@ -1,9 +1,11 @@ function TP = algo_template_loadtp() % Setup tunable control params +TP.enable = true; 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 558f4c499a969e03061eec8716e87a21d24c4ac9..b93ee78b1155bb2c6fa685b9f27ae231fd49cf17 100644 --- a/algos/template/algoobj_template.m +++ b/algos/template/algoobj_template.m @@ -13,6 +13,7 @@ obj=obj.addfpinitfcn('algo_template_loadfp','algo_template_fp'); obj=obj.addtunparamstruct('algo_template_tp', @()algo_template_loadtp(), false); %% Tunable parameters +obj=obj.addparameter(SCDclass_mdsparnumeric('kb1','enable' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest')); 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')); diff --git a/classes/SCDclass_mdspar.m b/classes/SCDclass_mdspar.m index 6f32b5827cb1af99d39d2b2cfb75a7ae5fa3fbad..e6c43aba67d9a852229e0003ea21159d461fa5a9 100644 --- a/classes/SCDclass_mdspar.m +++ b/classes/SCDclass_mdspar.m @@ -42,6 +42,7 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous mdsvalidationstr % MDS validation string used in autopopulation loadpermissivity % true if load error shoudn't cause an error (warning only) + logicalmdstype % expected type for a logical parameter end properties @@ -68,7 +69,7 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous obj.verbose=1; obj.matlabseparator='.'; obj.marteseparator='-'; - + obj.logicalmdstype='uint8'; % generated C code uses uint8 to handle logicals end function obj=parseconstructor(obj, srctdimodel, destparam, varargin) diff --git a/classes/SCDclass_mdsparnumeric.m b/classes/SCDclass_mdsparnumeric.m index e62f14596f1a6930b702d386853dceaf2953c057..bab4db50e19275a07bb1469aff9947067a0ac9cb 100644 --- a/classes/SCDclass_mdsparnumeric.m +++ b/classes/SCDclass_mdsparnumeric.m @@ -27,23 +27,24 @@ classdef SCDclass_mdsparnumeric < SCDclass_mdspar return; end - %%% Actualization checks %%% - % dimensions + %%%% Actualization checks %%%% + boolcast=false; + %%% dimensions sourcedim=size(obj.value); targetdim=Simulink.data.evalinGlobal(obj.modelname,sprintf('size(%s)',obj.assignvar)); - actchk=true; if numel(sourcedim)~=numel(targetdim) + sourcedim + targetdim if obj.loadpermissivity warning('SCDDScore:mdsparnumeric','%s: number of dimensions not matching, actualization skipped!',obj.modelparam); else error('SCDDScore:mdsparnumeric','%s: number of dimensions not matching, actualization skipped!',obj.modelparam); end - sourcedim - targetdim + actchk=false; end - % handle vector transposition + %%% 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 @@ -55,27 +56,43 @@ classdef SCDclass_mdsparnumeric < SCDclass_mdspar end end if actchk && ~any(sourcedim == targetdim) + sourcedim + targetdim if obj.loadpermissivity warning('SCDDScore:mdsparnumeric','%s: dimensions not matching, actualization skipped!',obj.modelparam); else error('SCDDScore:mdsparnumeric','%s: dimensions not matching, actualization skipped!',obj.modelparam); end - sourcedim - targetdim actchk=false; - end - - % type + end + %%%% type sourceclass=class(obj.value); targetclass=Simulink.data.evalinGlobal(obj.modelname,sprintf('class(%s)',obj.assignvar)); + %%% handle cast to logical + if strcmp(targetclass,'logical') + if ~strcmp(sourceclass,'uint8') + sourceclass + if obj.loadpermissivity + warning('SCDDScore:mdsparnumeric','%s: source type must be %s for logical parameters',obj.modelparam,obj.logicalmdstype); + else + error('SCDDScore:mdsparnumeric','%s: source type must be %s for logical parameters',obj.modelparam,obj.logicalmdstype); + end + actchk=false; + end + if actchk + sourceclass='logical'; + boolcast=true; + end + end + %%% type check if actchk && ~strcmp(sourceclass,targetclass) + sourceclass + targetclass if obj.loadpermissivity warning('SCDDScore:mdsparnumeric','%s: Data types not matching, actualization skipped!',obj.modelparam); else error('SCDDScore:mdsparnumeric','%s: Data types not matching, actualization skipped!',obj.modelparam); end - sourceclass - targetclass actchk=false; end @@ -83,8 +100,12 @@ classdef SCDclass_mdsparnumeric < SCDclass_mdspar % 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 boolcast + obj.caststring=sprintf('%s=logical(%s);',obj.assignvar,obj.assignvar); + else + obj.caststring=sprintf('%s=%s;',obj.assignvar,obj.assignvar); + end if actchk obj.postactualize(shot); end