Add CANSpeedController interface in Java.

This helps to bring Java to parity with C++.

Change-Id: Ibc79fd788c5c3c11af5de49d0c87436ebf4ba710
This commit is contained in:
James Kuszmaul
2015-06-09 16:33:41 -04:00
parent 6ce98056d3
commit 27e4509676
4 changed files with 147 additions and 20 deletions

View File

@@ -23,7 +23,7 @@ import edu.wpi.first.wpilibj.util.CheckedAllocationException;
* Texas Instruments Jaguar Speed Controller as a CAN device.
* @author Thomas Clark
*/
public class CANJaguar implements MotorSafety, PIDOutput, SpeedController, LiveWindowSendable {
public class CANJaguar implements MotorSafety, PIDOutput, CANSpeedController, LiveWindowSendable {
public static final int kMaxMessageDataSize = 8;
@@ -217,7 +217,7 @@ public class CANJaguar implements MotorSafety, PIDOutput, SpeedController, LiveW
// Not all Jaguar firmware reports a hardware version.
m_hardwareVersion = 0;
}
// 3330 was the first shipping RDK firmware version for the Jaguar
if (m_firmwareVersion >= 3330 || m_firmwareVersion < 108)
{

View File

@@ -0,0 +1,122 @@
package edu.wpi.first.wpilibj;
public interface CANSpeedController extends SpeedController {
/**
* Mode determines how the motor is controlled, used internally.
*
* Note that the Jaguar does not support follower mode.
*/
public enum ControlMode {
PercentVbus((byte)0),
Current((byte)1),
Speed((byte)2),
Position((byte)3),
Voltage((byte)4),
Follower((byte)5); // Not supported by Jaguar.
public byte value;
public static ControlMode valueOf(byte value) {
for(ControlMode mode : values()) {
if(mode.value == value) {
return mode;
}
}
return null;
}
private ControlMode(byte value) {
this.value = value;
}
}
/**
* Return the current setpoint.
*
* @return the current setpoint, as passed to {@link #set}.
*/
public double get();
/**
* Set the output for whichever mode we are currently in.
*
* @param value the setpoint, in some units depending on the mode.
*/
public void set(double value);
/**
* Disables to motor controller output.
*/
public void disable();
/**
* Set the proportional PID constant.
*/
public void setP(double p);
/**
* Set the integral PID constant.
*/
public void setI(double i);
/**
* Set the derivative PID constant.
*/
public void setD(double d);
/**
* Get the current input (battery) voltage.
*
* @return the input voltage to the controller (in Volts).
*/
public double getBusVoltage();
/**
* Get the current output voltage.
*
* @return the output voltage to the motor in volts.
*/
public double getOutputVoltage();
/**
* Get the current being applied to the motor.
*
* @return the current motor current (in Amperes).
*/
public double getOutputCurrent();
/**
* Get the current temperature of the controller.
*
* @return the current temperature of the controller, in degrees Celsius.
*/
public double getTemperature();
/**
* Return the current position of whatever the current selected sensor is.
*
* See specific implementations for more information on selecting feedback
* sensors.
*
* @return the current sensor position.
*/
public double getPosition();
/**
* Return the current velocity of whatever the current selected sensor is.
*
* See specific implementations for more information on selecting feedback
* sensors.
*
* @return the current sensor velocity.
*/
public double getSpeed();
/**
* Set the maximum rate of change of the output voltage.
*
* @param rampRate the maximum rate of change of the votlage, in Volts / sec.
*/
public void setVoltageRampRate(double rampRate);
}

View File

@@ -20,14 +20,14 @@ import edu.wpi.first.wpilibj.livewindow.LiveWindowSendable;
import edu.wpi.first.wpilibj.tables.ITable;
import edu.wpi.first.wpilibj.tables.ITableListener;
public class CANTalon implements MotorSafety, PIDOutput, SpeedController, LiveWindowSendable {
public class CANTalon implements MotorSafety, PIDOutput, PIDSource, CANSpeedController, LiveWindowSendable {
private MotorSafetyHelper m_safetyHelper;
public enum ControlMode {
public enum TalonControlMode {
PercentVbus(0), Follower(5), Voltage(4), Position(1), Speed(2), Current(3), Disabled(15);
public int value;
public static ControlMode valueOf(int value) {
for(ControlMode mode : values()) {
public static TalonControlMode valueOf(int value) {
for(TalonControlMode mode : values()) {
if(mode.value == value) {
return mode;
}
@@ -36,7 +36,7 @@ public class CANTalon implements MotorSafety, PIDOutput, SpeedController, LiveWi
return null;
}
private ControlMode(int value) {
private TalonControlMode(int value) {
this.value = value;
}
}
@@ -79,7 +79,7 @@ public class CANTalon implements MotorSafety, PIDOutput, SpeedController, LiveWi
private CanTalonSRX m_impl;
ControlMode m_controlMode;
TalonControlMode m_controlMode;
private static double kDelayForSolicitedSignals = 0.004;
int m_deviceNumber;
@@ -96,7 +96,7 @@ public class CANTalon implements MotorSafety, PIDOutput, SpeedController, LiveWi
m_profile = 0;
m_setPoint = 0;
setProfile(m_profile);
applyControlMode(ControlMode.PercentVbus);
applyControlMode(TalonControlMode.PercentVbus);
}
public CANTalon(int deviceNumber,int controlPeriodMs) {
m_deviceNumber = deviceNumber;
@@ -106,13 +106,13 @@ public class CANTalon implements MotorSafety, PIDOutput, SpeedController, LiveWi
m_profile = 0;
m_setPoint = 0;
setProfile(m_profile);
applyControlMode(ControlMode.PercentVbus);
applyControlMode(TalonControlMode.PercentVbus);
}
@Override
public void pidWrite(double output)
{
if (getControlMode() == ControlMode.PercentVbus) {
if (getControlMode() == TalonControlMode.PercentVbus) {
set(output);
}
else {
@@ -120,6 +120,11 @@ public class CANTalon implements MotorSafety, PIDOutput, SpeedController, LiveWi
}
}
@Override
public double pidGet() {
return getPosition();
}
public void delete() {
m_impl.delete();
}
@@ -366,7 +371,7 @@ public class CANTalon implements MotorSafety, PIDOutput, SpeedController, LiveWi
/**
* Returns temperature of Talon, in degrees Celsius.
*/
public double getTemp() {
public double getTemperature() {
long tempp = CanTalonJNI.new_doublep(); // Create a new swig pointer.
m_impl.GetTemp(new SWIGTYPE_p_double(tempp, true));
return CanTalonJNI.doublep_value(tempp);
@@ -446,7 +451,7 @@ public class CANTalon implements MotorSafety, PIDOutput, SpeedController, LiveWi
return CanTalonJNI.intp_value(speedp);
}
public ControlMode getControlMode() {
public TalonControlMode getControlMode() {
return m_controlMode;
}
/**
@@ -455,16 +460,16 @@ public class CANTalon implements MotorSafety, PIDOutput, SpeedController, LiveWi
* @param controlMode Control mode to ultimately enter once user calls set().
* @see #set
*/
private void applyControlMode(ControlMode controlMode) {
private void applyControlMode(TalonControlMode controlMode) {
m_controlMode = controlMode;
if (controlMode == ControlMode.Disabled)
if (controlMode == TalonControlMode.Disabled)
m_controlEnabled = false;
// Disable until set() is called.
m_impl.SetModeSelect(ControlMode.Disabled.value);
m_impl.SetModeSelect(TalonControlMode.Disabled.value);
UsageReporting.report(tResourceType.kResourceType_CANTalonSRX, m_deviceNumber + 1, controlMode.value);
}
public void changeControlMode(ControlMode controlMode) {
public void changeControlMode(TalonControlMode controlMode) {
if(m_controlMode == controlMode){
/* we already are in this mode, don't perform disable workaround */
}else{
@@ -484,7 +489,7 @@ public class CANTalon implements MotorSafety, PIDOutput, SpeedController, LiveWi
}
public void disableControl() {
m_impl.SetModeSelect(ControlMode.Disabled.value);
m_impl.SetModeSelect(TalonControlMode.Disabled.value);
m_controlEnabled = false;
}