Go to Post "The purpose of computation is insight, not numbers." - Tom Ore [more]
Home
Go Back   Chief Delphi > Technical > Programming > Java
CD-Media   CD-Spy  
portal register members calendar search Today's Posts Mark Forums Read FAQ rules

 
Reply
Thread Tools Rate Thread Display Modes
  #1   Spotlight this post!  
Unread 30-01-2016, 16:04
ckirschner ckirschner is offline
Registered User
FRC #0869
 
Join Date: Jan 2016
Location: New Jersey
Posts: 9
ckirschner is an unknown quantity at this point
Using joystick buttons with Command based programming

I'm new to command based robot programming with Java and for some reason I can't get the Joystick buttons to control my solenoid for my drive shifter.

It appears as though it's not even accepting Button input, but I'm not positive. I want Joystick Button A to enable the one side of DoubleSolenoid then another button to enable side 2 of DoubleSolenoid.

I'm thinking my initialization of my button is wrong or something?



OI CODE
Code:
package org.usfirst.frc.team869.robot;

import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.buttons.JoystickButton;
import edu.wpi.first.wpilibj.buttons.Button;
import org.usfirst.frc.team869.robot.commands.shiftDriveSpeed;
import org.usfirst.frc.team869.robot.commands.*;
//import edu.wpi.first.wpilibj.vision.USBCamera;
import edu.wpi.first.wpilibj.CameraServer;


/**
 * This class is the glue that binds the controls on the physical operator
 * interface to the commands and command groups that allow control of the robot.
 */
public class OI {
    //// CREATING BUTTONS
    // One type of button is a joystick button which is any button on a joystick.
    // You create one by telling it which joystick it's on and which button
    // number it is.
    // Joystick stick = new Joystick(port);
    // Button button = new JoystickButton(stick, buttonNumber);
	
	public static Joystick driverController = new Joystick(RobotMap.driverControllerID);
	public static Joystick operatorController = new Joystick(RobotMap.operatorControllerID);
	public static JoystickButton joystickButtonA = new JoystickButton(driverController, RobotMap.logitechControllerAbutton);
	
	
	
	//static shiftDriveSpeed shiftHigh = new shiftDriveSpeed();
	
	
	
	
	public static void init() {
		joystickButtonA.whenPressed(new shiftDriveSpeed());
		
		//new JoystickButton(driverController, RobotMap.logitechControllerYbutton).whenPressed(new driveShift(RobotMap.logitechControllerYbutton));
		
		
	}
	
	
	
	
	
		
	//public static USBCamera microSoftCam = new USBCamera("cam0");
	
		/*shiftHighSpeed.whenPressed(new driveShift());
	
		shiftHighSpeed.whenPressed(new driveShift(RobotMap.driveHighSpeed));
		shiftHighTorque.whenPressed(new driveShift(RobotMap.driveHighTorque));*/
		
		
		
	public static double getLeftDriveSpeed(){
		return driverController.getRawAxis(RobotMap.logitechControllerLYAxis);
	}

	public static double getRightDriveSpeed(){
		return driverController.getRawAxis(RobotMap.logitechControllerRYAxis);
	}

    // There are a few additional built in buttons you can use. Additionally,
    // by subclassing Button you can create custom triggers and bind those to
    // commands the same as any other Button.
    
    //// TRIGGERING COMMANDS WITH BUTTONS
    // Once you have a button, it's trivial to bind it to a button in one of
    // three ways:
    
    // Start the command when the button is pressed and let it run the command
    // until it is finished as determined by it's isFinished method.
    // button.whenPressed(new ExampleCommand());
    
    // Run the command while the button is being held down and interrupt it once
    // the button is released.
    // button.whileHeld(new ExampleCommand());
    
    // Start the command when the button is released  and let it run the command
    // until it is finished as determined by it's isFinished method.
    // button.whenReleased(new ExampleCommand());
}


shiftDriveSpeed Command:
Code:
package org.usfirst.frc.team869.robot.commands;

import edu.wpi.first.wpilibj.command.Command;

import org.usfirst.frc.team869.robot.subsystems.driveShifter;


/**
 *
 */
public class shiftDriveSpeed extends Command {
	
	driveShifter DriveShifter;
	

    public shiftDriveSpeed() {
        // Use requires() here to declare subsystem dependencies
        // eg. requires(chassis);
    	
    	requires(DriveShifter);
    	
    }

    // Called just before this Command runs the first time
    protected void initialize() {
    }

    // Called repeatedly when this Command is scheduled to run
    protected void execute() {
    	DriveShifter.shiftHighSpeed();
    }

    // Make this return true when this Command no longer needs to run execute()
    protected boolean isFinished() {
        return false;
    }

    // Called once after isFinished returns true
    protected void end() {
    }

    // Called when another command which requires one or more of the same
    // subsystems is scheduled to run
    protected void interrupted() {
    }
}



driveShifter Subsystem
Code:
package org.usfirst.frc.team869.robot.subsystems;

import edu.wpi.first.wpilibj.command.Subsystem;
import edu.wpi.first.wpilibj.DoubleSolenoid;



/**
 *
 */
public class driveShifter extends Subsystem {
	
	DoubleSolenoid speedSolenoid = new DoubleSolenoid (0,0,1);
	
	
    
    // Put methods for controlling this subsystem
    // here. Call these from Commands.

    public void initDefaultCommand() {
        // Set the default command for a subsystem here.
        //setDefaultCommand(new MySpecialCommand());
    }
    
    public void shiftHighSpeed(){
    	
    	speedSolenoid.set(DoubleSolenoid.Value.kForward);
    	
    	System.out.print("HighSpeed Shift");
    	
    	
    	
    }
    public void shiftHighTorque(){
    	
    	speedSolenoid.set(DoubleSolenoid.Value.kReverse);
    	
    	
    	
    }
}


Robot class
Code:
package org.usfirst.frc.team869.robot;

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.frc.team869.robot.commands.ExampleCommand;
import org.usfirst.frc.team869.robot.commands.driveWithJoysticks;
import org.usfirst.frc.team869.robot.subsystems.ExampleSubsystem;
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;

import org.usfirst.frc.team869.robot.subsystems.*;


/**
 * The VM is configured to automatically run this class, and to call the
 * functions corresponding to each mode, as described in the IterativeRobot
 * documentation. If you change the name of this class or the package after
 * creating this project, you must also update the manifest file in the resource
 * directory.
 */
public class Robot extends IterativeRobot {

	public static final ExampleSubsystem exampleSubsystem = new ExampleSubsystem();
	public static final driveTrain DriveTrain = new driveTrain();
	public static final driveWithJoysticks driveWithJoysticks = new driveWithJoysticks();
	public static final camera cameraSystem = new camera();
	
	
	public static OI oi;

    Command autonomousCommand;
    SendableChooser chooser;

    /**
     * This function is run when the robot is first started up and should be
     * used for any initialization code.
     */
    public void robotInit() {
		oi = new OI();
        //chooser = new SendableChooser();
        //chooser.addDefault("Default Auto", new ExampleCommand());
//        chooser.addObject("My Auto", new MyAutoCommand());
        //SmartDashboard.putData("Auto mode", chooser);
    }
	
	/**
     * This function is called once each time the robot enters Disabled mode.
     * You can use it to reset any subsystem information you want to clear when
	 * the robot is disabled.
     */
    public void disabledInit(){

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

	/**
	 * This autonomous (along with the chooser code above) shows how to select between different autonomous modes
	 * using the dashboard. The sendable chooser code works with the Java SmartDashboard. If you prefer the LabVIEW
	 * Dashboard, remove all of the chooser code and uncomment the getString code to get the auto name from the text box
	 * below the Gyro
	 *
	 * You can add additional auto modes by adding additional commands to the chooser code above (like the commented example)
	 * or additional comparisons to the switch structure below with additional strings & commands.
	 */
    public void autonomousInit() {
        autonomousCommand = (Command) chooser.getSelected();
        
		/* String autoSelected = SmartDashboard.getString("Auto Selector", "Default");
		switch(autoSelected) {
		case "My Auto":
			autonomousCommand = new MyAutoCommand();
			break;
		case "Default Auto":
		default:
			autonomousCommand = new ExampleCommand();
			break;
		} */
    	
    	// schedule the autonomous command (example)
        if (autonomousCommand != null) autonomousCommand.start();
    }

    /**
     * This function is called periodically during autonomous
     */
    public void autonomousPeriodic() {
        Scheduler.getInstance().run();
    }

    public void teleopInit() {
		// This makes sure that the autonomous stops running when
        // teleop starts running. If you want the autonomous to 
        // continue until interrupted by another command, remove
        // this line or comment it out.
    	
    	
        if (autonomousCommand != null) autonomousCommand.cancel();
    }

    /**
     * This function is called periodically during operator control
     */
    public void teleopPeriodic() {
        Scheduler.getInstance().run();    
        
        //System.out.print(Scheduler.getInstance());
        
        
        
        
    }
    
    /**
     * This function is called periodically during test mode
     */
    public void testPeriodic() {
        LiveWindow.run();
    }
}
Reply With Quote
  #2   Spotlight this post!  
Unread 30-01-2016, 16:12
Guy997's Avatar
Guy997 Guy997 is offline
Le Programmer
AKA: Sam Schwartz
FRC #1339 (Angelbots)
Team Role: Programmer
 
Join Date: Oct 2015
Rookie Year: 2015
Location: Denver
Posts: 15
Guy997 is an unknown quantity at this point
Re: Using joystick buttons with Command based programming

Instead of putting

Code:
joystickButtonA.whenPressed(new shiftDriveSpeed());
in init, make a function public OI in OI.

Code:
public OI(){
joystickButtonA.whenPressed(new shiftDriveSpeed());
}
Also, in shiftDriveSpeed, return true on isFinished or else it'll constantly shift.
__________________
I think the PDP needs more metal shavings but y'know, that's just me...

Reply With Quote
  #3   Spotlight this post!  
Unread 30-01-2016, 17:21
ckirschner ckirschner is offline
Registered User
FRC #0869
 
Join Date: Jan 2016
Location: New Jersey
Posts: 9
ckirschner is an unknown quantity at this point
Re: Using joystick buttons with Command based programming

Quote:
Originally Posted by Guy997 View Post
Instead of putting

in init, make a function public OI in OI.

Code:
public OI(){
joystickButtonA.whenPressed(new shiftDriveSpeed());
}
When I do that and I deploy I get no RobotCode and I see this error in the console:
Code:
ERROR Unhandled exception: java.lang.ExceptionInInitializerError at [org.usfirst.frc.team869.robot.Robot.robotInit(Robot.java:42), edu.wpi.first.wpilibj.IterativeRobot.startCompetition(IterativeRobot.java:72), edu.wpi.first.wpilibj.RobotBase.main(RobotBase.java:241)]ERROR Unhandled exception: java.lang.ExceptionInInitializerError at [org.usfirst.frc.team869.robot.Robot.robotInit(Robot.java:42), edu.wpi.first.wpilibj.IterativeRobot.startCompetition(IterativeRobot.java:72), edu.wpi.first.wpilibj.RobotBase.main(RobotBase.java:241)]

When I remove that code I get RobotCode and can still use the drive train however I see this in the console:
Code:
 Exception in thread "main" java.lang.NoClassDefFoundError: edu/wpi/first/wpilibj/internal/HardwareTimer 
 	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
 ERROR Unhandled exception: java.lang.ExceptionInInitializerError at [org.usfirst.frc.team869.robot.Robot.robotInit(Robot.java:42), edu.wpi.first.wpilibj.IterativeRobot.startCompetition(IterativeRobot.java:72), edu.wpi.first.wpilibj.RobotBase.main(RobotBase.java:241)] 
 WARNING: Robots don't quit! 
 WARNING: Robots don't quit! 
 ---> The startCompetition() method (or methods called by it) should have handled the exception above. 
 	at java.net.URLClassLoader$1.run(URLClassLoader.java:372) 
 ➔ Launching «'/usr/local/frc/JRE/bin/java' '-jar' '/home/lvuser/FRCUserProgram.jar'» 
 platform: /Linux/arm/ 
 ➔ Launching «'/usr/local/frc/JRE/bin/java' '-jar' '/home/lvuser/FRCUserProgram.jar'» 
 ➔ Launching «'/usr/local/frc/JRE/bin/java' '-jar' '/home/lvuser/FRCUserProgram.jar'» 
 ERROR Unhandled exception: java.lang.ExceptionInInitializerError at [org.usfirst.frc.team869.robot.Robot.robotInit(Robot.java:42), edu.wpi.first.wpilibj.IterativeRobot.startCompetition(IterativeRobot.java:72), edu.wpi.first.wpilibj.RobotBase.main(RobotBase.java:241)] 
 NT: server: client CONNECTED: 10.8.69.221 port 60331

So when I modify it with what you mentioned it breaks it, however there may be something underlying in my code that's ultimately causing that issue.
Reply With Quote
  #4   Spotlight this post!  
Unread 30-01-2016, 17:34
Guy997's Avatar
Guy997 Guy997 is offline
Le Programmer
AKA: Sam Schwartz
FRC #1339 (Angelbots)
Team Role: Programmer
 
Join Date: Oct 2015
Rookie Year: 2015
Location: Denver
Posts: 15
Guy997 is an unknown quantity at this point
Re: Using joystick buttons with Command based programming

Whenever we get the robots don't quit error, we're always assigning two sensors to one port, so maybe you're assigning two solenoids to one port on the PCM.
__________________
I think the PDP needs more metal shavings but y'know, that's just me...

Reply With Quote
  #5   Spotlight this post!  
Unread 30-01-2016, 17:42
ckirschner ckirschner is offline
Registered User
FRC #0869
 
Join Date: Jan 2016
Location: New Jersey
Posts: 9
ckirschner is an unknown quantity at this point
Re: Using joystick buttons with Command based programming

Quote:
Originally Posted by Guy997 View Post
Whenever we get the robots don't quit error, we're always assigning two sensors to one port, so maybe you're assigning two solenoids to one port on the PCM.
I was assigning the PCM to the default of 0. I thought I needed to since the PCM wasn't responding to any of my button clicks, but it looks like I just don't know how to properly assign button clicks with Command Based programming.

So when I remove the PCM assignment from the DoubleSolenoid object that error goes away. But then I re-add the modifications you mentioned before and I still get this error:


Code:
ERROR Unhandled exception: java.lang.ExceptionInInitializerError at [org.usfirst.frc.team869.robot.Robot.robotInit(Robot.java:42), edu.wpi.first.wpilibj.IterativeRobot.startCompetition(IterativeRobot.java:72), edu.wpi.first.wpilibj.RobotBase.main(RobotBase.java:241)]

OI Looks like this:
Code:
package org.usfirst.frc.team869.robot;

import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.buttons.JoystickButton;
import edu.wpi.first.wpilibj.buttons.Button;
import org.usfirst.frc.team869.robot.commands.shiftDriveSpeed;
import org.usfirst.frc.team869.robot.commands.*;
//import edu.wpi.first.wpilibj.vision.USBCamera;
import edu.wpi.first.wpilibj.CameraServer;


/**
 * This class is the glue that binds the controls on the physical operator
 * interface to the commands and command groups that allow control of the robot.
 */
public class OI {
    //// CREATING BUTTONS
    // One type of button is a joystick button which is any button on a joystick.
    // You create one by telling it which joystick it's on and which button
    // number it is.
    // Joystick stick = new Joystick(port);
    // Button button = new JoystickButton(stick, buttonNumber);
	
	public static Joystick driverController = new Joystick(RobotMap.driverControllerID);
	public static Joystick operatorController = new Joystick(RobotMap.operatorControllerID);
	public static JoystickButton joystickButtonA = new JoystickButton(driverController, RobotMap.logitechControllerAbutton);
	
	
	
	static shiftDriveSpeed shiftHigh = new shiftDriveSpeed();
	
	
	
	
	public OI() {
		
		joystickButtonA.whenPressed(shiftHigh);
		
		//new JoystickButton(driverController, RobotMap.logitechControllerYbutton).whenPressed(new driveShift(RobotMap.logitechControllerYbutton));
		
		
	}
	
	
	
	
	
		
	//public static USBCamera microSoftCam = new USBCamera("cam0");
	
		/*shiftHighSpeed.whenPressed(new driveShift());
	
		shiftHighSpeed.whenPressed(new driveShift(RobotMap.driveHighSpeed));
		shiftHighTorque.whenPressed(new driveShift(RobotMap.driveHighTorque));*/
		
		
		
	public static double getLeftDriveSpeed(){
		return driverController.getRawAxis(RobotMap.logitechControllerLYAxis);
	}

	public static double getRightDriveSpeed(){
		return driverController.getRawAxis(RobotMap.logitechControllerRYAxis);
	}

    // There are a few additional built in buttons you can use. Additionally,
    // by subclassing Button you can create custom triggers and bind those to
    // commands the same as any other Button.
    
    //// TRIGGERING COMMANDS WITH BUTTONS
    // Once you have a button, it's trivial to bind it to a button in one of
    // three ways:
    
    // Start the command when the button is pressed and let it run the command
    // until it is finished as determined by it's isFinished method.
    // button.whenPressed(new ExampleCommand());
    
    // Run the command while the button is being held down and interrupt it once
    // the button is released.
    // button.whileHeld(new ExampleCommand());
    
    // Start the command when the button is released  and let it run the command
    // until it is finished as determined by it's isFinished method.
    // button.whenReleased(new ExampleCommand());
}
Reply With Quote
  #6   Spotlight this post!  
Unread 30-01-2016, 17:47
ckirschner ckirschner is offline
Registered User
FRC #0869
 
Join Date: Jan 2016
Location: New Jersey
Posts: 9
ckirschner is an unknown quantity at this point
Re: Using joystick buttons with Command based programming

If it helps the repo is here and I just committed it:



https://github.com/ckirschner/FRC-869-Robot-2016
Reply With Quote
  #7   Spotlight this post!  
Unread 31-01-2016, 01:35
Guy997's Avatar
Guy997 Guy997 is offline
Le Programmer
AKA: Sam Schwartz
FRC #1339 (Angelbots)
Team Role: Programmer
 
Join Date: Oct 2015
Rookie Year: 2015
Location: Denver
Posts: 15
Guy997 is an unknown quantity at this point
Re: Using joystick buttons with Command based programming

You might want to have Commandbase.init() in your robotInit.

Like so:
Code:
 public void robotInit() {
		oi = new OI();
        // instantiate the command used for the autonomous period
        CommandBase.init();
That's a snippet from our code.

I'm not positive that's the issue, but it might be a problem.
__________________
I think the PDP needs more metal shavings but y'know, that's just me...

Reply With Quote
  #8   Spotlight this post!  
Unread 31-01-2016, 01:59
MaGiC_PiKaChU's Avatar
MaGiC_PiKaChU MaGiC_PiKaChU is offline
Drive Coach
AKA: Antoine L.
FRC #3360 (Hyperion)
Team Role: Mentor
 
Join Date: Mar 2014
Rookie Year: 2012
Location: Sherbrooke
Posts: 608
MaGiC_PiKaChU has a reputation beyond reputeMaGiC_PiKaChU has a reputation beyond reputeMaGiC_PiKaChU has a reputation beyond reputeMaGiC_PiKaChU has a reputation beyond reputeMaGiC_PiKaChU has a reputation beyond reputeMaGiC_PiKaChU has a reputation beyond reputeMaGiC_PiKaChU has a reputation beyond reputeMaGiC_PiKaChU has a reputation beyond reputeMaGiC_PiKaChU has a reputation beyond reputeMaGiC_PiKaChU has a reputation beyond reputeMaGiC_PiKaChU has a reputation beyond repute
Re: Using joystick buttons with Command based programming

in robotInit, you have to initialise your subsystems before your OI. Else you will try to build commands that use methods from non-existing subsystems
__________________
2012 - 3360 - Junior member
2013 - 3360 - Lead Programmer, Human player
2014 - 3360 - Lead Programmer, Human player
2015 - 3360 - Lead Programmer, Driver
2016 - 3360 - Mentor, Drive coach



Reply With Quote
  #9   Spotlight this post!  
Unread 31-01-2016, 09:05
ckirschner ckirschner is offline
Registered User
FRC #0869
 
Join Date: Jan 2016
Location: New Jersey
Posts: 9
ckirschner is an unknown quantity at this point
Re: Using joystick buttons with Command based programming

Quote:
Originally Posted by Guy997 View Post
You might want to have Commandbase.init() in your robotInit.

Like so:
Code:
 public void robotInit() {
		oi = new OI();
        // instantiate the command used for the autonomous period
        CommandBase.init();
That's a snippet from our code.

I'm not positive that's the issue, but it might be a problem.


Quote:
Originally Posted by MaGiC_PiKaChU View Post
in robotInit, you have to initialise your subsystems before your OI. Else you will try to build commands that use methods from non-existing subsystems

Okay that makes sense then. I will check that out today. However one question I have about that (I apologize I'm not actually a programmer, just appointed to this position as the best candidate to figure out programming the robot )

If you look in my code I created the driveTrain class in the Robot class but not in robotInit and the drive train works. So is that sufficient? And if so, or if not, what exactly is robotInit doing that the declaration inside the Robot class isn't?

Code:
public class Robot extends IterativeRobot {

	public static final ExampleSubsystem exampleSubsystem = new ExampleSubsystem();
	public static final driveTrain DriveTrain = new driveTrain();
	public static final driveWithJoysticks driveWithJoysticks = new driveWithJoysticks();
	public static final camera cameraSystem = new camera();
	
	
	public static OI oi;

    Command autonomousCommand;
    SendableChooser chooser;

    /**
     * This function is run when the robot is first started up and should be
     * used for any initialization code.
     */
    public void robotInit() {
		oi = new OI();
        //chooser = new SendableChooser();
        //chooser.addDefault("Default Auto", new ExampleCommand());
//        chooser.addObject("My Auto", new MyAutoCommand());
        //SmartDashboard.putData("Auto mode", chooser);
    }
Reply With Quote
Reply


Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump


All times are GMT -5. The time now is 10:52.

The Chief Delphi Forums are sponsored by Innovation First International, Inc.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi