View Single Post
  #2   Spotlight this post!  
Unread 12-02-2015, 17:58
cstelter cstelter is offline
Programming Mentor
AKA: Craig Stelter
FRC #3018 (Nordic Storm)
Team Role: Mentor
 
Join Date: Apr 2012
Rookie Year: 2012
Location: Mankato, MN
Posts: 77
cstelter will become famous soon enough
Re: Running Commands

Quote:
Originally Posted by antonyebert View Post
Okay so, I pretty much have my entire program done (except for the autonomous), and tried to test it out on our robot. I got everything hooked up, all the lights were on on the robot, and the driver station was giving me the go ahead. Once I hit enable though, nothing happens. I'm thinking there's a problem with my program, namely in making all of the code I wrote actually run.

In the Robot.java class (the one that has all of the Scheduler.getinstance.run() lines), do I need to run my commands for teleop and autonomous there? Or do I just leave it as is? And, if I do need to run my commands from there, how do I go about doing that? (I know how to call and run a method from an alternate class, but not the entire alternate class itself)
from the looks of your code, if you select Autonomous and enable, it should run your AutonomousLift command only.

If nothing is happening also in Teleop when you enable, you likely don't have a default command for your drivetrain subsystem. I'm presuming DriveTrain extends Subsystem. If so, you can add something like this:

Code:
public class DriveTrain extends Subsystem {
        ...

        public void initDefaultCommand() {
            setDefaultCommand(new DriveWithJoystick());
        }
        ...
}
That presumes you have a command like DriveWithJoystick that you by default want to control your DriveTrain. Be sure that both DriveWithJoystick or equivalent has requires(driveTrain) as well as AutonomousDrive(). Scheduler has to interrupt the default command to schedule AutonomousDrive().


See notes in red below that I have injected into your code:

Code:
package org.usfirst.frc4993.Mater;

import edu.wpi.first.wpilibj.IterativeRobot;
import edu.wpi.first.wpilibj.command.Command;
import edu.wpi.first.wpilibj.command.Scheduler;
import edu.wpi.first.wpilibj.livewindow.LiveWindow;

import org.usfirst.frc4993.Mater.commands.*;
import org.usfirst.frc4993.Mater.subsystems.*;


public class Robot extends IterativeRobot

    Command autonomousCommand;

    public static OI oi;
   
    public static DriveTrain driveTrain;
    public static Arms arms;

    //  I think this is what you were going for below in RobotInit
    private class AutonomousSequence extends CommandGroup {
        public AutonomousSequence() {
            addSequential(new AutonomousDrive());
            addSequential(new AutonomousLift());
        }
     }

    
    public void robotInit() {
    RobotMap.init();
      
        driveTrain = new DriveTrain();
        arms = new Arms();

        oi = new OI();
        
        autonomousCommand = new AutonomousDrive();
        //WARNING-- Next Line will forget about AutonomousDrive and 
        //reassign autonomousCommand to be a new instance of AutonomousLift, 
        //causing autonomous to run *only* AutonomousLift()
        autonomousCommand = new AutonoumousLift();
        //I suspect you want to create a new thing like the CommandGroup above
        //But instead of a private class in Robot, 
        //        it should be a public class in its own AutonomousSequence.java file 
        // Then the following line can replace the above to assignments
        autonomousCommand = new AutonomousSequence();

        //Then again, perhaps you couldn't make AutonomousDrive() 
        //work so you intentionally reassigned AutonomousLift.  I'm doing a lot of guesswork here.
    }

    public void disabledInit(){

    }

    public void disabledPeriodic() {
        Scheduler.getInstance().run();
    }

    public void autonomousInit() {
        if (autonomousCommand != null) autonomousCommand.start();
    }

    public void autonomousPeriodic() {
        Scheduler.getInstance().run();
    }

    public void teleopInit() {
        if (autonomousCommand != null) autonomousCommand.cancel();
    }

    public void teleopPeriodic() {
        Scheduler.getInstance().run();
    }

    public void testPeriodic() {
        LiveWindow.run();
    }
}
If you can upload your code to github or bitbucket, then we can assist better with less guesswork.
Reply With Quote