PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm frage



Stephan90
10.07.2013, 21:04
Hallo,
ich habe mich jetzt einige Std. mit den Beispielen beschäftig so langsam versteh ich das ganze, aber ich habe fragen zu ein paar sachen zu denen ich noch nichts gefunden habe und die ich nicht zuordnen kann.
1.)Für was steht #define IDLE 0 und #define MOVE_FORWARDS 1 z.B im beispiel Move 04? Und was genau wird damit ausgeführt?
man sieht ja befehle wie !IDLE oder es steht mal in den klammern von behaviour_command_t cruise mal IDLE oder auch mal MOVE_FORWARTS das verstehe ich nicht so genau warum und was
es bedeutet
2.)Und wie wird behaviour_command_t cruise einfach nur behaviour cruise?
3.)void moveCommand(behaviour_command_t * cmd) was wir hier abgerufen und für was steht cmd?
Danke im vorraus

Dirk
10.07.2013, 21:21
Zu 1:
Die #define Direktive ist im Prinzip nur eine Textersatz-Funktion.
Bei #define IDLE 0 wird also überall im Programm, wo IDLE vorkommt, eine 0 eingesetzt.
Das Ganze hilft dabei, das Programm verständlicher zu machen.

Zu 2:
behaviour_command_t ist ein "höherer Datentyp", der im Programm mit typedef struct definiert wurde. Durch solch einen Datentyp werden einzelne Daten zusammengefaßt, um sie gemeinsam als quasi EINE Variable nutzen zu können.
"behaviour_command_t" ist damit der NAME dieses neuen Datentyps. Er erfüllt denau dieselbe Funktion wie uint8_t oder double.
Damit ist noch keine Variable eingerichtet: Das wird mit "behaviour_command_t cruise" gemacht. Danach gibt es die "höhere Variable" cruise. Sie besteht aus uint8_t speed_left, uint8_t speed_right, usw.

Zu 3:
Hier wird die Funktion moveCommand mit dem Parameter cmd aufgerufen, wobei cmd vom Typ behaviour_command_t ist.

Stephan90
10.07.2013, 21:49
ok danke schonmal,
da habe ich habe nochmal ne frage zu cmd:
void moveCommand(behaviour_command_t * cmd)
{
if(cmd->move_value > 0) // any move/rotate commands?
{
if(cmd->rotate)
rotate(cmd->speed_left, cmd->dir, cmd->move_value, false);
else if(cmd->move)
move(cmd->speed_left, cmd->dir, DIST_MM(cmd->move_value), false);
cmd->move_value = 0; // clear move value - the move commands are only
// given once and then runs in background.
}
else if(!(cmd->move || cmd->rotate)) // just move at speed?
{
changeDirection(cmd->dir);
moveAtSpeed(cmd->speed_left,cmd->speed_right);
}
else if(isMovementComplete()) // movement complete? --> clear flags!
{
cmd->rotate = false;
cmd->move = false;
}
}
also werden bei deisem Programmabschnitt die werte aus behaviour_command_t abgerufen?
Was genau passiert dann in diesem abschnitt?
am anfang verstehe ich es schonmal so, das wenn bei behaviour_command_t cruise an der letzten stelle IDLE steht ist move_value 0 und wenn da MOVE_FORWART steht ist move_value 1 oder?
aber was dann im genauen passiert versthe ich nicht so genau. Kannst du mir das noch so grob erklären?
Danke

Valen
11.07.2013, 09:07
Vielleicht ist das einfacher zu verstehen wen die Code etwas mehr Strukturiert wiedergegeben wird. Ich habe Tab-zeichen zugefügt so das alle Zeilen im gleichen {}-Hierarchie-niveau die selbe Einsprung-abständen haben.

Tip: Setze deine Code zwisschen [ code ] Schreib hier deine Code [ / code] Tags in dein Bericht. (Nur die Leer-zeichen entfernen zwischen die [ ] Klammern !) Dann wird es isoliert von dein normale Text in ein Spezielles Fenster. Und werden auch Zeilen-einsprung behalten.


void moveCommand(behaviour_command_t * cmd)
{
if(cmd->move_value > 0) // any move/rotate commands?
{
if(cmd->rotate) rotate(cmd->speed_left, cmd->dir, cmd->move_value, false);
else if(cmd->move) move(cmd->speed_left, cmd->dir, DIST_MM(cmd->move_value), false);

// von Valen: Das nächste gehört nicht mehr zu den "if else if" Gesetzen. Weil das hier oben mit ein Punkt-komma abgeschlossen ist. Und kein tieferes {} Niveau verwendet wird.

cmd->move_value = 0; // clear move value - the move commands are only
// given once and then runs in background.
}
else if(!(cmd->move || cmd->rotate)) // just move at speed?
{
changeDirection(cmd->dir);
moveAtSpeed(cmd->speed_left,cmd->speed_right);
}
else if(isMovementComplete()) // movement complete? --> clear flags!
{
cmd->rotate = false;
cmd->move = false;
}
}

Stephan90
12.07.2013, 16:16
Ok, also werden mit cmd die werte geändert?
dann nochmal eine Frage zu IDLE in der funktion void behaviour_escape(void) steht ganz als erstes case IDLE dazu steht in der erklärung das kein object erkannt wurde, also müsste er ja gerade aus fahren, aber wo ist IDLE zugeornet das er geradeausfahren soll wenn hier nur 0 gesetzt ist?
Und für was steht escape.move_value und was bedeuten diese werte und warum sind es verschiedene? und wofür genau ist hier der counter?
Danke