/*
 * c't-Sim - Robotersimulator fuer den c't-Bot
 * 
 * This program is free software; you can redistribute it
 * and/or modify it under the terms of the GNU General
 * Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your
 * option) any later version. 
 * This program is distributed in the hope that it will be 
 * useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
 * PURPOSE. See the GNU General Public License for more details.
 * You should have received a copy of the GNU General Public 
 * License along with this program; if not, write to the Free 
 * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307, USA.
 * 
 */

/*! @file 	ct-Bot.h
 * @brief 	Demo-Hauptprogramm
 * @author 	Benjamin Benz (bbe@heise.de)
 * @date 	26.12.05
*/
#ifndef CT_BOT_H_DEF
#define CT_BOT_H_DEF

#ifndef MMC_LOW_H_
	#include "global.h"	// denn in mmc-low.S sind typedefs unerwuenscht
#endif

/************************************************************
* Module switches, to make code smaller if features are not needed
************************************************************/
//#define LOG_CTSIM_AVAILABLE		/*!< Logging ueber das ct-Sim (PC und MCU) */
//#define LOG_DISPLAY_AVAILABLE		/*!< Logging ueber das LCD-Display (PC und MCU) */
//#define LOG_UART_AVAILABLE		/*!< Logging ueber UART (NUR für MCU) */
#define LOG_STDOUT_AVAILABLE 		/*!< Logging auf die Konsole (NUR für PC) */


#define LED_AVAILABLE		/*!< LEDs for local control */

#define IR_AVAILABLE		/*!< Infrared Remote Control */
#define RC5_AVAILABLE		/*!< Key-Mapping for IR-RC	 */

#define BOT_2_PC_AVAILABLE	/*!< Soll der Bot mit dem PC kommunmizieren? */

//#define TIME_AVAILABLE		/*!< Gibt es eine Systemzeit im s und ms? */

#define DISPLAY_AVAILABLE	/*!< Display for local control */
#define DISPLAY_REMOTE_AVAILABLE /*!< Sende LCD Anzeigedaten an den Simulator */
#define DISPLAY_SCREENS_AVAILABLE	/*!< Ermoeglicht vier verschiedene Screen */
//#define DISPLAY_SCREEN_RESETINFO	/*!< Zeigt auf Screen 4 Informationen ueber Resets an */
//#define DISPLAY_ODOMETRIC_INFO 	/*!< Zeigt auf Screen 4 Positions- und Geschwindigkeitsdaten */
//#define DISPLAY_REGELUNG_AVAILABLE 3 /*!< Zeigt Reglerdaten auf Screen 4, wenn SPEED_CONTROL_AVAILABLE gesetzt ist*/
#define DISPLAY_MMC_INFO	/*!< Zeigt auf Screen 4 die Daten der MMC-Karte an */
//#define DISPLAY_BEHAVIOUR_AVAILABLE  /*!< Anzeige der Verhalten im Display Screen 3, ersetzt Counteranzeige */
#define DISPLAY_DYNAMIC_BEHAVIOUR_AVAILABLE /*!< Zustandsaenderungen der Verhalten sind direkt unter Umgehung der Puffervar sichtbar */
#define MEASURE_MOUSE_AVAILABLE			/*!< Geschwindigkeiten werden aus den Maussensordaten berechnet */
//#define MEASURE_COUPLED_AVAILABLE		/*!< Geschwindigkeiten werden aus Maus- und Encoderwerten ermittelt und gekoppelt */


//#define WELCOME_AVAILABLE	/*!< kleiner Willkommensgruss */

#define ADC_AVAILABLE		/*!< A/D-Converter */

#define MAUS_AVAILABLE		/*!< Maus Sensor */

#define ENA_AVAILABLE		/*!< Enable-Leitungen */
#define SHIFT_AVAILABLE		/*!< Shift Register */

//#define TEST_AVAILABLE_ANALOG	/*!< Sollen die LEDs die analoge Sensorwerte anzeigen */
#define TEST_AVAILABLE_DIGITAL	/*!< Sollen die LEDs die digitale Sensorwerte anzeigen */
//#define TEST_AVAILABLE_MOTOR	/*!< Sollen die Motoren ein wenig drehen */
//#define TEST_AVAILABLE_COUNTER /*!< Gibt einen Endlos-Counter auf Screen 3 aus und aktiviert Screen 3 */
//#define DOXYGEN		/*!< Nur zum Erzeugen der Doku, wenn dieser schalter an ist, jammert der gcc!!! */

#define BEHAVIOUR_AVAILABLE /*!< Nur wenn dieser Parameter gesetzt ist, exisitiert das Verhaltenssystem */

#define MAP_AVAILABLE /*!< Aktiviere die Kartographie */

//#define SPEED_CONTROL_AVAILABLE /*!< Aktiviert die Motorregelung */

//#define SRF10_AVAILABLE		/*!< Ultraschallsensor SRF10 vorhanden */

#define MMC_AVAILABLE			/*!< haben wir eine MMC/SD-Karte zur Verfuegung */
#define MINI_FAT_AVAILABLE		/*!< koennen wir sektoren in FAT-systemen finden */
//#define MMC_VM_AVAILABLE		/*!< Virtual Memory Management mit MMC / SD-Card oder PC-Emulation */
/************************************************************
* Some Dependencies!!!
************************************************************/

#ifdef DOXYGEN
	#define PC			/*!< Beim generieren der Doku alles anschalten */
	#define MCU		/*!< Beim generieren der Doku alles anschalten */
	#define TEST_AVAILABLE_MOTOR	/*!< Beim generieren der Doku alles anschalten */
#endif


#ifndef DISPLAY_AVAILABLE
	#undef WELCOME_AVAILABLE
   #undef DISPLAY_REMOTE_AVAILABLE
   #undef DISPLAY_SCREENS_AVAILABLE
   #undef DISPLAY_SCREEN_RESETINFO
#endif

#ifndef IR_AVAILABLE
	#undef RC5_AVAILABLE
#endif

#ifndef MAUS_AVAILABLE
	#undef MEASURE_MOUSE_AVAILABLE
	#undef MEASURE_COUPLED_AVAILABLE
#endif

#ifdef PC
	#ifndef DOXYGEN
		#undef UART_AVAILABLE
		#undef BOT_2_PC_AVAILABLE
		#undef SRF10_AVAILABLE
		#undef TWI_AVAILABLE
		#undef SPEED_CONTROL_AVAILABLE // Deaktiviere die Motorregelung 
		#undef MMC_AVAILABLE
	#endif

	#define COMMAND_AVAILABLE		/*!< High-Level Communication */
   #undef DISPLAY_SCREEN_RESETINFO
   #undef TEST_AVAILABLE_COUNTER
#endif

#ifdef MCU
	#ifdef LOG_CTSIM_AVAILABLE
		#define BOT_2_PC_AVAILABLE
	#endif
	#ifdef BOT_2_PC_AVAILABLE
		#define UART_AVAILABLE	/*!< Serial Communication */
		#define COMMAND_AVAILABLE	/*!< High-Level Communication */
	#endif
//	#undef MAP_AVAILABLE
#endif


#ifdef TEST_AVAILABLE_MOTOR
	#define TEST_AVAILABLE			/*!< brauchen wir den Testkrams */
	#define TEST_AVAILABLE_DIGITAL /*!< Sollen die LEDs die digitale Sensorwerte anzeigen */
#endif

#ifdef TEST_AVAILABLE_DIGITAL
	#define TEST_AVAILABLE			/*!< brauchen wir den Testkrams */
	#undef TEST_AVAILABLE_ANALOG
#endif

#ifdef TEST_AVAILABLE_ANALOG
	#define TEST_AVAILABLE			/*!< brauchen wir den Testkrams */
#endif

#ifdef TEST_AVAILABLE_COUNTER
	#define TEST_AVAILABLE			/*!< brauchen wir den Testkrams */
	#define DISPLAY_SCREENS_AVAILABLE
	#define DISPLAY_SCREEN_RESETINFO
#endif

#ifdef DISPLAY_ODOMETRIC_INFO
	#undef DISPLAY_SCREEN_RESETINFO		/*!< Wenn Odometrieinfos, dann keine Resetinfos */
#endif

#ifndef SPEED_CONTROL_AVAILABLE
	#undef DISPLAY_REGELUNG_AVAILABLE
#endif

#ifdef LOG_UART_AVAILABLE
	#define LOG_AVAILABLE
#endif 
#ifdef LOG_CTSIM_AVAILABLE
	#define LOG_AVAILABLE
#endif 
#ifdef LOG_DISPLAY_AVAILABLE
	#define LOG_AVAILABLE
#endif 
#ifdef LOG_STDOUT_AVAILABLE
	#define LOG_AVAILABLE
#endif 

#ifndef MMC_AVAILABLE
	#undef MINI_FAT_AVAILABLE
	#ifdef MCU
		#undef MMC_VM_AVAILABLE
	#endif
#endif

#ifdef LOG_AVAILABLE
	#ifdef PC
		/* Auf dem PC gibts kein Logging ueber UART. */
		#undef LOG_UART_AVAILABLE
	#endif
	
	#ifdef MCU
		/* Mit Bot zu PC Kommunikation auf dem MCU gibts kein Logging ueber UART.
		 * Ohne gibts keine Kommunikation ueber ct-Sim.
		 */
		#undef LOG_STDOUT_AVAILABLE		/*!< MCU hat kein STDOUT */
		#ifdef BOT_2_PC_AVAILABLE
			#undef LOG_UART_AVAILABLE
		#else
			#undef LOG_CTSIM_AVAILABLE
		#endif
	#endif
	
	/* Ohne Display gibts auch keine Ausgaben auf diesem. */
	#ifndef DISPLAY_AVAILABLE
		#undef LOG_DISPLAY_AVAILABLE
	#endif
	
	/* Logging aufs Display ist nur moeglich, wenn mehrere Screens
	 * unterstuetzt werden.
	 */
	#ifndef DISPLAY_SCREENS_AVAILABLE
		#undef LOG_DISPLAY_AVAILABLE
	#endif
	
	/* Es kann immer nur ueber eine Schnittstelle geloggt werden. */
	
	#ifdef LOG_UART_AVAILABLE
		#define UART_AVAILABLE
		#undef LOG_CTSIM_AVAILABLE
		#undef LOG_DISPLAY_AVAILABLE
		#undef LOG_STDOUT_AVAILABLE
	#endif
	
	#ifdef LOG_CTSIM_AVAILABLE
		#undef LOG_DISPLAY_AVAILABLE
		#undef LOG_STDOUT_AVAILABLE
	#endif
	
	#ifdef LOG_DISPLAY_AVAILABLE
		#undef LOG_STDOUT_AVAILABLE
	#endif

	// Wenn keine sinnvolle Log-Option mehr uebrig, loggen wir auch nicht
	#ifndef LOG_CTSIM_AVAILABLE
		#ifndef LOG_DISPLAY_AVAILABLE
			#ifndef LOG_UART_AVAILABLE
				#ifndef LOG_STDOUT_AVAILABLE
					#undef LOG_AVAILABLE
				#endif
			#endif
		#endif
	#endif

#endif


#ifdef SRF10_AVAILABLE
	#define TWI_AVAILABLE				/*!< TWI-Schnittstelle (I2C) nutzen */
#endif


#define F_CPU	16000000L    /*!< Crystal frequency in Hz */
#define XTAL F_CPU			 /*!< Crystal frequency in Hz */

#define LINE_FEED "\n\r"	/*!< Windows und Linux unterscheiden beim Linefeed. Windows erwarten \n\r, Linux nur \n */

#ifdef MCU
	#ifndef MMC_LOW_H_
		#include <avr/interrupt.h>
	#endif
	#ifdef SIGNAL
		#define NEW_AVR_LIB
	#endif
#endif

#endif
