diff --git a/code/classes/SCDclass_mdspar.m b/code/classes/SCDclass_mdspar.m index 929ebee1692c19971c1297dc50be50473bd31323..bcf283ae0bf5b5369bfdcc28a96704a4224605f2 100644 --- a/code/classes/SCDclass_mdspar.m +++ b/code/classes/SCDclass_mdspar.m @@ -117,6 +117,16 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous assert(s==localshot, str); end + function obj=setactualizecmds(obj, shot) + pointspos=strfind(obj.modelparam,'.'); + baseparam=obj.modelparam(1:pointspos(1)-1); + structparam=obj.modelparam(pointspos(1):end); + obj.assignvar=sprintf('%s.Value%s',baseparam,structparam); + obj.assignstring=sprintf('%s=%s;',obj.assignvar,obj.getcommand); + obj.denanstring=sprintf('%s(isnan(%s))=0;',obj.assignvar,obj.assignvar); + obj.caststring=sprintf('%s=%s;',obj.assignvar,obj.assignvar); + end + function obj=preactualizecommon(obj, shot) if(~obj.unlinked) % Opening the tree @@ -125,13 +135,7 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous [obj, obj.value]=obj.getdata(shot); if ~obj.actualizable, return; end - pointspos=strfind(obj.modelparam,'.'); - baseparam=obj.modelparam(1:pointspos(1)-1); - structparam=obj.modelparam(pointspos(1):end); - obj.assignvar=sprintf('%s.Value%s',baseparam,structparam); - obj.assignstring=sprintf('%s=%s;',obj.assignvar,obj.getcommand); - obj.denanstring=sprintf('%s(isnan(%s))=0;',obj.assignvar,obj.assignvar); - obj.caststring=sprintf('%s=%s;',obj.assignvar,obj.assignvar); + obj=obj.setactualizecmds(shot); end end @@ -156,9 +160,9 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous function [obj,value]=getdatacommon(obj, shot) obj=obj.actualizegetcmd('mdsvalue(''%s'')', shot); - + value=eval(obj.getcommand); - if(~isnumeric(value)) + if(~isnumeric(value) && ~isa(obj,'SCDclass_mdsparenum')) % TODO: better handle this exception warning('SCDclass_mdspar:MDSerror','MDS+ error for parameter %s: %s. Actualization skipped.',obj.modelparam, value); obj.actualizable=false; else diff --git a/code/classes/SCDclass_mdsparenum.m b/code/classes/SCDclass_mdsparenum.m new file mode 100644 index 0000000000000000000000000000000000000000..1d0eb73642c74b549e5923a16bae4485d6d0f16c --- /dev/null +++ b/code/classes/SCDclass_mdsparenum.m @@ -0,0 +1,116 @@ +classdef SCDclass_mdsparenum < SCDclass_mdspar + % A string enumerated MDS parameter, for uint16 enum codes + % + % behavior in MATLAB: + % if a string match between MDS string and matlab num string is + % asserted, the enum choice is loaded into the tun parameter + % if not a warning is issued and the param is left untouched + % behavior in MARTe2: + % the same than before but the enum map is used to load the + % equivalent uint16 code on the MARTe2 side tunable parameter + % if a string match is not detected, the parameter is invalidated + + properties(Access=private) + enumclass + stringmap + intmap + end + + methods + + function obj=SCDclass_mdsparenum(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='MDSParEnum'; + end + + function actualizedata(obj, shot) + obj=obj.preactualizecommon(shot); + + if(~obj.unlinked) + % Enumeration map fill + obj=obj.initenummap(); + + found=false; + for ii=1:numel(obj.stringmap) + if strcmp(obj.value,char(obj.stringmap(ii))) + found = true; + break; + end + + end + + if ~found + warning('SCDclass_mdsparenum:actualize','No match between MDS and enum values, parameter not actualized'); + return + end + + obj.assignstring=sprintf('%s=%s.%s;',obj.assignvar,obj.enumclass,obj.value); + obj.denanstring=''; + obj.caststring=''; + end + + obj.postactualizecommon(shot); + 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); + + % to populate obj.assignvar + obj=obj.setactualizecmds(shot); + + % Enumeration map fill + obj=obj.initenummap(); + + enumval ='EnumVal = {'; + enumcode ='EnumCode = {'; + for ii=1:numel(obj.stringmap) + enumval=[enumval '"' char(obj.stringmap(ii)) '"']; + if ii~=numel(obj.stringmap) + enumval=[enumval ',']; + end + end + enumval=[enumval, '}']; + for ii=1:numel(obj.intmap) + enumcode=[enumcode num2str(obj.intmap(ii))]; + if ii~=numel(obj.intmap) + enumcode=[enumcode ',']; + end + end + enumcode=[enumcode '}']; + + + entrystring=[entrystring ' ' enumcode ' ' enumval '}']; + end + + end + + methods(Access = private) + + function obj = initenummap(obj) + % TODO: probably Simulink.data.evalinGlobal better than + % evalin('base' + + basecmd = ['class(' obj.assignvar ');']; + obj.enumclass = evalin('base',basecmd); + basecmd = ['enumeration(' obj.assignvar ');']; + obj.stringmap = evalin('base',basecmd); + basecmd = ['uint16(enumeration(' obj.assignvar '));']; + obj.intmap = evalin('base',basecmd); + end + + end +end +