diff --git a/code/classes/SCDclass_mdswgsigarray1.m b/code/classes/SCDclass_mdswgsigarray1.m index e91c740057f54b427c25e84a414ee67a0167564e..54096a6b7003d1481635ad83996baccd2cf08c7b 100644 --- a/code/classes/SCDclass_mdswgsigarray1.m +++ b/code/classes/SCDclass_mdswgsigarray1.m @@ -36,7 +36,7 @@ classdef SCDclass_mdswgsigarray1 < SCDclass_mdswg obj.srcstopidx=srcinterval(end); obj.deststartidx=dstinterval(1); obj.deststopidx=dstinterval(end); - + obj.classname=mfilename; obj.marteclassname='MDSWgSigArray1'; end @@ -117,7 +117,13 @@ classdef SCDclass_mdswgsigarray1 < SCDclass_mdswg dbdata=mdsvalue(mdschannel); dbtime=mdsvalue(['dim_of(' mdschannel ')']); + value.Data(:,ii) = single(interp1(dbtime,dbdata,timebase,'linear',0))'; + firstindexes=find(timebase<dbtime(1)); + lastindexes=find(timebase>dbtime(end)); + value.Data(firstindexes,ii)=single(dbdata(1)); + value.Data(lastindexes,ii)=single(dbdata(end)); + end end @@ -137,7 +143,10 @@ classdef SCDclass_mdswgsigarray1 < SCDclass_mdswg end end - function entrystring = genMARTe2entry(obj, shot) + function entrystring = genMARTe2entry(obj, shot) + if(srcstartidx~=deststartidx || srcstopidx~=deststopidx) + error('SCDclass_mdswgsigarray1:genMARTe2entry','Signal position remapping not yet implemented in the MARTe version of this class'); + end entrystring=obj.genMARTe2entrycommon(shot); entrystring=[entrystring ' StartIdx=' num2str(obj.srcstartidx) ' StopIdx=' num2str(obj.srcstopidx) ' }']; end @@ -158,7 +167,7 @@ classdef SCDclass_mdswgsigarray1 < SCDclass_mdswg for ii=obj.srcstartidx:obj.srcstopidx expandedtdi = sprintf(obj.tdiexpr, ii); martename=expandedtdi; - sigentry=sprintf(' %s={ NodeName=%s Type=float32 NumberOfElements=1 DataManagement=0 HoleManagement=1 }\n',martename, expandedtdi); + sigentry=sprintf(' %s={ NodeName=%s Type=float32 NumberOfElements=%d DataManagement=0 HoleManagement=1 }\n',martename, expandedtdi); expentries=[expentries sigentry]; end end diff --git a/code/classes/SCDclass_mdswgsigsingle.m b/code/classes/SCDclass_mdswgsigsingle.m index d204baafdcfaa017612ebf86a9336606e8d8e47e..e4cbbe75c4a0c87d3c75ba01a9458653a8f96099 100644 --- a/code/classes/SCDclass_mdswgsigsingle.m +++ b/code/classes/SCDclass_mdswgsigsingle.m @@ -97,6 +97,12 @@ classdef SCDclass_mdswgsigsingle < SCDclass_mdswg dbdata=mdsvalue(obj.tdiexpr); dbtime=mdsvalue(['dim_of(' obj.tdiexpr ')']); value.Data = single(interp1(dbtime,dbdata,timebase,'linear',0))'; + + firstindexes=find(timebase<dbtime(1)); + lastindexes=find(timebase>dbtime(end)); + value.Data(firstindexes)=single(dbdata(1)); + value.Data(lastindexes)=single(dbdata(end)); + end diff --git a/code/classes/SCDclass_task.m b/code/classes/SCDclass_task.m index 28d77a20f3423d2bfd10b822da4ccd0df1648387..145d698665226195ae394070d582069aff107264 100644 --- a/code/classes/SCDclass_task.m +++ b/code/classes/SCDclass_task.m @@ -9,7 +9,7 @@ classdef SCDclass_task < matlab.mixin.Heterogeneous datadictionary % data dictionary hosting the parameter, if empty base workspace modelname % name of the Simulink model using the parameter classname % class name for logging - + cparser % constructor parameters parser % Properties for a MDS+ related task (not necessarly used) mdsserver % MDS+ server for a MDS+ related task @@ -32,32 +32,34 @@ classdef SCDclass_task < matlab.mixin.Heterogeneous function obj=SCDclass_task(id,varargin) % MDS source and model destination constructor - p=inputParser; - addRequired(p,'id',@(x) ischar(x)); + obj.cparser=inputParser; + addRequired(obj.cparser,'id',@(x) ischar(x)); - addParameter(p,'srcsrv','tcvdata',@(x) ischar(x)); - addParameter(p,'srctree','tcv_shot',@(x) ischar(x)); - addParameter(p,'srctdimodel','',@(x) ischar(x)); - addParameter(p,'srctdishot','',@(x) ischar(x)); - addParameter(p,'modelname','',@(x) ischar(x)); - addParameter(p,'datadictname','',@(x) ischar(x)); - - parse(p,id,varargin{:}{:}); + addParameter(obj.cparser,'srcsrv','tcvdata',@(x) ischar(x)); + addParameter(obj.cparser,'srctree','tcv_shot',@(x) ischar(x)); + addParameter(obj.cparser,'srctdimodel','',@(x) ischar(x)); + addParameter(obj.cparser,'srctdishot','',@(x) ischar(x)); + addParameter(obj.cparser,'modelname','',@(x) ischar(x)); + addParameter(obj.cparser,'datadictname','',@(x) ischar(x)); + + obj.verbose=1; + end + + function obj=parseconstructorcommon(obj, id, varargin) + parse(obj.cparser,id,varargin{:}{:}); - obj.id=p.Results.id; - obj.mdsserver=p.Results.srcsrv; - obj.mdstree=p.Results.srctree; - obj.tdiexprmodel=p.Results.srctdimodel; - if isempty(p.Results.srctdishot) - obj.tdiexprshot=p.Results.srctdimodel; + obj.id=obj.cparser.Results.id; + obj.mdsserver=obj.cparser.Results.srcsrv; + obj.mdstree=obj.cparser.Results.srctree; + obj.tdiexprmodel=obj.cparser.Results.srctdimodel; + if isempty(obj.cparser.Results.srctdishot) + obj.tdiexprshot=obj.cparser.Results.srctdimodel; else - obj.tdiexprshot=p.Results.srctdishot; + obj.tdiexprshot=obj.cparser.Results.srctdishot; end - obj.modelname=p.Results.modelname; - obj.datadictionary=p.Results.datadictname; - - obj.verbose=1; - end + obj.modelname=obj.cparser.Results.modelname; + obj.datadictionary=obj.cparser.Results.datadictname; + end function name=getmodelname(obj) name=obj.modelname; diff --git a/code/classes/SCDclass_taskmdscheckbusnames.m b/code/classes/SCDclass_taskmdscheckbusnames.m index 39cf89b1e1193aede08c8e1e2a1a2e8d62aa93c3..757b859db8fa42dc32bf96ad4e020b4cfe2c7c78 100644 --- a/code/classes/SCDclass_taskmdscheckbusnames.m +++ b/code/classes/SCDclass_taskmdscheckbusnames.m @@ -14,9 +14,11 @@ classdef SCDclass_taskmdscheckbusnames < SCDclass_task methods - function obj=SCDclass_taskmdscheckbusnames(id, modelbus, varargin) + function obj=SCDclass_taskmdscheckbusnames(id, varargin) obj@SCDclass_task(id, varargin); - obj.modelbus=modelbus; + obj.cparser.addRequired('modelbus',@(x) ischar(x)); + obj=obj.parseconstructorcommon(id, varargin); + obj.modelbus=obj.cparser.Results.modelbus; obj.classname=mfilename; end @@ -27,7 +29,7 @@ classdef SCDclass_taskmdscheckbusnames < SCDclass_task [obj,value]=obj.getdata(shot); if obj.verbose==1 - fprintf('Cheking bus: ''%s'' <-> ''%s'' (%s, shot %d)\n', obj.modelbus, obj.tdiexprused, obj.classname, shot); + fprintf('Checking bus: ''%s'' <-> ''%s'' (%s, shot %d)\n', obj.modelbus, obj.tdiexprused, obj.classname, shot); end d=Simulink.data.dictionary.open(sprintf('%s',obj.datadictionary)); diff --git a/code/classes/SCDclass_taskmdsloadprevADC.m b/code/classes/SCDclass_taskmdsloadprevADC.m new file mode 100644 index 0000000000000000000000000000000000000000..93a0b17f6ecfca591931e108815d073fd6165347 --- /dev/null +++ b/code/classes/SCDclass_taskmdsloadprevADC.m @@ -0,0 +1,120 @@ +classdef SCDclass_taskmdsloadprevADC < SCDclass_task + % This is a special class which loads previous + % values of the ADCs for the acquiring nodes + properties + modelbus + node + workspacedatabasestructure + end + + methods + + function obj=SCDclass_taskmdsloadprevADC(id, varargin) + obj@SCDclass_task(id, varargin); + obj.cparser.addRequired('modelbus',@(x) ischar(x)); + obj.cparser.addParameter('node', 0, @(x) (isnumeric(x) && (x==2))); + obj=obj.parseconstructorcommon(id, varargin); + obj.modelbus=obj.cparser.Results.modelbus; + obj.node=obj.cparser.Results.node; + switch(obj.node) + case 2 + obj.workspacedatabasestructure='SCDsimdata.SCDnode02simdata.adc'; + otherwise + obj.workspacedatabasestructure=''; + end + obj.classname=mfilename; + end + + function init(obj, shot) + mdsconnect(obj.mdsserver); + mdsopen(obj.mdstree, shot); + + switch(obj.node) + case 2 + obj.actualizeNode02(shot); + end + end + + function [obj, value] = getdata(obj,shot) + %obj=obj.actualizegetcmd('mdsvalue(''%s'')', shot); + %value=eval(obj.getcommand); + + switch(obj.node) + case 2 + [~,value]=obj.getdataNode02ACQ196(shot); %% Here we need to switch betweeen old and new acquisition unit and tcv standard also + end + end + + function printinfo(obj) + obj.printinfocommon; + fprintf(' Init model bus: %s, node: %d, ws base struct: %s\n',obj.modelbus, obj.node, obj.workspacedatabasestructure); + end + + end + + methods(Access = private) + + function obj = actualizeNode02(obj, shot) + dd=SCDconf_getdatadict(obj.datadictionary); + adcbus=dd.getEntry(obj.modelbus).getValue; + [~,data]=obj.getdata(shot); + T=timeseries; + if obj.verbose==1 + fprintf('Actualizing data for bus: ''%s'' (%s, shot %d) ', obj.modelbus, obj.classname, shot); + end + for ii=1:192 + T.Time=data.Time; + T.Data=int16(data.Data(:,ii)); + assignin('base','temp',T); + assigncmd=sprintf('%s.%s=temp;',obj.workspacedatabasestructure, adcbus.Elements(ii).Name); + evalin('base',assigncmd); + if obj.verbose==1 + fprintf('.'); + end + end + evalin('base','clear temp'); + if obj.verbose==1 + fprintf('\n'); + end + end + + function [obj, value] = getdataNode02ACQ196(obj, shot) + T=timeseries; + timebase=mdsvalue('dim_of(\top.crpprt02.board1.adc_01)'); %% TODO: check with marte + d_time = double(mdsvalueraw( '\top.crpprt02.params:d_time' ))*1.0e-6; + %timebase = round(timebase.*1/d_time)*d_time-d_time/2; + timebase = round(timebase.*1/d_time)*d_time-d_time/100; + T.Time=timebase; + T.Data=zeros(numel(timebase),192); + if obj.verbose==1 + fprintf('Getting data for bus: ''%s'' (%s, shot %d) ', obj.modelbus, obj.classname, shot); + end + for ii=1:96 + % NOTE: physical2logical remapping is only for + % data acquired with the present ACQ196 system + % it must go away when using the new ACQ2106 system + %fprintf('Loading channel %d:%d ...\r',1,physical2logical(ii)); + + channelstr=sprintf('\\top.crpprt02.board1.adc_%02d.raw',physical2logical(ii)); + T.Data(:,ii)=int16(mdsvalue(channelstr)); + if obj.verbose==1 + fprintf('.'); + end + end + for ii=1:96 + %fprintf('Loading channel %d:%d ...\r',2,physical2logical(ii)); + channelstr=sprintf('\\top.crpprt02.board2.adc_%02d.raw',physical2logical(ii)); + T.Data(:,ii+96)=int16(mdsvalue(channelstr)); + if obj.verbose==1 + fprintf('.'); + end + end + value=T; + if obj.verbose==1 + fprintf('\n'); + end + end + + end +end +