classdef MyArduino < handle
  
  properties
    serPort  = [];
    status   = 'closed';
    comPort  = '';
    baudRate = 115200;
  end   % properties
  
  methods ( Static )
    function instrfind()
      instrSer = instrfind( 'Type', 'serial' );
      if( isempty( instrSer ) )
        fprintf( 'Kein Gerät an einem Port angemeldet. \n' ); 
      else
        instrSer
      end
    end
  end   % methods (Static)
  
  methods
    
    function obj = MyArduino( com_Port )
      obj.comPort = com_Port;
    end
    
    % Schnittstelle erzeugen
    function createSerial( obj )
      % seriellen Port erzeugen 
      obj.serPort = serial( obj.comPort, 'BaudRate', obj.baudRate );
      obj.instrfind() 
      setStatus( obj );
      fprintf( 'Port wurde erzeugt.\n' );
    end
    
    function openPort( obj )
      try 
        fopen( obj.serPort );
      catch exc
        fprintf( 'Port konnte nicht geöffnet werden: \n' );
        fprintf( '%s \n', exc.message );
        return;
      end
      obj.instrfind() 
      setStatus( obj );
      fprintf( 'Port wurde geöffnet.\n' );
    end
   
    function closePort( obj )
      if( isOpen( obj ) )
        fclose( obj.serPort );
        % obj.instrfind(); 
        setStatus( obj );
        fprintf( 'Port wurde geschlossen.\n' );
      end
    end
    
    function delete( obj )
      if( ~isSerPort( obj ) ) return; end;
      closePort( obj );
      delete( obj.serPort );
      obj.serPort = [];
      setStatus( obj );
      fprintf( 'Port wurde entfernt.\n' );     
    end
    
    % Schreib- und Leseroutinen 
    
    
    
  end   % methods
    
  
    methods ( Access = private )
  
    function res = isSerPort( obj )
      if( ~isempty( obj.serPort ) && ... 
          isa( obj.serPort, 'serial' ) && isvalid( obj.serPort )  )
        res = 1;
      else
        res = 0;
      end   
    end
   
    function res = isOpen( obj )
      % Check case-insensitive
      if( strcmpi( getStatus( obj ), 'open') )
        res = 1;
      else
        res = 0;
      end   
    end
    
    function res = getStatus( obj )
      if( isSerPort( obj ) ) 
        res = obj.serPort.Status;
      else
        res = '';
      end
    end
    
    function setStatus( obj )
      if( isSerPort( obj ) ) 
        obj.status = obj.serPort.Status;
      else
        obj.status = 'closed';
      end
    end     
    
  end   % methods (private)
  
end
