/*****************************************************************************/
/*** Includes                                                              ***/
/*****************************************************************************/
#include <stdlib.h>
#include <iolib.h>
#include <ioctl.h>
#include <ioslib.h>
#include <vxWorks.h>
#include <stdio.h>
#include <math.h>
#include <sysLib.h>

#include "me1400.h"

/*****************************************************************************/
/*** Defines                                                               ***/
/*****************************************************************************/
#define PORT_A_A_LS0 0x01 /* Lichtschranke (C0 an Port A_A) */
#define PORT_A_A_LS1 0x02 /* Lichtschranke (C1 an Port A_A) */

#define PORT_A_B_MAGNET 0x02    /* Elektromagnet (an Port A_B) */
#define PORT_A_B_CNT_GATE0 0x04 /* Gate 0 (an Port A_B) */
#define PORT_A_B_CNT_GATE1 0x08 /* Gate 1 (an Port A_B) */

/*****************************************************************************/
/*** Prototypes                                                            ***/
/*****************************************************************************/
extern STATUS portSchreiben(UINT16, UINT8);
extern STATUS portLesen(UINT16, UINT8*);
extern STATUS timerLaden(UINT16);
extern STATUS timerLesen(UINT16*);
extern STATUS me1400();
extern STATUS me1400dio();
extern STATUS me1400timer();
extern STATUS stopDevice();
extern STATUS taskDelay(int);

/*****************************************************************************/
/*** Functions                                                             ***/
/*****************************************************************************/
STATUS me1400_init (void) {
	STATUS retValue = 0;
	
	printf ("Setting up ME1400...\n");
		
	retValue = me1400();
	if (0 != retValue) {
		printf ("Error during me1400(): %d!\n", retValue);
		return retValue;
	}
	
	retValue = me1400dio();
	if (0 != retValue) {
		printf ("Error during me1400dio(): %d!\n", retValue);
		return retValue;
	}
	
	retValue = me1400timer();
	if (0 != retValue) {
		printf ("Error during me1400timer(): %d!\n", retValue);
		return retValue;
	}
		
	return retValue;
}

/* user_isr() wird ausgefuehrt, sobald der Zaehler den Wert Null erreicht.
 * Dies kann dazu verwendet werden, den Elektromagneten abzuschalten. */
VOID user_isr()
{
	/* TODO: Code einfuegen */
}

int main()
{
	STATUS ret;		/* wird als Rueckgabewert der ME1400-Funktionen benutzt */
	UINT16 wertTimer;
	UINT8 byte;

	sysClkRateSet(60);

	/* ME1400 initialisieren */
	if (0 != (ret = me1400_init())) {
		printf ("Error initializing ME1400: %d. Exiting...\n", ret);
		goto lerror;
	}

	/* ------------------------------
	 * Die folgenden Aufrufe zeigen, wie die Funktionen timerLaden(),
	 * timerLesen(), portSchreiben() und portLesen() generell verwendet
	 * werden. Im richtigen Programm muessen diese Funktionen natuerlich
	 * in anderer Form angeordnet werden. Bitte beachten Sie die Pruefung
	 * auf Fehler.
	 */

	/* Setzt den Timer auf den Wert wertTimer.
	 * Der Zaehler laeuft dann rueckwaerts ab diesem Wert.
	 */
	if (0 != (ret = timerLaden(wertTimer))) {
		printf ("Error loading timer: %d\n", ret);
	}

	/* Ermittelt den aktuellen Zaehlerstand des Timers.
	 * Der Wert wird in die Variable wertTimer geschrieben.
	 */
	if (0 != (ret = timerLesen(&wertTimer))) {
		printf ("Error readinig timer: %d\n", ret);
	}

	/* Setzt den Wert eines Ports, hier PORT_A_B. Der Wert von byte sollte eine
	 * bitweise Kombination der oben definierten PORT_A_B_*-Werte sein.
	 */
	if (0 != (ret = portSchreiben(ME1400_PORT_A_B, byte))) {
		printf ("Error writing PORT_A_B: %d\n", ret);
	}

	/* Liest den aktuellen Zustand eines Ports, hier PORT_A_A.
	 * Der Wert wird in die Variable byte geschrieben.
	 */
	if (0 != (ret =	portLesen(ME1400_PORT_A_A, &byte))) {
		printf ("Error reading PORT_A_A: %d\n", ret);
	}

	/* Ende der beispielhaften Funktionsaufrufe
	 * ----------------------------------------
	 */

	/* TODO: Code einfuegen */

	/* Warte auf Loslassen der Kugel (user_isr()) */
	taskDelay(50);

lerror:
	/* ME1400 freigeben */
	if (0 != (ret = stopDevice())) {
		printf ("Error shutting down ME1400: %d.\n", ret);
		return ret;
	}

	return 0;
}
