mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
Analog interrupts work again now, and RequestInterrupts is no longer duplicated three times. Change-Id: I5244b76262d7620852141cd21b2429d627636793
58 lines
2.7 KiB
C++
58 lines
2.7 KiB
C++
/*----------------------------------------------------------------------------*/
|
|
/* 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. */
|
|
/*----------------------------------------------------------------------------*/
|
|
#pragma once
|
|
|
|
#include "DigitalSource.h"
|
|
|
|
class AnalogTrigger;
|
|
|
|
/**
|
|
* Class to represent a specific output from an analog trigger.
|
|
* This class is used to get the current output value and also as a DigitalSource
|
|
* to provide routing of an output to digital subsystems on the FPGA such as
|
|
* Counter, Encoder, and Interrupt.
|
|
*
|
|
* The TriggerState output indicates the primary output value of the trigger. If the analog
|
|
* signal is less than the lower limit, the output is false. If the analog value is greater
|
|
* than the upper limit, then the output is true. If the analog value is in between, then
|
|
* the trigger output state maintains its most recent value.
|
|
*
|
|
* The InWindow output indicates whether or not the analog signal is inside the range defined
|
|
* by the limits.
|
|
*
|
|
* The RisingPulse and FallingPulse outputs detect an instantaneous transition from above the
|
|
* upper limit to below the lower limit, and vise versa. These pulses represent a rollover
|
|
* condition of a sensor and can be routed to an up / down couter or to interrupts. Because
|
|
* the outputs generate a pulse, they cannot be read directly. To help ensure that a rollover
|
|
* condition is not missed, there is an average rejection filter available that operates on the
|
|
* upper 8 bits of a 12 bit number and selects the nearest outlyer of 3 samples. This will reject
|
|
* a sample that is (due to averaging or sampling) errantly between the two limits. This filter
|
|
* will fail if more than one sample in a row is errantly in between the two limits. You may see
|
|
* this problem if attempting to use this feature with a mechanical rollover sensor, such as a
|
|
* 360 degree no-stop potentiometer without signal conditioning, because the rollover transition
|
|
* is not sharp / clean enough. Using the averaging engine may help with this, but rotational speeds of
|
|
* the sensor will then be limited.
|
|
*/
|
|
class AnalogTriggerOutput : public DigitalSource
|
|
{
|
|
friend class AnalogTrigger;
|
|
public:
|
|
|
|
virtual ~AnalogTriggerOutput();
|
|
bool Get();
|
|
|
|
// DigitalSource interface
|
|
virtual uint32_t GetChannelForRouting();
|
|
virtual uint32_t GetModuleForRouting();
|
|
virtual bool GetAnalogTriggerForRouting();
|
|
protected:
|
|
AnalogTriggerOutput(AnalogTrigger *trigger, AnalogTriggerType outputType);
|
|
|
|
private:
|
|
AnalogTrigger *m_trigger;
|
|
AnalogTriggerType m_outputType;
|
|
};
|