Unknown error that error prone told me to report
error: An unhandled exception was thrown by the Error Prone static analysis plugin. Logger.recordOutput("Intake/EncoderResetDelta", encodersResetDelta); ^ Please report this at https://github.com/google/error-prone/issues/new and include the following:
error-prone version: 2.42.0
BugPattern: StringConcatToTextBlock
Stack Trace:
java.util.NoSuchElementException
at com.google.common.collect.Iterables.getLast(Iterables.java:845)
at com.google.errorprone.bugpatterns.StringConcatToTextBlock.matchLiteral(StringConcatToTextBlock.java:101)
at com.google.errorprone.scanner.ErrorProneScanner.processMatchers(ErrorProneScanner.java:509)
at com.google.errorprone.scanner.ErrorProneScanner.visitLiteral(ErrorProneScanner.java:786)
at com.google.errorprone.scanner.ErrorProneScanner.visitLiteral(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCLiteral.accept(JCTree.java:2637)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:111)
at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:119)
at jdk.compiler/com.sun.source.util.TreeScanner.visitMethodInvocation(TreeScanner.java:590)
at com.google.errorprone.scanner.ErrorProneScanner.visitMethodInvocation(ErrorProneScanner.java:829)
at com.google.errorprone.scanner.ErrorProneScanner.visitMethodInvocation(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1813)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.visitExpressionStatement(TreeScanner.java:502)
at com.google.errorprone.scanner.ErrorProneScanner.visitExpressionStatement(ErrorProneScanner.java:711)
at com.google.errorprone.scanner.ErrorProneScanner.visitExpressionStatement(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1592)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:96)
at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:111)
at jdk.compiler/com.sun.source.util.TreeScanner.visitBlock(TreeScanner.java:272)
at com.google.errorprone.scanner.ErrorProneScanner.visitBlock(ErrorProneScanner.java:591)
at com.google.errorprone.scanner.ErrorProneScanner.visitBlock(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1103)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:96)
at jdk.compiler/com.sun.source.util.TreeScanner.visitMethod(TreeScanner.java:224)
at com.google.errorprone.scanner.ErrorProneScanner.visitMethod(ErrorProneScanner.java:818)
at com.google.errorprone.scanner.ErrorProneScanner.visitMethod(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:953)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:96)
at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:111)
at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:119)
at jdk.compiler/com.sun.source.util.TreeScanner.visitClass(TreeScanner.java:203)
at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:619)
at com.google.errorprone.scanner.ErrorProneScanner.visitClass(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:860)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:86)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:74)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:48)
at jdk.compiler/com.sun.source.util.TreeScanner.scan(TreeScanner.java:111)
at jdk.compiler/com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:119)
at jdk.compiler/com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:152)
at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:631)
at com.google.errorprone.scanner.ErrorProneScanner.visitCompilationUnit(ErrorProneScanner.java:170)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:614)
at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:60)
at com.google.errorprone.scanner.Scanner.scan(Scanner.java:58)
at com.google.errorprone.scanner.ErrorProneScannerTransformer.apply(ErrorProneScannerTransformer.java:43)
at com.google.errorprone.ErrorProneAnalyzer.finished(ErrorProneAnalyzer.java:231)
at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:132)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1397)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1344)
at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:933)
at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.invocationHelper(JavacTaskImpl.java:152)
at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)
at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)
at org.gradle.internal.compiler.java.IncrementalCompileTask.call(IncrementalCompileTask.java:92)
at org.gradle.api.internal.tasks.compile.AnnotationProcessingCompileTask.call(AnnotationProcessingCompileTask.java:94)
at org.gradle.api.internal.tasks.compile.ResourceCleaningCompilationTask.call(ResourceCleaningCompilationTask.java:57)
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:78)
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:46)
at org.gradle.api.internal.tasks.compile.daemon.AbstractIsolatedCompilerWorkerExecutor$CompilerWorkAction.execute(AbstractIsolatedCompilerWorkerExecutor.java:78)
at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
at org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:54)
at org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:48)
at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
at org.gradle.workers.internal.AbstractClassLoaderWorker.executeInClassLoader(AbstractClassLoaderWorker.java:48)
at org.gradle.workers.internal.FlatClassLoaderWorker.run(FlatClassLoaderWorker.java:32)
at org.gradle.workers.internal.FlatClassLoaderWorker.run(FlatClassLoaderWorker.java:22)
at org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:103)
at org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:72)
at org.gradle.process.internal.worker.request.WorkerAction$1.call(WorkerAction.java:152)
at org.gradle.process.internal.worker.child.WorkerLogEventListener.withWorkerLoggingProtocol(WorkerLogEventListener.java:41)
at org.gradle.process.internal.worker.request.WorkerAction.lambda$run$1(WorkerAction.java:149)
at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
at org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:141)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:840)file that it choked on for context:
package frc.robot.subsystems;
import static edu.wpi.first.units.Units.*;
import com.ctre.phoenix6.configs.AudioConfigs; import com.ctre.phoenix6.configs.Slot0Configs; import com.ctre.phoenix6.configs.TalonFXConfiguration; import com.ctre.phoenix6.controls.MotionMagicExpoVoltage; import com.ctre.phoenix6.controls.MotionMagicVelocityVoltage; import com.ctre.phoenix6.controls.VoltageOut; import com.ctre.phoenix6.signals.GravityTypeValue; import com.ctre.phoenix6.signals.InvertedValue; import com.ctre.phoenix6.signals.NeutralModeValue; import edu.wpi.first.math.util.Units; import edu.wpi.first.units.VoltageUnit; import edu.wpi.first.units.measure.Current; import edu.wpi.first.units.measure.Time; import edu.wpi.first.units.measure.Velocity; import edu.wpi.first.units.measure.Voltage; import edu.wpi.first.wpilibj.Alert.AlertType; import edu.wpi.first.wpilibj.Timer; import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine; import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine.Direction; import frc.robot.Constants; import frc.robot.RobotContainer; import frc.robot.subsystems.io.IntakeIO; import frc.robot.subsystems.io.IntakeIOInputsAutoLogged; import frc.robot.subsystems.io.sim.IntakeSim; import frc.robot.utils.AutoLogLevel; import frc.robot.utils.KillableSubsystem; import frc.robot.utils.PositionedSubsystem; import frc.robot.utils.PoweredSubsystem; import frc.robot.utils.SimpleMath; import frc.robot.utils.SysIdManager; import frc.robot.utils.SysIdManager.SysIdProvider; import frc.robot.utils.wrappers.SafeAlert; import org.littletonrobotics.junction.Logger; import org.littletonrobotics.junction.networktables.LoggedNetworkBoolean;
public final class Intake extends KillableSubsystem implements PoweredSubsystem, PositionedSubsystem { // Arm Leader is on the left of the intake (right of the robot) and Arm Follower is on the right of the intake (left // of the robot)
private static final double ARM_POSITION_TOLERANCE = Units.degreesToRotations(5);
private static final double ARM_POSITION_TOLERANCE_WHEEL_START = Units.degreesToRotations(20);
private static final double ARM_VELOCITY_TOLERANCE = Units.degreesToRotations(50);
private static final double WHEEL_VELOCITY_TOLERANCE_MPS = 2.0; // TODO
private static final Velocity<VoltageUnit> SYSID_ARM_RAMP_RATE =
Volts.of(2.0).per(Second);
private static final Voltage SYSID_ARM_STEP_VOLTAGE = Volts.of(0.8);
private static final Time SYSID_ARM_TIMEOUT = Seconds.of(0.8);
private static final Velocity<VoltageUnit> SYSID_WHEEL_RAMP_RATE =
Volts.of(2.86).per(Second);
private static final Voltage SYSID_WHEEL_STEP_VOLTAGE = Volts.of(4.3);
private static final Time SYSID_WHEEL_TIMEOUT = Seconds.of(1.5);
private static final double RESET_VOLTAGE = -2.0;
private static final double RESET_VELOCITY_THRESHOLD = 0.06;
private static final double RESET_VELOCITY_THRESHOLD_TIME = 0.1;
private static final LoggedNetworkBoolean disableWheelToggle =
new LoggedNetworkBoolean("Intake/DisableWheel", false);
private final IntakeIO io;
private final IntakeIOInputsAutoLogged inputs = new IntakeIOInputsAutoLogged();
private final SysIdRoutine sysIdRoutineArm;
private final SysIdRoutine sysIdRoutineWheel;
private final MotionMagicExpoVoltage armRequest =
new MotionMagicExpoVoltage(Units.radiansToRotations(Constants.Intake.ARM_STARTING_POSITION_RADIANS));
private final MotionMagicVelocityVoltage wheelRequest = new MotionMagicVelocityVoltage(RotationsPerSecond.of(0.0));
private final VoltageOut armVoltageRequest = new VoltageOut(0);
private final VoltageOut wheelVoltageRequest = new VoltageOut(0);
private double armTargetRotations = Units.radiansToRotations(Constants.Intake.ARM_STARTING_POSITION_RADIANS);
private double wheelTargetVelocityMps = 0.0;
private double actualWheelTargetVelocityMps = 0.0;
private WheelMode wheelTargetState = WheelMode.OFF;
private IntakeState targetState = IntakeState.STARTING;
private double lastNotJammedTime = 0;
private PositionStatus positionStatus = PositionStatus.UNKNOWN;
private boolean hasStartedMovingDown = false;
private boolean runExtendHoming = false;
private double lastMovementTime = 0;
private boolean overrideKnown = false;
private double lastNotNegativePositionTime = 0;
private double encodersResetDelta = 0;
private final SafeAlert wheelDisconnectedAlert = new SafeAlert("Intake roller disconnected!", AlertType.kError);
public enum IntakeState {
INTAKE,
OUT,
EJECT,
STARTING,
RETRACTED
}
private enum WheelMode {
OFF,
INTAKE,
EJECT
}
public Intake(IntakeIO io) {
this.io = io;
TalonFXConfiguration configArm = new TalonFXConfiguration();
// set slot 0 gains
Slot0Configs slot0ConfigsLeader = configArm.Slot0;
slot0ConfigsLeader.kS = Constants.Intake.ARM_KS;
slot0ConfigsLeader.kV = Constants.Intake.ARM_KV;
slot0ConfigsLeader.kA = Constants.Intake.ARM_KA;
slot0ConfigsLeader.kG = Constants.Intake.ARM_KG;
slot0ConfigsLeader.kP = Constants.Intake.ARM_KP;
slot0ConfigsLeader.kD = Constants.Intake.ARM_KD;
slot0ConfigsLeader.GravityType = GravityTypeValue.Arm_Cosine;
slot0ConfigsLeader.GravityArmPositionOffset = Constants.Intake.ARM_GRAVITY_POSITION_OFFSET_ROTATIONS;
configArm.MotionMagic.MotionMagicExpo_kV = Constants.Intake.ARM_MMEXPO_KV;
configArm.MotionMagic.MotionMagicExpo_kA = Constants.Intake.ARM_MMEXPO_KA;
configArm.CurrentLimits.SupplyCurrentLimit = Constants.Intake.ARM_SUPPLY_CURRENT_LIMIT.in(Amps);
configArm.CurrentLimits.StatorCurrentLimit = Constants.Intake.ARM_STATOR_CURRENT_LIMIT.in(Amps);
configArm.CurrentLimits.SupplyCurrentLimitEnable = true;
configArm.CurrentLimits.StatorCurrentLimitEnable = true;
configArm.CurrentLimits.SupplyCurrentLowerLimit = Constants.Intake.ARM_SUPPLY_LOWER_CURRENT_LIMIT.in(Amps);
configArm.CurrentLimits.SupplyCurrentLowerTime =
Constants.Intake.ARM_SUPPLY_LOWER_CURRENT_LIMIT_TIME.in(Seconds);
configArm.SoftwareLimitSwitch.ForwardSoftLimitThreshold =
Units.radiansToRotations(Constants.Intake.ARM_MAX_POSITION_RADIANS);
configArm.SoftwareLimitSwitch.ReverseSoftLimitThreshold =
Units.radiansToRotations(Constants.Intake.ARM_DOWN_POSITION_RADIANS);
configArm.SoftwareLimitSwitch.ForwardSoftLimitEnable = true;
configArm.SoftwareLimitSwitch.ReverseSoftLimitEnable = true;
configArm.Feedback.SensorToMechanismRatio = Constants.Intake.ARM_GEAR_RATIO;
configArm.MotorOutput.NeutralMode = NeutralModeValue.Brake;
io.applyArmTalonFXConfig(configArm.withAudio(new AudioConfigs().withAllowMusicDurDisable(true)));
TalonFXConfiguration configWheel = new TalonFXConfiguration();
// set slot 0 gains
Slot0Configs slot0ConfigsWheel = configWheel.Slot0;
slot0ConfigsWheel.kS = Constants.Intake.WHEEL_KS;
slot0ConfigsWheel.kV = Constants.Intake.WHEEL_KV;
slot0ConfigsWheel.kA = Constants.Intake.WHEEL_KA;
slot0ConfigsWheel.kP = Constants.Intake.WHEEL_KP;
configWheel.MotionMagic.MotionMagicJerk = Constants.Intake.WHEEL_MAX_JERK;
configWheel.MotionMagic.MotionMagicAcceleration = Constants.Intake.WHEEL_MAX_ACCELERATION;
configWheel.CurrentLimits.SupplyCurrentLimit = Constants.Intake.WHEEL_SUPPLY_CURRENT_LIMIT.in(Amps);
configWheel.CurrentLimits.StatorCurrentLimit = Constants.Intake.WHEEL_STATOR_CURRENT_LIMIT.in(Amps);
configWheel.CurrentLimits.SupplyCurrentLimitEnable = true;
configWheel.CurrentLimits.StatorCurrentLimitEnable = true;
configWheel.CurrentLimits.SupplyCurrentLowerLimit = Constants.Intake.WHEEL_SUPPLY_LOWER_CURRENT_LIMIT.in(Amps);
configWheel.CurrentLimits.SupplyCurrentLowerTime =
Constants.Intake.WHEEL_SUPPLY_LOWER_CURRENT_LIMIT_TIME.in(Seconds);
configWheel.Feedback.SensorToMechanismRatio = 1.0 / Constants.Intake.WHEEL_METERS_PER_ROTATION;
configWheel.MotorOutput.Inverted = InvertedValue.Clockwise_Positive;
configWheel.MotorOutput.NeutralMode = NeutralModeValue.Coast;
io.applyWheelTalonFXConfig(configWheel.withAudio(new AudioConfigs().withAllowMusicDurDisable(true)));
setState(targetState);
sysIdRoutineArm = new SysIdRoutine(
new SysIdRoutine.Config(
SYSID_ARM_RAMP_RATE,
SYSID_ARM_STEP_VOLTAGE,
SYSID_ARM_TIMEOUT,
state -> Logger.recordOutput("Intake/Arm/SysIdTestState", state.toString())),
new SysIdRoutine.Mechanism(
v -> io.setArmControl(armVoltageRequest.withOutput(
v.in(Volts) + 0.9 * Math.cos(Units.rotationsToRadians(inputs.armPositionRotations)))),
null,
this));
sysIdRoutineWheel = new SysIdRoutine(
new SysIdRoutine.Config(
SYSID_WHEEL_RAMP_RATE, // default 1 volt/second ramp rate
SYSID_WHEEL_STEP_VOLTAGE, // default 7 volt step voltageSource: google/error-prone