diff --git a/src/main/java/org/carlmontrobotics/lib199/ErrorCodeAnswer.java b/src/main/java/org/carlmontrobotics/lib199/ErrorCodeAnswer.java index c1365989..49867208 100644 --- a/src/main/java/org/carlmontrobotics/lib199/ErrorCodeAnswer.java +++ b/src/main/java/org/carlmontrobotics/lib199/ErrorCodeAnswer.java @@ -1,6 +1,6 @@ package org.carlmontrobotics.lib199; -import com.ctre.phoenix.ErrorCode; +import com.ctre.phoenix6.StatusCode; import org.mockito.internal.stubbing.defaultanswers.ReturnsSmartNulls; import org.mockito.invocation.InvocationOnMock; @@ -11,7 +11,7 @@ public class ErrorCodeAnswer extends ReturnsSmartNulls { @Override public Object answer(InvocationOnMock invocation) throws Throwable { - return invocation.getMethod().getReturnType().equals(ErrorCode.class) ? ErrorCode.OK : super.answer(invocation); + return invocation.getMethod().getReturnType().equals(StatusCode.class) ? StatusCode.OK : super.answer(invocation); } } \ No newline at end of file diff --git a/src/main/java/org/carlmontrobotics/lib199/MotorControllerFactory.java b/src/main/java/org/carlmontrobotics/lib199/MotorControllerFactory.java index 1aeb5c8f..ae34bc03 100644 --- a/src/main/java/org/carlmontrobotics/lib199/MotorControllerFactory.java +++ b/src/main/java/org/carlmontrobotics/lib199/MotorControllerFactory.java @@ -7,10 +7,11 @@ package org.carlmontrobotics.lib199; -import com.ctre.phoenix.motorcontrol.NeutralMode; -import com.ctre.phoenix.motorcontrol.can.WPI_TalonSRX; -import com.ctre.phoenix.motorcontrol.can.WPI_VictorSPX; -import com.ctre.phoenix.sensors.CANCoder; +import com.ctre.phoenix6.configs.CurrentLimitsConfigs; +import com.ctre.phoenix6.configs.MotorOutputConfigs; +import com.ctre.phoenix6.hardware.CANcoder; +import com.ctre.phoenix6.hardware.TalonFX; +import com.ctre.phoenix6.signals.NeutralModeValue; import com.revrobotics.CANSparkMax; import com.revrobotics.CANSparkMax.ExternalFollower; import com.revrobotics.CANSparkMax.IdleMode; @@ -18,9 +19,6 @@ import com.revrobotics.SparkMaxPIDController; import org.carlmontrobotics.lib199.sim.MockSparkMax; -import org.carlmontrobotics.lib199.sim.MockTalonSRX; -import org.carlmontrobotics.lib199.sim.MockVictorSPX; -import org.carlmontrobotics.lib199.sim.MockedCANCoder; import edu.wpi.first.cameraserver.CameraServer; import edu.wpi.first.cscore.UsbCamera; @@ -31,46 +29,28 @@ * Add your docs here. */ public class MotorControllerFactory { - public static WPI_VictorSPX createVictor(int port) { - WPI_VictorSPX victor; - if (RobotBase.isReal()) { - victor = new WPI_VictorSPX(port); - } else { - victor = MockVictorSPX.createMockVictorSPX(port); - } - // Put all configurations for the victor motor controllers in here. - MotorErrors.reportError(victor.configNominalOutputForward(0, 10)); - MotorErrors.reportError(victor.configNominalOutputReverse(0, 10)); - MotorErrors.reportError(victor.configPeakOutputForward(1, 10)); - MotorErrors.reportError(victor.configPeakOutputReverse(-1, 10)); - MotorErrors.reportError(victor.configNeutralDeadband(0.001, 10)); - victor.setNeutralMode(NeutralMode.Brake); - - return victor; - } - - public static WPI_TalonSRX createTalon(int id) { - WPI_TalonSRX talon; - if (RobotBase.isReal()) { - talon = new WPI_TalonSRX(id); - } else { - talon = MockTalonSRX.createMockTalonSRX(id); - } + public static TalonFX createTalon(int id) { + TalonFX talon = new TalonFX(id); // Put all configurations for the talon motor controllers in here. // All values are from last year's code. - MotorErrors.reportError(talon.configNominalOutputForward(0, 10)); - MotorErrors.reportError(talon.configNominalOutputReverse(0, 10)); - MotorErrors.reportError(talon.configPeakOutputForward(1, 10)); - MotorErrors.reportError(talon.configPeakOutputReverse(-1, 10)); - MotorErrors.reportError(talon.configPeakCurrentLimit(0, 0)); - MotorErrors.reportError(talon.configPeakCurrentDuration(0, 0)); + MotorOutputConfigs motorOutputConfigs = new MotorOutputConfigs(); + motorOutputConfigs.PeakForwardDutyCycle = 1; + motorOutputConfigs.PeakReverseDutyCycle = -1; + motorOutputConfigs.NeutralMode = NeutralModeValue.Brake; + motorOutputConfigs.DutyCycleNeutralDeadband = 0.001; + MotorErrors.reportError(talon.getConfigurator().apply(motorOutputConfigs)); + + CurrentLimitsConfigs currentLimits = new CurrentLimitsConfigs(); // 40 Amps is the amp limit of a CIM. lThe PDP has 40 amp circuit breakers, - MotorErrors.reportError(talon.configContinuousCurrentLimit(30, 0)); - talon.enableCurrentLimit(true); - MotorErrors.reportError(talon.configNeutralDeadband(0.001, 10)); - talon.setNeutralMode(NeutralMode.Brake); + currentLimits.SupplyCurrentLimit = 30; + currentLimits.SupplyCurrentThreshold = 0; + currentLimits.StatorCurrentLimitEnable = true; + // Why is the peak current limit 0 amps? + // MotorErrors.reportError(talon.configPeakCurrentLimit(0, 0)); + // MotorErrors.reportError(talon.configPeakCurrentDuration(0, 0)); + MotorErrors.reportError(talon.getConfigurator().apply(currentLimits)); return talon; } @@ -148,9 +128,8 @@ public static CANSparkMax createSparkMax(int id, MotorConfig config) { * @deprecated Use {@link SensorFactory#createCANCoder(int)} instead. */ @Deprecated - public static CANCoder createCANCoder(int port) { - CANCoder canCoder = new CANCoder(port); - if(RobotBase.isSimulation()) new MockedCANCoder(canCoder); + public static CANcoder createCANCoder(int port) { + CANcoder canCoder = new CANcoder(port); return canCoder; } diff --git a/src/main/java/org/carlmontrobotics/lib199/MotorErrors.java b/src/main/java/org/carlmontrobotics/lib199/MotorErrors.java index afc02146..66600c01 100644 --- a/src/main/java/org/carlmontrobotics/lib199/MotorErrors.java +++ b/src/main/java/org/carlmontrobotics/lib199/MotorErrors.java @@ -3,7 +3,7 @@ import java.util.Arrays; import java.util.concurrent.ConcurrentHashMap; -import com.ctre.phoenix.ErrorCode; +import com.ctre.phoenix6.StatusCode; import com.revrobotics.CANSparkMax; import com.revrobotics.CANSparkMax.FaultID; import com.revrobotics.REVLibError; @@ -25,16 +25,16 @@ public final class MotorErrors { Lib199Subsystem.registerAsyncPeriodic(MotorErrors::printSparkMaxErrorMessages); } - public static void reportError(ErrorCode error) { - reportError("CTRE", error, ErrorCode.OK); + public static void reportError(StatusCode error) { + reportError("CTRE", error, StatusCode.OK); } public static void reportError(REVLibError error) { reportError("REV Robotics", error, REVLibError.kOk); } - public static void reportErrors(ErrorCode... errors) { - for(ErrorCode error: errors) { + public static void reportErrors(StatusCode... errors) { + for(StatusCode error: errors) { reportError(error); } } diff --git a/src/main/java/org/carlmontrobotics/lib199/SensorFactory.java b/src/main/java/org/carlmontrobotics/lib199/SensorFactory.java index 7b778844..85820a86 100644 --- a/src/main/java/org/carlmontrobotics/lib199/SensorFactory.java +++ b/src/main/java/org/carlmontrobotics/lib199/SensorFactory.java @@ -1,8 +1,6 @@ package org.carlmontrobotics.lib199; -import org.carlmontrobotics.lib199.sim.MockedCANCoder; - -import com.ctre.phoenix.sensors.CANCoder; +import com.ctre.phoenix6.hardware.CANcoder; import edu.wpi.first.cameraserver.CameraServer; import edu.wpi.first.cscore.UsbCamera; @@ -20,10 +18,8 @@ public class SensorFactory { * @param port The CAN ID of the CANCoder * @return The CANCoder object */ - public static CANCoder createCANCoder(int port) { - CANCoder canCoder = new CANCoder(port); - if (RobotBase.isSimulation()) - new MockedCANCoder(canCoder); + public static CANcoder createCANCoder(int port) { + CANcoder canCoder = new CANcoder(port); return canCoder; } diff --git a/src/main/java/org/carlmontrobotics/lib199/sim/MockPhoenixController.java b/src/main/java/org/carlmontrobotics/lib199/sim/MockPhoenixController.java deleted file mode 100644 index af092a76..00000000 --- a/src/main/java/org/carlmontrobotics/lib199/sim/MockPhoenixController.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.carlmontrobotics.lib199.sim; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; - -import com.ctre.phoenix.motorcontrol.ControlMode; -import com.ctre.phoenix.motorcontrol.IMotorController; - -import edu.wpi.first.wpilibj.motorcontrol.PWMMotorController; - -abstract class MockPhoenixController implements AutoCloseable { - private final int portPWM; - private boolean isInverted; - // Assign the CAN port to a PWM port so it works with the simulator. Not a fan of this solution though - // CAN ports should be separate from PWM ports - protected PWMMotorController motorPWM; - // Since we need to keep a record of all the motor's followers - protected static ConcurrentHashMap> followMap = new ConcurrentHashMap<>(); - - public MockPhoenixController(int portPWM) { - this.portPWM = portPWM; - isInverted = false; - } - - public void set(double speed) { - speed = (getInverted() ? -1.0 : 1.0) * speed; - motorPWM.set(speed); - if (followMap.containsKey(getDeviceID())) { - for (PWMMotorController motor : followMap.get(getDeviceID())) motor.set(speed); - } - } - - public double get() { - return motorPWM.get(); - } - - public void follow(IMotorController leader) { - if (!followMap.containsKey(leader.getDeviceID())) { - CopyOnWriteArrayList arr = new CopyOnWriteArrayList(); - arr.add(motorPWM); - followMap.put(leader.getDeviceID(), arr); - } else { - followMap.get(leader.getDeviceID()).add(motorPWM); - } - } - - public void setInverted(boolean invert) { - isInverted = invert; - } - - public boolean getInverted() { - return isInverted; - } - - public int getDeviceID() { return portPWM; } - public ControlMode getControlMode() { return ControlMode.PercentOutput; } - - @Override - public void close() { - motorPWM.close(); - followMap.values().forEach(followList -> followList.remove(motorPWM)); - } -} diff --git a/src/main/java/org/carlmontrobotics/lib199/sim/MockTalonSRX.java b/src/main/java/org/carlmontrobotics/lib199/sim/MockTalonSRX.java deleted file mode 100644 index 991bfb47..00000000 --- a/src/main/java/org/carlmontrobotics/lib199/sim/MockTalonSRX.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.carlmontrobotics.lib199.sim; - -import com.ctre.phoenix.motorcontrol.can.WPI_TalonSRX; - -import org.carlmontrobotics.lib199.ErrorCodeAnswer; -import org.carlmontrobotics.lib199.Mocks; - -import edu.wpi.first.wpilibj.motorcontrol.Talon; - -public class MockTalonSRX extends MockPhoenixController { - - public MockTalonSRX(int portPWM) { - super(portPWM); - motorPWM = new Talon(portPWM); - } - - public static WPI_TalonSRX createMockTalonSRX(int portPWM) { - return Mocks.createMock(WPI_TalonSRX.class, new MockTalonSRX(portPWM), new ErrorCodeAnswer(), AutoCloseable.class); - } -} \ No newline at end of file diff --git a/src/main/java/org/carlmontrobotics/lib199/sim/MockVictorSPX.java b/src/main/java/org/carlmontrobotics/lib199/sim/MockVictorSPX.java deleted file mode 100644 index bb59d10d..00000000 --- a/src/main/java/org/carlmontrobotics/lib199/sim/MockVictorSPX.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.carlmontrobotics.lib199.sim; - -import com.ctre.phoenix.motorcontrol.can.WPI_VictorSPX; - -import org.carlmontrobotics.lib199.ErrorCodeAnswer; -import org.carlmontrobotics.lib199.Mocks; - -import edu.wpi.first.wpilibj.motorcontrol.VictorSP; - -public class MockVictorSPX extends MockPhoenixController { - public MockVictorSPX(int portPWM) { - super(portPWM); - motorPWM = new VictorSP(portPWM); - } - - public static WPI_VictorSPX createMockVictorSPX(int portPWM) { - return Mocks.createMock(WPI_VictorSPX.class, new MockVictorSPX(portPWM), new ErrorCodeAnswer(), AutoCloseable.class); - } -} diff --git a/src/main/java/org/carlmontrobotics/lib199/sim/MockedCANCoder.java b/src/main/java/org/carlmontrobotics/lib199/sim/MockedCANCoder.java deleted file mode 100644 index 90d1856c..00000000 --- a/src/main/java/org/carlmontrobotics/lib199/sim/MockedCANCoder.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.carlmontrobotics.lib199.sim; - -import java.util.HashMap; - -import com.ctre.phoenix.sensors.CANCoder; -import com.ctre.phoenix.sensors.CANCoderSimCollection; - -import org.carlmontrobotics.lib199.Lib199Subsystem; - -import edu.wpi.first.hal.SimDevice; -import edu.wpi.first.hal.SimDevice.Direction; -import edu.wpi.first.hal.SimDouble; - -public class MockedCANCoder { - - public static final double kCANCoderCPR = 4096; - - private static final HashMap sims = new HashMap<>(); - - private int port; - private SimDevice device; - private SimDouble position; // Rotations - Continuous - private SimDouble gearing; - private CANCoderSimCollection sim; - - public MockedCANCoder(CANCoder canCoder) { - port = canCoder.getDeviceID(); - device = SimDevice.create("CANCoder", port); - position = device.createDouble("count", Direction.kInput, 0); - gearing = device.createDouble("gearing", Direction.kOutput, 1); - sim = canCoder.getSimCollection(); - Lib199Subsystem.registerAsyncSimulationPeriodic(this::update); - sims.put(port, this); - } - - public void update() { - sim.setRawPosition((int) (position.get() * kCANCoderCPR)); - } - - public void setGearing(double gearing) { - this.gearing.set(gearing); - } - - public static void setGearing(int port, double gearing) { - if(sims.containsKey(port)) sims.get(port).setGearing(gearing); - } - -} \ No newline at end of file diff --git a/src/main/java/org/carlmontrobotics/lib199/swerve/SwerveModule.java b/src/main/java/org/carlmontrobotics/lib199/swerve/SwerveModule.java index 0eabe462..82f1347e 100644 --- a/src/main/java/org/carlmontrobotics/lib199/swerve/SwerveModule.java +++ b/src/main/java/org/carlmontrobotics/lib199/swerve/SwerveModule.java @@ -2,8 +2,9 @@ import java.util.function.Supplier; -import com.ctre.phoenix.sensors.AbsoluteSensorRange; -import com.ctre.phoenix.sensors.CANCoder; +import com.ctre.phoenix6.configs.MagnetSensorConfigs; +import com.ctre.phoenix6.hardware.CANcoder; +import com.ctre.phoenix6.signals.AbsoluteSensorRangeValue; import com.revrobotics.CANSparkMax; import com.revrobotics.CANSparkMax.IdleMode; @@ -15,6 +16,7 @@ import edu.wpi.first.math.kinematics.SwerveModulePosition; import edu.wpi.first.math.kinematics.SwerveModuleState; import edu.wpi.first.math.trajectory.TrapezoidProfile; +import edu.wpi.first.math.util.Units; import edu.wpi.first.util.sendable.Sendable; import edu.wpi.first.util.sendable.SendableBuilder; import edu.wpi.first.util.sendable.SendableRegistry; @@ -31,7 +33,7 @@ public enum ModuleType {FL, FR, BL, BR}; private SwerveConfig config; private ModuleType type; private CANSparkMax drive, turn; - private CANCoder turnEncoder; + private CANcoder turnEncoder; private PIDController drivePIDController; private ProfiledPIDController turnPIDController; private TrapezoidProfile.Constraints turnConstraints; @@ -42,7 +44,7 @@ public enum ModuleType {FL, FR, BL, BR}; private SimpleMotorFeedforward forwardSimpleMotorFF, backwardSimpleMotorFF, turnSimpleMotorFeedforward; private double desiredSpeed, lastAngle, maxAchievableTurnVelocityDps, maxAchievableTurnAccelerationMps2, turnToleranceDeg, angleDiff; - public SwerveModule(SwerveConfig config, ModuleType type, CANSparkMax drive, CANSparkMax turn, CANCoder turnEncoder, + public SwerveModule(SwerveConfig config, ModuleType type, CANSparkMax drive, CANSparkMax turn, CANcoder turnEncoder, int arrIndex, Supplier pitchDegSupplier, Supplier rollDegSupplier) { //SmartDashboard.putNumber("Target Angle (deg)", 0.0); this.timer = new Timer(); @@ -106,7 +108,10 @@ public SwerveModule(SwerveConfig config, ModuleType type, CANSparkMax drive, CAN turnPIDController.setTolerance(turnToleranceDeg); this.turnEncoder = turnEncoder; - this.turnEncoder.configAbsoluteSensorRange(AbsoluteSensorRange.Signed_PlusMinus180); + MagnetSensorConfigs rangeConfig = new MagnetSensorConfigs(); + // WARNING: Signed_PlusMinusHalf != Signed-PlusMinus180 (Phoenix 6 does not provide PlusMinus180) + rangeConfig.AbsoluteSensorRange = AbsoluteSensorRangeValue.Signed_PlusMinusHalf; + this.turnEncoder.getConfigurator().apply(rangeConfig); this.driveModifier = config.driveModifier; this.reversed = config.reversed[arrIndex]; @@ -230,7 +235,7 @@ private void setAngle(double angle) { * @return module angle in degrees */ public double getModuleAngle() { - return MathUtil.inputModulus(turnEncoder.getAbsolutePosition()-turnZero, -180, 180); + return MathUtil.inputModulus(Units.rotationsToDegrees(turnEncoder.getAbsolutePosition().getValue()) - turnZero, -180, 180); } /** @@ -266,9 +271,9 @@ public double getCurrentSpeed() { public void updateSmartDashboard() { String moduleString = type.toString(); // Display the position of the quadrature encoder. - SmartDashboard.putNumber(moduleString + " Incremental Position", turnEncoder.getPosition()); + SmartDashboard.putNumber(moduleString + " Incremental Position", Units.rotationsToDegrees(turnEncoder.getPosition().getValue())); // Display the position of the analog encoder. - SmartDashboard.putNumber(moduleString + " Absolute Angle (deg)", turnEncoder.getAbsolutePosition()); + SmartDashboard.putNumber(moduleString + " Absolute Angle (deg)", Units.rotationsToDegrees(turnEncoder.getAbsolutePosition().getValue())); // Display the module angle as calculated using the absolute encoder. SmartDashboard.putNumber(moduleString + " Turn Measured Pos (deg)", getModuleAngle()); SmartDashboard.putNumber(moduleString + " Encoder Position", drive.getEncoder().getPosition()); @@ -309,8 +314,8 @@ public void initSendable(SendableBuilder builder) { builder.setActuator(true); builder.setSafeState(() -> setSpeed(0)); builder.setSmartDashboardType("SwerveModule"); - builder.addDoubleProperty("Incremental Position", turnEncoder::getPosition, null); - builder.addDoubleProperty("Absolute Angle (deg)", turnEncoder::getAbsolutePosition, null); + builder.addDoubleProperty("Incremental Position", () -> Units.rotationsToDegrees(turnEncoder.getPosition().getValue()), null); + builder.addDoubleProperty("Absolute Angle (deg)", () -> Units.rotationsToDegrees(turnEncoder.getAbsolutePosition().getValue()), null); builder.addDoubleProperty("Turn Measured Pos (deg)", this::getModuleAngle, null); builder.addDoubleProperty("Encoder Position", drive.getEncoder()::getPosition, null); // Display the speed that the robot thinks it is travelling at. diff --git a/src/test/java/org/carlmontrobotics/lib199/ErrorCodeAnswerTest.java b/src/test/java/org/carlmontrobotics/lib199/ErrorCodeAnswerTest.java index 89fce5c7..5016fe37 100644 --- a/src/test/java/org/carlmontrobotics/lib199/ErrorCodeAnswerTest.java +++ b/src/test/java/org/carlmontrobotics/lib199/ErrorCodeAnswerTest.java @@ -1,23 +1,21 @@ package org.carlmontrobotics.lib199; -import static org.junit.Assert.assertEquals; - -import com.ctre.phoenix.ErrorCode; -import com.ctre.phoenix.motorcontrol.can.WPI_TalonSRX; - import org.junit.Test; public class ErrorCodeAnswerTest { @Test public void testResponses() throws Exception { - WPI_TalonSRX talon = Mocks.mock(WPI_TalonSRX.class, new ErrorCodeAnswer()); + // Currently ErrorCodeAnswer is not used since we no longer mock phoenix motors + + // Here is the original test for when we did + // WPI_TalonSRX talon = Mocks.mock(WPI_TalonSRX.class, new ErrorCodeAnswer()); - // Check that primative types return "null" - assertEquals(0, talon.get(), 0.01); + // // Check that primative types return "null" + // assertEquals(0, talon.get(), 0.01); - // Check that ErrorCode functions return ErrorCode.OK - assertEquals(ErrorCode.OK, talon.getLastError()); + // // Check that ErrorCode functions return ErrorCode.OK + // assertEquals(ErrorCode.OK, talon.getLastError()); } } diff --git a/src/test/java/org/carlmontrobotics/lib199/MotorControllerFactoryTest.java b/src/test/java/org/carlmontrobotics/lib199/MotorControllerFactoryTest.java index d0791dbf..0a3a8997 100644 --- a/src/test/java/org/carlmontrobotics/lib199/MotorControllerFactoryTest.java +++ b/src/test/java/org/carlmontrobotics/lib199/MotorControllerFactoryTest.java @@ -20,7 +20,6 @@ public class MotorControllerFactoryTest extends ErrStreamTest { public void testCreateNoErrors() throws Exception { // Call close to free PWM ports ((AutoCloseable)MotorControllerFactory.createTalon(0)).close(); - ((AutoCloseable)MotorControllerFactory.createVictor(1)).close(); MotorControllerFactory.createSparkMax(2, MotorConfig.NEO); assertEquals(0, errStream.toByteArray().length); } diff --git a/src/test/java/org/carlmontrobotics/lib199/MotorErrorsTest.java b/src/test/java/org/carlmontrobotics/lib199/MotorErrorsTest.java index 5f37bb59..c363d98d 100644 --- a/src/test/java/org/carlmontrobotics/lib199/MotorErrorsTest.java +++ b/src/test/java/org/carlmontrobotics/lib199/MotorErrorsTest.java @@ -8,8 +8,8 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; -import com.ctre.phoenix.ErrorCode; import com.revrobotics.REVLibError; +import com.ctre.phoenix6.StatusCode; import com.revrobotics.CANSparkMax; import com.revrobotics.CANSparkMax.FaultID; @@ -85,21 +85,21 @@ public int getDeviceId() { public void testOkErrors() { errStream.reset(); // Null Status - MotorErrors.reportError((ErrorCode)null); + MotorErrors.reportError((StatusCode)null); assertEquals(0, errStream.toByteArray().length); MotorErrors.reportError((REVLibError)null); assertEquals(0, errStream.toByteArray().length); - MotorErrors.reportErrors((ErrorCode)null, null); + MotorErrors.reportErrors((StatusCode)null, null); assertEquals(0, errStream.toByteArray().length); MotorErrors.reportErrors((REVLibError)null, null); assertEquals(0, errStream.toByteArray().length); // Ok Status - MotorErrors.reportError(ErrorCode.OK); + MotorErrors.reportError(StatusCode.OK); assertEquals(0, errStream.toByteArray().length); MotorErrors.reportError(REVLibError.kOk); assertEquals(0, errStream.toByteArray().length); - MotorErrors.reportErrors(ErrorCode.OK, ErrorCode.OK); + MotorErrors.reportErrors(StatusCode.OK, StatusCode.OK); assertEquals(0, errStream.toByteArray().length); MotorErrors.reportErrors(REVLibError.kOk, REVLibError.kOk); assertEquals(0, errStream.toByteArray().length); @@ -108,12 +108,12 @@ public void testOkErrors() { @Test public void testOtherErrors() { errStream.reset(); - for(ErrorCode code: ErrorCode.values()) { - if(code != ErrorCode.OK) { + for(StatusCode code: StatusCode.values()) { + if(code != StatusCode.OK) { MotorErrors.reportError(code); assertNotEquals(0, errStream.toByteArray().length); errStream.reset(); - MotorErrors.reportErrors(ErrorCode.OK, code); + MotorErrors.reportErrors(StatusCode.OK, code); assertNotEquals(0, errStream.toByteArray().length); errStream.reset(); } diff --git a/src/test/java/org/carlmontrobotics/lib199/sim/MockPheonixControllerTest.java b/src/test/java/org/carlmontrobotics/lib199/sim/MockPheonixControllerTest.java deleted file mode 100644 index 717580b2..00000000 --- a/src/test/java/org/carlmontrobotics/lib199/sim/MockPheonixControllerTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.carlmontrobotics.lib199.sim; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import com.ctre.phoenix.motorcontrol.can.BaseMotorController; - -import org.carlmontrobotics.lib199.Mocks; -import org.carlmontrobotics.lib199.testUtils.SafelyClosable; -import org.carlmontrobotics.lib199.testUtils.SimDeviceTestRule; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mockito; - -import edu.wpi.first.wpilibj.motorcontrol.MotorController; -import edu.wpi.first.wpilibj.simulation.PWMSim; - -public abstract class MockPheonixControllerTest { - - @ClassRule - public static SimDeviceTestRule.Class simClassRule = new SimDeviceTestRule.Class(); - @Rule - public SimDeviceTestRule.Test simTestRule = new SimDeviceTestRule.Test(); - - protected abstract BaseMotorController createController(int portPWM); - - private SafelyClosable createSafeController(int portPWM) { - BaseMotorController controller = createController(portPWM); - // Turn the controller into a SafelyClosable that calls the defined close() method (if available) - return (SafelyClosable)Mocks.createMock( - // Extend the runtime class type (or superclass if mocked) - (Class)(Mockito.mockingDetails(controller).isMock() ? controller.getClass().getSuperclass() : controller.getClass()), - // Implement all methods with the implementation defined in controller - controller, - // Return null for any methods not defined in the implementation (none of them) - false, - // Implement SafelyClosable - SafelyClosable.class); - } - - @Test - public void testDeviceId() { - assertTestDeviceId(0); - assertTestDeviceId(1); - assertTestDeviceId(2); - } - - private void assertTestDeviceId(int port) { - PWMSim sim = new PWMSim(port); - sim.resetData(); - assertFalse(sim.getInitialized()); - try(SafelyClosable controller = createSafeController(port)) { - BaseMotorController motor = (BaseMotorController)controller; - assertTrue(sim.getInitialized()); - assertEquals(port, motor.getDeviceID()); - } - sim.resetData(); - assertFalse(sim.getInitialized()); - } - - @Test - public void testInverted() { - withControllers((controller, sController, sim) -> { - controller.setInverted(true); - assertTrue(controller.getInverted()); - controller.setInverted(false); - assertFalse(controller.getInverted()); - }); - } - - @Test - public void testSet() { - withControllers((controller, sController, sim) -> { - assertSet(1, sController, sim); - assertSet(0.5, sController, sim); - assertSet(0, sController, sim); - assertSet(-0.5, sController, sim); - assertSet(-1, sController, sim); - }); - } - - private void assertSet(double speed, MotorController controller, PWMSim sim) { - assertSet(speed, controller, controller, sim); - } - - private void assertSet(double speed, MotorController setController, MotorController getController, PWMSim sim) { - setController.set(speed); - assertEquals(speed, getController.get(), 0.01); - assertEquals(speed, sim.getSpeed(), 0.01); - } - - @Test - public void testFollow() { - withControllers((mController, msController, mSim) -> - withController(mController.getDeviceID()+1, (sController, ssController, sSim) -> { - sController.follow(mController); - assertSet(1, msController, ssController, sSim); - assertSet(0.5, msController, ssController, sSim); - assertSet(0, msController, ssController, sSim); - assertSet(-0.5, msController, ssController, sSim); - assertSet(-1, msController, ssController, sSim); - }) - ); - } - - private void withControllers(ControllerTest func) { - withController(0, func); - withController(1, func); - withController(2, func); - } - - private void withController(int port, ControllerTest func) { - try(SafelyClosable controller = createSafeController(port)) { - PWMSim sim = new PWMSim(port); - assertTrue(sim.getInitialized()); - func.test((BaseMotorController)controller, (MotorController)controller, sim); - } - } - - private interface ControllerTest { - public void test(BaseMotorController controller, MotorController sController, PWMSim sim); - } - -} diff --git a/src/test/java/org/carlmontrobotics/lib199/sim/MockTalonSRXTest.java b/src/test/java/org/carlmontrobotics/lib199/sim/MockTalonSRXTest.java deleted file mode 100644 index ac1c08cd..00000000 --- a/src/test/java/org/carlmontrobotics/lib199/sim/MockTalonSRXTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.carlmontrobotics.lib199.sim; - -import com.ctre.phoenix.motorcontrol.can.BaseMotorController; - -public class MockTalonSRXTest extends MockPheonixControllerTest { - - @Override - protected BaseMotorController createController(int portPWM) { - return MockTalonSRX.createMockTalonSRX(portPWM); - } - -} diff --git a/src/test/java/org/carlmontrobotics/lib199/sim/MockVictorSPXTest.java b/src/test/java/org/carlmontrobotics/lib199/sim/MockVictorSPXTest.java deleted file mode 100644 index b6fdd307..00000000 --- a/src/test/java/org/carlmontrobotics/lib199/sim/MockVictorSPXTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.carlmontrobotics.lib199.sim; - -import com.ctre.phoenix.motorcontrol.can.BaseMotorController; - -public class MockVictorSPXTest extends MockPheonixControllerTest { - - @Override - protected BaseMotorController createController(int portPWM) { - return MockVictorSPX.createMockVictorSPX(portPWM); - } - -} diff --git a/vendordeps/Phoenix.json b/vendordeps/Phoenix6.json similarity index 61% rename from vendordeps/Phoenix.json rename to vendordeps/Phoenix6.json index 282d5367..e51ec442 100644 --- a/vendordeps/Phoenix.json +++ b/vendordeps/Phoenix6.json @@ -1,56 +1,25 @@ { - "fileName": "Phoenix.json", - "name": "CTRE-Phoenix (v5)", - "version": "5.30.4+23.0.12", + "fileName": "Phoenix6.json", + "name": "CTRE-Phoenix (v6)", + "version": "23.2.1", "frcYear": 2023, - "uuid": "ab676553-b602-441f-a38d-f1296eff6537", + "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", "mavenUrls": [ "https://maven.ctr-electronics.com/release/" ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2023-latest.json", + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2023-latest.json", "javaDependencies": [ { - "groupId": "com.ctre.phoenix", - "artifactId": "api-java", - "version": "5.30.4" - }, - { - "groupId": "com.ctre.phoenix", + "groupId": "com.ctre.phoenix6", "artifactId": "wpiapi-java", - "version": "5.30.4" + "version": "23.2.1" } ], "jniDependencies": [ { - "groupId": "com.ctre.phoenix", - "artifactId": "cci", - "version": "5.30.4", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "cci-sim", - "version": "5.30.4", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro", + "groupId": "com.ctre.phoenix6", "artifactId": "tools", - "version": "23.0.12", + "version": "23.2.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -61,9 +30,9 @@ "simMode": "hwsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "tools-sim", - "version": "23.0.12", + "version": "23.2.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -74,9 +43,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simTalonSRX", - "version": "23.0.12", + "version": "23.2.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -87,9 +56,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simTalonFX", - "version": "23.0.12", + "version": "23.2.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -100,9 +69,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simVictorSPX", - "version": "23.0.12", + "version": "23.2.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -113,9 +82,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simPigeonIMU", - "version": "23.0.12", + "version": "23.2.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -126,9 +95,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simCANCoder", - "version": "23.0.12", + "version": "23.2.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -139,9 +108,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProTalonFX", - "version": "23.0.12", + "version": "23.2.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -152,9 +121,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProCANcoder", - "version": "23.0.12", + "version": "23.2.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -165,9 +134,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProPigeon2", - "version": "23.0.12", + "version": "23.2.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -180,25 +149,10 @@ ], "cppDependencies": [ { - "groupId": "com.ctre.phoenix", + "groupId": "com.ctre.phoenix6", "artifactId": "wpiapi-cpp", - "version": "5.30.4", - "libName": "CTRE_Phoenix_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "api-cpp", - "version": "5.30.4", - "libName": "CTRE_Phoenix", + "version": "23.2.1", + "libName": "CTRE_Phoenix6_WPI", "headerClassifier": "headers", "sharedLibrary": true, "skipInvalidPlatforms": true, @@ -210,24 +164,9 @@ "simMode": "hwsim" }, { - "groupId": "com.ctre.phoenix", - "artifactId": "cci", - "version": "5.30.4", - "libName": "CTRE_PhoenixCCI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenixpro", + "groupId": "com.ctre.phoenix6", "artifactId": "tools", - "version": "23.0.12", + "version": "23.2.1", "libName": "CTRE_PhoenixTools", "headerClassifier": "headers", "sharedLibrary": true, @@ -240,40 +179,10 @@ "simMode": "hwsim" }, { - "groupId": "com.ctre.phoenix.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "wpiapi-cpp-sim", - "version": "5.30.4", - "libName": "CTRE_Phoenix_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "api-cpp-sim", - "version": "5.30.4", - "libName": "CTRE_PhoenixSim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "cci-sim", - "version": "5.30.4", - "libName": "CTRE_PhoenixCCISim", + "version": "23.2.1", + "libName": "CTRE_Phoenix6_WPISim", "headerClassifier": "headers", "sharedLibrary": true, "skipInvalidPlatforms": true, @@ -285,9 +194,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "tools-sim", - "version": "23.0.12", + "version": "23.2.1", "libName": "CTRE_PhoenixTools_Sim", "headerClassifier": "headers", "sharedLibrary": true, @@ -300,9 +209,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simTalonSRX", - "version": "23.0.12", + "version": "23.2.1", "libName": "CTRE_SimTalonSRX", "headerClassifier": "headers", "sharedLibrary": true, @@ -315,9 +224,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simTalonFX", - "version": "23.0.12", + "version": "23.2.1", "libName": "CTRE_SimTalonFX", "headerClassifier": "headers", "sharedLibrary": true, @@ -330,9 +239,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simVictorSPX", - "version": "23.0.12", + "version": "23.2.1", "libName": "CTRE_SimVictorSPX", "headerClassifier": "headers", "sharedLibrary": true, @@ -345,9 +254,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simPigeonIMU", - "version": "23.0.12", + "version": "23.2.1", "libName": "CTRE_SimPigeonIMU", "headerClassifier": "headers", "sharedLibrary": true, @@ -360,9 +269,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simCANCoder", - "version": "23.0.12", + "version": "23.2.1", "libName": "CTRE_SimCANCoder", "headerClassifier": "headers", "sharedLibrary": true, @@ -375,9 +284,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProTalonFX", - "version": "23.0.12", + "version": "23.2.1", "libName": "CTRE_SimProTalonFX", "headerClassifier": "headers", "sharedLibrary": true, @@ -390,9 +299,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProCANcoder", - "version": "23.0.12", + "version": "23.2.1", "libName": "CTRE_SimProCANcoder", "headerClassifier": "headers", "sharedLibrary": true, @@ -405,9 +314,9 @@ "simMode": "swsim" }, { - "groupId": "com.ctre.phoenixpro.sim", + "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProPigeon2", - "version": "23.0.12", + "version": "23.2.1", "libName": "CTRE_SimProPigeon2", "headerClassifier": "headers", "sharedLibrary": true,