diff --git a/hal/include/HAL/Digital.hpp b/hal/include/HAL/Digital.hpp index 5fab060820..1b2d07d7e1 100644 --- a/hal/include/HAL/Digital.hpp +++ b/hal/include/HAL/Digital.hpp @@ -24,6 +24,7 @@ extern "C" bool allocatePWMChannel(void* digital_port_pointer, int32_t *status); void freePWMChannel(void* digital_port_pointer, int32_t *status); unsigned short getPWM(void* digital_port_pointer, int32_t *status); + void latchPWMZero(void* digital_port_pointer, int32_t *status); void setPWMPeriodScale(void* digital_port_pointer, uint32_t squelchMask, int32_t *status); void* allocatePWM(int32_t *status); void freePWM(void* pwmGenerator, int32_t *status); diff --git a/hal/lib/Athena/Digital.cpp b/hal/lib/Athena/Digital.cpp index 1e6b4adf8e..b7b4c5b91f 100644 --- a/hal/lib/Athena/Digital.cpp +++ b/hal/lib/Athena/Digital.cpp @@ -217,6 +217,12 @@ unsigned short getPWM(void* digital_port_pointer, int32_t *status) { } } +void latchPWMZero(void* digital_port_pointer, int32_t *status) { + DigitalPort* port = (DigitalPort*) digital_port_pointer; + pwmSystem->writeZeroLatch(1 << port->port.pin, true, status); + pwmSystem->writeZeroLatch(1 << port->port.pin, false, status); +} + /** * Set how how often the PWM signal is squelched, thus scaling the period. * diff --git a/wpilibc/wpilibC++Devices/include/PWM.h b/wpilibc/wpilibC++Devices/include/PWM.h index 4d1a9d38f0..e54194e552 100644 --- a/wpilibc/wpilibC++Devices/include/PWM.h +++ b/wpilibc/wpilibC++Devices/include/PWM.h @@ -40,6 +40,7 @@ public: virtual void SetRaw(unsigned short value); virtual unsigned short GetRaw(); void SetPeriodMultiplier(PeriodMultiplier mult); + void SetZeroLatch(); void EnableDeadbandElimination(bool eliminateDeadband); void SetBounds(int32_t max, int32_t deadbandMax, int32_t center, int32_t deadbandMin, int32_t min); diff --git a/wpilibc/wpilibC++Devices/src/Jaguar.cpp b/wpilibc/wpilibC++Devices/src/Jaguar.cpp index ced5d23a01..0a03cc1e94 100644 --- a/wpilibc/wpilibC++Devices/src/Jaguar.cpp +++ b/wpilibc/wpilibC++Devices/src/Jaguar.cpp @@ -26,6 +26,7 @@ void Jaguar::InitJaguar() SetBounds(2.31, 1.55, 1.507, 1.454, .697); SetPeriodMultiplier(kPeriodMultiplier_1X); SetRaw(m_centerPwm); + SetZeroLatch(); HALReport(HALUsageReporting::kResourceType_Jaguar, GetChannel()); LiveWindow::GetInstance()->AddActuator("Jaguar", GetChannel(), this); diff --git a/wpilibc/wpilibC++Devices/src/PWM.cpp b/wpilibc/wpilibC++Devices/src/PWM.cpp index 3391990450..028dc0feb6 100644 --- a/wpilibc/wpilibC++Devices/src/PWM.cpp +++ b/wpilibc/wpilibC++Devices/src/PWM.cpp @@ -352,6 +352,16 @@ void PWM::SetPeriodMultiplier(PeriodMultiplier mult) wpi_setErrorWithContext(status, getHALErrorMessage(status)); } +void PWM::SetZeroLatch() +{ + if (StatusIsFatal()) return; + + int32_t status = 0; + + latchPWMZero(m_pwm_ports[m_channel], &status); + wpi_setErrorWithContext(status, getHALErrorMessage(status)); +} + void PWM::ValueChanged(ITable* source, const std::string& key, EntryValue value, bool isNew) { SetSpeed(value.f); diff --git a/wpilibc/wpilibC++Devices/src/Talon.cpp b/wpilibc/wpilibC++Devices/src/Talon.cpp index 39d6bf187b..987f56bc20 100644 --- a/wpilibc/wpilibC++Devices/src/Talon.cpp +++ b/wpilibc/wpilibC++Devices/src/Talon.cpp @@ -27,6 +27,7 @@ void Talon::InitTalon() { SetBounds(2.037, 1.539, 1.513, 1.487, .989); SetPeriodMultiplier(kPeriodMultiplier_2X); SetRaw(m_centerPwm); + SetZeroLatch(); HALReport(HALUsageReporting::kResourceType_Talon, GetChannel()); LiveWindow::GetInstance()->AddActuator("Talon", GetChannel(), this); diff --git a/wpilibc/wpilibC++Devices/src/Victor.cpp b/wpilibc/wpilibC++Devices/src/Victor.cpp index 173e9c1801..c5a8e7e62b 100644 --- a/wpilibc/wpilibC++Devices/src/Victor.cpp +++ b/wpilibc/wpilibC++Devices/src/Victor.cpp @@ -29,6 +29,7 @@ void Victor::InitVictor() { SetPeriodMultiplier(kPeriodMultiplier_2X); SetRaw(m_centerPwm); + SetZeroLatch(); LiveWindow::GetInstance()->AddActuator("Victor", GetChannel(), this); HALReport(HALUsageReporting::kResourceType_Victor, GetChannel()); diff --git a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Jaguar.java b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Jaguar.java index 51a657b3f4..666bd5b62f 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Jaguar.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Jaguar.java @@ -32,6 +32,7 @@ public class Jaguar extends SafePWM implements SpeedController { setBounds(2.31, 1.55, 1.507, 1.454, .697); setPeriodMultiplier(PeriodMultiplier.k1X); setRaw(m_centerPwm); + setZeroLatch(); UsageReporting.report(tResourceType.kResourceType_Jaguar, getChannel()); LiveWindow.addActuator("Jaguar", getChannel(), this); diff --git a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/PWM.java b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/PWM.java index b2a40cc941..7f3e2fb737 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/PWM.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/PWM.java @@ -393,37 +393,37 @@ public class PWM extends SensorBase implements LiveWindowSendable { HALUtil.checkStatus(status.asIntBuffer()); } + + protected void setZeroLatch() + { + ByteBuffer status = ByteBuffer.allocateDirect(4); + status.order(ByteOrder.LITTLE_ENDIAN); + + PWMJNI.latchPWMZero(m_port, status.asIntBuffer()); + + HALUtil.checkStatus(status.asIntBuffer()); + } private int getMaxPositivePwm() { return m_maxPwm; } - ; - private int getMinPositivePwm() { return m_eliminateDeadband ? m_deadbandMaxPwm : m_centerPwm + 1; } - ; - private int getCenterPwm() { return m_centerPwm; } - ; - private int getMaxNegativePwm() { return m_eliminateDeadband ? m_deadbandMinPwm : m_centerPwm - 1; } - ; - private int getMinNegativePwm() { return m_minPwm; } - ; - private int getPositiveScaleFactor() { return getMaxPositivePwm() - getMinPositivePwm(); } ///< The scale for positive speeds. diff --git a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Talon.java b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Talon.java index 03a6cf1324..5353f88d9b 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Talon.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Talon.java @@ -34,6 +34,7 @@ public class Talon extends SafePWM implements SpeedController { setBounds(2.037, 1.539, 1.513, 1.487, .989); setPeriodMultiplier(PeriodMultiplier.k2X); setRaw(m_centerPwm); + setZeroLatch(); LiveWindow.addActuator("Talon", getChannel(), this); UsageReporting.report(tResourceType.kResourceType_Talon, getChannel()); diff --git a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Victor.java b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Victor.java index d30104c812..211308c2e3 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Victor.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Victor.java @@ -36,6 +36,7 @@ public class Victor extends SafePWM implements SpeedController { setBounds(2.027, 1.525, 1.507, 1.49, 1.026); setPeriodMultiplier(PeriodMultiplier.k2X); setRaw(m_centerPwm); + setZeroLatch(); LiveWindow.addActuator("Victor", getChannel(), this); UsageReporting.report(tResourceType.kResourceType_Victor, getChannel()); diff --git a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/hal/PWMJNI.java b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/hal/PWMJNI.java index 32ecaa7a85..a555c6adf1 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/hal/PWMJNI.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/hal/PWMJNI.java @@ -11,6 +11,7 @@ public class PWMJNI extends DIOJNI { public static native void freePWMChannel(ByteBuffer digital_port_pointer, IntBuffer status); public static native void setPWM(ByteBuffer digital_port_pointer, short value, IntBuffer status); public static native short getPWM(ByteBuffer digital_port_pointer, IntBuffer status); + public static native void latchPWMZero(ByteBuffer digital_port_pointer, IntBuffer status); public static native void setPWMPeriodScale(ByteBuffer digital_port_pointer, int squelchMask, IntBuffer status); public static native ByteBuffer allocatePWM(IntBuffer status); public static native void freePWM(ByteBuffer pwmGenerator, IntBuffer status); diff --git a/wpilibj/wpilibJavaJNI/lib/PWMJNI.cpp b/wpilibj/wpilibJavaJNI/lib/PWMJNI.cpp index e5c06d231e..2307155da8 100644 --- a/wpilibj/wpilibJavaJNI/lib/PWMJNI.cpp +++ b/wpilibj/wpilibJavaJNI/lib/PWMJNI.cpp @@ -84,6 +84,21 @@ JNIEXPORT jshort JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_getPWM return returnValue; } +/* + * Class: edu_wpi_first_wpilibj_hal_PWMJNI + * Method: latchPWMZero + * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/IntBuffer;)V + */ +JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_latchPWMZero + (JNIEnv * env, jclass, jobject id, jobject status) +{ + void ** javaId = (void**)env->GetDirectBufferAddress(id); + PWMJNI_LOG(logDEBUG) << "PWM Ptr = " << *javaId; + jint * statusPtr = (jint*)env->GetDirectBufferAddress(status); + latchPWMZero( *javaId, statusPtr ); + PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr; +} + /* * Class: edu_wpi_first_wpilibj_hal_PWMJNI * Method: setPWMPeriodScale