 /*
 * 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 	bot-local.h
 * @brief 	Konstanten, die den Bot an reale Umgebungen anpassen
 * @author 	Benjamin Benz (bbe@heise.de)
 * @author Christoph Grimmer (c.grimmer@futurio.de)
 * @date 	28.02.06
*/

#ifndef BOTLOCAL_H_
#define BOTLOCAL_H_

#include "ct-Bot.h"

#define ENCODER_MARKS		60		/*!< Anzahl der Flanken, die ein Encoder bei einer Radumdrehung liefert, also Anzahl der weissen + Anzahl der schwarzen Felder */
#define WHEEL_DIAMETER		57		/*!< Durchmesser eines Rades in mm */
#define WHEEL_PERIMETER		179 	/*!< Umfang eines Rades in mm */	
#define WHEEL_TO_WHEEL_DIAMETER 97 /*!< Abstand der beiden Raeder in mm */

#define DISTSENSOR_POS_FW	35	/*!< Abstand der Distanzsensoren von der Radachse (in fahrtrichtung)*/
#define DISTSENSOR_POS_SW	32	/*!< Abstand der Distanzsensoren von der Mittelachse (in querrichtung)*/

#define SPEED_CONTROL_INTERVAL		333		/*!> Intervall fuer die Motorregelung [ms]*/

//#define SPEED_TO_ENCODER_RATE		(WHEEL_PERIMETER /ENCODER_MARKS*(1000/SPEED_CONTROL_INTERVAL)) /*!< Faktor durch den man eine Speed [mm/s] teilt um Ticks/intervall zu erhalten */
#define SPEED_TO_ENCODER_RATE		9 /*!< Faktor durch den man eine Speed [mm/s] teilt um Ticks/intervall zu erhalten */

/* Odometrie-Konstanten */
//#define MOUSE_CPI			401		/*!< CPI-Wert aus Kalibrierung */
//#define MOUSE_FULL_TURN	1430	/*!< Mausaenderung in X-Richtung fuer einen vollen Kreis */
#define MOUSE_CPI			400		/*!< CPI-Wert aus Kalibrierung (Wert fuer den Sim) */
#define MOUSE_FULL_TURN		1484	/*!< Mausaenderung in X-Richtung fuer einen vollen Kreis (Wert fuer den Sim) */

#define WHEEL_DISTANCE		49		/*!< Abstand eines Rades zur Mitte des Bots */
#define STUCK_DIFF			100		/*!< ab welcher Differenz haben wir durchdrehende Raeder? */
#define G_SPEED			0.5		/*!< Kopplung Encoder- und Maussensor fuer Geschwindigkeiten (0.0=nur Radencoder, 1.0=nur Maussensor) */
#define G_POS				0.5		/*!< Kopplung Encoder- und Maussensor fuer Positionen und Winkel (0.0=nur Radencoder, 1.0=nur Maussensor) */

/*! Hilfskonstante */
#define ANGLE_CONSTANT		(WHEEL_TO_WHEEL_DIAMETER * ENCODER_MARKS / WHEEL_DIAMETER)

/* Motorregelung */
#define PID_LOW_RATE	(BOT_SPEED_MEDIUM / SPEED_TO_ENCODER_RATE)	/*!< Encoder-rate/aufruf, fuer den dieser PID-Satz gilt */
#define PID_LOW_Kp	8	/*!< Regelung PID-Parameter [Zehntel Schritte] */ 
#define PID_LOW_Ki	6	/*!< Regelung PID-Parameter [Zehntel Schritte] */ 
#define PID_LOW_Kd	0	/*!< Regelung PID-Parameter */ 

#define PID_HIGH_RATE	(BOT_SPEED_NORMAL / SPEED_TO_ENCODER_RATE) /*!< Encoder-rate/aufruf, fuer den dieser PID-Satz gilt */
#define PID_HIGH_Kp	70	/*!< Regelung PID-Parameter [Zehntel Schritte] */ 
#define PID_HIGH_Ki	40	/*!< Regelung PID-Parameter [Zehntel Schritte] */ 
#define PID_HIGH_Kd	0	/*!< Regelung PID-Parameter */ 

/* Einstellunge fuer die Verhaltensregeln */
#define BORDER_DANGEROUS	0x3A0	/*!< Wert, ab dem wir sicher sind, dass es eine Kante ist */


#define GLANCE_FACTOR 		0.9		/*!< Schlangenlinienfaktor zur Erweiterung des Sensorfeldes */
#define GLANCE_STRAIGHT	20		/*!< Anzahl der Zyklen, die nicht geschielt wird Gesamtzahl der Zyklen ist GLANCE_STRAIGHT + GLANCE_SIDE*4 */
#define GLANCE_SIDE 		5		/*!< Anzahl der Zyklen, die geschielt wird (jeweils pro Seite) Gesamtzahl der Zyklen ist GLANCE_STRAIGHT + GLANCE_SIDE*4 */



#define COL_CLOSEST		200		/*!< Abstand in mm, den wir als zu nah betrachten -- je nach echtem Sensor ist das schon zu nah! */
#define COL_NEAR			300		/*!< Nahbereich */
#define COL_FAR			400		/*!< Fernbereich */



#define SWEEP_STATE_TURN			0	/*!< Zustand: Drehung im Sweep. */
#define SWEEP_STATE_CHECK			1	/*!< Zustamd: Ueberpruefe Objekt vor dem Bot. */

/* Zustaende und Konstanten fuer das bot_solve_maze_behaviour-Verhalten */
#define BOT_DIAMETER				12
#define OPTIMAL_DISTANCE			BOT_DIAMETER*12	/* etwas mehr als Bot-Durchmesser ist ideal (vergroessert aufgrund der kennlinien der sharps) */
#define ADJUST_DISTANCE				10
#define IGNORE_DISTANCE				240
#define GROUND_GOAL					0x221
#define STARTPAD1					0x2B2
#define STARTPAD2					0x332


/* Konstanten fuer das bot_follow_line_behaviour-Verhalten */
#define LINE_SENSE					0x350	// Ab wann ist es Linie? (Fuer den Sim auf 350 setzen, helle Tischflaeche 50)


/* Konstanten fuer Verhaltensanzeige, Verhalten mit prio von bis sichtbar */
#define PRIO_VISIBLE_MIN 3		
#define PRIO_VISIBLE_MAX 200





#endif /*BOTLOCAL_H_*/
