//-------------------------------------------------------------------
uint8_t I2C_ReadByte ( uint8_t SlaveAddr, uint8_t RegAddr )
{
#if 0
	return sccb_read(SlaveAddr, RegAddr);
#else
	uint8_t Data = 0;
	I2CSendAddr(SlaveAddr,WRITE);
	I2CSendByte(RegAddr);
	I2CSendAddr (SlaveAddr,READ);
	I2CGetByte(LAST_BYTE, &Data);
	I2CSendStop();
	
	return Data;
#endif
}
//------------------------------------------------------------------------------
// Function Name:  I2C_ReadSegmentBlockEDID
// Function Description: Reads segment block of EDID from HDMI Downstream Device
//------------------------------------------------------------------------------
uint8_t I2C_ReadSegmentBlockEDID (uint8_t SlaveAddr, uint8_t Segment, uint8_t Offset, uint8_t *Buffer, uint8_t Length)
{
	uint8_t i, bState;
	TX_DEBUG_PRINT(("I2C_ReadSegmentBlockEDID%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n"));

	bState = I2CSendAddr(0x60, WRITE);
       if(bState){
       	I2CSendStop();
        	return IIC_NOACK;
     	}
	   
	bState = I2CSendByte(Segment);
       if(bState){
       	I2CSendStop();
        	return IIC_NOACK;
     	}
	
       bState = I2CSendAddr(SlaveAddr,WRITE);
       if(bState){
       	I2CSendStop();
        	return IIC_NOACK;
     	}

	bState = I2CSendByte(Offset);
  	if(bState){
    		I2CSendStop();
     		return IIC_NOACK;
	}

	bState = I2CSendAddr (SlaveAddr,READ);
       if(bState){
		I2CSendStop();
      		return IIC_NOACK;
	}

    	for (i = 0; i < Length - 1; i++)
   		if (I2CGetByte(NOT_LAST_BYTE, &Buffer[i]))
			return IIC_SCL_TIMEOUT;

        if (I2CGetByte(LAST_BYTE, &Buffer[i]))
		return IIC_SCL_TIMEOUT;
		
        I2CSendStop();
     
        return IIC_OK;
}
//-------------------------------------------------------------------
void I2C_WriteByte  ( uint8_t SlaveAddr, uint8_t RegAddr, uint8_t Data )
{
#if 0
sccb_write(SlaveAddr, RegAddr, Data);

#else

        I2CSendAddr(SlaveAddr,WRITE);
        I2CSendByte(RegAddr);
        I2CSendByte(Data);
        I2CSendStop();
#endif
}
//------------------------------------------------------------------------------
// Function Name: I2C_ReadBlock
// Function Description: Reads block of data from I2C Device
//------------------------------------------------------------------------------
uint8_t I2C_ReadBlock(uint8_t SlaveAddr, uint8_t RegAddr,uint8_t *Data, uint8_t NBytes)
{
	uint8_t i, bState;

       bState = I2CSendAddr(SlaveAddr,WRITE);
       if(bState){
       	I2CSendStop();
        	return IIC_NOACK;
     	}
	
	bState = I2CSendByte(RegAddr);
  	if(bState){
    		I2CSendStop();
     		return IIC_NOACK;
	}

	bState = I2CSendAddr (SlaveAddr,READ);
       if(bState){
		I2CSendStop();
      		return IIC_NOACK;
	}

    	for (i = 0; i < NBytes - 1; i++)
    	{
   		    if (I2CGetByte(NOT_LAST_BYTE, &Data[i])){
			    I2CSendStop();
			    return IIC_SCL_TIMEOUT;
   		    }
    	}
        if (I2CGetByte(LAST_BYTE, &Data[i])){
		    I2CSendStop();
		    return IIC_SCL_TIMEOUT;
       	}
        I2CSendStop();
     
        return IIC_OK;
}
//------------------------------------------------------------------------------
// Function Name:  I2C_WriteBlock
// Function Description: Writes block of data from I2C Device
//------------------------------------------------------------------------------
uint8_t I2C_WriteBlock( uint8_t SlaveAddr, uint8_t RegAddr, uint8_t NBytes, uint8_t * Data )
{
	uint8_t i, bState;

	bState = I2CSendAddr (SlaveAddr,WRITE);
 	if( bState ){
		I2CSendStop();
		return IIC_NOACK;
	}
	
	bState = I2CSendByte(RegAddr);
	if(bState){
		I2CSendStop();
		return IIC_NOACK;
	}

	for (i=0; i<NBytes; i++)
		I2CSendByte(Data[i]);

	I2CSendStop();
	
	return IIC_OK;

}
/*
 * workAS()
 * Schnittstelle nur fuer das Modul Betriebsmittelverwaltung. Die
 * Schnittstelle dient dem Auslesen von maximal vier Meldungen der Module aus
 * dem Ringpuffer und deren Versendung ueber den I2C-Bus.
 * Fuer diese Uebertragung werden werden maximal 29 Bytes + Start- und
 * Stoppbits versendet.
 * 
 * Nach Aufruf dieser Schnittstelle wird ueberprueft, ob der Ringpuffer leer
 * ist. Wenn dem so ist, muessen keine Daten untersucht werden und der Vorgang
 * wird beendet.
 * Andernfalls wird ueberprueft, ob der Lesezeiger AS_read_next_msg auf einen
 * gueltigen Index zeigt. Ggf. wird dieser durch Nullsetzen korrigiert.
 * Dadurch soll sichergestellt werden, dass im Folgenden nicht wahllose Werte
 * aus dem Speicher gelesen werden.
 * Es wird eine Wartepause von 1,568 ms eingelegt.
 * Dann wird versucht die I2C-Bus-Verbindung zum AD herzustellen. Dazu wird die
 * Funktion I2CSendAddr(addr, rd) mit den Parametern (8, WRITE) benutzt.
 * Schlaegt die Verbindung fehl, wird der Vorgang beendet.
 * Danach wird versucht maximal vier Meldungen zu versenden. Dazu werden
 * jeweils die naechsten 7 Daten aus dem Ringpuffer an der Stelle des
 * Lesezeigers AS_read_next_msg gelesen und mit Hilfe der Funktion
 * I2CSendByte(bt) wird sucht, sie zu versenden. Schlaegt die Verbindung fehl,
 * wird erst versucht die Verbindung zu beenden und danach wird der Vorgang
 * beendet.
 * Ist der Vorgang des Daten aus dem Ringpuffers versenden abgeschlossen, wird
 * versucht die Verbindung zu beenden. Dazu wird die Funktion I2CSendStop()
 * benutzt.
 * 
 * Rueckgabe: Keine
 * 
 * Autor: Felix Blueml
 */
void workAS()
{
	// Maximale Anzahl Mitteilungen, die versendet werden.
	// byte maxSendMsg_workAS; // ist globale Variable

	// Zaehler fuer die beiden for-Schleifen, fuer die Versendung von
	// Mitteilungen.
	// byte i_workAS, j_workAS; // sind globale Variablen


	// Keine Elemente im Puffer zum versenden?
	if(!AS_msg_counter)
	{
		// Abbruch!
		return;
	}
	
	// Enthaellt AS_read_next_msg einen falschen Wert?
	if(AS_read_next_msg >= MAX_MELDUNGEN)
	{
		// Sicherstellen, dass nicht wahllos irgendwelche Werte aus
		// dem Speicher gelesen werden
		AS_read_next_msg = 0;
	}
	
	warten(); // eine Wartepause einlegen


	// Versuche eine schreibende Verbindung zum Arduino mit der
	// Adresse 4 herzustellen

	_i2c_error = 255; // Status: Kein Fehler

	I2CSendAddr(8, WRITE);

	if(_i2c_error != 255) // Fehler erkannt?
	{
		// Abbruch!
		return;
	}


	// Lese maximal 4 Mitteilungen aus dem Ringpuffer und versende sie
	if(AS_msg_counter<4)
	{
		maxSendMsg_workAS = AS_msg_counter;
	}
	else
	{
		maxSendMsg_workAS = 4;
	}

	for(i_workAS=0; i_workAS<maxSendMsg_workAS; i_workAS++)
	{
		for(j_workAS=0; j_workAS<7; j_workAS++)
		{
			// Versuche ein Byte aus dem Ringpuffer an den Arduino
			// zu versenden

			_i2c_error = 255; // Status: Kein Fehler

			I2CSendByte(AS_msg_array[AS_read_next_msg][j_workAS]);
			
			if(_i2c_error != 255) // Fehler erkannt?
			{
				// Versuche die Verbindung zu beenden
				I2CSendStop();

				// Abbruch!
				return;
			}
		}
		

		// Eine komplette Statusmeldung wurde versendet,
		// Lesezeiger auf die naechste zu sendende Meldung setzen
		AS_read_next_msg = (AS_read_next_msg+1) % MAX_MELDUNGEN;

		// Fuellstand um 1 verringern
		AS_msg_counter--;
	}

	// Versuche die Verbindung zu beenden
	I2CSendStop();
}