Add fault reporting for SparkMax

This commit is contained in:
Shatcar
2026-03-28 10:21:34 -06:00
parent bc933eba94
commit aead1c165a
2 changed files with 100 additions and 2 deletions
+3 -2
View File
@@ -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");
@@ -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;
}
}