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

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

+#define ROBOTDRIVE_H_

+

+#include "ErrorBase.h"

+#include <stdlib.h>

+#include <vxWorks.h>

+#include "MotorSafety.h"

+#include "MotorSafetyHelper.h"

+

+class SpeedController;

+class GenericHID;

+

+/**

+ * Utility class for handling Robot drive based on a definition of the motor configuration.

+ * The robot drive class handles basic driving for a robot. Currently, 2 and 4 motor standard

+ * drive trains are supported. In the future other drive types like swerve and meccanum might

+ * be implemented. Motor channel numbers are passed supplied on creation of the class. Those are

+ * used for either the Drive function (intended for hand created drive code, such as autonomous)

+ * or with the Tank/Arcade functions intended to be used for Operator Control driving.

+ */

+class RobotDrive: public MotorSafety, public ErrorBase

+{

+public:

+	typedef enum

+	{

+		kFrontLeftMotor = 0,

+		kFrontRightMotor = 1,

+		kRearLeftMotor = 2,

+		kRearRightMotor = 3

+	} MotorType;

+

+	RobotDrive(UINT32 leftMotorChannel, UINT32 rightMotorChannel);

+	RobotDrive(UINT32 frontLeftMotorChannel, UINT32 rearLeftMotorChannel,

+				UINT32 frontRightMotorChannel, UINT32 rearRightMotorChannel);

+	RobotDrive(SpeedController *leftMotor, SpeedController *rightMotor);

+	RobotDrive(SpeedController &leftMotor, SpeedController &rightMotor);

+	RobotDrive(SpeedController *frontLeftMotor, SpeedController *rearLeftMotor,

+				SpeedController *frontRightMotor, SpeedController *rearRightMotor);

+	RobotDrive(SpeedController &frontLeftMotor, SpeedController &rearLeftMotor,

+				SpeedController &frontRightMotor, SpeedController &rearRightMotor);

+	virtual ~RobotDrive();

+

+	void Drive(float outputMagnitude, float curve);

+	void TankDrive(GenericHID *leftStick, GenericHID *rightStick, bool squaredInputs = true);

+	void TankDrive(GenericHID &leftStick, GenericHID &rightStick, bool squaredInputs = true);

+	void TankDrive(GenericHID *leftStick, UINT32 leftAxis, GenericHID *rightStick, UINT32 rightAxis, bool squaredInputs = true);

+	void TankDrive(GenericHID &leftStick, UINT32 leftAxis, GenericHID &rightStick, UINT32 rightAxis, bool squaredInputs = true);

+	void TankDrive(float leftValue, float rightValue, bool squaredInputs = true);

+	void ArcadeDrive(GenericHID *stick, bool squaredInputs = true);

+	void ArcadeDrive(GenericHID &stick, bool squaredInputs = true);

+	void ArcadeDrive(GenericHID *moveStick, UINT32 moveChannel, GenericHID *rotateStick, UINT32 rotateChannel, bool squaredInputs = true);

+	void ArcadeDrive(GenericHID &moveStick, UINT32 moveChannel, GenericHID &rotateStick, UINT32 rotateChannel, bool squaredInputs = true);

+	void ArcadeDrive(float moveValue, float rotateValue, bool squaredInputs = true);

+	void MecanumDrive_Cartesian(float x, float y, float rotation, float gyroAngle = 0.0);

+	void MecanumDrive_Polar(float magnitude, float direction, float rotation);

+	void HolonomicDrive(float magnitude, float direction, float rotation);

+	virtual void SetLeftRightMotorOutputs(float leftOutput, float rightOutput);

+	void SetInvertedMotor(MotorType motor, bool isInverted);

+	void SetSensitivity(float sensitivity);

+	void SetMaxOutput(double maxOutput);

+

+	void SetExpiration(float timeout);

+	float GetExpiration();

+	bool IsAlive();

+	void StopMotor();

+	bool IsSafetyEnabled();

+	void SetSafetyEnabled(bool enabled);

+	void GetDescription(char *desc);

+

+protected:

+	void InitRobotDrive();

+	float Limit(float num);

+	void Normalize(double *wheelSpeeds);

+	void RotateVector(double &x, double &y, double angle);

+

+	static const INT32 kMaxNumberOfMotors = 4;

+

+	INT32 m_invertedMotors[kMaxNumberOfMotors];

+	float m_sensitivity;

+	double m_maxOutput;

+	bool m_deleteSpeedControllers;

+	SpeedController *m_frontLeftMotor;

+	SpeedController *m_frontRightMotor;

+	SpeedController *m_rearLeftMotor;

+	SpeedController *m_rearRightMotor;

+	MotorSafetyHelper *m_safetyHelper;

+	

+private:

+	INT32 GetNumMotors()

+	{

+		int motors = 0;

+		if (m_frontLeftMotor) motors++;

+		if (m_frontRightMotor) motors++;

+		if (m_rearLeftMotor) motors++;

+		if (m_rearRightMotor) motors++;

+		return motors;

+	}

+	DISALLOW_COPY_AND_ASSIGN(RobotDrive);

+};

+

+#endif

+