From 2accd8b3c2f41d2ac2fea51987c9289e8d5930c5 Mon Sep 17 00:00:00 2001 From: Dean Brettle Date: Thu, 20 Jun 2024 12:35:42 -0700 Subject: [PATCH 1/3] Temporarily remove anonymous subsclass to see if it fixes the problem. --- .../lib199/sim/MockSparkBase.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java b/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java index afc45e2..f57c0ad 100644 --- a/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java +++ b/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java @@ -196,13 +196,16 @@ public void close() { */ public synchronized SparkAbsoluteEncoder getAbsoluteEncoder(SparkAbsoluteEncoder.Type encoderType) { if(absoluteEncoder == null) { - MockedEncoder absoluteEncoderImpl = new MockedEncoder(SimDevice.create("CANDutyCycle:" + name, port), 0, false, true) { - @Override - public double getVelocity() { - // A SparkAbsoluteEncoder returns a velocity in rps, not rpm. - return super.getVelocity() / 60.0; - } - }; + MockedEncoder absoluteEncoderImpl = new MockedEncoder( + SimDevice.create("CANDutyCycle:" + name, port), 0, false, + true); + // { + // @Override + // public double getVelocity() { + // // A SparkAbsoluteEncoder returns a velocity in rps, not rpm. + // return super.getVelocity() / 60.0; + // } + // }; absoluteEncoder = Mocks.createMock(SparkAbsoluteEncoder.class, absoluteEncoderImpl, new REVLibErrorAnswer()); } return absoluteEncoder; From e1d9b589cfe64d654832ded420b2a3451e5dbae2 Mon Sep 17 00:00:00 2001 From: Dean Brettle Date: Thu, 20 Jun 2024 13:10:36 -0700 Subject: [PATCH 2/3] Workaround access error when calling getVelocity() on and absolute encoder by moving the functionality from an anonymous subclass to MockedEncoder. --- .../lib199/sim/MockSparkBase.java | 9 +----- .../lib199/sim/MockedEncoder.java | 28 +++++++++++++++---- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java b/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java index f57c0ad..b8e787a 100644 --- a/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java +++ b/src/main/java/org/carlmontrobotics/lib199/sim/MockSparkBase.java @@ -198,14 +198,7 @@ public synchronized SparkAbsoluteEncoder getAbsoluteEncoder(SparkAbsoluteEncoder if(absoluteEncoder == null) { MockedEncoder absoluteEncoderImpl = new MockedEncoder( SimDevice.create("CANDutyCycle:" + name, port), 0, false, - true); - // { - // @Override - // public double getVelocity() { - // // A SparkAbsoluteEncoder returns a velocity in rps, not rpm. - // return super.getVelocity() / 60.0; - // } - // }; + true, true); absoluteEncoder = Mocks.createMock(SparkAbsoluteEncoder.class, absoluteEncoderImpl, new REVLibErrorAnswer()); } return absoluteEncoder; diff --git a/src/main/java/org/carlmontrobotics/lib199/sim/MockedEncoder.java b/src/main/java/org/carlmontrobotics/lib199/sim/MockedEncoder.java index 7bcff87..7456ddc 100644 --- a/src/main/java/org/carlmontrobotics/lib199/sim/MockedEncoder.java +++ b/src/main/java/org/carlmontrobotics/lib199/sim/MockedEncoder.java @@ -32,6 +32,7 @@ public class MockedEncoder implements AbsoluteEncoder, AnalogInput, AutoCloseabl protected final SimBoolean init; protected final int countsPerRev; protected final boolean absolute; + protected final boolean useRps; protected double positionConversionFactor = 1.0; protected double velocityConversionFactor = 1.0; protected double positionOffset = 0.0; @@ -41,11 +42,26 @@ public class MockedEncoder implements AbsoluteEncoder, AnalogInput, AutoCloseabl * @param device The device to retrieve position and velocity data from * @param countsPerRev The value that this.getCountsPerRevolution() should return * @param analog Whether the encoder is an analog sensor - * @param absolute Whether the encoder is an absolute encoder. - * This flag caps the position to one rotation via. {@link MathUtil#inputModulus(double, double, double)}, - * disables {@link #setPosition(double)}, and enables {@link #setZeroOffset(double)}. + * @param absolute Whether the encoder is an absolute encoder. This flag caps the position to + * one rotation via. {@link MathUtil#inputModulus(double, double, double)}, disables + * {@link #setPosition(double)}, and enables {@link #setZeroOffset(double)}. */ - public MockedEncoder(SimDevice device, int countsPerRev, boolean analog, boolean absolute) { + public MockedEncoder(SimDevice device, int countsPerRev, boolean analog, + boolean absolute) { + this(device, countsPerRev, analog, absolute, false); + } + + /** + * @param device The device to retrieve position and velocity data from + * @param countsPerRev The value that this.getCountsPerRevolution() should return + * @param analog Whether the encoder is an analog sensor + * @param absolute Whether the encoder is an absolute encoder. This flag caps the position to + * one rotation via. {@link MathUtil#inputModulus(double, double, double)}, disables + * {@link #setPosition(double)}, and enables {@link #setZeroOffset(double)}. + * @param useRps Whether getVelocity() should return rps instead of rpm. + */ + public MockedEncoder(SimDevice device, int countsPerRev, boolean analog, + boolean absolute, boolean useRps) { this.device = device; position = device.createDouble("position", Direction.kInput, 0); // Rotations velocity = device.createDouble("velocity", Direction.kInput, 0); // Rotations per *second* @@ -56,6 +72,7 @@ public MockedEncoder(SimDevice device, int countsPerRev, boolean analog, boolean } this.countsPerRev = countsPerRev; this.absolute = absolute; + this.useRps = useRps; init = device.createBoolean("init", Direction.kOutput, true); } @@ -105,7 +122,8 @@ public double getPosition() { @Override public double getVelocity() { - return velocity.get() * 60 * (inverted ? -1 : 1) * velocityConversionFactor; + return velocity.get() * (useRps ? 1 : 60) * (inverted ? -1 : 1) + * velocityConversionFactor; } @Override From 3672212a7afd566b805264cd0f52ee3b8c61e033 Mon Sep 17 00:00:00 2001 From: Dean Brettle Date: Thu, 20 Jun 2024 13:44:54 -0700 Subject: [PATCH 3/3] Address doc issue raised in PR. --- .../java/org/carlmontrobotics/lib199/sim/MockedEncoder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/carlmontrobotics/lib199/sim/MockedEncoder.java b/src/main/java/org/carlmontrobotics/lib199/sim/MockedEncoder.java index 7456ddc..0520b7d 100644 --- a/src/main/java/org/carlmontrobotics/lib199/sim/MockedEncoder.java +++ b/src/main/java/org/carlmontrobotics/lib199/sim/MockedEncoder.java @@ -45,6 +45,8 @@ public class MockedEncoder implements AbsoluteEncoder, AnalogInput, AutoCloseabl * @param absolute Whether the encoder is an absolute encoder. This flag caps the position to * one rotation via. {@link MathUtil#inputModulus(double, double, double)}, disables * {@link #setPosition(double)}, and enables {@link #setZeroOffset(double)}. + * + * {@link #getVelocity()} will return a value in rpm. */ public MockedEncoder(SimDevice device, int countsPerRev, boolean analog, boolean absolute) {