Our robot has two
VEX ultrasonic rangefinders, each connected to separate DIO ports on the digital sidecar. We're using the command-based template.
In a subsystem they're declared as:
Code:
private Ultrasonic wallSonar, ballSonar;
and in the constructor of the subsystem,
Code:
ballSonar = new Ultrasonic(Map.ARM_SONAR_INPUT, Map.ARM_SONAR_OUTPUT);
ballSonar.setEnabled(true);
ballSonar.setAutomaticMode(true);
wallSonar = new Ultrasonic(Map.LAUNCHER_SONAR_INPUT, Map.LAUNCHER_SONAR_OUTPUT);
wallSonar.setEnabled(true);
wallSonar.setAutomaticMode(true);
Ultrasonic.java in WPILib appears to be designed to handle >1 Ultrasonic instance, but when we try to run this code
it throws an IllegalThreadStateException.
Things we tried so far:
- Changing the order of assignment (wallSonar before ballSonar, ballSonar before wallSonar); still throws IllegalThreadStateException
- Moving one of the Ultrasonic sensors to a different subsystem; still throws IllegalThreadStateException.
- Declaring only one of the Ultrasonic sensors; having only one Ultrasonic sensor throws no errors, and the sensor works as expected.
- Unit testing with SimpleRobot,
like this. Both sensors worked as expected, with no errors thrown.
Any idea why we can't declare/use two Ultrasonic sensors?
Thanks to Jeanne Boyarsky from team 694 at NYC today for helping us try to fix this.