diff --git a/styleguide/spotbugs-exclude.xml b/styleguide/spotbugs-exclude.xml
index 21e70e0ba6..c5e2d20898 100644
--- a/styleguide/spotbugs-exclude.xml
+++ b/styleguide/spotbugs-exclude.xml
@@ -126,6 +126,9 @@
+
+
+
diff --git a/wpilibc/src/main/native/cpp/MotorSafety.cpp b/wpilibc/src/main/native/cpp/MotorSafety.cpp
index 0395d707c6..368092b221 100644
--- a/wpilibc/src/main/native/cpp/MotorSafety.cpp
+++ b/wpilibc/src/main/native/cpp/MotorSafety.cpp
@@ -24,7 +24,7 @@ class Thread : public wpi::SafeThread {
};
void Thread::Main() {
- wpi::Event event{true, false};
+ wpi::Event event{false, false};
HAL_ProvideNewDataEventHandle(event.GetHandle());
int safetyCounter = 0;
diff --git a/wpilibc/src/main/native/cpp/motorcontrol/PWMMotorController.cpp b/wpilibc/src/main/native/cpp/motorcontrol/PWMMotorController.cpp
index 0042b62e46..3692f757b1 100644
--- a/wpilibc/src/main/native/cpp/motorcontrol/PWMMotorController.cpp
+++ b/wpilibc/src/main/native/cpp/motorcontrol/PWMMotorController.cpp
@@ -12,6 +12,7 @@ using namespace frc;
void PWMMotorController::Set(double speed) {
m_pwm.SetSpeed(m_isInverted ? -speed : speed);
+ Feed();
}
double PWMMotorController::Get() const {
@@ -31,7 +32,8 @@ void PWMMotorController::Disable() {
}
void PWMMotorController::StopMotor() {
- Set(0);
+ // Don't use Set(0) as that will feed the watch kitty
+ m_pwm.SetSpeed(0);
}
std::string PWMMotorController::GetDescription() const {
diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/MotorSafety.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/MotorSafety.java
index dbdbafe793..c1bf04b891 100644
--- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/MotorSafety.java
+++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/MotorSafety.java
@@ -4,6 +4,9 @@
package edu.wpi.first.wpilibj;
+import edu.wpi.first.hal.ControlWord;
+import edu.wpi.first.hal.DriverStationJNI;
+import edu.wpi.first.util.WPIUtilJNI;
import java.util.LinkedHashSet;
import java.util.Set;
@@ -24,12 +27,49 @@ public abstract class MotorSafety {
private final Object m_thisMutex = new Object();
private static final Set m_instanceList = new LinkedHashSet<>();
private static final Object m_listMutex = new Object();
+ private static Thread m_safetyThread;
+
+ @SuppressWarnings("PMD.AssignmentInOperand")
+ private static void threadMain() {
+ int event = WPIUtilJNI.createEvent(false, false);
+ DriverStationJNI.provideNewDataEventHandle(event);
+ ControlWord controlWord = new ControlWord();
+
+ int safetyCounter = 0;
+ while (true) {
+ boolean timedOut;
+ try {
+ timedOut = WPIUtilJNI.waitForObjectTimeout(event, 0.1);
+ } catch (InterruptedException e) {
+ DriverStationJNI.removeNewDataEventHandle(event);
+ WPIUtilJNI.destroyEvent(event);
+ Thread.currentThread().interrupt();
+ return;
+ }
+ if (!timedOut) {
+ DriverStationJNI.getControlWord(controlWord);
+ if (!(controlWord.getEnabled() && controlWord.getDSAttached())) {
+ safetyCounter = 0;
+ }
+ if (++safetyCounter >= 4) {
+ checkMotors();
+ safetyCounter = 0;
+ }
+ } else {
+ safetyCounter = 0;
+ }
+ }
+ }
/** MotorSafety constructor. */
public MotorSafety() {
synchronized (m_listMutex) {
m_instanceList.add(this);
- // TODO Threads
+ if (m_safetyThread == null) {
+ m_safetyThread = new Thread(() -> threadMain(), "MotorSafety Thread");
+ m_safetyThread.setDaemon(true);
+ m_safetyThread.start();
+ }
}
}
diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/motorcontrol/PWMMotorController.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/motorcontrol/PWMMotorController.java
index 56ed1c8c4e..68817a1dad 100644
--- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/motorcontrol/PWMMotorController.java
+++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/motorcontrol/PWMMotorController.java
@@ -78,7 +78,8 @@ public abstract class PWMMotorController extends MotorSafety
@Override
public void stopMotor() {
- set(0);
+ // Don't use set(0) as that will feed the watch kitty
+ m_pwm.setSpeed(0);
}
@Override