From dfdf48057348ac98a7724284d3e0efc6b8024fdc Mon Sep 17 00:00:00 2001 From: AlexNunemacher <147670490+AlexNunemacher@users.noreply.github.com> Date: Thu, 6 Feb 2025 16:25:58 -0500 Subject: [PATCH] 144 lights subsystem (#176) * maybe works????? idk lights stuff that might work lok just copied from jb2024 * gang * lights * spotless for nothing???? --------- Co-authored-by: wibwib Co-authored-by: Matthew Milunic <62996888+mmilunicmobile@users.noreply.github.com> --- src/main/java/frc/robot/RobotContainer.java | 20 +- .../subsystems/lights/LightsSubsystem.java | 236 +++++++++++ vendordeps/Phoenix5-frc2025-latest.json | 171 ++++++++ vendordeps/Phoenix6-25.1.0.json | 389 ------------------ 4 files changed, 425 insertions(+), 391 deletions(-) create mode 100644 src/main/java/frc/robot/subsystems/lights/LightsSubsystem.java create mode 100644 vendordeps/Phoenix5-frc2025-latest.json delete mode 100644 vendordeps/Phoenix6-25.1.0.json diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 0a86b32d..755c1711 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -49,6 +49,7 @@ import frc.robot.subsystems.intake.IntakeRollerIOSim; import frc.robot.subsystems.intake.IntakeRollerTalonFX; import frc.robot.subsystems.intake.IntakeSubsystem; +import frc.robot.subsystems.lights.LightsSubsystem; import frc.robot.subsystems.swerve.CommandSwerveDrivetrain; import frc.robot.subsystems.vision.Vision; import frc.robot.subsystems.vision.VisionIOLimelight; @@ -74,6 +75,7 @@ public class RobotContainer { public ClimberSubsystem climberSubsystem; public ArmSubsystem armSubsystem; public Vision vision; + public LightsSubsystem lights; public SuperstructureStateManager stateManager; @@ -103,6 +105,7 @@ public RobotContainer() { elevatorSubsystem = new ElevatorSubsystem(new ElevatorIOTalonFX()); armSubsystem = new ArmSubsystem(new ArmPivotIOTalonFX(), new WristIONeo550()); climberSubsystem = new ClimberSubsystem(new ClimberIOTalonFX()); + lights = new LightsSubsystem(); intakeSubsystem = new IntakeSubsystem(new IntakeRollerTalonFX(), new FlipperIOTalon()); } else { @@ -127,6 +130,7 @@ public RobotContainer() { armSubsystem = new ArmSubsystem(new ArmPivotIOSim(), new WristIOSim()); intakeSubsystem = new IntakeSubsystem(new IntakeRollerIOSim(), new FlipperIOSim()); climberSubsystem = new ClimberSubsystem(new ClimberIOSim()); + lights = new LightsSubsystem(); } stateManager = new SuperstructureStateManager(elevatorSubsystem, armSubsystem); @@ -268,8 +272,20 @@ private void configureBindings() { operatorController.getLeftBumper().onTrue(stateManager.setLeftCoralMode()); operatorController.getRightBumper().onTrue(stateManager.setRightCoralMode()); operatorController.getRightTrigger().onTrue(stateManager.setAlgaeMode()); - operatorController.getLeftJoystick().toggleOnTrue(Commands.idle()); // L3 Rainbow - operatorController.getLeftTrigger().whileTrue(Commands.idle()); // L2 Station Lights + operatorController + .getLeftJoystick() + .toggleOnTrue( + Commands.runOnce( + (() -> + LightsSubsystem.LEDSegment.MainStrip.setRainbowAnimation( + 1)))); // L3 Rainbow + operatorController + .getLeftTrigger() + .whileTrue( + Commands.runOnce( + (() -> + LightsSubsystem.LEDSegment.MainStrip.setStrobeAnimation( + LightsSubsystem.purple, 1)))); // L2 tation Lights // Coral Mode Bindings final Trigger CORAL = stateManager.LEFT_CORAL.or(stateManager.RIGHT_CORAL); diff --git a/src/main/java/frc/robot/subsystems/lights/LightsSubsystem.java b/src/main/java/frc/robot/subsystems/lights/LightsSubsystem.java new file mode 100644 index 00000000..b500484d --- /dev/null +++ b/src/main/java/frc/robot/subsystems/lights/LightsSubsystem.java @@ -0,0 +1,236 @@ +package frc.robot.subsystems.lights; + +import com.ctre.phoenix.led.Animation; +import com.ctre.phoenix.led.CANdle; +import com.ctre.phoenix.led.CANdle.LEDStripType; +import com.ctre.phoenix.led.CANdle.VBatOutputMode; +import com.ctre.phoenix.led.CANdleConfiguration; +import com.ctre.phoenix.led.ColorFlowAnimation; +import com.ctre.phoenix.led.ColorFlowAnimation.Direction; +import com.ctre.phoenix.led.LarsonAnimation; +import com.ctre.phoenix.led.LarsonAnimation.BounceMode; +import com.ctre.phoenix.led.RainbowAnimation; +import com.ctre.phoenix.led.SingleFadeAnimation; +import com.ctre.phoenix.led.StrobeAnimation; +import edu.wpi.first.wpilibj.RobotBase; +import edu.wpi.first.wpilibj2.command.Command; +import edu.wpi.first.wpilibj2.command.SubsystemBase; +import java.util.function.BooleanSupplier; + +public class LightsSubsystem extends SubsystemBase { + public static final class LightsConstants { + public static final int CANDLE_PORT = 12; + + public static final int SENSOR_PORT = 0; + } + + private BooleanSupplier hasPiece = () -> false; + + private static final CANdle candle; + + static { + if (RobotBase.isReal()) { + candle = new CANdle(LightsConstants.CANDLE_PORT); + } else { + candle = null; + } + } + + // Team colors + public static final Color orange = new Color(255, 25, 0); + public static final Color black = new Color(0, 0, 0); + + // Game piece colors + public static final Color yellow = new Color(242, 60, 0); + public static final Color purple = new Color(184, 0, 185); + + // Indicator colors + public static final Color white = new Color(255, 230, 220); + public static final Color green = new Color(56, 209, 0); + public static final Color blue = new Color(8, 32, 255); + public static final Color red = new Color(255, 0, 0); + + public LightsSubsystem() { + if (candle != null) { + CANdleConfiguration candleConfiguration = new CANdleConfiguration(); + candleConfiguration.statusLedOffWhenActive = true; + candleConfiguration.disableWhenLOS = false; + candleConfiguration.stripType = LEDStripType.RGB; + candleConfiguration.brightnessScalar = 1.0; + candleConfiguration.vBatOutputMode = VBatOutputMode.Modulated; + candle.configAllSettings(candleConfiguration, 100); + } + + setDefaultCommand(defaultCommand()); + } + + public static void setBrightness(double percent) { + if (candle != null) { + candle.configBrightnessScalar(percent, 100); + } + } + + public Command defaultCommand() { + return run( + () -> { + LEDSegment.BatteryIndicator.fullClear(); + LEDSegment.DriverstationIndicator.fullClear(); + LEDSegment.ExtraAIndicator.fullClear(); + LEDSegment.ExtraBIndicator.fullClear(); + LEDSegment.PivotEncoderIndicator.fullClear(); + + if (hasPiece.getAsBoolean()) { + LightsSubsystem.LEDSegment.MainStrip.setStrobeAnimation( + LightsSubsystem.white, 0.3); + } else { + LEDSegment.MainStrip.setColor(orange); + } + }); + } + + public void setHasPieceSupplier(BooleanSupplier hasPiece) { + this.hasPiece = hasPiece; + } + + public Command clearSegmentCommand(LEDSegment segment) { + return runOnce( + () -> { + segment.clearAnimation(); + segment.disableLEDs(); + }); + } + + public static enum LEDSegment { + BatteryIndicator(0, 2, 0), + DriverstationIndicator(2, 2, 1), + ExtraAIndicator(4, 1, -1), + ExtraBIndicator(5, 1, -1), + PivotEncoderIndicator(6, 1, -1), + AllianceIndicator(7, 1, -1), + MainStrip(8, 300, 2); + + public final int startIndex; + public final int segmentSize; + public final int animationSlot; + + private LEDSegment(int startIndex, int segmentSize, int animationSlot) { + this.startIndex = startIndex; + this.segmentSize = segmentSize; + this.animationSlot = animationSlot; + } + + public void setColor(Color color) { + if (candle != null) { + clearAnimation(); + candle.setLEDs(color.red, color.green, color.blue, 0, startIndex, segmentSize); + } + } + + private void setAnimation(Animation animation) { + if (candle != null) { + candle.animate(animation, animationSlot); + } + } + + public void fullClear() { + if (candle != null) { + clearAnimation(); + disableLEDs(); + } + } + + public void clearAnimation() { + if (candle != null) { + candle.clearAnimation(animationSlot); + } + } + + public void disableLEDs() { + if (candle != null) { + setColor(black); + } + } + + public void setFlowAnimation(Color color, double speed) { + setAnimation( + new ColorFlowAnimation( + color.red, + color.green, + color.blue, + 0, + speed, + segmentSize, + Direction.Forward, + startIndex)); + } + + public void setFadeAnimation(Color color, double speed) { + setAnimation( + new SingleFadeAnimation( + color.red, color.green, color.blue, 0, speed, segmentSize, startIndex)); + } + + public void setBandAnimation(Color color, double speed) { + setAnimation( + new LarsonAnimation( + color.red, + color.green, + color.blue, + 0, + speed, + segmentSize, + BounceMode.Front, + 3, + startIndex)); + } + + public void setStrobeAnimation(Color color, double speed) { + setAnimation( + new StrobeAnimation( + color.red, color.green, color.blue, 0, speed, segmentSize, startIndex)); + } + + public void setRainbowAnimation(double speed) { + setAnimation(new RainbowAnimation(1, speed, segmentSize, false, startIndex)); + } + } + + public static class Color { + public int red; + public int green; + public int blue; + + public Color(int red, int green, int blue) { + this.red = red; + this.green = green; + this.blue = blue; + } + + /** + * Highly imperfect way of dimming the LEDs. It does not maintain color or accurately adjust + * perceived brightness. + * + * @param dimFactor + * @return The dimmed color + */ + public Color dim(double dimFactor) { + int newRed = (int) (ensureRange(red * dimFactor, 0, 200)); + int newGreen = (int) (ensureRange(green * dimFactor, 0, 200)); + int newBlue = (int) (ensureRange(blue * dimFactor, 0, 200)); + + return new Color(newRed, newGreen, newBlue); + } + } + + private static double ensureRange(double value, double low, double upper) { + return Math.max(low, Math.min(upper, value)); + } + + public static void disableLEDs() { + setBrightness(0); + } + + public static void enableLEDs() { + setBrightness(1); + } +} diff --git a/vendordeps/Phoenix5-frc2025-latest.json b/vendordeps/Phoenix5-frc2025-latest.json new file mode 100644 index 00000000..c1098dcc --- /dev/null +++ b/vendordeps/Phoenix5-frc2025-latest.json @@ -0,0 +1,171 @@ +{ + "fileName": "Phoenix5-frc2025-latest.json", + "name": "CTRE-Phoenix (v5)", + "version": "5.35.1", + "frcYear": "2025", + "uuid": "ab676553-b602-441f-a38d-f1296eff6537", + "mavenUrls": [ + "https://maven.ctr-electronics.com/release/" + ], + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2025-latest.json", + "requires": [ + { + "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", + "errorMessage": "Phoenix 5 requires low-level libraries from Phoenix 6. Please add the Phoenix 6 vendordep before adding Phoenix 5.", + "offlineFileName": "Phoenix6-frc2025-latest.json", + "onlineUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json" + } + ], + "conflictsWith": [ + { + "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", + "errorMessage": "Users must use the Phoenix 5 replay vendordep when using the Phoenix 6 replay vendordep.", + "offlineFileName": "Phoenix6-replay-frc2025-latest.json" + }, + { + "uuid": "fbc886a4-2cec-40c0-9835-71086a8cc3df", + "errorMessage": "Users cannot have both the replay and regular Phoenix 5 vendordeps in their robot program.", + "offlineFileName": "Phoenix5-replay-frc2025-latest.json" + } + ], + "javaDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "api-java", + "version": "5.35.1" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "wpiapi-java", + "version": "5.35.1" + } + ], + "jniDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "cci", + "version": "5.35.1", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "cci-sim", + "version": "5.35.1", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ], + "cppDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "wpiapi-cpp", + "version": "5.35.1", + "libName": "CTRE_Phoenix_WPI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "api-cpp", + "version": "5.35.1", + "libName": "CTRE_Phoenix", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "cci", + "version": "5.35.1", + "libName": "CTRE_PhoenixCCI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "wpiapi-cpp-sim", + "version": "5.35.1", + "libName": "CTRE_Phoenix_WPISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "api-cpp-sim", + "version": "5.35.1", + "libName": "CTRE_PhoenixSim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "cci-sim", + "version": "5.35.1", + "libName": "CTRE_PhoenixCCISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ] +} \ No newline at end of file diff --git a/vendordeps/Phoenix6-25.1.0.json b/vendordeps/Phoenix6-25.1.0.json deleted file mode 100644 index 473f6a89..00000000 --- a/vendordeps/Phoenix6-25.1.0.json +++ /dev/null @@ -1,389 +0,0 @@ -{ - "fileName": "Phoenix6-25.1.0.json", - "name": "CTRE-Phoenix (v6)", - "version": "25.1.0", - "frcYear": "2025", - "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", - "mavenUrls": [ - "https://maven.ctr-electronics.com/release/" - ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json", - "conflictsWith": [ - { - "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", - "errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.", - "offlineFileName": "Phoenix6-replay-frc2025-latest.json" - } - ], - "javaDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "wpiapi-java", - "version": "25.1.0" - } - ], - "jniDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "api-cpp", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6", - "artifactId": "tools", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "api-cpp-sim", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "tools-sim", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonSRX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simVictorSPX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simPigeonIMU", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simCANCoder", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProTalonFX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANcoder", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProPigeon2", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANrange", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ], - "cppDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "wpiapi-cpp", - "version": "25.1.0", - "libName": "CTRE_Phoenix6_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6", - "artifactId": "tools", - "version": "25.1.0", - "libName": "CTRE_PhoenixTools", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "wpiapi-cpp-sim", - "version": "25.1.0", - "libName": "CTRE_Phoenix6_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "tools-sim", - "version": "25.1.0", - "libName": "CTRE_PhoenixTools_Sim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonSRX", - "version": "25.1.0", - "libName": "CTRE_SimTalonSRX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simVictorSPX", - "version": "25.1.0", - "libName": "CTRE_SimVictorSPX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simPigeonIMU", - "version": "25.1.0", - "libName": "CTRE_SimPigeonIMU", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simCANCoder", - "version": "25.1.0", - "libName": "CTRE_SimCANCoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProTalonFX", - "version": "25.1.0", - "libName": "CTRE_SimProTalonFX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANcoder", - "version": "25.1.0", - "libName": "CTRE_SimProCANcoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProPigeon2", - "version": "25.1.0", - "libName": "CTRE_SimProPigeon2", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANrange", - "version": "25.1.0", - "libName": "CTRE_SimProCANrange", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ] -} \ No newline at end of file