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()); }