8 #include "DigitalInput.h"
9 #include "NetworkCommunication/UsageReporting.h"
11 #include "WPIErrors.h"
12 #include "LiveWindow/LiveWindow.h"
14 static Resource *quadEncoders = NULL;
26 void Encoder::InitEncoder(
bool reverseDirection, EncodingType encodingType)
29 m_encodingType = encodingType;
30 tRioStatusCode localStatus = NiFpga_Status_Success;
36 uint32_t index = quadEncoders->
Allocate(
"4X Encoder");
39 CloneError(quadEncoders);
44 CloneError(m_aSource);
49 CloneError(m_bSource);
53 m_encoder = tEncoder::create(m_index, &localStatus);
54 m_encoder->writeConfig_ASource_Module(m_aSource->GetModuleForRouting(), &localStatus);
55 m_encoder->writeConfig_ASource_Channel(m_aSource->GetChannelForRouting(), &localStatus);
56 m_encoder->writeConfig_ASource_AnalogTrigger(m_aSource->GetAnalogTriggerForRouting(), &localStatus);
57 m_encoder->writeConfig_BSource_Module(m_bSource->GetModuleForRouting(), &localStatus);
58 m_encoder->writeConfig_BSource_Channel(m_bSource->GetChannelForRouting(), &localStatus);
59 m_encoder->writeConfig_BSource_AnalogTrigger(m_bSource->GetAnalogTriggerForRouting(), &localStatus);
60 m_encoder->strobeReset(&localStatus);
61 m_encoder->writeConfig_Reverse(reverseDirection, &localStatus);
62 m_encoder->writeTimerConfig_AverageSize(4, &localStatus);
69 m_counter =
new Counter(m_encodingType, m_aSource, m_bSource, reverseDirection);
70 m_index = m_counter->GetIndex();
74 m_distancePerPulse = 1.0;
75 m_pidSource = kDistance;
76 wpi_setError(localStatus);
78 nUsageReporting::report(nUsageReporting::kResourceType_Encoder, m_index, encodingType);
97 Encoder::Encoder(uint8_t aModuleNumber, uint32_t aChannel,
98 uint8_t bModuleNumber, uint32_t bChannel,
99 bool reverseDirection, EncodingType encodingType) :
105 InitEncoder(reverseDirection, encodingType);
106 m_allocatedASource =
true;
107 m_allocatedBSource =
true;
123 Encoder::Encoder(uint32_t aChannel, uint32_t bChannel,
bool reverseDirection, EncodingType encodingType) :
129 InitEncoder(reverseDirection, encodingType);
130 m_allocatedASource =
true;
131 m_allocatedBSource =
true;
155 m_allocatedASource =
false;
156 m_allocatedBSource =
false;
157 if (m_aSource == NULL || m_bSource == NULL)
158 wpi_setWPIError(NullParameter);
160 InitEncoder(reverseDirection, encodingType);
182 m_aSource = &aSource;
183 m_bSource = &bSource;
184 m_allocatedASource =
false;
185 m_allocatedBSource =
false;
186 InitEncoder(reverseDirection, encodingType);
195 if (m_allocatedASource)
delete m_aSource;
196 if (m_allocatedBSource)
delete m_bSource;
203 quadEncoders->
Free(m_index);
219 tRioStatusCode localStatus = NiFpga_Status_Success;
220 m_encoder->writeConfig_Enable(1, &localStatus);
221 wpi_setError(localStatus);
235 tRioStatusCode localStatus = NiFpga_Status_Success;
236 m_encoder->writeConfig_Enable(0, &localStatus);
237 wpi_setError(localStatus);
252 value = m_counter->
Get();
255 tRioStatusCode localStatus = NiFpga_Status_Success;
256 value = m_encoder->readOutput_Value(&localStatus);
257 wpi_setError(localStatus);
272 return (int32_t) (
GetRaw() * DecodingScaleFactor());
286 tRioStatusCode localStatus = NiFpga_Status_Success;
287 m_encoder->strobeReset(&localStatus);
288 wpi_setError(localStatus);
304 double measuredPeriod;
307 measuredPeriod = m_counter->GetPeriod();
311 tRioStatusCode localStatus = NiFpga_Status_Success;
312 tEncoder::tTimerOutput output = m_encoder->readTimerOutput(&localStatus);
323 value = (double)(output.Period << 1) / (double)output.Count;
325 wpi_setError(localStatus);
326 measuredPeriod = value * 1.0e-6;
328 return measuredPeriod / DecodingScaleFactor();
348 m_counter->
SetMaxPeriod(maxPeriod * DecodingScaleFactor());
352 tRioStatusCode localStatus = NiFpga_Status_Success;
353 m_encoder->writeTimerConfig_StallPeriod((uint32_t)(maxPeriod * 1.0e6 * DecodingScaleFactor()), &localStatus);
354 wpi_setError(localStatus);
374 tRioStatusCode localStatus = NiFpga_Status_Success;
375 bool value = m_encoder->readTimerOutput_Stalled(&localStatus) != 0;
376 wpi_setError(localStatus);
394 tRioStatusCode localStatus = NiFpga_Status_Success;
395 bool value = m_encoder->readOutput_Direction(&localStatus);
396 wpi_setError(localStatus);
404 double Encoder::DecodingScaleFactor()
407 switch (m_encodingType)
428 return GetRaw() * DecodingScaleFactor() * m_distancePerPulse;
440 return (m_distancePerPulse /
GetPeriod());
468 m_distancePerPulse = distancePerPulse;
486 tRioStatusCode localStatus = NiFpga_Status_Success;
487 m_encoder->writeConfig_Reverse(reverseDirection, &localStatus);
488 wpi_setError(localStatus);
501 tRioStatusCode localStatus = NiFpga_Status_Success;
502 if (samplesToAverage < 1 || samplesToAverage > 127)
504 wpi_setWPIErrorWithContext(ParameterOutOfRange,
"Average counter values must be between 1 and 127");
506 switch (m_encodingType) {
508 m_encoder->writeTimerConfig_AverageSize(samplesToAverage, &localStatus);
515 wpi_setError(localStatus);
526 tRioStatusCode localStatus = NiFpga_Status_Success;
528 switch (m_encodingType) {
530 result = m_encoder->readTimerConfig_AverageSize(&localStatus);
537 wpi_setError(localStatus);
551 m_pidSource = pidSource;
574 if (m_table != NULL) {
577 m_table->
PutNumber(
"Distance per Tick", m_distancePerPulse);
590 if (m_encodingType == k4X)
591 return "Quadrature Encoder";
void SetPIDSourceParameter(PIDSourceParameter pidSource)
void InitTable(ITable *subTable)
virtual void PutNumber(std::string key, double value)=0
void StartLiveWindowMode()
void SetReverseDirection(bool reverseDirection)
void StopLiveWindowMode()
void AddSensor(const char *subsystem, const char *name, LiveWindowSendable *component)
void SetReverseDirection(bool reverseDirection)
void Free(uint32_t index)
void SetMinRate(double minRate)
void SetDistancePerPulse(double distancePerPulse)
uint32_t Allocate(const char *resourceDesc)
static LiveWindow * GetInstance()
void SetMaxPeriod(double maxPeriod)
int GetSamplesToAverage()
void SetSamplesToAverage(int samplesToAverage)
void SetMaxPeriod(double maxPeriod)
virtual bool StatusIsFatal() const
Check if the current error code represents a fatal error.
void SetSamplesToAverage(int samplesToAverage)
static void CreateResourceObject(Resource **r, uint32_t elements)
std::string GetSmartDashboardType()
int GetSamplesToAverage()