mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-25 01:41:43 +00:00
[hal] Fix interrupt edges being flipped in sim (#6720)
This commit is contained in:
@@ -4,7 +4,9 @@
|
||||
|
||||
package edu.wpi.first.wpilibj;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertAll;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import edu.wpi.first.wpilibj.simulation.DIOSim;
|
||||
@@ -22,7 +24,7 @@ class InterruptTest {
|
||||
AsynchronousInterrupt interrupt =
|
||||
new AsynchronousInterrupt(
|
||||
di,
|
||||
(a, b) -> {
|
||||
(rising, falling) -> {
|
||||
counter.incrementAndGet();
|
||||
hasFired.set(true);
|
||||
})) {
|
||||
@@ -43,4 +45,78 @@ class InterruptTest {
|
||||
assertEquals(1, counter.get(), "The interrupt did not fire the expected number of times");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRisingEdge() {
|
||||
AtomicBoolean hasFiredFallingEdge = new AtomicBoolean(false);
|
||||
AtomicBoolean hasFiredRisingEdge = new AtomicBoolean(false);
|
||||
|
||||
try (DigitalInput di = new DigitalInput(0);
|
||||
AsynchronousInterrupt interrupt =
|
||||
new AsynchronousInterrupt(
|
||||
di,
|
||||
(rising, falling) -> {
|
||||
hasFiredFallingEdge.set(falling);
|
||||
hasFiredRisingEdge.set(rising);
|
||||
})) {
|
||||
interrupt.setInterruptEdges(true, true);
|
||||
DIOSim digitalSim = new DIOSim(di);
|
||||
digitalSim.setValue(false);
|
||||
Timer.delay(0.5);
|
||||
interrupt.enable();
|
||||
Timer.delay(0.01);
|
||||
digitalSim.setValue(true);
|
||||
Timer.delay(0.01);
|
||||
|
||||
int count = 0;
|
||||
while (!hasFiredRisingEdge.get()) {
|
||||
Timer.delay(0.005);
|
||||
count++;
|
||||
assertTrue(count < 1000);
|
||||
}
|
||||
assertAll(
|
||||
() ->
|
||||
assertFalse(hasFiredFallingEdge.get(), "The interrupt triggered on the falling edge"),
|
||||
() ->
|
||||
assertTrue(
|
||||
hasFiredRisingEdge.get(), "The interrupt did not trigger on the rising edge"));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFallingEdge() {
|
||||
AtomicBoolean hasFiredFallingEdge = new AtomicBoolean(false);
|
||||
AtomicBoolean hasFiredRisingEdge = new AtomicBoolean(false);
|
||||
|
||||
try (DigitalInput di = new DigitalInput(0);
|
||||
AsynchronousInterrupt interrupt =
|
||||
new AsynchronousInterrupt(
|
||||
di,
|
||||
(rising, falling) -> {
|
||||
hasFiredFallingEdge.set(falling);
|
||||
hasFiredRisingEdge.set(rising);
|
||||
})) {
|
||||
interrupt.setInterruptEdges(true, true);
|
||||
DIOSim digitalSim = new DIOSim(di);
|
||||
digitalSim.setValue(true);
|
||||
Timer.delay(0.5);
|
||||
interrupt.enable();
|
||||
Timer.delay(0.01);
|
||||
digitalSim.setValue(false);
|
||||
Timer.delay(0.01);
|
||||
|
||||
int count = 0;
|
||||
while (!hasFiredFallingEdge.get()) {
|
||||
Timer.delay(0.005);
|
||||
count++;
|
||||
assertTrue(count < 1000);
|
||||
}
|
||||
assertAll(
|
||||
() ->
|
||||
assertTrue(
|
||||
hasFiredFallingEdge.get(), "The interrupt did not trigger on the rising edge"),
|
||||
() ->
|
||||
assertFalse(hasFiredRisingEdge.get(), "The interrupt triggered on the rising edge"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user