Wait() issue

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:

			if ((LeftBumper)&&(RightBumper))  //xBox controller
			{
				front->Set(-speed); //Talons
				back-> Set(speed);
				if (ButtonA)
				{
					Forward->Set(1); //solenoids
					Reverse->Set(0);
					Wait(0.1);
					Forward->Set(0);
					Reverse->Set(1);
					Wait(1.5);
				}
			}

Has anyone else encountered this problem?

This is a classic problem that new teams (or programmers) struggle with every season.

You need to either

a) use a state machine, or

b) put your wait code in a separate thread where it can run concurrently.

Here’s a generic explanation of state machine.

I agree with trying a state machine first.

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
    }
}