#ifndef SKELETON_H_
#define SKELETON_H

#define BUFFER_LEN 500

void process_ping_SWI(void);
void process_pong_SWI(void);

void EDMA_interrupt_service(void);
//void SWI_enable(void);

// functions declarations
void config_EDMA(void);
void config_interrupts(void);

/* Puffer im Cache*/
#pragma DATA_SECTION(Buffer_in_ping, ".datenpuffer");
short Buffer_in_ping[BUFFER_LEN];
#pragma DATA_SECTION(Buffer_in_pong, ".datenpuffer");
short Buffer_in_pong[BUFFER_LEN];
#pragma DATA_SECTION(Buffer_out_ping, ".datenpuffer");
short Buffer_out_ping[BUFFER_LEN];
#pragma DATA_SECTION(Buffer_out_pong, ".datenpuffer");
short Buffer_out_pong[BUFFER_LEN];


//Konfig Struktur McBSP1
static MCBSP_Config datainterface_config = {
		/* McBSP Control Register */
        MCBSP_FMKS(SPCR, FREE, NO)              |	// Während dem Stoppen der Emulation stoppt auch die Clock des McBSPs
        MCBSP_FMKS(SPCR, SOFT, YES)          	|	// Beim Stoppen der Emulation (des Debuggens) wird die Übertragung sofort abgebrochen
        MCBSP_FMKS(SPCR, FRST, YES)             |	// Framesync ist ein (not generated by the sample rate generator)
        MCBSP_FMKS(SPCR, GRST, YES)             |	// Reset aus, damit läuft der Samplerate- Generator
        MCBSP_FMKS(SPCR, XINTM, XRDY)           |	// XINT (Interrupt der der CPU meldet, das eine Übertragung abgeschlossen ist), wird durch das Bit XRDY ausgelöst
        MCBSP_FMKS(SPCR, XSYNCERR, NO)          |	// empfängerseitig keine Überwachung der Synchronisation
        MCBSP_FMKS(SPCR, XRST, YES)             |	// Sender läuft (kein Reset- Status)	
        MCBSP_FMKS(SPCR, DLB, OFF)              |	// Loopback (Kurzschluss) nicht aktiv
        MCBSP_FMKS(SPCR, RJUST, RZF)            |	// rechtsbündige Ausrichtung der Daten im Puffer (mit Nullen aufgefüllt)
        MCBSP_FMKS(SPCR, CLKSTP, DISABLE)       |	// Clock startet ohne Verzögerung auf fallenden Flanke (siehe auch PCR-Register)
        MCBSP_FMKS(SPCR, DXENA, OFF)            |	// DX- Enabler wird nicht verwendet
        MCBSP_FMKS(SPCR, RINTM, RRDY)           |	// Sender Interrupt wird durch "RRDY-Bit" ausgelöst
        MCBSP_FMKS(SPCR, RSYNCERR, NO)          |	// senderseitig keine Überwachung der Synchronisation
        MCBSP_FMKS(SPCR, RRST, YES), 			// Empfänger läuft (kein Reset- Status)
		/* Empfangs-Control Register */
        MCBSP_FMKS(RCR, RPHASE, SINGLE)         |	// Nur eine Phase pro Frame
        MCBSP_FMKS(RCR, RFRLEN2, DEFAULT)       |	// Länge in Phase 2, unrelevant
        MCBSP_FMKS(RCR, RWDLEN2, DEFAULT)       |	// Wortlänge in Phase 2, unrelevant
        MCBSP_FMKS(RCR, RCOMPAND, MSB)          |	// kein Compandierung der Daten (MSB first)
        MCBSP_FMKS(RCR, RFIG, NO)               |	// Rahmensynchronisationspulse (nach dem ersten Puls)) startet die Übertragung neu
        MCBSP_FMKS(RCR, RDATDLY, 0BIT)          |	// keine Verzögerung (delay) der Daten
        MCBSP_FMKS(RCR, RFRLEN1, OF(1))         |	// Länge der Phase 1 --> 2 Wörter pro Frame
        MCBSP_FMKS(RCR, RWDLEN1, 16BIT)         |	// Länge DAtenwort: 16 bit
        MCBSP_FMKS(RCR, RWDREVRS, DISABLE),		// 32-bit Reversal nicht genutzt
		/* Sende-Control Register */
        MCBSP_FMKS(XCR, XPHASE, SINGLE)         |	//
        MCBSP_FMKS(XCR, XFRLEN2, DEFAULT)       |	// Länge in Phase 2, unrelevant
        MCBSP_FMKS(XCR, XWDLEN2, DEFAULT)       |	// Wortlänge in Phase 2, unrelevant
        MCBSP_FMKS(XCR, XCOMPAND, MSB)          |	// kein Compandierung der Daten (MSB first)
        MCBSP_FMKS(XCR, XFIG, NO)               |	// Rahmensynchronisationspulse (nach dem ersten Puls)) startet die Übertragung neu
        MCBSP_FMKS(XCR, XDATDLY, 0BIT)          |	// keine Verzögerung (delay) der Daten
        MCBSP_FMKS(XCR, XFRLEN1, OF(1))         |	// Länge der Phase 1 --> 1 Wort
        MCBSP_FMKS(XCR, XWDLEN1, 16BIT)         |	// Wortlänge in Phase 1 --> 16 bit
        MCBSP_FMKS(XCR, XWDREVRS, DISABLE),		// 32-bit Reversal nicht genutzt
		/* Sample Rate Generator Register */
        MCBSP_FMKS(SRGR, GSYNC, DEFAULT)        |	// Einstellungen nicht relevant da
        MCBSP_FMKS(SRGR, CLKSP, DEFAULT)        |	// der McBSP1 als Slave läuft
        MCBSP_FMKS(SRGR, CLKSM, DEFAULT)        |	// und den Takt von aussen 
        MCBSP_FMKS(SRGR, FSGM, FSG)         	|	// vorgegeben bekommt.
        MCBSP_FMKS(SRGR, FPER, DEFAULT)         |	// --
        MCBSP_FMKS(SRGR, FWID, DEFAULT)         |	// --
        MCBSP_FMKS(SRGR, CLKGDV, DEFAULT),		// --
		/* Mehrkanal */
        MCBSP_MCR_DEFAULT,				// Mehrkanal wird nicht verwendet
        MCBSP_RCER_DEFAULT,				// dito
        MCBSP_XCER_DEFAULT,				// dito
		/* Pinout Control Register */
        MCBSP_FMKS(PCR, XIOEN, SP)              |	// Pin wird für serielle Schnittstelle verwendet (alternativ GPIO)
        MCBSP_FMKS(PCR, RIOEN, SP)              |	// Pin wird für serielle Schnittstelle verwendet (alternativ GPIO)
        MCBSP_FMKS(PCR, FSXM, EXTERNAL)         |	// Framesync- Signal für Sender kommt von extern (Slave)
        MCBSP_FMKS(PCR, FSRM, EXTERNAL)         |	// Framesync- Signal für Empfänger kommt von extern (Slave)
        MCBSP_FMKS(PCR, CLKXM, INPUT)           |	// Takt für Sender kommt von extern (Slave)
        MCBSP_FMKS(PCR, CLKRM, INPUT)           |	// Takt für Empfänger kommt von extern (Slave)
        MCBSP_FMKS(PCR, CLKSSTAT, DEFAULT)      |	// unrelevant da PINS keine GPIOs
        MCBSP_FMKS(PCR, DXSTAT, DEFAULT)        |	// unrelevant da PINS keine GPIOs
        MCBSP_FMKS(PCR, FSXP, ACTIVEHIGH)       |	// Framesync senderseitig ist "activehigh"
        MCBSP_FMKS(PCR, FSRP, ACTIVEHIGH)       |	// Framesync empfängerseitig ist "activehigh"
        MCBSP_FMKS(PCR, CLKXP, FALLING)         |	// Datum wird bei fallender Flanke gesendet
        MCBSP_FMKS(PCR, CLKRP, RISING)			// Datum wird bei steigender Flanke übernommen
};

/* Basiskonfiguration Empfangsseite EDMA */
EDMA_Config configEDMARcv = {
    EDMA_FMKS(OPT, PRI, LOW)          |  // auf beide Queues verteilen
    EDMA_FMKS(OPT, ESIZE, 16BIT)       |  // Element size
    EDMA_FMKS(OPT, 2DS, NO)            |  // kein 2D-Transfer
    EDMA_FMKS(OPT, SUM, NONE)          |  // Quell-update mode -> FEST (McBSP)!!!
    EDMA_FMKS(OPT, 2DD, NO)            |  // 2kein 2D-Transfer
    EDMA_FMKS(OPT, DUM, IDX)           |  // Ziel-update mode
    EDMA_FMKS(OPT, TCINT,YES)         |  // EDMA interrupt erzeugen?
    EDMA_FMKS(OPT, TCC, OF(0))         |  // Transfer complete code (TCC)
    EDMA_FMKS(OPT, LINK, YES)          |  // Link Parameter nutzen?
    EDMA_FMKS(OPT, FS, NO),               // Frame Sync nutzen?

    EDMA_FMKS(SRC, SRC, OF(0)),           // Quell-Adresse

    EDMA_FMK (CNT, FRMCNT, NULL)       |  // Anzahl Frames
    EDMA_FMK (CNT, ELECNT, 2),   // Anzahl Elemente

    EDMA_FMKS(DST, DST, OF(0)),       	// Ziel-Adresse


    EDMA_FMKS(IDX, FRMIDX, OF(-BUFFER_LEN*2+2))    |  // Frame index Wert
    EDMA_FMKS(IDX, ELEIDX, OF(BUFFER_LEN*2)),      // Element index Wert

    EDMA_FMK (RLD, ELERLD, 2)       |  // Reload Element
    EDMA_FMK (RLD, LINK, NULL)            // Reload Link
};
EDMA_Config configEDMAXmt = {
	// opt Options
	EDMA_FMKS(OPT, PRI, HIGH) | 		// auf beide Queues verteilen, z.B. low für lesen, high für schreiben
	EDMA_FMKS(OPT, ESIZE, 16BIT) |  	// Element size
	EDMA_FMKS(OPT, 2DS, NO) |  			// kein 2D-Transfer - No --> 1D!
	EDMA_FMKS(OPT, SUM, IDX) | 			// Quell-update mode -> FEST (McBSP)!!!
	EDMA_FMKS(OPT, 2DD, NO) |  			// 2kein 2D-Transfer
	EDMA_FMKS(OPT, DUM, NONE) | 		// Ziel-update mode - increase um jeweils 2 Byte, da 16bit Elemente
	EDMA_FMKS(OPT, TCINT, YES) |  		// EDMA interrupt erzeugen? Ja
	EDMA_FMKS(OPT, TCC, OF(0)) | 		// Transfer complete code (TCC) --> wird zur Laufzeit zugewiesen!
	EDMA_FMKS(OPT, LINK, YES) |  		// Link Parameter nutzen?
	EDMA_FMKS(OPT, FS, NO),             // Frame Sync nutzen?
	// src Source address
	EDMA_FMKS(SRC, SRC, OF(0)), 		// Quell-Adresse - der ser. Schnittstelle, später zur Laufzeit wird diese gesetzt --> modularer
	// cnt Transfer count
	EDMA_FMK(CNT, FRMCNT, NULL) |  		// Anzahl Frames
	EDMA_FMK(CNT, ELECNT, 2), 	// Anzahl Elemente - Transfer count parameter
	// dst Destination address
	EDMA_FMKS(DST, DST, OF(0)), 		// Ziel-Adresse - Destination address parameter - wird zur Laufzeit gesetzt
	// idx Index
	EDMA_FMKS(IDX, FRMIDX, OF(-BUFFER_LEN*2+2)) |  	// Frame index Wert
	EDMA_FMKS(IDX, ELEIDX, OF(BUFFER_LEN*2)),    // Element index Wert
	// rld Element count reload and link address
	EDMA_FMK(RLD, ELERLD, 2) |  		// Reload Element
	EDMA_FMK(RLD, LINK, NULL) 				// Reload Link - hier muss noch etwas konfiguriert werden
};


/* Transfer-Complete-Codes der EDMA-Jobs */
int tccRcvPing;
int tccRcvPong;
int tccXmtPing;
int tccXmtPong;

/* verschiedene Handles */
// handle for data transfer
MCBSP_Handle hMcbsp;

EDMA_Handle hEdmaRcv;  /* handle auf EDMA REVT1-Channel */
EDMA_Handle hEdmaRcvPing; /* handle auf einen reload-Parametersatz */
EDMA_Handle hEdmaRcvPong;

EDMA_Handle hEdmaXmt;  /* handle auf EDMA XEVT1-Channel */
EDMA_Handle hEdmaXmtPing;
EDMA_Handle hEdmaXmtPong;

	
#endif /*SKELETON_H*/
