/*
 * UsiTwiSlave.h
 *
 * Created: 07.07.2012
 *  Author: Ulli
 */ 


#ifndef USITWISLAVE_H
#define USITWISLAVE_H

#include <inttypes.h>

// Die folgenden Definitionen werden in 'UsiTwiSlave.cfg.h' benötigt und müssen deshalb vor dem #include stehen!
// -------------------------------------------------------------------------------------------------------------
// Ausprägungen für TWI_RECEIVE_MODE
#define TWI_AUTO      -2  // Eingehende Bytes werden an der vorgesehenen Stelle abgelegt.
#define TWI_FLAG      -3  // Eingehende Bytes werden an der vorgesehenen Stelle abgelegt. Zusätzlich wird die Variable 'TwiDataReceivedFlag' deklariert.
                          // Diese wird auf 'true' gesetzt, wenn ein Byte empfangen wurde. Die Applikation kann diese Variable bei Bedarf löschen.
#define TWI_CALLBACK  -4  // Die von der Applikation zu implementierende CallBack-Funktion 'void TwiDataReceived(uint8_t data)' wird aufgerufen.
#define TWI_CB_INLINE -5  // Die CallBack-Funktion wird als 'ALWAYS_INLINE void TwiDataReceived(uint8_t data)' in UsiSlave.cfg.h bereit gestellt.

// Ausprügungen für die Art der Funktions-Einbindung
#define INLINE   -7       // Einbindung als ALWAYS_INLINE und Angabe in UsiSlave.cf.h
#define STANDARD -8       // Standard-Funktion

#define TWI_MODE_STANDARD -11 // Keine Automatismen
#define TWI_MODE_SIMPLE   -12 // Ein-Byte-IO
#define TWI_MODE_REGISTER -13 // Register-IO

  typedef enum { TwiRead  = 0,    // Der Master will Daten von diesem Slave empfangen
	  TwiWrite = 1,    // Der Master sendet Daten an diesen Slave
	  #if (TWI_ACCEPT_BROADCAST_MSG)
	  BroadcastRead  = 2, // Der Master will Daten von allen Slaves empfangen
	  BroadcastWrite = 3, // Der Master sendet Daten an alle Slaves
	  #endif // ACCEPT_BROADCAST_MSG
  } TwiTransferType;


#include "UsiTwiSlave.cfg.h"


/*************************************************************************
Function: TwiTransmissionStart()
		  Signalisiert, dass ein neuer Übertragungszyklus begonnen hat.
		  Diese Funktion wird aufgerufen, wenn die Startkonfiguration erkannt wurde.

		  Wichtig: Die Funktion muss schnell zurückkehren!
**************************************************************************/

#if (TWI_TRANSMISSION_START_MSG)
  #if (TWI_TRANSMISSION_START_MSG == INLINE)
    ALWAYS_INLINE  void TwiTransmissionStart (TwiTransferType rw); // Die Funktion wird in UsiSlave.cfg.h bereit gestellt.
  #else
    void TwiTransmissionStart (TwiTransferType rw);                // Die Applikation stellt die Funktion bereit.
  #endif
#endif

#if (TWI_RECEIVE_MODE == TWI_CB_INLINE)
  #undef TWI_RECEIVE_MODE
  #define TWI_RECEIVE_MODE TWI_CALLBACK
  #define CALLBACK_TYPE ALWAYS_INLINE
#endif


#if (TWI_RECEIVE_MODE == TWI_CALLBACK)  // Callback-Funktion 'TwiDataReceived' deklarieren
  #if (TWI_OPERATION_MODE == TWI_MODE_REGISTER)
    CALLBACK_TYPE void TwiDataReceived(uint8_t index, uint8_t data);
  #else
    CALLBACK_TYPE void TwiDataReceived(uint8_t data);
  #endif
#endif // TWI_RECEIVE == TWI_CALLBACK

#if (TWI_RECEIVE_MODE == TWI_FLAG) // TwiDataReceivedFlag deklarieren
  extern volatile uint8_t TwiDataReceivedFlag;
#endif // TWI_RECEIVE == TWI_FLAG


// --- Betriebs-Modus -----------------------------------------------------------------------------------------------------------------------------------
// --- Modus TWI_MODE_STANDARD --------------------------------------------------------------------------------------------------------------------------
#if (TWI_OPERATION_MODE == TWI_MODE_STANDARD)
  #if (TWI_DATA_REQUEST_MODE == INLINE)
    ALWAYS_INLINE uint8_t TwiDataRequest  (void);    // Die Funktion wird in UsiSlave.cfg.h bereit gestellt.
  #else
    uint8_t TwiDataRequest  (void);                  // Die Applikation stellt die Funktion' bereit.
  #endif
#endif // TWI_OPERATION_MODE == TWI_MODE_STANDARD

// --- Modus TWI_MODE_SIMPLE ----------------------------------------------------------------------------------------------------------------------------
#if (TWI_OPERATION_MODE == TWI_MODE_SIMPLE)
  extern volatile uint8_t TwiData;                 // Daten werden über Variable 'TwiData' ausgetauscht.
#endif // TWI_OPERATION_MODE == TWI_MODE_SIMPLE

// --- Modus TWI_MODE_REGISTER --------------------------------------------------------------------------------------------------------------------------
#if (TWI_OPERATION_MODE == TWI_MODE_REGISTER)
  extern volatile I2CRegister_t I2CRegister;       // Daten werden über Variable 'I2CRegister' ausgetauscht.
#endif // TWI_OPERATION_MODE == TWI_MODE_REGISTER


// --- Adress-Modus ------------------------------------------------------------------------------------------------------------------------------------
// --- Adress-Modus FIXED ------------------------------------------------------------------------------------------------------------------------------

#if (TWI_FIXED_TWI_ADDRESS != NONE) // Fest vorgegebene Bus-Adresse
   void TwiInitialize (void); 

// --- Adress-Modus VARIABLE ---------------------------------------------------------------------------------------------------------------------------

#else   // Variable Bus-Adresse
  void TwiInitialize (uint8_t TwiAddress);
  void TwiSetAddress (uint8_t TwiAddress);
#endif //FIXED_TWI_ADDRESS

#endif //USITWISLAVE_H
