Also, ich habe jetzt etwas mit Tasksystem, was erstmal die Basisbewegung darstellt.
In meinem Beispiel wird Bumper links für "Hindernis" und Bumper rechts für "Kein Hindernis" verwendet. Da sollen dann irgendwann mal die ACS-Tasks hin, da ich da aber ja im Moment hänge habe ich das erstmal mit den Bumpern gemacht, damit ich die in der Testumgebung eben fix drücken kann.
Code:
#include "RP6RobotBaseLib.h"
#define STATE_START 0
#define STATE_LEFT_OBSTACLE 1
#define STATE_FRONT_OBSTACLE 2
#define STATE_RIGHT_OBSTACLE 3
#define STATE_ALL_OBSTACLE 4
#define STATE_MOVE_FORWARD 5
uint8_t move_state = STATE_START;
void move_stateMachine(void)
{
switch(move_state)
{
case STATE_START:
setLEDs(0b010000);
move_state = STATE_LEFT_OBSTACLE;
rotate(50, LEFT, 90, true);
break;
case STATE_LEFT_OBSTACLE:
if(isMovementComplete())
{
if(getStopwatch1() > 500)
{
writeString_P("Blinke links");
statusLEDs.LED5 = !statusLEDs.LED5;
updateStatusLEDs();
setStopwatch1(0);
}
if(bumper_left)
{
writeString_P("Bumper links getroffen");
writeString_P("HINDERNIS");
setLEDs(0b011001);
rotate(50, RIGHT, 90, true);
move_state = STATE_FRONT_OBSTACLE;
}
if(bumper_right)
{
writeString_P("Bumper rechts getroffen");
writeString_P("KEIN HINDERNIS");
setLEDs(0b011001);
move_state = STATE_MOVE_FORWARD;
}
}
break;
case STATE_FRONT_OBSTACLE:
if(isMovementComplete())
{
if(getStopwatch1() > 500)
{
writeString_P("Blinke links");
statusLEDs.LED5 = !statusLEDs.LED5;
updateStatusLEDs();
setStopwatch1(0);
}
if(bumper_left)
{
writeString_P("Bumper links getroffen");
writeString_P("HINDERNIS");
setLEDs(0b011001);
rotate(50, RIGHT, 90, true);
move_state = STATE_RIGHT_OBSTACLE;
}
if(bumper_right)
{
writeString_P("Bumper rechts getroffen");
writeString_P("KEIN HINDERNIS");
setLEDs(0b011001);
move_state = STATE_MOVE_FORWARD;
}
}
break;
case STATE_RIGHT_OBSTACLE:
if(isMovementComplete())
{
if(getStopwatch1() > 500)
{
writeString_P("Blinke links");
statusLEDs.LED5 = !statusLEDs.LED5;
updateStatusLEDs();
setStopwatch1(0);
}
if(bumper_left)
{
writeString_P("Bumper links getroffen");
writeString_P("HINDERNIS");
setLEDs(0b011001);
rotate(50, RIGHT, 90, true);
move_state = STATE_ALL_OBSTACLE;
}
if(bumper_right)
{
writeString_P("Bumper rechts getroffen");
writeString_P("KEIN HINDERNIS");
setLEDs(0b011001);
move_state = STATE_MOVE_FORWARD;
}
}
break;
case STATE_ALL_OBSTACLE:
if(isMovementComplete())
{
if(getStopwatch1() > 500)
{
writeString_P("Blinke links");
statusLEDs.LED5 = !statusLEDs.LED5;
updateStatusLEDs();
setStopwatch1(0);
}
if(bumper_left)
{
writeString_P("Bumper links getroffen");
writeString_P("ERROR! GEFANGEN!");
setLEDs(0b011001);
rotate(50, RIGHT, 90, true);
}
if(bumper_right)
{
writeString_P("Bumper rechts getroffen");
writeString_P("KEIN HINDERNIS");
setLEDs(0b011001);
move_state = STATE_MOVE_FORWARD;
}
}
break;
case STATE_MOVE_FORWARD:
if(isMovementComplete())
{
move(50, FWD, DIST_MM(250), true);
move_state = STATE_START;
}
break;
}
}
int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(1000);
powerON();
startStopwatch1();
while(true)
{
move_stateMachine();
task_RP6System();
}
return 0;
}
Meine Frage ist nun, wie spreche ich denn nun die ACS-Tasks an. Geht das nicht einfach so wie die Bumper!?
Und noch etwas zu meiner Peinlichkeit: Was genau meint eigentlich das Blocking? Habe es mir einfach so zusammengeschnipselt.
Lesezeichen