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/Ultrasonic.h b/azaleasource/WPILibCProgramming/trunk/WPILib/Ultrasonic.h
new file mode 100644
index 0000000..b7c667a
--- /dev/null
+++ b/azaleasource/WPILibCProgramming/trunk/WPILib/Ultrasonic.h
@@ -0,0 +1,90 @@
+/*----------------------------------------------------------------------------*/

+/* 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.  */

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

+

+#ifndef ULTRASONIC_H_

+#define ULTRASONIC_H_

+

+#include "SensorBase.h"

+#include "Task.h"

+#include "PIDSource.h"

+#include "LiveWindow/LiveWindowSendable.h"

+

+class Counter;

+class DigitalInput;

+class DigitalOutput;

+

+/**

+ * Ultrasonic rangefinder class.

+ * The Ultrasonic rangefinder measures absolute distance based on the round-trip time

+ * of a ping generated by the controller. These sensors use two transducers, a speaker and

+ * a microphone both tuned to the ultrasonic range. A common ultrasonic sensor, the Daventech SRF04

+ * requires a short pulse to be generated on a digital channel. This causes the chirp to be

+ * emmitted. A second line becomes high as the ping is transmitted and goes low when

+ * the echo is received. The time that the line is high determines the round trip distance

+ * (time of flight).

+ */

+class Ultrasonic: public SensorBase, public PIDSource, public LiveWindowSendable

+{

+public:

+	typedef enum {

+		kInches = 0,

+		kMilliMeters = 1

+	} DistanceUnit;

+	

+	Ultrasonic(DigitalOutput *pingChannel, DigitalInput *echoChannel, DistanceUnit units = kInches);

+	Ultrasonic(DigitalOutput &pingChannel, DigitalInput &echoChannel, DistanceUnit units = kInches);

+	Ultrasonic(UINT32 pingChannel, UINT32 echoChannel, DistanceUnit units = kInches);

+	Ultrasonic(UINT8 pingModuleNumber, UINT32 pingChannel,

+							UINT8 echoModuleNumber, UINT32 echoChannel, DistanceUnit units = kInches);

+	virtual ~Ultrasonic();

+

+	void Ping();

+	bool IsRangeValid();

+	static void SetAutomaticMode(bool enabling);

+	double GetRangeInches();

+	double GetRangeMM();

+	bool IsEnabled() { return m_enabled; }

+	void SetEnabled(bool enable) { m_enabled = enable; }

+	

+	double PIDGet();

+	void SetDistanceUnits(DistanceUnit units);

+	DistanceUnit GetDistanceUnits();

+

+	void UpdateTable();

+	void StartLiveWindowMode();

+	void StopLiveWindowMode();

+	std::string GetSmartDashboardType();

+	void InitTable(ITable *subTable);

+	ITable * GetTable();

+

+private:

+	void Initialize();

+

+	static void UltrasonicChecker();

+

+	static const double kPingTime = 10 * 1e-6;	///< Time (sec) for the ping trigger pulse.

+	static const UINT32 kPriority = 90;	///< Priority that the ultrasonic round robin task runs.

+	static const double kMaxUltrasonicTime = 0.1;	///< Max time (ms) between readings.

+	static const double kSpeedOfSoundInchesPerSec = 1130.0 * 12.0;

+

+	static Task m_task; // task doing the round-robin automatic sensing

+	static Ultrasonic *m_firstSensor; // head of the ultrasonic sensor list

+	static bool m_automaticEnabled; // automatic round robin mode

+	static SEM_ID m_semaphore; // synchronize access to the list of sensors

+

+	DigitalInput *m_echoChannel;

+	DigitalOutput *m_pingChannel;

+	bool m_allocatedChannels;

+	bool m_enabled;

+	Counter *m_counter;

+	Ultrasonic *m_nextSensor;

+	DistanceUnit m_units;

+	

+	ITable *m_table;

+};

+

+#endif

+