This is the latest WPILib src, VisionSample2013, cRIO image, ... pulled down from firstforge.wpi.edu.

There might be risks in using the top of tree rather than an official release, but the commit messages do mention fixes for some deadlocks and race conditions.

git-svn-id: https://robotics.mvla.net/svn/frc971/2013/trunk/src@4066 f308d9b7-e957-4cde-b6ac-9a88185e7312
diff --git a/azaleasource/WPILibCProgramming/trunk/WPILib/SafePWM.cpp b/azaleasource/WPILibCProgramming/trunk/WPILib/SafePWM.cpp
new file mode 100644
index 0000000..0844abc
--- /dev/null
+++ b/azaleasource/WPILibCProgramming/trunk/WPILib/SafePWM.cpp
@@ -0,0 +1,117 @@
+/*----------------------------------------------------------------------------*/

+/* Copyright (c) FIRST 2008. All Rights Reserved.							  */

+/* Open Source Software - may be modified and shared by FRC teams. The code   */

+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */

+/*----------------------------------------------------------------------------*/

+

+#include "SafePWM.h"

+

+#include "MotorSafetyHelper.h"

+

+/**

+ * Initialize a SafePWM object by setting defaults

+ */

+void SafePWM::InitSafePWM()

+{

+	m_safetyHelper = new MotorSafetyHelper(this);

+	m_safetyHelper->SetSafetyEnabled(false);

+}

+

+/**

+ * Constructor for a SafePWM object taking a channel number

+ * @param channel The channel number to be used for the underlying PWM object

+ */

+SafePWM::SafePWM(UINT32 channel): PWM(channel)

+{

+	InitSafePWM();

+}

+

+/**

+ * Constructor for a SafePWM object taking channel and slot numbers.

+ * @param moduleNumber The digital module (1 or 2).

+ * @param channel The PWM channel number on the module (1..10).

+ */

+SafePWM::SafePWM(UINT8 moduleNumber, UINT32 channel): PWM(moduleNumber, channel)

+{

+	InitSafePWM();

+}

+

+SafePWM::~SafePWM()

+{

+	delete m_safetyHelper;

+}

+

+/*

+ * Set the expiration time for the PWM object

+ * @param timeout The timeout (in seconds) for this motor object

+ */

+void SafePWM::SetExpiration(float timeout)

+{

+	m_safetyHelper->SetExpiration(timeout);

+}

+

+/**

+ * Return the expiration time for the PWM object.

+ * @returns The expiration time value.

+ */

+float SafePWM::GetExpiration()

+{

+	return m_safetyHelper->GetExpiration();

+}

+

+/**

+ * Check if the PWM object is currently alive or stopped due to a timeout.

+ * @returns a bool value that is true if the motor has NOT timed out and should still

+ * be running.

+ */

+bool SafePWM::IsAlive()

+{

+	return m_safetyHelper->IsAlive();

+}

+

+/**

+ * Stop the motor associated with this PWM object.

+ * This is called by the MotorSafetyHelper object when it has a timeout for this PWM and needs to

+ * stop it from running.

+ */

+void SafePWM::StopMotor()

+{

+	SetRaw(kPwmDisabled);

+}

+

+/**

+ * Enable/disable motor safety for this device

+ * Turn on and off the motor safety option for this PWM object.

+ * @param enabled True if motor safety is enforced for this object

+ */

+void SafePWM::SetSafetyEnabled(bool enabled)

+{

+	m_safetyHelper->SetSafetyEnabled(enabled);

+}

+

+/**

+ * Check if motor safety is enabled for this object

+ * @returns True if motor safety is enforced for this object

+ */

+bool SafePWM::IsSafetyEnabled()

+{

+	return m_safetyHelper->IsSafetyEnabled();

+}

+

+void SafePWM::GetDescription(char *desc)

+{

+	sprintf(desc, "PWM %d on module %d", GetChannel(), GetModuleNumber());

+}

+

+/**

+ * Feed the MotorSafety timer when setting the speed.

+ * This method is called by the subclass motor whenever it updates its speed, thereby reseting

+ * the timeout value.

+ * @param speed Value to pass to the PWM class

+ */

+void SafePWM::SetSpeed(float speed)

+{

+	PWM::SetSpeed(speed);

+	m_safetyHelper->Feed();

+}

+