Absender: Menzel, Frank IT-OO4
Datum: Fr, 11.05.2007 11:02:05
In-reply-to:
<200705082357.31569.tevers@xxxxxxxxxxxxx>
Hallo, Die Idee mit dem Ringpuffer habe ich nicht so recht verstanden. Ich stelle einfach mal meine Idee vor, vielleicht ist das ja auch so gemeint gewesen. Ziel war es ja, mit einem Abgrund-Notverhalten auch in den Verhalten darüber informiert zu werden, wenn der bot eben auf einen Abgrund fährt. Je nach Verhalten kann dann entsprechend reagiert werden. Im einfachsten Fall darf der bot nicht da reinfallen, so wie es jetzt eben der Fall ist. Ich greife mal die Idee mit der Screen-Registrierung auf. Da werden in einem begrenzten Array Pointer auf Prozeduren gespeichert und je nach Screen eine bestimmte Routine aufgerufen. Wenn man nun ein ebensolches Array macht für die Registrierung von nacheinander auszuführende Notfallroutinen, die je nach Verhalten dort registriert werden, kann man relativ flexibel darüber die Verhalten informieren und dort was tun. Im einfachsten Fall wird auf jeden Fall die Routine registriert, die die speeds auf minus setzt, so wie jetzt, damit er nicht ins Loch fällt (es muß hier sichergestellt sein, daß auch drunterliegende Fahrverhalten zum Zuge kommen). Das jetzige Notfallverhalten prüft also die Sensoren auf Abgrund und startet nacheinander alle Routinen, die hier registriert sind. So könnte es aussehen: #define MAX_PROCS 3 /*!< Maximale Anzahl der Funktionen */ int8 count_arr_emerg = 0; /*!< Anzahl der zurzeit registrierten Notfallfunktionen */ /*!< hier liegen die Zeiger auf die auszufuehrenden Abgrund Notfall-Funktionen */ static void (* screen_functions[MAX_PROCS])(void) = {NULL}; int8 register_emergency_proc(void* fkt){ if (count_arr_emerg == MAX_PROCS) return -1; // sorry, aber fuer dich ist kein Platz mehr da :( int8 proc_nr = count_arr_emerg++; // neue proc hinten anfuegen screen_functions[proc_nr] = fkt; // Pointer im Array speichern return proc_nr; } void start_registered_emergency_procs(void) { uint8 i=0; for (i=0; i<MAX_PROCS; i++){ if (screen_functions[i-1] != NULL) { screen_functions[i-1](); } } } Verhaltenshandler, der zuerst auch die Aktivitaet des Verhaltens prueft // Notfallhandler, ausgefuehrt bei Abgrunderkennung; muss registriert werden void border_recognize(void){ // Routine muss zuerst checken, ob map_go_destination auch gerade aktiv ist, da nur in diesem // Fall etwas gemacht werden muss if (Behaviour_is_activated(bot_gotoxy_behaviour_map)) { LOG_DEBUG(("in border_rec aber Verhalten nicht aktiv und return ")); return; } bot_drive_distance(0,0,-BOT_SPEED_FOLLOW,10);// 10cm rueckwaerts LOG_INFO(("rueckwaerts durch Abgrundverhalten \n")); } / Standard-Notfallhandler; greift falls nichts anderes vorgesehen ist; void border_standard_handler(void){ // werden die Speedwerte direkt gesetzt, kommt kein anderes Verhalten drunter mehr zum Zuge weil dieses // ja mit die hoechste prio hat // daher werden die Faktoren auf 0 gesetzt, damit Verhalten darunter zum Zuge kommen, die Faktoren auf 0 gesetzt // um nicht zu fahren; die anderen registrierten Folgeverhalten muessen dann reagieren und Faktoren ruecksetzen // wenn eigene Fahrbehandlungsroutine wie rueckwaertsfahren vorhanden ist if (sensBorderL > BORDER_DANGEROUS) speedWishLeft=-BOT_SPEED_NORMAL; if (sensBorderR > BORDER_DANGEROUS) speedWishRight=-BOT_SPEED_NORMAL; } Registriert werden die Routinen beim Einfügen ins Verhaltenssystem: // Registrierung des Notfallverhaltens register_emergency_proc(&border_standard_handler); // Registrierung des Notfallverhaltens register_emergency_proc(&border_recognize); // Start aller auszufuehrenden registrierten Prozeduren im Abgrund-Notfall start_registered_emergency_procs(); Wie gesagt, hier muß man noch sehen, wie man ein Rückwärtsfahren via bot_drive_distance z.B. zum Zuge kommen läßt, auch wenn durch den Standardhandler die Geschwindigkeiten bereits gesetzt hat. Mit freundlichen Grüßen Frank Menzel Confidentiality note: The information in this email and any attachment may contain confidential and proprietary information of Heidelberger Druckmaschinen AG and/or its affiliates and may be privileged or otherwise protected from disclosure. If you are not the intended recipient, you are hereby notified that any review, reliance or distribution by others or forwarding without express permission is strictly prohibited and may cause liability. In case you have received this message due to an error in transmission, we kindly ask you to notify the sender immediately and to delete this email and any attachment from your system.