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 
	
    % Überprüfen des Sketch-Typs, Befehl 99 
    %   Rückgabe: 1 OK, 0 nicht OK 
    function val = checkSketchType( obj )
      fwrite( obj.serPort, [48+9 48+9], 'uchar' );
      sketchType = fscanf( obj.serPort, '%d' );
      if( sketchType == 2 )
        val = 1;
      else
        val = 0;
      end
    end
	
    % Digital-Pin als Input oder Output setzen, Befehl 48
    %  val: input = 0, output = 1
    function pinMode( obj, pin, val )
      fwrite( obj.serPort, [48 97+pin 48+val], 'uchar' );	
    end
	
    % Belegen des Digital-Pins mit dem Wert, Befehl 50
    %   z.B. dv = 1; zum Einschalten 
    function digitalWrite( obj, pin, dv )
      fwrite( obj.serPort, [50 97+pin 48+dv], 'uchar' );
    end	
	
    % Einlesen der Daten von einem Digital-Pin, Befehl 49
    %   Rückgabe val
    function val = digitalRead( obj, pin ) 
      fwrite( obj.serPort, [49 97+pin], 'uchar' );  
      val = fscanf( obj.serPort, '%d '); 
    end	
	
    % Einlesen der Daten von einem Analog-Pin, Befehl 51    
    %   Rückgabe val
    function val = analogRead( obj, pin ) 
      fwrite( obj.serPort, [51 97+pin], 'uchar' );   
      % Board sendet auf Befehl 51 Daten an MATLAB zurück
      val = fscanf( obj.serPort, '%d ');
    end	
	    
  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
