## c't-Projekte - Mailinglisten

[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

### [ct-bot] Erweiterung Posstack als FIFO-Queue

Absender: Frank Menzel
Datum: Do, 25.09.2008 21:33:44

    Hallo,
    habe den Positionsstack etwas erweitert, um diesen als FIFO-Queue
    verwenden zu können. Also damit gibt es nicht mehr nur die
    Stackfunktionen POP und PUSH sondern auch QUEUE und DEQUEUE um (wie bei
    Push) eine Koordinate hinten anzufügen und vorn wieder zu entnehmen.
    Als Anwendung habe ich dafür das Stack-Fahrverhalten angepasst, welches
    die hier gespeicherten Punkte nun auch von vorn nach hinten (Start via
    Display Taste 6) abfahren kann. Hat man beim Abfahren Punkte in den
    Stack gespeichert und drückt die Taste 6, fährt er die 1. Koordinate an
    und weiter genauso, wie er an sich gefahren ist.

    Gruß, Frank

    Index: C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_drive_stack.c
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_drive_stack.c	(revision 1486)
    +++ C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_drive_stack.c	(working copy)
    @@ -34,6 +34,7 @@
     #include "rc5-codes.h"
     #include "pos_stack.h"
     #include "math_utils.h"
    +#include "ct-Bot.h"
     #include <stdlib.h>

     static uint8_t drivestack_state = 0;	/*!< Status des drive_stack-Verhaltens */
    @@ -43,15 +44,24 @@
     static int16_t posx = 0;
     static int16_t posy = 0;

    +static uint8_t go_fifo = 0; /*!< falls True wird nicht mit Stack-Pop nach LIFO sondern via Queue FIFO gefahren */
    +
     /*!
      * Verhalten zum Anfahren aller auf dem Stack befindlichen Punkte, wobei das Fahr-Unterverhalten bot_goto_pos benutzt wird
      * @param *data	Der Verhaltensdatensatz
      */
     void bot_drive_stack_behaviour(Behaviour_t * data) {
    +	uint8_t get_pos;
     	switch (drivestack_state) {
     	case 0:
     		// Koordinaten werden vom Stack geholt und angefahren; Ende nach nicht mehr erfolgreichem Pop
    -		if (!pos_stack_pop(&posx, &posy))
    +		#ifdef POS_QUEUE_FIFO
    +		  // wenn Fifo-Queue definiert, kann sowohl nach LIFO (Stack) oder FIFO (Queue) gefahren werden
    +	      get_pos=(go_fifo)?pos_queue_dequeue(&posx,&posy):pos_stack_pop(&posx, &posy);
    +	    #else
    +	      get_pos=pos_stack_pop(&posx, &posy);
    +	    #endif
    +		if (!get_pos)
     			drivestack_state = 1;
     		else
     			bot_goto_pos(data, posx, posy, 999);
    @@ -76,6 +86,7 @@
     void bot_drive_stack(Behaviour_t * caller) {
     	switch_to_behaviour(caller, bot_drive_stack_behaviour, OVERRIDE);
     	drivestack_state = 0;
    +	go_fifo = 0;
     	if (behaviour_is_activated(bot_put_stack_waypositions_behaviour)) {
     		/* falls put_stack_waypos an ist, temporaer deaktivieren */
     		deactivateBehaviour(bot_put_stack_waypositions_behaviour);
    @@ -85,7 +96,20 @@
     	}
     }

    +#ifdef POS_QUEUE_FIFO
     /*!
    + * Botenfunktion: Verhalten zum Anfahren aller in der FIFO-Queue befindlichen Punkte; d.h. nicht wie beim
    + * Stackfahren sondern die zuerst in der Queue (Stackarray) befindlichen Koordinaten-also von vorn nach hinten
    + * @param *caller	Der Verhaltensdatensatz des Aufrufers
    + */
    +void bot_drive_stack_fifo(Behaviour_t * caller) {
    +	go_fifo = True;
    +	switch_to_behaviour(caller, bot_drive_stack_behaviour, OVERRIDE);
    +	drivestack_state = 0;
    +}
    +#endif
    +
    +/*!
      * Speichern der uebergebenen Koordinaten auf dem Stack
      * @param pos_x	X-Koordinate
      * @param pos_y	Y-Koordinate
    @@ -207,6 +231,14 @@
     		RC5_Code = 0;
     		bot_put_stack_waypositions(NULL);
     		break;
    +
    +#ifdef POS_QUEUE_FIFO
    +	case RC5_CODE_6:
    +		/* Verhalten starten zum Anfahren der Queuepunkte von vorn nach hinten, also entgegen dem Stackfahren via Pop*/
    +		RC5_Code = 0;
    +		bot_drive_stack_fifo(NULL);
    +		break;
    +#endif

     	case RC5_CODE_8:
     		/* Loeschen des Positionsstacks */
    @@ -229,7 +261,11 @@
     	display_cursor(3, 1);
     	display_printf("Save/Goto/Del: 3/4/8");
     	display_cursor(4, 1);
    -	display_printf("Start WayPushPos: 5");
    +	#ifdef POS_QUEUE_FIFO
    +	  display_printf("WayPush/GoFIFO: 5/6");
    +	#else
    +	  display_printf("Start WayPushPos: 5");
    +	#endif

     	drivestack_disp_key_handler();	// aufrufen des Key-Handlers
     }
    Index: C:/eclipse/workspace/ct-Bot/Changelog.txt
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/Changelog.txt	(revision 1486)
    +++ C:/eclipse/workspace/ct-Bot/Changelog.txt	(working copy)
    @@ -1,5 +1,7 @@
     CHANGELOG fuer c't-Bot
     ======================
    +2008-09-25 Frank Menzel [Menzelfr@xxxxxxx]: Erweiterung des Posstacks als Fifo-Queue; drive_stack-Verhalten hierfuer angepasst zum Abfahren der Punkte von vorn nach hinten
    +
     2008-09-16 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: Verbesserungen im MMC-Code (groesserer Timeout bei HW-SPI, Debug-Ausgaben bei MiniFAT)

     2008-09-06 Frank Menzel [Menzelfr@xxxxxxx]: Verhalten drive_area stark ueberarbeitet
    Index: C:/eclipse/workspace/ct-Bot/ct-Bot.h
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/ct-Bot.h	(revision 1486)
    +++ C:/eclipse/workspace/ct-Bot/ct-Bot.h	(working copy)
    @@ -53,13 +53,14 @@
     #define MEASURE_MOUSE_AVAILABLE			/*!< Geschwindigkeiten werden aus den Maussensordaten berechnet */
     //#define MEASURE_COUPLED_AVAILABLE		/*!< Geschwindigkeiten werden aus Maus- und Encoderwerten ermittelt und gekoppelt */

    -//#define POS_STACK_AVAILABLE  /*!< Positionsstack vorhanden */
    +#define POS_STACK_AVAILABLE  /*!< Positionsstack vorhanden */
    +//#define POS_QUEUE_FIFO       /*!< Queue-Routinen FIFO als Erweiterung des Pos-Stacks */

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

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

    -#define MAUS_AVAILABLE		/*!< Maus Sensor */
    +//#define MAUS_AVAILABLE		/*!< Maus Sensor */

     #define ENA_AVAILABLE		/*!< Enable-Leitungen */
     #define SHIFT_AVAILABLE		/*!< Shift Register */
    @@ -70,9 +71,9 @@

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

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

    -//#define SPEED_CONTROL_AVAILABLE /*!< Aktiviert die Motorregelung */
    +#define SPEED_CONTROL_AVAILABLE /*!< Aktiviert die Motorregelung */
     //#define ADJUST_PID_PARAMS		/*!< macht PID-Paramter zur Laufzeit per FB einstellbar */
     //#define SPEED_LOG_AVAILABLE 	/*!< Zeichnet Debug-Infos der Motorregelung auf MMC auf */

    @@ -80,12 +81,12 @@
     //#define CMPS03_AVAILABLE		/*!< Kompass CMPS03 vorhanden */
     //#define SP03_AVAILABLE		/*!< Sprachmodul SP03 vorhanden */

    -//#define MMC_AVAILABLE			/*!< haben wir eine MMC/SD-Karte zur Verfuegung */
    -//#define SPI_AVAILABLE			/*!< verwendet den Hardware-SPI-Modus des Controllers, um mit der MMC zu kommunizieren - Hinweise in mcu/mmc.c beachten! */
    +#define MMC_AVAILABLE			/*!< haben wir eine MMC/SD-Karte zur Verfuegung */
    +#define SPI_AVAILABLE			/*!< verwendet den Hardware-SPI-Modus des Controllers, um mit der MMC zu kommunizieren - Hinweise in mcu/mmc.c beachten! */
     //#define MMC_VM_AVAILABLE		/*!< Virtual Memory Management mit MMC / SD-Card oder PC-Emulation */
     //#define OS_AVAILABLE			/*!< Aktiviert BotOS fuer Threads und Scheduling */

    -#define EEPROM_EMU_AVAILABLE	/*!< Aktiviert die EEPROM-Emulation fuer PC */
    +//#define EEPROM_EMU_AVAILABLE	/*!< Aktiviert die EEPROM-Emulation fuer PC */

     // Achtung, Linkereinstellungen anpassen !!!!! (siehe Documentation/Bootloader.html)!
     //#define BOOTLOADER_AVAILABLE	/*!< Aktiviert den Bootloadercode - das ist nur noetig fuer die einmalige "Installation" des Bootloaders. Achtung, Linkereinstellungen anpassen (siehe mcu/bootloader.c)! */
    @@ -118,6 +119,10 @@
     	#define BOT_2_PC_AVAILABLE
     #endif

    +#ifdef POS_QUEUE_FIFO
    +  #define POS_STACK_AVAILABLE  // fuer FIFO-Queue Erweiterung muss Stack auch an sein
    +#endif
    +
     #ifdef PC
     	#ifndef DOXYGEN
     		#undef UART_AVAILABLE
    Index: C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h	(revision 1486)
    +++ C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h	(working copy)
    @@ -33,7 +33,7 @@

     #define BEHAVIOUR_SERVO_AVAILABLE 	/*!< Kontrollverhalten fuer die Servos */

    -//#define BEHAVIOUR_DRIVE_STACK_AVAILABLE /*!< Abfahren der auf dem Stack gesicherten Koordinaten */
    +#define BEHAVIOUR_DRIVE_STACK_AVAILABLE /*!< Abfahren der auf dem Stack gesicherten Koordinaten */

     //#define BEHAVIOUR_OLYMPIC_AVAILABLE	/*!< Olympiadenverhalten vorhanden? */

    Index: C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_drive_stack.h
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_drive_stack.h	(revision 1486)
    +++ C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_drive_stack.h	(working copy)
    @@ -71,5 +71,15 @@
      */
     void drive_stack_display(void);

    +//nur wenn Erweiterung des Stacks zur Queue angeschaltet
    +#ifdef POS_QUEUE_FIFO
    +/*!
    + * Botenfunktion: Verhalten zum Anfahren aller in der FIFO-Queue befindlichen Punkte; d.h. nicht wie beim
    + * Stackfahren sondern die zuerst in der Queue (Stackarray) befindlichen Koordinaten-also von vorn nach hinten
    + * @param *caller	Der Verhaltensdatensatz des Aufrufers
    + */
    +void bot_drive_stack_fifo(Behaviour_t * caller);
    +#endif
    +
     #endif	// BEHAVIOUR_DRIVE_STACK_AVAILABLE
     #endif /*BEHAVIOUR_DRIVESTACK_H_*/
    Index: C:/eclipse/workspace/ct-Bot/include/rc5-codes.h
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/include/rc5-codes.h	(revision 1486)
    +++ C:/eclipse/workspace/ct-Bot/include/rc5-codes.h	(working copy)
    @@ -62,11 +62,11 @@
     #ifdef MCU

     	// Dies ist die Standard-Fernbedienung fuer den Bot
    -	#define RC_HAVE_HQ_RC_UNIVERS29_334
    +	//#define RC_HAVE_HQ_RC_UNIVERS29_334

     	//#define RC_HAVE_HAUPPAUGE_WINTV
     	//#define RC_HAVE_HAUPPAUGE_MediaMPV
    -	//#define RC_HAVE_CONRAD_PROMO8
    +	#define RC_HAVE_CONRAD_PROMO8
     	//#define RC_HAVE_VIVANCO_UR89
     	//#define RC_HAVE_VIVANCO_UR89_TV_CODE_089
     	//#define RC_HAVE_Technisat_TTS35AI
    Index: C:/eclipse/workspace/ct-Bot/include/pos_stack.h
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/include/pos_stack.h	(revision 1486)
    +++ C:/eclipse/workspace/ct-Bot/include/pos_stack.h	(working copy)
    @@ -39,7 +39,11 @@
     /*! ab hier der statische Stack mittels Array */
     #ifdef ARRAY_POINT_STACK

    -#define POS_STACK_SIZE	20  // Stackgroesse ist beim Array begrenzt
    +#ifdef POS_QUEUE_FIFO
    +  #define POS_STACK_SIZE	100  // Fahren nach Queue benoetigt hoeheren Wert, da jede Teilstrecke gespeichert wird
    +#else
    +  #define POS_STACK_SIZE	20  // Stackgroesse ist beim Array begrenzt
    +#endif

     /*! Datenstruktur eines Koordinatenpunktes */
     typedef struct {
    @@ -82,6 +86,26 @@
      * @param y	Y-Koordinate des zu sichernden Punktes
      */
     void pos_stack_push(int16_t x, int16_t y);
    +
    +//nur wenn Erweiterung des Stacks zur Queue angeschaltet
    +#ifdef POS_QUEUE_FIFO
    +/*!
    + * Element wird hinten angefuegt, identisch dem Stack-Push
    + * @param x	X-Koordinate des zu sichernden Punktes
    + * @param y	Y-Koordinate des zu sichernden Punktes
    + * @return True wenn erfolgreich angefuegt werden konnte sonst False
    + */
    +uint8_t pos_queue_queue(int16_t x, int16_t y);
    +
    +/*!
    + * Element wird vorn entnommen und alle anderen Elemente nach vorn geschoben
    + * @param *x	X-Koordinate des ersten entnommenen Elementes
    + * @param *y	Y-Koordinate des ersten entnommenen Elementes
    + * @return True wenn Element erfolgreich entnommen werden konnte sonst False falls leer
    + */
    +uint8_t pos_queue_dequeue(int16_t * x, int16_t * y);
    +#endif
    +
     #endif	// POS_STACK_AVAILABLE

     #endif	/*POS_STACK_H_*/
    Index: C:/eclipse/workspace/ct-Bot/pos_stack.c
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/pos_stack.c	(revision 1486)
    +++ C:/eclipse/workspace/ct-Bot/pos_stack.c	(working copy)
    @@ -92,6 +92,59 @@
     	return True;
     }

    +//Erweiterung des Stacks zur Queue
    +#ifdef POS_QUEUE_FIFO
    +
    +static pos_stack_t * firstpos_sp = pos_stack;  // Zeiger auf 1. Element
    +static pos_stack_t * sp_counter = pos_stack;
    +
    +/*!
    + * Element wird hinten angefuegt, identisch dem Stack-Push
    + * @param x	X-Koordinate des zu sichernden Punktes
    + * @param y	Y-Koordinate des zu sichernden Punktes
    + * @return True wenn erfolgreich angefuegt werden konnte sonst False
    + */
    +uint8_t pos_queue_queue(int16_t x, int16_t y) {
    +  if (is_full())
    +    return False;
    +  pos_stack_push(x,y);
    +  return True;
    +}
    +
    +/*!
    + * Element wird vorn entnommen und alle anderen Elemente nach vorn geschoben
    + * @param *x	X-Koordinate des ersten entnommenen Elementes
    + * @param *y	Y-Koordinate des ersten entnommenen Elementes
    + * @return True wenn Element erfolgreich entnommen werden konnte sonst False falls leer
    + */
    +uint8_t pos_queue_dequeue(int16_t * x, int16_t * y) {
    +	if (is_empty())
    +	  return False;
    +
    +	firstpos_sp = pos_stack;  // auf 1. Position setzen
    +	sp_counter = pos_stack;
    +	sp_counter++;             // bereits auf naechstes Element setzen
    +
    +	*x = firstpos_sp->posx;
    +	*y = firstpos_sp->posy;
    +
    +	uint8_t i;
    +
    +	// hier muessen alle Elemente nach vorn gezogen werden
    +	 for (i=1; i< stack_count; i++) {
    +	 	firstpos_sp->posx = sp_counter->posx;
    +	 	firstpos_sp->posy = sp_counter->posy;
    +
    +	 	firstpos_sp++;
    +	 	sp_counter++;
    +	 }
    +	stack_count--;  // Stackcounter verringern
    +	pos_sp--;       //Letzten Stackzeiger verringern
    +
    +	return True;
    +}
    +#endif
    +
     #else	//  ab hier der dynamische Stack */

     static pos_stack_t * Point_Stack; /*!< die eigentlich zu verwendende Stack-Variable */
    @@ -171,6 +224,8 @@
     	tmp->element.posy = y;
     	push_element(tmp);
     }
    -
    +#ifdef POS_QUEUE_FIFO
    +  #warning "Dyn. Queue nicht realisiert"
    +#endif
     #endif	// ARRAY_POINT_STACK
     #endif	// POS_STACK_AVAILABLE
    Index: C:/eclipse/workspace/ct-Bot/ui/available_screens.h
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/ui/available_screens.h	(revision 1486)
    +++ C:/eclipse/workspace/ct-Bot/ui/available_screens.h	(working copy)
    @@ -38,8 +38,8 @@
     //#define DISPLAY_BEHAVIOUR_AVAILABLE		/*!< zeigt Verhalten an */
     //#define MISC_DISPLAY_AVAILABLE			/*!< aehm ja, der Rest irgendwie... */
     #define DISPLAY_ODOMETRIC_INFO			/*!< zeigt Positions- und Geschwindigkeitsdaten an */
    -//#define DISPLAY_MMC_INFO				/*!< Zeigt die Daten der MMC-Karte an */
    -//#define DISPLAY_MINIFAT_INFO			/*!< Zeigt Ausgaben des MiniFAT-Treibers an */
    +#define DISPLAY_MMC_INFO				/*!< Zeigt die Daten der MMC-Karte an */
    +#define DISPLAY_MINIFAT_INFO			/*!< Zeigt Ausgaben des MiniFAT-Treibers an */
     //#define RESET_INFO_DISPLAY_AVAILABLE	/*!< Zeigt Informationen ueber Resets an */
     #define RAM_DISPLAY_AVAILABLE			/*!< Ausgabe des freien RAMs */
     #define DISPLAY_MAP_AVAILABLE			/*!< Zeigt Map-Display an */
    Index: C:/eclipse/workspace/ct-Bot/.settings/org.eclipse.cdt.core.prefs
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/.settings/org.eclipse.cdt.core.prefs	(revision 0)
    +++ C:/eclipse/workspace/ct-Bot/.settings/org.eclipse.cdt.core.prefs	(revision 0)
    @@ -0,0 +1,3 @@
    +#Thu Sep 25 20:32:18 CEST 2008
    +eclipse.preferences.version=1
    +indexerId=org.eclipse.cdt.core.fastIndexer

- Antworten:
  - Re: [ct-bot] Erweiterung Posstack als FIFO-Queue
    - From: Timo Sandmann

- Voriger (Datum): Re: [ct-bot] Map shrink und Grenzen, Benjamin Benz
- Nächster (Datum): Re: [ct-bot] Erweiterung Posstack als FIFO-Queue, Timo Sandmann
- Voriger (Thread): Re: [ct-bot] Map delete..., Timo Sandmann
- Nächster (Thread): Re: [ct-bot] Erweiterung Posstack als FIFO-Queue, Timo Sandmann
- Indizes:
  - Datum
  - Thread