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/Encoder.h b/azaleasource/WPILibCProgramming/trunk/WPILib/Encoder.h
new file mode 100644
index 0000000..db3c74c
--- /dev/null
+++ b/azaleasource/WPILibCProgramming/trunk/WPILib/Encoder.h
@@ -0,0 +1,84 @@
+/*----------------------------------------------------------------------------*/
+/* 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 QUAD_ENCODER_H_
+#define QUAD_ENCODER_H_
+
+#include "ChipObject.h"
+#include "CounterBase.h"
+#include "SensorBase.h"
+#include "Counter.h"
+#include "PIDSource.h"
+#include "LiveWindow/LiveWindowSendable.h"
+
+class DigitalSource;
+
+/**
+ * Class to read quad encoders.
+ * Quadrature encoders are devices that count shaft rotation and can sense direction. The output of
+ * the QuadEncoder class is an integer that can count either up or down, and can go negative for
+ * reverse direction counting. When creating QuadEncoders, a direction is supplied that changes the
+ * sense of the output to make code more readable if the encoder is mounted such that forward movement
+ * generates negative values. Quadrature encoders have two digital outputs, an A Channel and a B Channel
+ * that are out of phase with each other to allow the FPGA to do direction sensing.
+ */
+class Encoder: public SensorBase, public CounterBase, public PIDSource, public LiveWindowSendable
+{
+public:
+ typedef enum {kDistance, kRate} PIDSourceParameter;
+
+ Encoder(UINT32 aChannel, UINT32 bChannel, bool reverseDirection=false, EncodingType encodingType = k4X);
+ Encoder(UINT8 aModuleNumber, UINT32 aChannel, UINT8 bModuleNumber, UINT32 _bChannel, bool reverseDirection=false, EncodingType encodingType = k4X);
+ Encoder(DigitalSource *aSource, DigitalSource *bSource, bool reverseDirection=false, EncodingType encodingType = k4X);
+ Encoder(DigitalSource &aSource, DigitalSource &bSource, bool reverseDirection=false, EncodingType encodingType = k4X);
+ virtual ~Encoder();
+
+ // CounterBase interface
+ void Start();
+ INT32 Get();
+ INT32 GetRaw();
+ void Reset();
+ void Stop();
+ double GetPeriod();
+ void SetMaxPeriod(double maxPeriod);
+ bool GetStopped();
+ bool GetDirection();
+ double GetDistance();
+ double GetRate();
+ void SetMinRate(double minRate);
+ void SetDistancePerPulse(double distancePerPulse);
+ void SetReverseDirection(bool reverseDirection);
+
+ void SetPIDSourceParameter(PIDSourceParameter pidSource);
+ double PIDGet();
+
+ void UpdateTable();
+ void StartLiveWindowMode();
+ void StopLiveWindowMode();
+ std::string GetSmartDashboardType();
+ void InitTable(ITable *subTable);
+ ITable * GetTable();
+
+private:
+ void InitEncoder(bool _reverseDirection, EncodingType encodingType);
+ double DecodingScaleFactor();
+
+ DigitalSource *m_aSource; // the A phase of the quad encoder
+ DigitalSource *m_bSource; // the B phase of the quad encoder
+ bool m_allocatedASource; // was the A source allocated locally?
+ bool m_allocatedBSource; // was the B source allocated locally?
+ tEncoder* m_encoder;
+ UINT8 m_index;
+ double m_distancePerPulse; // distance of travel for each encoder tick
+ Counter *m_counter; // Counter object for 1x and 2x encoding
+ EncodingType m_encodingType; // Encoding type
+ PIDSourceParameter m_pidSource;// Encoder parameter that sources a PID controller
+
+ ITable *m_table;
+};
+
+#endif
+