Merge "Adds WaitResult to Java waitForInterrupt"

This commit is contained in:
Peter Johnson (294)
2016-01-02 09:54:57 -08:00
committed by Gerrit Code Review
2 changed files with 85 additions and 4 deletions

View File

@@ -15,6 +15,27 @@ import edu.wpi.first.wpilibj.util.CheckedAllocationException;
* Base for sensors to be used with interrupts
*/
public abstract class InterruptableSensorBase extends SensorBase {
public static enum WaitResult {
kTimeout(0x0), kRisingEdge(0x1), kFallingEdge(0x100), kBoth(0x101);
public final int value;
public static WaitResult valueOf(int value) {
for (WaitResult mode : values()) {
if (mode.value == value) {
return mode;
}
}
return null;
}
private WaitResult(int value) {
this.value = value;
}
}
/**
* The interrupt resource
*/
@@ -141,21 +162,25 @@ public abstract class InterruptableSensorBase extends SensorBase {
* @param timeout Timeout in seconds
* @param ignorePrevious If true, ignore interrupts that happened before
* waitForInterrupt was called.
* @return Result of the wait.
*/
public void waitForInterrupt(double timeout, boolean ignorePrevious) {
public WaitResult waitForInterrupt(double timeout, boolean ignorePrevious) {
if (m_interrupt == 0) {
throw new IllegalStateException("The interrupt is not allocated.");
}
InterruptJNI.waitForInterrupt(m_interrupt, timeout, ignorePrevious);
int result = InterruptJNI.waitForInterrupt(m_interrupt, timeout, ignorePrevious);
return WaitResult.valueOf(result);
}
/**
* In synchronous mode, wait for the defined interrupt to occur.
*
* @param timeout Timeout in seconds
* @return Result of the wait.
*/
public void waitForInterrupt(double timeout) {
waitForInterrupt(timeout, true);
public WaitResult waitForInterrupt(double timeout) {
return waitForInterrupt(timeout, true);
}
/**

View File

@@ -218,6 +218,62 @@ public abstract class AbstractInterruptTest extends AbstractComsSetup {
synchronousDelay, interruptRunTime, .1);
}
@Test(timeout = (long) (synchronousTimeout * 1e3))
public void testSynchronousInterruptsWaitResultTimeout() {
// Given
getInterruptable().requestInterrupts();
//Don't fire interrupt. Expect it to timeout.
InterruptableSensorBase.WaitResult result = getInterruptable().waitForInterrupt(synchronousTimeout / 2);
assertEquals("The interrupt did not time out correctly.", result, InterruptableSensorBase.WaitResult.kTimeout);
}
@Test(timeout = (long) (synchronousTimeout * 1e3))
public void testSynchronousInterruptsWaitResultRisingEdge() {
// Given
getInterruptable().requestInterrupts();
final double synchronousDelay = synchronousTimeout / 2.;
Runnable r = new Runnable() {
@Override
public void run() {
Timer.delay(synchronousDelay);
setInterruptLow();
setInterruptHigh();
}
};
new Thread(r).start();
// Delay for twice as long as the timeout so the test should fail first
InterruptableSensorBase.WaitResult result = getInterruptable().waitForInterrupt(synchronousTimeout * 2);
assertEquals("The interrupt did not fire on the rising edge.", result, InterruptableSensorBase.WaitResult.kRisingEdge);
}
@Test(timeout = (long) (synchronousTimeout * 1e3))
public void testSynchronousInterruptsWaitResultFallingEdge() {
// Given
getInterruptable().requestInterrupts();
getInterruptable().setUpSourceEdge(false, true);
final double synchronousDelay = synchronousTimeout / 2.;
Runnable r = new Runnable() {
@Override
public void run() {
Timer.delay(synchronousDelay);
setInterruptHigh();
setInterruptLow();
}
};
new Thread(r).start();
// Delay for twice as long as the timeout so the test should fail first
InterruptableSensorBase.WaitResult result = getInterruptable().waitForInterrupt(synchronousTimeout * 2);
assertEquals("The interrupt did not fire on the falling edge.", result, InterruptableSensorBase.WaitResult.kFallingEdge);
}
@Test(timeout = 4000)
public void testDisableStopsInterruptFiring() {