Multiple Autons

I want to run different autonomous modes for different starting positions and i was wondering A) How do you do that in the code and B) can it be set from the Classmate and if not can it be set from a controller

The simplest way to do this is to have a switch/case taking in a variable that you predetermine before a match and having the separate autonomous modes there. For example…


int position = 1;
switch(position) {
  case 1:
    // autonomous mode for close
    break;
  case 2:
    // autonomous mode for mid
    break;
  case 3:
    // autonomous mode for far
    break;
}

It is also legal to have a “switch” of some sorts on your robot plugged into your sidecar that you flip before the match as you set up your bot to determine position (in which case your code would still look similar to the code above).

Our robot has 16 different autonomous modes that can be programmed. We simply put 4 switches onto the robot and used the get() method to get true or false. Then we converted true (or false, depending on preference). Into 1’s and 0’s. Finally, we multiplied the values together into a variable and switch/case/breaked it. Although for readability we made a seperate method for each case, and called the specific method.

edit: the switches work only on the robot, i beleive, because we tried control board switches last year and it did not read them, therefore we had to switch to robot switches. But both are easy to use. Also not it’s good to write down what each autonomous position is, oh yeah and make copies of it.

You can definitely do it from the Classmate. Just go to the I/O tab and select one or more of the digital inputs. In the code, use station.getInstance().getDigitalInput(number) to get the value of the input, where station is the name of the DriverStation object. There are 10 digital inputs, so you can have 2^10-1=1023 different autonomous programs.

where do you assign the switch between the autons in the code do you do it in disabled periodic or robot init

Yes, but I’m fairly certain that you cannot read from the driver station input in autonomous mode.

Also, 1024 different autonomous programs, you only subtract 1 to get the highest number you can represent, so you can represent 0-1023, which is 1024 integers total.

You can in disabled. We use a push button on our control board to cycle through autonomous modes. The dashboard gives a read out of the current selection.

I’m very certain that you can because that’s exactly what our team did during the Finger Lake Regionals. I put 3 if statements in autonomousInit() and had each of them start a new thread.

Also, 1024 different autonomous programs, you only subtract 1 to get the highest number you can represent, so you can represent 0-1023, which is 1024 integers total.

Oops, you’re right; I was getting confused.

Ok i really have very little preference to how the switch is made i am just looking for help with the code. if you can tell me anyway to set and switch between autons that would be fantastic

Here is a sniippet of our code that handles auton switiching. It is sanitized, and not all variables are shown declared.
Switching takes place during disabledPeriodic. Care should be taken in teleopinit to clean up after autonomous before heading into teleop mode so that nothing unexpected happens.


public void autonomousPeriodic()
    {
        this.getWatchdog().feed();
        switch (autoMode)
        {
            case 1:
                // Add kick three balls in goal code here
                message("Performing auto in FAR field");
                break;
            case 2:
                // Add kick two balls in goal code here
                message("Performing auto in MID field");
                break;
            case 3:
                // Add kick one ball in goal here
                message("Performing auto in NEAR field");
                break;
            default:
                // Auto program isn't working so do this instead
                message("Doing nothing");
                break;
        }
    }

    public void disabledInit()
    {
        this.getWatchdog().feed();
    }

    public void disabledPeriodic()
    {
        this.getWatchdog().feed();
        // Using joystick trigger to switch modes
        if (!autoTrigger && js_right.getRawButton(1))
        {
            if (autoMode < 4)
            {
                autoMode++;
            } else
            {
                autoMode = 1;
            }
            autoTrigger = true;
        } else if (!js_right.getRawButton(1))
        {
            autoTrigger = false;
        }
        // Update message at driverstation to reflect current
        // mode selection
        switch (autoMode)
        {
            case 1:
                message("1. Autonomous for FAR field");
                break;
            case 2:
                message("2. Autonomous for  MID field");
                break;
            case 3:
                message("3. Autonomous for NEAR field");
                break;
            default:
                message("Do Nothing...in any position!");
                break;
        }
    }
public void message(String s)
    {
        String temp = s;
        if (!temp.equals(userMessage))
        {
            //System.out.println(s);
            userMessage = temp;
            int length = s.length();
            //int numRows = 1;
            String] row = new String[6];
            for (int i = 0; i < 6; i++)
            {
                row* = "";
            }
            if (length > 20)
            {
                int backwards = 5;
                int index = 0;
                // Each line can only hold 21 characters, so
                // break the line in reverse at a space.
                // This will end up not working if a message is STILL
                // too long.  Program must ensure not to send messages
                // too long.
                while (length > 20 && backwards >= 0)
                {
                    index = temp.lastIndexOf(' ', 20);
                    row[backwards] = temp.substring(index);
                    row[backwards].trim();
                    temp = temp.substring(0, index).trim();
                    length = temp.length();
                    backwards--;
                }
                row[backwards]=temp;
            } else
            {
                row[5] = temp;
            }
            // Erase the message box
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kMain6, 1, "                      ");
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kUser2, 1, "                      ");
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kUser3, 1, "                      ");
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kUser4, 1, "                      ");
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kUser5, 1, "                      ");
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kUser6, 1, "                      ");
            DriverStationLCD.getInstance().updateLCD();
            // Now write the data
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kMain6, 1, row[0]);
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kUser2, 1, row[1]);
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kUser3, 1, row[2]);
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kUser4, 1, row[3]);
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kUser5, 1, row[4]);
            DriverStationLCD.getInstance().println(DriverStationLCD.Line.kUser6, 1, row[5]);
            DriverStationLCD.getInstance().updateLCD();
        }
    }

Since it doesn’t seem like you’re the programmer who coded autonomous, get that programmer to do it. It’s not a good idea to mess around with somebody else’s code because it’s very easy to break something or make an error that’s super hard to fix.

It is my code i am just relatively new to java

I wrote a code that can switch between i am wondering were i can put it that it will be accessible in disabled and in autonomous.
if it helps my code looks like this(

private boolean AutonMode0() {
if (driveStick.getRawButton(1))
return false;
if (driveStick.getRawButton(2))
return false;
if (driveStick.getRawButton(3))
return true;
if (driveStick.getRawButton(4))
return true;
else {
return false;
}
}
private boolean AutonMode1() {
if (driveStick.getRawButton(1))
return false;
if (driveStick.getRawButton(2))
return true;
if (driveStick.getRawButton(3))
return false;
if (driveStick.getRawButton(4))
return true;
else {
return false;
}
}

)

That works,and you’d put it inside the brackets enclosing the class, except you have to change the method declarations from private boolean Name to private static boolean Name.

There’s a much simpler way to do this. In autonomousInit(), do:

if (driveStick.getRawButton(1)) {
run whatever;
}
if (driveStick.getRawButton(2)) {
run whatever;
}
and so on

Will these work if you are standing 5 feet away from your controls? If you are using a joystick as your method for selecting an autonomous mode, you need to do it in disabledPeriodic. And you need to set a VARIABLE to some value in response to the input. Your joystick methods are state calls. They don’t remember what was done in the past. You store the input in a GLOBAL variable that can be examined by autonomous.

Do not place your autonomous code in autonomousInit, as this is called only once on the way to autonomousPeriodic. Initialize variables and motors and perhaps decide which auton to run in autonomousPeriodic.

HINT: see my code above