From a55f34646d1fb898b4705af2bf44d862b1ce2fa8 Mon Sep 17 00:00:00 2001 From: Brad Miller Date: Tue, 23 Dec 2014 19:47:23 -0500 Subject: [PATCH] Encoder/Counter Fixes This fixes all encoder variants with the getRate and getPeriod methods. The clock speed in the HAL was updated, as was the scaling factors for setting the stall periods. A default of .5 seconds is now set for the max period. Additionally, a long standing bug was fixed with Java 2x encoders. Changed tests to take into account the increased default timeout on encoders Change-Id: I8b54c07ea467154be94d7ae7e9ada1775933dee4 --- hal/lib/Athena/Digital.cpp | 8 ++++---- wpilibc/wpilibC++Devices/src/Counter.cpp | 2 ++ wpilibc/wpilibC++Devices/src/Encoder.cpp | 1 + .../src/main/java/edu/wpi/first/wpilibj/Counter.java | 8 +++++++- .../src/main/java/edu/wpi/first/wpilibj/Encoder.java | 5 +++-- .../main/java/edu/wpi/first/wpilibj/MotorEncoderTest.java | 1 + 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/hal/lib/Athena/Digital.cpp b/hal/lib/Athena/Digital.cpp index 7164699067..38f040ab07 100644 --- a/hal/lib/Athena/Digital.cpp +++ b/hal/lib/Athena/Digital.cpp @@ -838,7 +838,7 @@ double getCounterPeriod(void* counter_pointer, int32_t *status) { // output.Period is a fixed point number that counts by 2 (24 bits, 25 integer bits) period = (double)(output.Period << 1) / (double)output.Count; } - return period * 1.0e-6; + return period * 2.5e-8; // result * timebase (currently 40ns) } /** @@ -850,7 +850,7 @@ double getCounterPeriod(void* counter_pointer, int32_t *status) { */ void setCounterMaxPeriod(void* counter_pointer, double maxPeriod, int32_t *status) { Counter* counter = (Counter*) counter_pointer; - counter->counter->writeTimerConfig_StallPeriod((uint32_t)(maxPeriod * 1.0e6), status); + counter->counter->writeTimerConfig_StallPeriod((uint32_t)(maxPeriod * 4.0e8), status); } /** @@ -1000,7 +1000,7 @@ double getEncoderPeriod(void* encoder_pointer, int32_t *status) { // output.Period is a fixed point number that counts by 2 (24 bits, 25 integer bits) value = (double)(output.Period << 1) / (double)output.Count; } - double measuredPeriod = value * 1.0e-6; + double measuredPeriod = value * 2.5e-8; return measuredPeriod / DECODING_SCALING_FACTOR; } @@ -1018,7 +1018,7 @@ double getEncoderPeriod(void* encoder_pointer, int32_t *status) { */ void setEncoderMaxPeriod(void* encoder_pointer, double maxPeriod, int32_t *status) { Encoder* encoder = (Encoder*) encoder_pointer; - encoder->encoder->writeTimerConfig_StallPeriod((uint32_t)(maxPeriod * 1.0e6 * DECODING_SCALING_FACTOR), status); + encoder->encoder->writeTimerConfig_StallPeriod((uint32_t)(maxPeriod * 4.0e8 * DECODING_SCALING_FACTOR), status); } /** diff --git a/wpilibc/wpilibC++Devices/src/Counter.cpp b/wpilibc/wpilibC++Devices/src/Counter.cpp index 76a0d3b9bd..b576ad3790 100644 --- a/wpilibc/wpilibC++Devices/src/Counter.cpp +++ b/wpilibc/wpilibC++Devices/src/Counter.cpp @@ -31,6 +31,8 @@ void Counter::InitCounter(Mode mode) m_allocatedUpSource = false; m_allocatedDownSource = false; + SetMaxPeriod(.5); + HALReport(HALUsageReporting::kResourceType_Counter, index, mode); } diff --git a/wpilibc/wpilibC++Devices/src/Encoder.cpp b/wpilibc/wpilibC++Devices/src/Encoder.cpp index 5934ae5790..b76bca30aa 100644 --- a/wpilibc/wpilibC++Devices/src/Encoder.cpp +++ b/wpilibc/wpilibC++Devices/src/Encoder.cpp @@ -52,6 +52,7 @@ void Encoder::InitEncoder(bool reverseDirection, EncodingType encodingType) reverseDirection, &index, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); m_counter = NULL; + SetMaxPeriod(.5); break; } case k1X: diff --git a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Counter.java b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Counter.java index aa4c2fc0a2..9dde48dc20 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Counter.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Counter.java @@ -86,6 +86,8 @@ public class Counter extends SensorBase implements CounterBase, m_upSource = null; m_downSource = null; + setMaxPeriod(.5); + UsageReporting.report(tResourceType.kResourceType_Counter, m_index, mode.value); } @@ -166,12 +168,16 @@ public class Counter extends SensorBase implements CounterBase, if (encodingType == null) throw new NullPointerException("Encoding type given was null"); + ByteBuffer status = ByteBuffer.allocateDirect(4); if (encodingType == EncodingType.k1X) { setUpSourceEdge(true, false); + CounterJNI.setCounterAverageSize(m_counter, 1, status.asIntBuffer()); } else { setUpSourceEdge(true, true); + CounterJNI.setCounterAverageSize(m_counter, 2, status.asIntBuffer()); } + HALUtil.checkStatus(status.asIntBuffer()); setDownSourceEdge(inverted, true); } @@ -374,7 +380,7 @@ public class Counter extends SensorBase implements CounterBase, ByteBuffer status = ByteBuffer.allocateDirect(4); status.order(ByteOrder.LITTLE_ENDIAN); CounterJNI.setCounterDownSourceEdge(m_counter, (byte) (risingEdge ? 1 - : 0), (byte) (fallingEdge ? 0 : 1), status.asIntBuffer()); + : 0), (byte) (fallingEdge ? 1 : 0), status.asIntBuffer()); HALUtil.checkStatus(status.asIntBuffer()); } diff --git a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Encoder.java b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Encoder.java index 14d4a06629..207f4f9509 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Encoder.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Encoder.java @@ -94,6 +94,7 @@ public class Encoder extends SensorBase implements CounterBase, PIDSource, LiveW HALUtil.checkStatus(status.asIntBuffer()); m_index = index.asIntBuffer().get(0); m_counter = null; + setMaxPeriod(.5); break; case EncodingType.k2X_val: case EncodingType.k1X_val: @@ -464,7 +465,7 @@ public class Encoder extends SensorBase implements CounterBase, PIDSource, LiveW public double getPeriod() { double measuredPeriod; if (m_counter != null) { - measuredPeriod = m_counter.getPeriod(); + measuredPeriod = m_counter.getPeriod() / decodingScaleFactor(); } else { ByteBuffer status = ByteBuffer.allocateDirect(4); // set the byte order @@ -472,7 +473,7 @@ public class Encoder extends SensorBase implements CounterBase, PIDSource, LiveW measuredPeriod = EncoderJNI.getEncoderPeriod(m_encoder, status.asIntBuffer()); HALUtil.checkStatus(status.asIntBuffer()); } - return measuredPeriod / decodingScaleFactor(); + return measuredPeriod; } /** diff --git a/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/MotorEncoderTest.java b/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/MotorEncoderTest.java index f71159fe65..ad4e8c1b60 100644 --- a/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/MotorEncoderTest.java +++ b/wpilibj/wpilibJavaIntegrationTests/src/main/java/edu/wpi/first/wpilibj/MotorEncoderTest.java @@ -196,6 +196,7 @@ public class MotorEncoderTest extends AbstractComsSetup { assertEquals(me.getType() + " Motor value was incorrect after reset.", me.getMotor().get(), 0, 0); assertEquals(me.getType() + " Counter1 value was incorrect after reset.", me.getCounters()[0].get(), 0); assertEquals(me.getType() + " Counter2 value was incorrect after reset.", me.getCounters()[1].get(), 0); + Timer.delay(0.5); // so this doesn't fail with the 0.5 second default timeout on the encoders assertTrue(me.getType() + " Encoder.getStopped() returned false after the motor was reset.", me.getEncoder().getStopped()); }