We’re having trouble with out robot losing control every time Wait() is used. We need to delay part of our code from executing for 1/10th or 1/100th second. That part works (we can’t notice the delay), but in other parts of the code (where we need 1.5 second delay) we completely lose control for that period of time. Someone mentioned that we could use the Timer() class for this, but we weren’t sure how accurate it is, having to Start and Stop it in a very short period of time. Here’s part of out code that causes the most issues:
Hand-coded state machines are a bit tedious. If you have more than a couple places you need them, the command-based robot approach works better. Robot builder will generate the basic code for your robot after you describe the subsystems and commands.
Here’s an example of what a hand-coded state machine looks like.
// declare the timeout variables at the top of your Robot.cpp
static double waitForwardTimeout = 0.0;
static double waitReverseTimeout = 0.0;
...
if (waitForwardTimeout > 0.0) {
if (Timer::GetPPCTimestamp() >= waitForwardTimeout) {
waitForwardTimeout = 0.0;
// DO SOMETHING AFTER WAITING FOR FORWARD TIMEOUT
Forward->Set(0);
Reverse->Set(1);
waitReverseTimeout = Timer::GetPPCTimestamp + 1.5;
}
}
else if (waitReverseTimeout > 0.0) {
if (Timer::GetPPCTimestamp() >= waitReverseTimeout) {
waitReverseTimeout = 0.0;
// DO SOMETHING AFTER WAITING FOR REVERSE TIMEOUT
}
}
else if (LeftBumper && RightBumper) { // xBox controller
front->Set(-speed); // Talons
back->Set(speed);
if (ButtonA) {
Forward->Set(1); // solenoids
Reverse->Set(0);
waitForwardTimeout = Timer::GetPPCTimestamp + 0.1;
}
}
There are many ways to implement a state machine, but that code is probably the easiest to fit into your existing code.
In case you can’t recognize your code in that example, here’s your code with a couple comments added to match the comments in my example:
if ((LeftBumper)&&(RightBumper)) { // xBox controller
front->Set(-speed); // Talons
back-> Set(speed);
if (ButtonA) {
Forward->Set(1); // solenoids
Reverse->Set(0);
Wait(0.1);
// DO SOMETHING AFTER WAITING FOR FORWARD TIMEOUT
Forward->Set(0);
Reverse->Set(1);
Wait(1.5);
// DO SOMETHING AFTER WAITING FOR REVERSE TIMEOUT
}
}