diff options
Diffstat (limited to 'source/ct-Bot/include/bot-logic/bot-logik.h')
-rw-r--r-- | source/ct-Bot/include/bot-logic/bot-logik.h | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/source/ct-Bot/include/bot-logic/bot-logik.h b/source/ct-Bot/include/bot-logic/bot-logik.h new file mode 100644 index 0000000..7455c21 --- /dev/null +++ b/source/ct-Bot/include/bot-logic/bot-logik.h @@ -0,0 +1,196 @@ +/* + * 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-logik.h + * @brief High-Level-Routinen fuer die Steuerung des c't-Bots + * @author Benjamin Benz (bbe@heise.de) + * @date 01.12.05 +*/ + +#ifndef bot_logik_H_ +#define bot_logik_H_ + +#include "global.h" +#include "ct-Bot.h" +#include "motor.h" +#include "sensor.h" +#include "bot-local.h" + + +#define BEHAVIOUR_DRIVE_AVAILABLE + + + +// Includes aller verfuegbaren Verhalten + + +#define INACTIVE 0 /*!< Verhalten ist aus */ +#define ACTIVE 1 /*!< Verhalten ist an */ + +#define OVERRIDE 1 /*!< Konstante, wenn Verhalten beim Aufruf alte Wuensche ueberschreiben sollen */ +#define NOOVERRIDE 0 /*!< Konstanten, wenn Verhalten beim Aufruf alte Wuensche nicht ueberschreiben sollen */ + +#define SUBSUCCESS 1 /*!< Konstante fuer Behaviour_t->subResult: Aufgabe erfolgreich abgeschlossen */ +#define SUBFAIL 0 /*!< Konstante fuer Behaviour_t->subResult: Aufgabe nicht abgeschlossen */ +#define SUBRUNNING 2 /*!< Konstante fuer Behaviour_t->subResult: Aufgabe wird noch beabeitet */ + +#define BOT_BEHAVIOUR_RUNNING 1 /*!< Rueckgabewert eines Verhaltens, das noch weiter laufen moechte. */ +#define BOT_BEHAVIOUR_DONE 0 /*!< Rueckgabewert eines Verhaltens, das fertig ist. */ + + +/*! Verwaltungsstruktur fuer die Verhaltensroutinen */ +typedef struct _Behaviour_t { + void (*work) (struct _Behaviour_t *data); /*!< Zeiger auf die Funktion, die das Verhalten bearbeitet */ + + uint8 priority; /*!< Prioritaet */ + struct _Behaviour_t *caller ; /* aufrufendes verhalten */ + + uint8 active:1; /*!< Ist das Verhalten aktiv */ + #ifdef DISPLAY_BEHAVIOUR_AVAILABLE + #ifndef DISPLAY_DYNAMIC_BEHAVIOUR_AVAILABLE /*!< bei dynamischer Anzeige und Wahl keine Puffervar notwendig */ + uint8 active_new:1; /*!< Ist das via Display gewaehlte neue Sollverhalten */ + #endif + #endif + uint8 subResult:2; /*!< War das aufgerufene unterverhalten erfolgreich (==1)?*/ + struct _Behaviour_t *next; /*!< Naechster Eintrag in der Liste */ +#ifndef DOXYGEN + }__attribute__ ((packed)) Behaviour_t; +#else + } Behaviour_t; +#endif + +/*! Dieser Typ definiert eine Funktion die das eigentliche Verhalten ausfuehrt. */ +typedef void (*BehaviourFunc)(Behaviour_t *data); + +/*! Liste mit allen Verhalten */ +extern Behaviour_t *behaviour; + +extern int16 speedWishLeft; /*!< Puffervariablen fuer die Verhaltensfunktionen absolut Geschwindigkeit links*/ +extern int16 speedWishRight; /*!< Puffervariablen fuer die Verhaltensfunktionen absolut Geschwindigkeit rechts*/ + +extern float faktorWishLeft; /*!< Puffervariablen fuer die Verhaltensfunktionen Modifikationsfaktor links*/ +extern float faktorWishRight; /*!< Puffervariablen fuer die Verhaltensfunktionen Modifikationsfaktor rechts */ + + + +extern int16 target_speed_l; /*!< Sollgeschwindigkeit linker Motor */ +extern int16 target_speed_r; /*!< Sollgeschwindigkeit rechter Motor */ + +/*! + * Kuemmert sich intern um die Ausfuehrung der goto-Kommandos + * @see bot_goto() + */ +extern void bot_behave(void); + +/*! + * Initilaisert das ganze Verhalten + */ +extern void bot_behave_init(void); + +/*! + * Aktiviert eine Regel mit gegebener Funktion + * @param function Die Funktion, die das Verhalten realisiert. + */ +void activateBehaviour(BehaviourFunc function); + +/*! + * Aktiviert eine Regel mit gegebener Funktion + * @param function Die Funktion, die das Verhalten realisiert. + */ +void deactivateBehaviour(BehaviourFunc function); + +/*! + * Deaktiviert alle Verhalten bis auf Grundverhalten. Bei Verhaltensauswahl werden die Aktivitaeten vorher + * in die Verhaltens-Auswahlvariable gesichert. + */ +void deactivateAllBehaviours(void); + +/*! + * Ruft ein anderes Verhalten auf und merkt sich den Ruecksprung + * return_from_behaviour() kehrt dann spaeter wieder zum aufrufenden Verhalten zurueck + * @param from aufrufendes Verhalten + * @param to aufgerufenes Verhalten + * @param override Hier sind zwei Werte Moeglich: + * 1. OVERRIDE : Das Zielverhalten to wird aktiviert, auch wenn es noch aktiv ist. + * Das Verhalten, das es zuletzt aufgerufen hat wird dadurch automatisch + * wieder aktiv und muss selbst sein eigenes Feld subResult auswerten, um zu pruefen, ob das + * gewuenschte Ziel erreicht wurde, oder vorher ein Abbruch stattgefunden hat. + * 2. NOOVERRIDE : Das Zielverhalten wird nur aktiviert, wenn es gerade nichts zu tun hat. + * In diesem Fall kann der Aufrufer aus seinem eigenen subResult auslesen, + * ob seibem Wunsch Folge geleistet wurde. + */ +void switch_to_behaviour(Behaviour_t * from, void *to, uint8 override ); + +/*! + * Kehrt zum aufrufenden Verhalten zurueck + * @param running laufendes Verhalten + */ +void return_from_behaviour(Behaviour_t * data); + + +/*! + * Fuegt ein Verhalten der Verhaltenliste anhand der Prioritaet ein. + * @param list Die Speicherstelle an der die globale Verhaltensliste anfaengt + * @param behave Einzufuegendes Verhalten + */ +void insert_behaviour_to_list(Behaviour_t **list, Behaviour_t *behave); + +/*! + * Erzeugt ein neues Verhalten + * @param priority Die Prioritaet + * @param *work Den Namen der Funktion, die sich drum kuemmert + */ +Behaviour_t *new_behaviour(uint8 priority, void (*work) (struct _Behaviour_t *data), int8 active); + + +#include "bot-logic/available_behaviours.h" + + + + +#ifdef DISPLAY_BEHAVIOUR_AVAILABLE + + /*! + * ermittelt ob noch eine weitere Verhaltensseite existiert + */ + extern int8 another_behaviour_page(void) ; + +/*! + * toggled ein Verhalten der Verhaltensliste an Position pos + * @param pos Listenposition, entspricht der Taste 1-6 der gewaehlten Verhaltensseite + */ + void toggleNewBehaviourPos(int8 pos); + +/*! + * Startschuss, die gewaehlten neuen Verhaltensaktivitaeten werden in die + * Verhaltensliste geschrieben und die Verhalten damit scharf geschaltet + */ + void set_behaviours_active_to_new(void); + +/*! + * Die Aktivitaeten der Verhalten werden in die Puffervariable geschrieben, + * welche zur Anzeige und Auswahl verwendet wird + */ + void set_behaviours_equal(void); + + int8 behaviour_page ; /*!< angezeigte Verhaltensseite */ + +#endif + +#endif |