8 #include "AnalogTrigger.h"
9 #include "DigitalInput.h"
10 #include "NetworkCommunication/UsageReporting.h"
12 #include "WPIErrors.h"
20 void Counter::InitCounter(Mode mode)
24 uint32_t index = counters->
Allocate(
"Counter");
31 tRioStatusCode localStatus = NiFpga_Status_Success;
32 m_counter = tCounter::create(m_index, &localStatus);
33 m_counter->writeConfig_Mode(mode, &localStatus);
36 m_allocatedUpSource =
false;
37 m_allocatedDownSource =
false;
38 m_counter->writeTimerConfig_AverageSize(1, &localStatus);
39 wpi_setError(localStatus);
41 nUsageReporting::report(nUsageReporting::kResourceType_Counter, index, mode);
125 m_allocatedUpSource =
true;
136 m_allocatedUpSource =
true;
144 if (encodingType != k1X && encodingType != k2X)
146 wpi_setWPIErrorWithContext(ParameterOutOfRange,
"Counter only supports 1X and 2X quadrature decoding.");
149 InitCounter(kExternalDirection);
152 tRioStatusCode localStatus = NiFpga_Status_Success;
154 if (encodingType == k1X)
157 m_counter->writeTimerConfig_AverageSize(1, &localStatus);
162 m_counter->writeTimerConfig_AverageSize(2, &localStatus);
165 wpi_setError(localStatus);
175 if (m_allocatedUpSource)
180 if (m_allocatedDownSource)
187 counters->
Free(m_index);
200 m_allocatedUpSource =
true;
211 m_allocatedUpSource =
true;
223 m_allocatedUpSource =
true;
243 if (m_allocatedUpSource)
247 m_allocatedUpSource =
false;
256 tRioStatusCode localStatus = NiFpga_Status_Success;
257 m_counter->writeConfig_UpSource_Module(source->GetModuleForRouting(), &localStatus);
258 m_counter->writeConfig_UpSource_Channel(source->GetChannelForRouting(), &localStatus);
259 m_counter->writeConfig_UpSource_AnalogTrigger(source->GetAnalogTriggerForRouting(), &localStatus);
261 if(
m_counter->readConfig_Mode(&localStatus) == kTwoPulse ||
262 m_counter->readConfig_Mode(&localStatus) == kExternalDirection)
267 wpi_setError(localStatus);
289 wpi_setWPIErrorWithContext(NullParameter,
"Must set non-NULL UpSource before setting UpSourceEdge");
291 tRioStatusCode localStatus = NiFpga_Status_Success;
292 m_counter->writeConfig_UpRisingEdge(risingEdge, &localStatus);
293 m_counter->writeConfig_UpFallingEdge(fallingEdge, &localStatus);
294 wpi_setError(localStatus);
303 if (m_allocatedUpSource)
307 m_allocatedUpSource =
false;
309 tRioStatusCode localStatus = NiFpga_Status_Success;
310 bool state =
m_counter->readConfig_Enable(&localStatus);
311 m_counter->writeConfig_Enable(
false, &localStatus);
312 m_counter->writeConfig_UpFallingEdge(
false, &localStatus);
313 m_counter->writeConfig_UpRisingEdge(
false, &localStatus);
315 m_counter->writeConfig_UpSource_Channel(0, &localStatus);
316 m_counter->writeConfig_UpSource_AnalogTrigger(
false, &localStatus);
317 m_counter->writeConfig_Enable(state, &localStatus);
318 wpi_setError(localStatus);
329 m_allocatedDownSource =
true;
342 m_allocatedDownSource =
true;
354 m_allocatedDownSource =
true;
374 if (m_allocatedDownSource)
378 m_allocatedDownSource =
false;
387 tRioStatusCode localStatus = NiFpga_Status_Success;
388 unsigned char mode =
m_counter->readConfig_Mode(&localStatus);
389 if (mode != kTwoPulse && mode != kExternalDirection)
391 wpi_setWPIErrorWithContext(ParameterOutOfRange,
"Counter only supports DownSource in TwoPulse and ExternalDirection modes.");
394 m_counter->writeConfig_DownSource_Module(source->GetModuleForRouting(), &localStatus);
395 m_counter->writeConfig_DownSource_Channel(source->GetChannelForRouting(), &localStatus);
396 m_counter->writeConfig_DownSource_AnalogTrigger(source->GetAnalogTriggerForRouting(), &localStatus);
400 wpi_setError(localStatus);
422 wpi_setWPIErrorWithContext(NullParameter,
"Must set non-NULL DownSource before setting DownSourceEdge");
424 tRioStatusCode localStatus = NiFpga_Status_Success;
425 m_counter->writeConfig_DownRisingEdge(risingEdge, &localStatus);
426 m_counter->writeConfig_DownFallingEdge(fallingEdge, &localStatus);
427 wpi_setError(localStatus);
436 if (m_allocatedDownSource)
440 m_allocatedDownSource =
false;
442 tRioStatusCode localStatus = NiFpga_Status_Success;
443 bool state =
m_counter->readConfig_Enable(&localStatus);
444 m_counter->writeConfig_Enable(
false, &localStatus);
445 m_counter->writeConfig_DownFallingEdge(
false, &localStatus);
446 m_counter->writeConfig_DownRisingEdge(
false, &localStatus);
448 m_counter->writeConfig_DownSource_Channel(0, &localStatus);
449 m_counter->writeConfig_DownSource_AnalogTrigger(
false, &localStatus);
450 m_counter->writeConfig_Enable(state, &localStatus);
451 wpi_setError(localStatus);
461 tRioStatusCode localStatus = NiFpga_Status_Success;
462 m_counter->writeConfig_Mode(kTwoPulse, &localStatus);
463 wpi_setError(localStatus);
474 tRioStatusCode localStatus = NiFpga_Status_Success;
475 m_counter->writeConfig_Mode(kExternalDirection, &localStatus);
476 wpi_setError(localStatus);
486 tRioStatusCode localStatus = NiFpga_Status_Success;
487 m_counter->writeConfig_Mode(kSemiperiod, &localStatus);
488 m_counter->writeConfig_UpRisingEdge(highSemiPeriod, &localStatus);
490 wpi_setError(localStatus);
501 tRioStatusCode localStatus = NiFpga_Status_Success;
502 m_counter->writeConfig_Mode(kPulseLength, &localStatus);
503 m_counter->writeConfig_PulseLengthThreshold((uint32_t)(threshold * 1.0e6) * kSystemClockTicksPerMicrosecond, &localStatus);
504 wpi_setError(localStatus);
516 tRioStatusCode localStatus = NiFpga_Status_Success;
517 return m_counter->readTimerConfig_AverageSize(&localStatus);
518 wpi_setError(localStatus);
528 tRioStatusCode localStatus = NiFpga_Status_Success;
529 if (samplesToAverage < 1 || samplesToAverage > 127)
531 wpi_setWPIErrorWithContext(ParameterOutOfRange,
"Average counter values must be between 1 and 127");
533 m_counter->writeTimerConfig_AverageSize(samplesToAverage, &localStatus);
534 wpi_setError(localStatus);
545 tRioStatusCode localStatus = NiFpga_Status_Success;
546 m_counter->writeConfig_Enable(1, &localStatus);
547 wpi_setError(localStatus);
558 tRioStatusCode localStatus = NiFpga_Status_Success;
559 int32_t value =
m_counter->readOutput_Value(&localStatus);
560 wpi_setError(localStatus);
572 tRioStatusCode localStatus = NiFpga_Status_Success;
574 wpi_setError(localStatus);
584 tRioStatusCode localStatus = NiFpga_Status_Success;
585 m_counter->writeConfig_Enable(0, &localStatus);
586 wpi_setError(localStatus);
595 double Counter::GetPeriod()
598 tRioStatusCode localStatus = NiFpga_Status_Success;
599 tCounter::tTimerOutput output =
m_counter->readTimerOutput(&localStatus);
610 period = (double)(output.Period << 1) / (double)output.Count;
612 wpi_setError(localStatus);
613 return period * 1.0e-6;
626 tRioStatusCode localStatus = NiFpga_Status_Success;
627 m_counter->writeTimerConfig_StallPeriod((uint32_t)(maxPeriod * 1.0e6), &localStatus);
628 wpi_setError(localStatus);
646 tRioStatusCode localStatus = NiFpga_Status_Success;
647 m_counter->writeTimerConfig_UpdateWhenEmpty(enabled, &localStatus);
648 wpi_setError(localStatus);
662 tRioStatusCode localStatus = NiFpga_Status_Success;
663 return m_counter->readTimerOutput_Stalled(&localStatus);
664 wpi_setError(localStatus);
674 tRioStatusCode localStatus = NiFpga_Status_Success;
675 bool value =
m_counter->readOutput_Direction(&localStatus);
676 wpi_setError(localStatus);
689 tRioStatusCode localStatus = NiFpga_Status_Success;
690 if (
m_counter->readConfig_Mode(&localStatus) == kExternalDirection)
692 if (reverseDirection)
697 wpi_setError(localStatus);
702 if (m_table != NULL) {
AnalogTriggerOutput * CreateOutput(AnalogTriggerOutput::Type type)
virtual void PutNumber(std::string key, double value)=0
void SetExternalDirectionMode()
void SetDownSource(uint32_t channel)
void StartLiveWindowMode()
void SetReverseDirection(bool reverseDirection)
void SetUpdateWhenEmpty(bool enabled)
tCounter * m_counter
The FPGA counter object.
void Free(uint32_t index)
uint32_t Allocate(const char *resourceDesc)
void SetUpSourceEdge(bool risingEdge, bool fallingEdge)
void SetMaxPeriod(double maxPeriod)
void SetUpDownCounterMode()
void InitTable(ITable *subTable)
DigitalSource * m_downSource
What makes the counter count down.
virtual bool StatusIsFatal() const
Check if the current error code represents a fatal error.
void SetSemiPeriodMode(bool highSemiPeriod)
void SetSamplesToAverage(int samplesToAverage)
virtual std::string GetSmartDashboardType()
static void CreateResourceObject(Resource **r, uint32_t elements)
void SetDownSourceEdge(bool risingEdge, bool fallingEdge)
void StopLiveWindowMode()
void SetUpSource(uint32_t channel)
void SetPulseLengthMode(float threshold)
DigitalSource * m_upSource
What makes the counter count up.
int GetSamplesToAverage()