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.parseconstructor(srctdimodel, destparam, varargin);
            % Constructor parser customization results here
            obj.classname=class(obj);            
            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)
            printinfo@SCDclass_mdspar(obj);
        end
         
        function entrystring = genMARTe2entry(obj, shot)
            entrystring=obj.genMARTe2entrycommon(shot);
            entrystring=[entrystring ' }'];
        end

        function out = casttomds(obj, in)
            out = in;
        end
    end
end