From aead1c165a26a70b81ce74afad41d0963bd3b4f4 Mon Sep 17 00:00:00 2001 From: Shatcar Date: Sat, 28 Mar 2026 10:21:34 -0600 Subject: [PATCH] Add fault reporting for SparkMax --- src/main/java/frc4388/robot/RobotMap.java | 5 +- .../frc4388/utility/status/FaultSparkMax.java | 97 +++++++++++++++++++ 2 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 src/main/java/frc4388/utility/status/FaultSparkMax.java diff --git a/src/main/java/frc4388/robot/RobotMap.java b/src/main/java/frc4388/robot/RobotMap.java index a9f19e9..eba05db 100644 --- a/src/main/java/frc4388/robot/RobotMap.java +++ b/src/main/java/frc4388/robot/RobotMap.java @@ -37,6 +37,7 @@ import frc4388.robot.subsystems.vision.VisionReal; import frc4388.utility.status.FaultCANCoder; import frc4388.utility.status.FaultPhotonCamera; import frc4388.utility.status.FaultPidgeon2; +import frc4388.utility.status.FaultSparkMax; import frc4388.utility.status.FaultTalonFX; /** @@ -118,8 +119,8 @@ public class RobotMap { FaultTalonFX.addDevice(shooter1, "Shooter1"); FaultTalonFX.addDevice(shooter2, "Shooter2"); FaultTalonFX.addDevice(indexer, "Indexer"); - // FaultTalonFX.addDevice(arm, "Arm"); - // FaultTalonFX.addDevice(roller, "Roller"); + FaultSparkMax.addDevice(arm, "Arm"); + FaultSparkMax.addDevice(roller, "Roller"); FaultTalonFX.addDevice(swerveDrivetrainReal.getModule(0).getDriveMotor(), "Module 0 Drive"); FaultTalonFX.addDevice(swerveDrivetrainReal.getModule(0).getSteerMotor(), "Module 0 Steer"); diff --git a/src/main/java/frc4388/utility/status/FaultSparkMax.java b/src/main/java/frc4388/utility/status/FaultSparkMax.java new file mode 100644 index 0000000..f9035a9 --- /dev/null +++ b/src/main/java/frc4388/utility/status/FaultSparkMax.java @@ -0,0 +1,97 @@ +package frc4388.utility.status; + +import com.revrobotics.spark.SparkBase.Faults; +import com.revrobotics.spark.SparkBase.Warnings; +import com.revrobotics.spark.SparkMax; + +import frc4388.utility.status.Status.ReportLevel; + +public class FaultSparkMax implements Queryable { + private String name; + private SparkMax motor; + + public static void addDevice(SparkMax motor, String name) { + FaultSparkMax p = new FaultSparkMax(); + + p.name = name; + p.motor = motor; + + FaultReporter.register(p); + } + + @Override + public String getName() { + return name; + } + + @Override + public Status diagnosticStatus() { + Status s = new Status(); + + s.addReport(ReportLevel.INFO, "Firmware Version: " + motor.getFirmwareString()); + s.addReport(ReportLevel.INFO, "Voltage: " + motor.getBusVoltage()); + s.addReport(ReportLevel.INFO, "Current: " + motor.getOutputCurrent()); + s.addReport(ReportLevel.INFO, "Device temp (C): " + motor.getMotorTemperature()); + s.addReport(ReportLevel.INFO, "Position: " + motor.getEncoder().getPosition()); + s.addReport(ReportLevel.INFO, "Velocity: " + motor.getEncoder().getVelocity()); + s.addReport(ReportLevel.INFO, "Forward hard limit: " + motor.getForwardLimitSwitch().isPressed()); + s.addReport(ReportLevel.INFO, "Reverse hard limit: " + motor.getReverseLimitSwitch().isPressed()); + s.addReport(ReportLevel.INFO, "Forward soft limit: " + motor.getForwardSoftLimit().isReached()); + s.addReport(ReportLevel.INFO, "Reverse soft limit: " + motor.getReverseSoftLimit().isReached()); + + // faults + Faults faults = motor.getFaults(); + if(faults.can) { + s.addReport(ReportLevel.ERROR, "CAN Fault (Joe Johnson)"); + } + if(faults.escEeprom) { + s.addReport(ReportLevel.ERROR, "Escape Eeprom. Cannot write to internal memory (oh god I don't want to think about what this means)"); + } + if(faults.firmware) { + s.addReport(ReportLevel.ERROR, "Firmware Fault"); + } + if(faults.gateDriver) { + s.addReport(ReportLevel.ERROR, "Gate Driver Fault"); + } + if(faults.motorType) { + s.addReport(ReportLevel.ERROR, "Motor type Fault"); + } + if(faults.other) { + s.addReport(ReportLevel.ERROR, "Fault type is 'other'. Hope for the best!"); + } + if(faults.sensor) { + s.addReport(ReportLevel.ERROR, "Sensor fault"); + } + if(faults.temperature) { + s.addReport(ReportLevel.ERROR, "Tempreture fault"); + } + + Warnings warnings = motor.getWarnings(); + if(warnings.brownout) { + s.addReport(ReportLevel.WARNING, "Brownout detected"); + } + if (warnings.escEeprom) { + s.addReport(ReportLevel.WARNING, "Escape Eeprom. Cannot write to internal memory. (Why is only a warning)"); + } + if (warnings.extEeprom) { + s.addReport(ReportLevel.WARNING, "Exit Eeprom. Cannot write to internal memory. (Why is only a warning)"); + } + if (warnings.hasReset) { + s.addReport(ReportLevel.WARNING, "Has Reset"); + } + if (warnings.other) { + s.addReport(ReportLevel.WARNING, "Other. Warning message sold seperately"); + } + if (warnings.overcurrent) { + s.addReport(ReportLevel.WARNING, "Overcurrent"); + } + if (warnings.sensor) { + s.addReport(ReportLevel.WARNING, "Sensor problem"); + } + if (warnings.stall) { + s.addReport(ReportLevel.WARNING, "Motor stall detected"); + } + + return s; + } +}