diff --git a/hal/include/HAL/Counter.h b/hal/include/HAL/Counter.h index 8b84ae8d50..0bea12465f 100644 --- a/hal/include/HAL/Counter.h +++ b/hal/include/HAL/Counter.h @@ -9,6 +9,7 @@ #include +#include "HAL/AnalogTrigger.h" #include "HAL/Handles.h" enum Mode { @@ -23,13 +24,15 @@ HalCounterHandle initializeCounter(Mode mode, int32_t* index, int32_t* status); void freeCounter(HalCounterHandle counter_handle, int32_t* status); void setCounterAverageSize(HalCounterHandle counter_handle, int32_t size, int32_t* status); -void setCounterUpSource(HalCounterHandle counter_handle, uint32_t pin, - bool analogTrigger, int32_t* status); +void setCounterUpSource(HalCounterHandle counter_handle, + HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, int32_t* status); void setCounterUpSourceEdge(HalCounterHandle counter_handle, bool risingEdge, bool fallingEdge, int32_t* status); void clearCounterUpSource(HalCounterHandle counter_handle, int32_t* status); -void setCounterDownSource(HalCounterHandle counter_handle, uint32_t pin, - bool analogTrigger, int32_t* status); +void setCounterDownSource(HalCounterHandle counter_handle, + HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, int32_t* status); void setCounterDownSourceEdge(HalCounterHandle counter_handle, bool risingEdge, bool fallingEdge, int32_t* status); void clearCounterDownSource(HalCounterHandle counter_handle, int32_t* status); diff --git a/hal/include/HAL/Encoder.h b/hal/include/HAL/Encoder.h index f1d9d78026..cef9db3e34 100644 --- a/hal/include/HAL/Encoder.h +++ b/hal/include/HAL/Encoder.h @@ -9,6 +9,7 @@ #include +#include "HAL/AnalogTrigger.h" #include "HAL/Handles.h" extern "C" { @@ -21,8 +22,8 @@ enum EncoderIndexingType { enum EncoderEncodingType { HAL_Encoder_k1X, HAL_Encoder_k2X, HAL_Encoder_k4X }; HalEncoderHandle initializeEncoder( - uint8_t port_a_module, uint32_t port_a_pin, bool port_a_analog_trigger, - uint8_t port_b_module, uint32_t port_b_pin, bool port_b_analog_trigger, + HalHandle digitalSourceHandleA, AnalogTriggerType analogTriggerTypeA, + HalHandle digitalSourceHandleB, AnalogTriggerType analogTriggerTypeB, bool reverseDirection, EncoderEncodingType encodingType, int32_t* status); void freeEncoder(HalEncoderHandle encoder_handle, int32_t* status); int32_t getEncoder(HalEncoderHandle encoder_handle, int32_t* status); @@ -48,9 +49,10 @@ void setEncoderSamplesToAverage(HalEncoderHandle encoder_handle, int32_t getEncoderSamplesToAverage(HalEncoderHandle encoder_handle, int32_t* status); -void setEncoderIndexSource(HalEncoderHandle encoder_handle, uint32_t pin, - uint8_t analogTrigger, EncoderIndexingType type, - int32_t* status); +void setEncoderIndexSource(HalEncoderHandle encoder_handle, + HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, + EncoderIndexingType type, int32_t* status); int32_t getEncoderFPGAIndex(HalEncoderHandle encoder_handle, int32_t* status); diff --git a/hal/include/HAL/Interrupts.h b/hal/include/HAL/Interrupts.h index abd54f3485..6af9f9bdc7 100644 --- a/hal/include/HAL/Interrupts.h +++ b/hal/include/HAL/Interrupts.h @@ -9,7 +9,8 @@ #include -#include "Handles.h" +#include "HAL/AnalogTrigger.h" +#include "HAL/Handles.h" extern "C" { typedef void (*InterruptHandlerFunction)(uint32_t interruptAssertedMask, @@ -27,8 +28,8 @@ double readRisingTimestamp(HalInterruptHandle interrupt_handle, double readFallingTimestamp(HalInterruptHandle interrupt_handle, int32_t* status); void requestInterrupts(HalInterruptHandle interrupt_handle, - uint8_t routing_module, uint32_t routing_pin, - bool routing_analog_trigger, int32_t* status); + HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, int32_t* status); void attachInterruptHandler(HalInterruptHandle interrupt_handle, InterruptHandlerFunction handler, void* param, int32_t* status); diff --git a/hal/lib/athena/Counter.cpp b/hal/lib/athena/Counter.cpp index 6b337a199f..dccc7f60d8 100644 --- a/hal/lib/athena/Counter.cpp +++ b/hal/lib/athena/Counter.cpp @@ -69,21 +69,30 @@ void setCounterAverageSize(HalCounterHandle counter_handle, int32_t size, * Set the source object that causes the counter to count up. * Set the up counting DigitalSource. */ -void setCounterUpSource(HalCounterHandle counter_handle, uint32_t pin, - bool analogTrigger, int32_t* status) { +void setCounterUpSource(HalCounterHandle counter_handle, + HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, int32_t* status) { auto counter = counterHandles.Get(counter_handle); if (counter == nullptr) { *status = HAL_HANDLE_ERROR; return; } - uint8_t module; + bool routingAnalogTrigger = false; + uint32_t routingPin = 0; + uint8_t routingModule = 0; + bool success = + remapDigitalSource(digitalSourceHandle, analogTriggerType, routingPin, + routingModule, routingAnalogTrigger); + if (!success) { + *status = HAL_HANDLE_ERROR; + return; + } - remapDigitalSource(analogTrigger, pin, module); - - counter->counter->writeConfig_UpSource_Module(module, status); - counter->counter->writeConfig_UpSource_Channel(pin, status); - counter->counter->writeConfig_UpSource_AnalogTrigger(analogTrigger, status); + counter->counter->writeConfig_UpSource_Module(routingModule, status); + counter->counter->writeConfig_UpSource_Channel(routingPin, status); + counter->counter->writeConfig_UpSource_AnalogTrigger(routingAnalogTrigger, + status); if (counter->counter->readConfig_Mode(status) == kTwoPulse || counter->counter->readConfig_Mode(status) == kExternalDirection) { @@ -127,8 +136,10 @@ void clearCounterUpSource(HalCounterHandle counter_handle, int32_t* status) { * Set the source object that causes the counter to count down. * Set the down counting DigitalSource. */ -void setCounterDownSource(HalCounterHandle counter_handle, uint32_t pin, - bool analogTrigger, int32_t* status) { +void setCounterDownSource(HalCounterHandle counter_handle, + HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, + int32_t* status) { auto counter = counterHandles.Get(counter_handle); if (counter == nullptr) { *status = HAL_HANDLE_ERROR; @@ -142,13 +153,21 @@ void setCounterDownSource(HalCounterHandle counter_handle, uint32_t pin, return; } - uint8_t module; + bool routingAnalogTrigger = false; + uint32_t routingPin = 0; + uint8_t routingModule = 0; + bool success = + remapDigitalSource(digitalSourceHandle, analogTriggerType, routingPin, + routingModule, routingAnalogTrigger); + if (!success) { + *status = HAL_HANDLE_ERROR; + return; + } - remapDigitalSource(analogTrigger, pin, module); - - counter->counter->writeConfig_DownSource_Module(module, status); - counter->counter->writeConfig_DownSource_Channel(pin, status); - counter->counter->writeConfig_DownSource_AnalogTrigger(analogTrigger, status); + counter->counter->writeConfig_DownSource_Module(routingModule, status); + counter->counter->writeConfig_DownSource_Channel(routingPin, status); + counter->counter->writeConfig_DownSource_AnalogTrigger(routingAnalogTrigger, + status); setCounterDownSourceEdge(counter_handle, true, false, status); counter->counter->strobeReset(status); diff --git a/hal/lib/athena/DigitalInternal.cpp b/hal/lib/athena/DigitalInternal.cpp index b9880a3665..3f4888f529 100644 --- a/hal/lib/athena/DigitalInternal.cpp +++ b/hal/lib/athena/DigitalInternal.cpp @@ -12,6 +12,7 @@ #include "ChipObject.h" #include "FRC_NetworkCommunication/LoadOut.h" +#include "HAL/AnalogTrigger.h" #include "HAL/HAL.h" #include "HAL/Ports.h" #include "HAL/cpp/priority_mutex.h" @@ -107,17 +108,30 @@ uint32_t remapMXPPWMChannel(uint32_t pin) { * If it's an analog trigger, determine the module from the high order routing * channel else do normal digital input remapping based on pin number (MXP) */ -extern "C++" void remapDigitalSource(bool analogTrigger, uint32_t& pin, - uint8_t& module) { - if (analogTrigger) { +extern "C++" bool remapDigitalSource(HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, + uint32_t& pin, uint8_t& module, + bool& analogTrigger) { + if (isHandleType(digitalSourceHandle, HalHandleEnum::AnalogTrigger)) { + // If handle passed, index is not negative + uint32_t index = getHandleIndex(digitalSourceHandle); + pin = (index << 2) + analogTriggerType; module = pin >> 4; - } else { - if (pin >= kNumDigitalHeaders) { - pin = remapMXPChannel(pin); + analogTrigger = true; + return true; + } else if (isHandleType(digitalSourceHandle, HalHandleEnum::DIO)) { + uint32_t index = getHandleIndex(digitalSourceHandle); + if (index >= kNumDigitalHeaders) { + pin = remapMXPChannel(index); module = 1; } else { + pin = index; module = 0; } + analogTrigger = false; + return true; + } else { + return false; } } } diff --git a/hal/lib/athena/DigitalInternal.h b/hal/lib/athena/DigitalInternal.h index 856792b808..cc7e2d29ae 100644 --- a/hal/lib/athena/DigitalInternal.h +++ b/hal/lib/athena/DigitalInternal.h @@ -10,6 +10,7 @@ #include #include "ChipObject.h" +#include "HAL/AnalogTrigger.h" #include "HAL/Handles.h" #include "HAL/Ports.h" #include "PortsInternal.h" @@ -69,7 +70,9 @@ extern DigitalHandleResource( - port_a_module, port_a_pin, port_a_analog_trigger, port_b_module, - port_b_pin, port_b_analog_trigger, reverseDirection, encodingType, - status); + digitalSourceHandleA, analogTriggerTypeA, digitalSourceHandleB, + analogTriggerTypeB, reverseDirection, encodingType, status); if (*status != 0) return HAL_INVALID_HANDLE; // return in creation error auto handle = encoderHandles.Allocate(encoder); if (handle == HAL_INVALID_HANDLE) { @@ -413,15 +415,16 @@ EncoderEncodingType getEncoderEncodingType(HalEncoderHandle encoder_handle, return encoder->GetEncodingType(); } -void setEncoderIndexSource(HalEncoderHandle encoder_handle, uint32_t pin, - uint8_t analogTrigger, EncoderIndexingType type, - int32_t* status) { +void setEncoderIndexSource(HalEncoderHandle encoder_handle, + HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, + EncoderIndexingType type, int32_t* status) { auto encoder = encoderHandles.Get(encoder_handle); if (encoder == nullptr) { *status = HAL_HANDLE_ERROR; return; } - encoder->SetIndexSource(pin, analogTrigger, type, status); + encoder->SetIndexSource(digitalSourceHandle, analogTriggerType, type, status); } int32_t getEncoderFPGAIndex(HalEncoderHandle encoder_handle, int32_t* status) { diff --git a/hal/lib/athena/EncoderInternal.h b/hal/lib/athena/EncoderInternal.h index 8e6e82efe3..2ce3a05dfe 100644 --- a/hal/lib/athena/EncoderInternal.h +++ b/hal/lib/athena/EncoderInternal.h @@ -14,9 +14,8 @@ namespace hal { class Encoder { public: - Encoder(uint8_t port_a_module, uint32_t port_a_pin, - bool port_a_analog_trigger, uint8_t port_b_module, - uint32_t port_b_pin, bool port_b_analog_trigger, + Encoder(HalHandle digitalSourceHandleA, AnalogTriggerType analogTriggerTypeA, + HalHandle digitalSourceHandleB, AnalogTriggerType analogTriggerTypeB, bool reverseDirection, EncoderEncodingType encodingType, int32_t* status); ~Encoder(); @@ -39,7 +38,8 @@ class Encoder { void SetSamplesToAverage(int samplesToAverage, int32_t* status); int32_t GetSamplesToAverage(int32_t* status) const; - void SetIndexSource(uint32_t pin, bool analogTrigger, + void SetIndexSource(HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, EncoderIndexingType type, int32_t* status); int32_t GetFPGAIndex() const { return m_index; } @@ -53,11 +53,11 @@ class Encoder { EncoderEncodingType GetEncodingType() const { return m_encodingType; } private: - void SetupCounter(uint8_t port_a_module, uint32_t port_a_pin, - bool port_a_analog_trigger, uint8_t port_b_module, - uint32_t port_b_pin, bool port_b_analog_trigger, - bool reverseDirection, EncoderEncodingType encodingType, - int32_t* status); + void SetupCounter(HalHandle digitalSourceHandleA, + AnalogTriggerType analogTriggerTypeA, + HalHandle digitalSourceHandleB, + AnalogTriggerType analogTriggerTypeB, bool reverseDirection, + EncoderEncodingType encodingType, int32_t* status); HalFPGAEncoderHandle m_encoder = HAL_INVALID_HANDLE; diff --git a/hal/lib/athena/FPGAEncoder.cpp b/hal/lib/athena/FPGAEncoder.cpp index 9482a7796d..07ab120ea3 100644 --- a/hal/lib/athena/FPGAEncoder.cpp +++ b/hal/lib/athena/FPGAEncoder.cpp @@ -27,12 +27,29 @@ static LimitedHandleResourceindex; // TODO: if (index == ~0ul) { CloneError(quadEncoders); return; } encoder->encoder = tEncoder::create(encoder->index, status); - encoder->encoder->writeConfig_ASource_Module(port_a_module, status); - encoder->encoder->writeConfig_ASource_Channel(port_a_pin, status); - encoder->encoder->writeConfig_ASource_AnalogTrigger(port_a_analog_trigger, + encoder->encoder->writeConfig_ASource_Module(routingModuleA, status); + encoder->encoder->writeConfig_ASource_Channel(routingPinA, status); + encoder->encoder->writeConfig_ASource_AnalogTrigger(routingAnalogTriggerA, status); - encoder->encoder->writeConfig_BSource_Module(port_b_module, status); - encoder->encoder->writeConfig_BSource_Channel(port_b_pin, status); - encoder->encoder->writeConfig_BSource_AnalogTrigger(port_b_analog_trigger, + encoder->encoder->writeConfig_BSource_Module(routingModuleB, status); + encoder->encoder->writeConfig_BSource_Channel(routingPinB, status); + encoder->encoder->writeConfig_BSource_AnalogTrigger(routingAnalogTriggerB, status); encoder->encoder->strobeReset(status); encoder->encoder->writeConfig_Reverse(reverseDirection, status); @@ -71,7 +88,7 @@ void freeFPGAEncoder(HalFPGAEncoderHandle fpga_encoder_handle, auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); fpgaEncoderHandles.Free(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return; } delete encoder->encoder; @@ -85,7 +102,7 @@ void resetFPGAEncoder(HalFPGAEncoderHandle fpga_encoder_handle, int32_t* status) { auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return; } encoder->encoder->strobeReset(status); @@ -101,7 +118,7 @@ int32_t getFPGAEncoder(HalFPGAEncoderHandle fpga_encoder_handle, int32_t* status) { auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return 0; } return encoder->encoder->readOutput_Value(status); @@ -121,7 +138,7 @@ double getFPGAEncoderPeriod(HalFPGAEncoderHandle fpga_encoder_handle, int32_t* status) { auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return 0.0; } tEncoder::tTimerOutput output = encoder->encoder->readTimerOutput(status); @@ -157,7 +174,7 @@ void setFPGAEncoderMaxPeriod(HalFPGAEncoderHandle fpga_encoder_handle, double maxPeriod, int32_t* status) { auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return; } encoder->encoder->writeTimerConfig_StallPeriod( @@ -175,7 +192,7 @@ bool getFPGAEncoderStopped(HalFPGAEncoderHandle fpga_encoder_handle, int32_t* status) { auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return false; } return encoder->encoder->readTimerOutput_Stalled(status) != 0; @@ -189,7 +206,7 @@ bool getFPGAEncoderDirection(HalFPGAEncoderHandle fpga_encoder_handle, int32_t* status) { auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return false; } return encoder->encoder->readOutput_Direction(status); @@ -205,7 +222,7 @@ void setFPGAEncoderReverseDirection(HalFPGAEncoderHandle fpga_encoder_handle, bool reverseDirection, int32_t* status) { auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return; } encoder->encoder->writeConfig_Reverse(reverseDirection, status); @@ -222,7 +239,7 @@ void setFPGAEncoderSamplesToAverage(HalFPGAEncoderHandle fpga_encoder_handle, int32_t* status) { auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return; } if (samplesToAverage < 1 || samplesToAverage > 127) { @@ -241,7 +258,7 @@ uint32_t getFPGAEncoderSamplesToAverage( HalFPGAEncoderHandle fpga_encoder_handle, int32_t* status) { auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return 0; } return encoder->encoder->readTimerConfig_AverageSize(status); @@ -252,17 +269,30 @@ uint32_t getFPGAEncoderSamplesToAverage( * encoder's count. */ void setFPGAEncoderIndexSource(HalFPGAEncoderHandle fpga_encoder_handle, - uint32_t pin, bool analogTrigger, + HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, bool activeHigh, bool edgeSensitive, int32_t* status) { auto encoder = fpgaEncoderHandles.Get(fpga_encoder_handle); if (encoder == nullptr) { - *status = PARAMETER_OUT_OF_RANGE; + *status = HAL_HANDLE_ERROR; return; } - encoder->encoder->writeConfig_IndexSource_Channel((unsigned char)pin, status); - encoder->encoder->writeConfig_IndexSource_Module((unsigned char)0, status); - encoder->encoder->writeConfig_IndexSource_AnalogTrigger(analogTrigger, + + bool routingAnalogTrigger = false; + uint32_t routingPin = 0; + uint8_t routingModule = 0; + bool success = + remapDigitalSource(digitalSourceHandle, analogTriggerType, routingPin, + routingModule, routingAnalogTrigger); + if (!success) { + *status = HAL_HANDLE_ERROR; + return; + } + + encoder->encoder->writeConfig_IndexSource_Channel(routingPin, status); + encoder->encoder->writeConfig_IndexSource_Module(routingModule, status); + encoder->encoder->writeConfig_IndexSource_AnalogTrigger(routingAnalogTrigger, status); encoder->encoder->writeConfig_IndexActiveHigh(activeHigh, status); encoder->encoder->writeConfig_IndexEdgeSensitive(edgeSensitive, status); diff --git a/hal/lib/athena/FPGAEncoder.h b/hal/lib/athena/FPGAEncoder.h index 173a0274cf..6d319b6b27 100644 --- a/hal/lib/athena/FPGAEncoder.h +++ b/hal/lib/athena/FPGAEncoder.h @@ -9,14 +9,16 @@ #include +#include "HAL/AnalogTrigger.h" #include "HAL/Handles.h" extern "C" { -HalFPGAEncoderHandle initializeFPGAEncoder( - uint8_t port_a_module, uint32_t port_a_pin, bool port_a_analog_trigger, - uint8_t port_b_module, uint32_t port_b_pin, bool port_b_analog_trigger, - bool reverseDirection, int32_t* index, - int32_t* status); // TODO: fix routing +HalFPGAEncoderHandle initializeFPGAEncoder(HalHandle digitalSourceHandleA, + AnalogTriggerType analogTriggerTypeA, + HalHandle digitalSourceHandleB, + AnalogTriggerType analogTriggerTypeB, + bool reverseDirection, + int32_t* index, int32_t* status); void freeFPGAEncoder(HalFPGAEncoderHandle fpga_encoder_handle, int32_t* status); void resetFPGAEncoder(HalFPGAEncoderHandle fpga_encoder_handle, int32_t* status); @@ -37,7 +39,8 @@ void setFPGAEncoderSamplesToAverage(HalFPGAEncoderHandle fpga_encoder_handle, uint32_t getFPGAEncoderSamplesToAverage( HalFPGAEncoderHandle fpga_encoder_handle, int32_t* status); void setFPGAEncoderIndexSource(HalFPGAEncoderHandle fpga_encoder_handle, - uint32_t pin, bool analogTrigger, + HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, bool activeHigh, bool edgeSensitive, int32_t* status); } diff --git a/hal/lib/athena/Interrupts.cpp b/hal/lib/athena/Interrupts.cpp index 0bc1dee664..de0c148aff 100644 --- a/hal/lib/athena/Interrupts.cpp +++ b/hal/lib/athena/Interrupts.cpp @@ -14,6 +14,7 @@ #include "DigitalInternal.h" #include "HAL/Errors.h" #include "PortsInternal.h" +#include "handles/HandlesInternal.h" #include "handles/LimitedHandleResource.h" using namespace hal; @@ -147,19 +148,28 @@ double readFallingTimestamp(HalInterruptHandle interrupt_handle, } void requestInterrupts(HalInterruptHandle interrupt_handle, - uint8_t routing_module, uint32_t routing_pin, - bool routing_analog_trigger, int32_t* status) { + HalHandle digitalSourceHandle, + AnalogTriggerType analogTriggerType, int32_t* status) { auto anInterrupt = interruptHandles.Get(interrupt_handle); if (anInterrupt == nullptr) { *status = HAL_HANDLE_ERROR; return; } anInterrupt->anInterrupt->writeConfig_WaitForAck(false, status); - remapDigitalSource(routing_analog_trigger, routing_pin, routing_module); + bool routingAnalogTrigger = false; + uint32_t routingPin = 0; + uint8_t routingModule = 0; + bool success = + remapDigitalSource(digitalSourceHandle, analogTriggerType, routingPin, + routingModule, routingAnalogTrigger); + if (!success) { + *status = HAL_HANDLE_ERROR; + return; + } anInterrupt->anInterrupt->writeConfig_Source_AnalogTrigger( - routing_analog_trigger, status); - anInterrupt->anInterrupt->writeConfig_Source_Channel(routing_pin, status); - anInterrupt->anInterrupt->writeConfig_Source_Module(routing_module, status); + routingAnalogTrigger, status); + anInterrupt->anInterrupt->writeConfig_Source_Channel(routingPin, status); + anInterrupt->anInterrupt->writeConfig_Source_Module(routingModule, status); } void attachInterruptHandler(HalInterruptHandle interrupt_handle, diff --git a/wpilibc/athena/include/AnalogTriggerOutput.h b/wpilibc/athena/include/AnalogTriggerOutput.h index bedf251303..3106b9c5c2 100644 --- a/wpilibc/athena/include/AnalogTriggerOutput.h +++ b/wpilibc/athena/include/AnalogTriggerOutput.h @@ -49,10 +49,10 @@ class AnalogTriggerOutput : public DigitalSource { bool Get() const; // DigitalSource interface - virtual uint32_t GetChannelForRouting() const override; - virtual uint32_t GetModuleForRouting() const override; - virtual bool GetAnalogTriggerForRouting() const override; - virtual HalHandle GetPortHandle() const override; + virtual HalHandle GetPortHandleForRouting() const override; + virtual AnalogTriggerType GetAnalogTriggerTypeForRouting() const override; + virtual bool IsAnalogTrigger() const override; + virtual uint32_t GetChannel() const override; protected: AnalogTriggerOutput(const AnalogTrigger& trigger, diff --git a/wpilibc/athena/include/DigitalInput.h b/wpilibc/athena/include/DigitalInput.h index b488696deb..430d2fdd72 100644 --- a/wpilibc/athena/include/DigitalInput.h +++ b/wpilibc/athena/include/DigitalInput.h @@ -29,13 +29,12 @@ class DigitalInput : public DigitalSource, public LiveWindowSendable { explicit DigitalInput(uint32_t channel); virtual ~DigitalInput(); bool Get() const; - uint32_t GetChannel() const; + uint32_t GetChannel() const override; // Digital Source Interface - virtual uint32_t GetChannelForRouting() const; - virtual uint32_t GetModuleForRouting() const; - virtual bool GetAnalogTriggerForRouting() const; - virtual HalHandle GetPortHandle() const; + virtual HalHandle GetPortHandleForRouting() const override; + virtual AnalogTriggerType GetAnalogTriggerTypeForRouting() const override; + virtual bool IsAnalogTrigger() const override; void UpdateTable(); void StartLiveWindowMode(); diff --git a/wpilibc/athena/include/DigitalOutput.h b/wpilibc/athena/include/DigitalOutput.h index a4f85041cb..635b68df3c 100644 --- a/wpilibc/athena/include/DigitalOutput.h +++ b/wpilibc/athena/include/DigitalOutput.h @@ -27,7 +27,7 @@ class DigitalOutput : public DigitalSource, explicit DigitalOutput(uint32_t channel); virtual ~DigitalOutput(); void Set(uint32_t value); - uint32_t GetChannel() const; + uint32_t GetChannel() const override; void Pulse(float length); bool IsPulsing() const; void SetPWMRate(float rate); @@ -36,10 +36,9 @@ class DigitalOutput : public DigitalSource, void UpdateDutyCycle(float dutyCycle); // Digital Source Interface - virtual uint32_t GetChannelForRouting() const; - virtual uint32_t GetModuleForRouting() const; - virtual bool GetAnalogTriggerForRouting() const; - virtual HalHandle GetPortHandle() const; + virtual HalHandle GetPortHandleForRouting() const override; + virtual AnalogTriggerType GetAnalogTriggerTypeForRouting() const override; + virtual bool IsAnalogTrigger() const override; virtual void ValueChanged(ITable* source, llvm::StringRef key, std::shared_ptr value, bool isNew); diff --git a/wpilibc/athena/include/DigitalSource.h b/wpilibc/athena/include/DigitalSource.h index 727a1372cc..ec74ff9381 100644 --- a/wpilibc/athena/include/DigitalSource.h +++ b/wpilibc/athena/include/DigitalSource.h @@ -23,8 +23,8 @@ class DigitalSource : public InterruptableSensorBase { public: virtual ~DigitalSource() = default; - virtual uint32_t GetChannelForRouting() const = 0; - virtual uint32_t GetModuleForRouting() const = 0; - virtual bool GetAnalogTriggerForRouting() const = 0; - virtual HalHandle GetPortHandle() const = 0; + virtual HalHandle GetPortHandleForRouting() const = 0; + virtual AnalogTriggerType GetAnalogTriggerTypeForRouting() const = 0; + virtual bool IsAnalogTrigger() const = 0; + virtual uint32_t GetChannel() const = 0; }; diff --git a/wpilibc/athena/include/Encoder.h b/wpilibc/athena/include/Encoder.h index 8355455840..3eb71e8f00 100644 --- a/wpilibc/athena/include/Encoder.h +++ b/wpilibc/athena/include/Encoder.h @@ -98,6 +98,7 @@ class Encoder : public SensorBase, std::shared_ptr m_aSource; // the A phase of the quad encoder std::shared_ptr m_bSource; // the B phase of the quad encoder + std::unique_ptr m_indexSource = nullptr; HalEncoderHandle m_encoder = HAL_INVALID_HANDLE; std::shared_ptr m_table; diff --git a/wpilibc/athena/include/InterruptableSensorBase.h b/wpilibc/athena/include/InterruptableSensorBase.h index d8300d3e04..1bb92da9c6 100644 --- a/wpilibc/athena/include/InterruptableSensorBase.h +++ b/wpilibc/athena/include/InterruptableSensorBase.h @@ -9,6 +9,7 @@ #include +#include "HAL/AnalogTrigger.h" #include "HAL/Interrupts.h" #include "SensorBase.h" @@ -23,9 +24,8 @@ class InterruptableSensorBase : public SensorBase { InterruptableSensorBase(); virtual ~InterruptableSensorBase() = default; - virtual uint32_t GetChannelForRouting() const = 0; - virtual uint32_t GetModuleForRouting() const = 0; - virtual bool GetAnalogTriggerForRouting() const = 0; + virtual HalHandle GetPortHandleForRouting() const = 0; + virtual AnalogTriggerType GetAnalogTriggerTypeForRouting() const = 0; virtual void RequestInterrupts( InterruptHandlerFunction handler, void* param); ///< Asynchronus handler version. diff --git a/wpilibc/athena/src/AnalogTriggerOutput.cpp b/wpilibc/athena/src/AnalogTriggerOutput.cpp index 7b9a371a8f..4742a1d24f 100644 --- a/wpilibc/athena/src/AnalogTriggerOutput.cpp +++ b/wpilibc/athena/src/AnalogTriggerOutput.cpp @@ -50,26 +50,26 @@ bool AnalogTriggerOutput::Get() const { return result; } -/** - * @return The value to be written to the channel field of a routing mux. - */ -uint32_t AnalogTriggerOutput::GetChannelForRouting() const { - return (m_trigger.m_index << 2) + m_outputType; -} - -/** - * @return The value to be written to the module field of a routing mux. - */ -uint32_t AnalogTriggerOutput::GetModuleForRouting() const { return 0; } - -/** - * @return The value to be written to the module field of a routing mux. - */ -bool AnalogTriggerOutput::GetAnalogTriggerForRouting() const { return true; } - /** * @return The HAL Handle to the specified source. */ -HalHandle AnalogTriggerOutput::GetPortHandle() const { +HalHandle AnalogTriggerOutput::GetPortHandleForRouting() const { return m_trigger.m_trigger; } + +/** + * Is source an AnalogTrigger + */ +bool AnalogTriggerOutput::IsAnalogTrigger() const { return true; } + +/** + * @return The type of analog trigger output to be used. + */ +AnalogTriggerType AnalogTriggerOutput::GetAnalogTriggerTypeForRouting() const { + return m_outputType; +} + +/** + * @return The channel of the source. + */ +uint32_t AnalogTriggerOutput::GetChannel() const { return m_trigger.m_index; } diff --git a/wpilibc/athena/src/Counter.cpp b/wpilibc/athena/src/Counter.cpp index c9e3cd0783..9c805a26a6 100644 --- a/wpilibc/athena/src/Counter.cpp +++ b/wpilibc/athena/src/Counter.cpp @@ -234,8 +234,8 @@ void Counter::SetUpSource(std::shared_ptr source) { CloneError(*m_upSource); } else { int32_t status = 0; - setCounterUpSource(m_counter, source->GetChannelForRouting(), - source->GetAnalogTriggerForRouting(), &status); + setCounterUpSource(m_counter, source->GetPortHandleForRouting(), + source->GetAnalogTriggerTypeForRouting(), &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); } } @@ -340,8 +340,8 @@ void Counter::SetDownSource(std::shared_ptr source) { CloneError(*m_downSource); } else { int32_t status = 0; - setCounterDownSource(m_counter, source->GetChannelForRouting(), - source->GetAnalogTriggerForRouting(), &status); + setCounterDownSource(m_counter, source->GetPortHandleForRouting(), + source->GetAnalogTriggerTypeForRouting(), &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); } } diff --git a/wpilibc/athena/src/DigitalGlitchFilter.cpp b/wpilibc/athena/src/DigitalGlitchFilter.cpp index 96f6686f52..d798522b41 100644 --- a/wpilibc/athena/src/DigitalGlitchFilter.cpp +++ b/wpilibc/athena/src/DigitalGlitchFilter.cpp @@ -53,21 +53,22 @@ void DigitalGlitchFilter::DoAdd(DigitalSource* input, int requested_index) { // here, we catch the issue more generally. if (input) { // we don't support GlitchFilters on AnalogTriggers. - if (input->GetAnalogTriggerForRouting()) { + if (input->IsAnalogTrigger()) { wpi_setErrorWithContext( -1, "Analog Triggers not supported for DigitalGlitchFilters"); return; } int32_t status = 0; - setFilterSelect(input->GetPortHandle(), requested_index, &status); + setFilterSelect(input->GetPortHandleForRouting(), requested_index, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); // Validate that we set it correctly. - int actual_index = getFilterSelect(input->GetPortHandle(), &status); + int actual_index = + getFilterSelect(input->GetPortHandleForRouting(), &status); wpi_assertEqual(actual_index, requested_index); HALReport(HALUsageReporting::kResourceType_DigitalInput, - input->GetChannelForRouting()); + input->GetChannel()); } } diff --git a/wpilibc/athena/src/DigitalInput.cpp b/wpilibc/athena/src/DigitalInput.cpp index a94d9b3b17..963c5eec9a 100644 --- a/wpilibc/athena/src/DigitalInput.cpp +++ b/wpilibc/athena/src/DigitalInput.cpp @@ -78,25 +78,22 @@ bool DigitalInput::Get() const { */ uint32_t DigitalInput::GetChannel() const { return m_channel; } -/** - * @return The value to be written to the channel field of a routing mux. - */ -uint32_t DigitalInput::GetChannelForRouting() const { return GetChannel(); } - -/** - * @return The value to be written to the module field of a routing mux. - */ -uint32_t DigitalInput::GetModuleForRouting() const { return 0; } - -/** - * @return The value to be written to the analog trigger field of a routing mux. - */ -bool DigitalInput::GetAnalogTriggerForRouting() const { return false; } - /** * @return The HAL Handle to the specified source. */ -HalHandle DigitalInput::GetPortHandle() const { return m_handle; } +HalHandle DigitalInput::GetPortHandleForRouting() const { return m_handle; } + +/** + * Is source an AnalogTrigger + */ +bool DigitalInput::IsAnalogTrigger() const { return false; } + +/** + * @return The type of analog trigger output to be used. 0 for Digitals + */ +AnalogTriggerType DigitalInput::GetAnalogTriggerTypeForRouting() const { + return (AnalogTriggerType)0; +} void DigitalInput::UpdateTable() { if (m_table != nullptr) { diff --git a/wpilibc/athena/src/DigitalOutput.cpp b/wpilibc/athena/src/DigitalOutput.cpp index 4b17449d25..445f2235f5 100644 --- a/wpilibc/athena/src/DigitalOutput.cpp +++ b/wpilibc/athena/src/DigitalOutput.cpp @@ -193,25 +193,22 @@ void DigitalOutput::UpdateDutyCycle(float dutyCycle) { wpi_setErrorWithContext(status, getHALErrorMessage(status)); } -/** - * @return The value to be written to the channel field of a routing mux. - */ -uint32_t DigitalOutput::GetChannelForRouting() const { return GetChannel(); } - -/** - * @return The value to be written to the module field of a routing mux. - */ -uint32_t DigitalOutput::GetModuleForRouting() const { return 0; } - -/** - * @return The value to be written to the analog trigger field of a routing mux. - */ -bool DigitalOutput::GetAnalogTriggerForRouting() const { return false; } - /** * @return The HAL Handle to the specified source. */ -HalHandle DigitalOutput::GetPortHandle() const { return m_handle; } +HalHandle DigitalOutput::GetPortHandleForRouting() const { return m_handle; } + +/** + * Is source an AnalogTrigger + */ +bool DigitalOutput::IsAnalogTrigger() const { return false; } + +/** + * @return The type of analog trigger output to be used. 0 for Digitals + */ +AnalogTriggerType DigitalOutput::GetAnalogTriggerTypeForRouting() const { + return (AnalogTriggerType)0; +} void DigitalOutput::ValueChanged(ITable* source, llvm::StringRef key, std::shared_ptr value, bool isNew) { diff --git a/wpilibc/athena/src/Encoder.cpp b/wpilibc/athena/src/Encoder.cpp index 7bc8db87f7..916acd3fc5 100644 --- a/wpilibc/athena/src/Encoder.cpp +++ b/wpilibc/athena/src/Encoder.cpp @@ -31,18 +31,18 @@ */ void Encoder::InitEncoder(bool reverseDirection, EncodingType encodingType) { int32_t status = 0; - m_encoder = initializeEncoder( - m_aSource->GetModuleForRouting(), m_aSource->GetChannelForRouting(), - m_aSource->GetAnalogTriggerForRouting(), m_bSource->GetModuleForRouting(), - m_bSource->GetChannelForRouting(), - m_bSource->GetAnalogTriggerForRouting(), reverseDirection, - (EncoderEncodingType)encodingType, &status); + m_encoder = initializeEncoder(m_aSource->GetPortHandleForRouting(), + m_aSource->GetAnalogTriggerTypeForRouting(), + m_bSource->GetPortHandleForRouting(), + m_bSource->GetAnalogTriggerTypeForRouting(), + reverseDirection, + (EncoderEncodingType)encodingType, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); HALReport(HALUsageReporting::kResourceType_Encoder, GetFPGAIndex(), encodingType); - LiveWindow::GetInstance()->AddSensor("Encoder", - m_aSource->GetChannelForRouting(), this); + LiveWindow::GetInstance()->AddSensor("Encoder", m_aSource->GetChannel(), + this); } /** @@ -447,10 +447,9 @@ double Encoder::PIDGet() { * @param type The state that will cause the encoder to reset */ void Encoder::SetIndexSource(uint32_t channel, Encoder::IndexingType type) { - int32_t status = 0; - setEncoderIndexSource(m_encoder, channel, false, (EncoderIndexingType)type, - &status); - wpi_setErrorWithContext(status, getHALErrorMessage(status)); + // Force digital input if just given an index + m_indexSource = std::make_unique(channel); + SetIndexSource(m_indexSource.get(), type); } /** @@ -478,8 +477,8 @@ void Encoder::SetIndexSource(DigitalSource* source, void Encoder::SetIndexSource(const DigitalSource& source, Encoder::IndexingType type) { int32_t status = 0; - setEncoderIndexSource(m_encoder, source.GetChannelForRouting(), - source.GetAnalogTriggerForRouting(), + setEncoderIndexSource(m_encoder, source.GetPortHandleForRouting(), + source.GetAnalogTriggerTypeForRouting(), (EncoderIndexingType)type, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); } diff --git a/wpilibc/athena/src/InterruptableSensorBase.cpp b/wpilibc/athena/src/InterruptableSensorBase.cpp index be43dab229..c9e2ef3b23 100644 --- a/wpilibc/athena/src/InterruptableSensorBase.cpp +++ b/wpilibc/athena/src/InterruptableSensorBase.cpp @@ -30,8 +30,8 @@ void InterruptableSensorBase::RequestInterrupts( if (StatusIsFatal()) return; // if allocate failed, out of interrupts int32_t status = 0; - requestInterrupts(m_interrupt, GetModuleForRouting(), GetChannelForRouting(), - GetAnalogTriggerForRouting(), &status); + requestInterrupts(m_interrupt, GetPortHandleForRouting(), + GetAnalogTriggerTypeForRouting(), &status); SetUpSourceEdge(true, false); attachInterruptHandler(m_interrupt, handler, param, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); @@ -52,8 +52,8 @@ void InterruptableSensorBase::RequestInterrupts() { if (StatusIsFatal()) return; // if allocate failed, out of interrupts int32_t status = 0; - requestInterrupts(m_interrupt, GetModuleForRouting(), GetChannelForRouting(), - GetAnalogTriggerForRouting(), &status); + requestInterrupts(m_interrupt, GetPortHandleForRouting(), + GetAnalogTriggerTypeForRouting(), &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); SetUpSourceEdge(true, false); } diff --git a/wpilibj/src/athena/cpp/lib/CounterJNI.cpp b/wpilibj/src/athena/cpp/lib/CounterJNI.cpp index 1293b81614..7f366bd9c5 100644 --- a/wpilibj/src/athena/cpp/lib/CounterJNI.cpp +++ b/wpilibj/src/athena/cpp/lib/CounterJNI.cpp @@ -82,17 +82,19 @@ Java_edu_wpi_first_wpilibj_hal_CounterJNI_setCounterAverageSize( /* * Class: edu_wpi_first_wpilibj_hal_CounterJNI * Method: setCounterUpSource - * Signature: (IIZ)V + * Signature: (III)V */ JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_CounterJNI_setCounterUpSource( - JNIEnv* env, jclass, jint id, jint pin, jboolean analogTrigger) { + JNIEnv* env, jclass, jint id, jint digitalSourceHandle, + jint analogTriggerType) { COUNTERJNI_LOG(logDEBUG) << "Calling COUNTERJNI setCounterUpSource"; COUNTERJNI_LOG(logDEBUG) << "Counter Handle = " << (HalCounterHandle)id; - COUNTERJNI_LOG(logDEBUG) << "Pin = " << pin; - COUNTERJNI_LOG(logDEBUG) << "AnalogTrigger = " << (jint)analogTrigger; + COUNTERJNI_LOG(logDEBUG) << "digitalSourceHandle = " << digitalSourceHandle; + COUNTERJNI_LOG(logDEBUG) << "analogTriggerType = " << analogTriggerType; int32_t status = 0; - setCounterUpSource((HalCounterHandle)id, pin, analogTrigger, &status); + setCounterUpSource((HalCounterHandle)id, (HalHandle)digitalSourceHandle, + (AnalogTriggerType)analogTriggerType, &status); COUNTERJNI_LOG(logDEBUG) << "Status = " << status; CheckStatus(env, status); } @@ -138,13 +140,15 @@ Java_edu_wpi_first_wpilibj_hal_CounterJNI_clearCounterUpSource( */ JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_CounterJNI_setCounterDownSource( - JNIEnv* env, jclass, jint id, jint pin, jboolean analogTrigger) { + JNIEnv* env, jclass, jint id, jint digitalSourceHandle, + jint analogTriggerType) { COUNTERJNI_LOG(logDEBUG) << "Calling COUNTERJNI setCounterDownSource"; COUNTERJNI_LOG(logDEBUG) << "Counter Handle = " << (HalCounterHandle)id; - COUNTERJNI_LOG(logDEBUG) << "Pin = " << pin; - COUNTERJNI_LOG(logDEBUG) << "AnalogTrigger = " << (jint)analogTrigger; + COUNTERJNI_LOG(logDEBUG) << "digitalSourceHandle = " << digitalSourceHandle; + COUNTERJNI_LOG(logDEBUG) << "analogTriggerType = " << analogTriggerType; int32_t status = 0; - setCounterDownSource((HalCounterHandle)id, pin, analogTrigger, &status); + setCounterDownSource((HalCounterHandle)id, (HalHandle)digitalSourceHandle, + (AnalogTriggerType)analogTriggerType, &status); COUNTERJNI_LOG(logDEBUG) << "Status = " << status; if (status == PARAMETER_OUT_OF_RANGE) { ThrowIllegalArgumentException(env, diff --git a/wpilibj/src/athena/cpp/lib/EncoderJNI.cpp b/wpilibj/src/athena/cpp/lib/EncoderJNI.cpp index 20b3cedff1..03dffb0873 100644 --- a/wpilibj/src/athena/cpp/lib/EncoderJNI.cpp +++ b/wpilibj/src/athena/cpp/lib/EncoderJNI.cpp @@ -29,29 +29,27 @@ extern "C" { /* * Class: edu_wpi_first_wpilibj_hal_EncoderJNI * Method: initializeEncoder - * Signature: (BIZBIZZI)I + * Signature: (IIIIZI)I */ JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_hal_EncoderJNI_initializeEncoder( - JNIEnv* env, jclass, jbyte port_a_module, jint port_a_pin, - jboolean port_a_analog_trigger, jbyte port_b_module, jint port_b_pin, - jboolean port_b_analog_trigger, jboolean reverseDirection, jint encodingType) { + JNIEnv* env, jclass, jint digitalSourceHandleA, jint analogTriggerTypeA, + jint digitalSourceHandleB, jint analogTriggerTypeB, jboolean reverseDirection, + jint encodingType) { ENCODERJNI_LOG(logDEBUG) << "Calling ENCODERJNI initializeEncoder"; - ENCODERJNI_LOG(logDEBUG) << "Module A = " << (jint)port_a_module; - ENCODERJNI_LOG(logDEBUG) << "Pin A = " << port_a_pin; - ENCODERJNI_LOG(logDEBUG) << "Analog Trigger A = " - << (jint)port_a_analog_trigger; - ENCODERJNI_LOG(logDEBUG) << "Module B = " << (jint)port_b_module; - ENCODERJNI_LOG(logDEBUG) << "Pin B = " << port_b_pin; - ENCODERJNI_LOG(logDEBUG) << "Analog Trigger B = " - << (jint)port_b_analog_trigger; + ENCODERJNI_LOG(logDEBUG) << "Source Handle A = " << digitalSourceHandleA; + ENCODERJNI_LOG(logDEBUG) << "Analog Trigger Type A = " + << analogTriggerTypeA; + ENCODERJNI_LOG(logDEBUG) << "Source Handle B = " << digitalSourceHandleB; + ENCODERJNI_LOG(logDEBUG) << "Analog Trigger Type B = " + << analogTriggerTypeB; ENCODERJNI_LOG(logDEBUG) << "Reverse direction = " << (jint)reverseDirection; ENCODERJNI_LOG(logDEBUG) << "EncodingType = " << encodingType; int32_t status = 0; auto encoder = initializeEncoder( - port_a_module, port_a_pin, port_a_analog_trigger, port_b_module, - port_b_pin, port_b_analog_trigger, reverseDirection, - (EncoderEncodingType)encodingType, &status); + (HalHandle)digitalSourceHandleA, (AnalogTriggerType)analogTriggerTypeA, + (HalHandle)digitalSourceHandleB, (AnalogTriggerType)analogTriggerTypeB, + reverseDirection, (EncoderEncodingType)encodingType, &status); ENCODERJNI_LOG(logDEBUG) << "Status = " << status; ENCODERJNI_LOG(logDEBUG) << "ENCODER Handle = " << encoder; @@ -336,20 +334,21 @@ Java_edu_wpi_first_wpilibj_hal_EncoderJNI_getEncoderSamplesToAverage( /* * Class: edu_wpi_first_wpilibj_hal_EncoderJNI * Method: setEncoderIndexSource - * Signature: (IIZI)V + * Signature: (IIII)V */ JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_EncoderJNI_setEncoderIndexSource( - JNIEnv* env, jclass, jint id, jint pin, jboolean analogTrigger, - jint type) { + JNIEnv* env, jclass, jint id, jint digitalSourceHandle, + jint analogTriggerType, jint type) { ENCODERJNI_LOG(logDEBUG) << "Calling ENCODERJNI setEncoderIndexSource"; ENCODERJNI_LOG(logDEBUG) << "Encoder Handle = " << (HalEncoderHandle)id; - ENCODERJNI_LOG(logDEBUG) << "Pin = " << pin; - ENCODERJNI_LOG(logDEBUG) << "Analog Trigger = " - << (analogTrigger ? "true" : "false"); + ENCODERJNI_LOG(logDEBUG) << "Source Handle = " << digitalSourceHandle; + ENCODERJNI_LOG(logDEBUG) << "Analog Trigger Type = " + << analogTriggerType; ENCODERJNI_LOG(logDEBUG) << "IndexingType = " << type; int32_t status = 0; - setEncoderIndexSource((HalEncoderHandle)id, pin, analogTrigger, + setEncoderIndexSource((HalEncoderHandle)id, (HalHandle)digitalSourceHandle, + (AnalogTriggerType)analogTriggerType, (EncoderIndexingType)type, &status); ENCODERJNI_LOG(logDEBUG) << "Status = " << status; CheckStatus(env, status); diff --git a/wpilibj/src/athena/cpp/lib/InterruptJNI.cpp b/wpilibj/src/athena/cpp/lib/InterruptJNI.cpp index 8845f9364c..dc48eedb67 100644 --- a/wpilibj/src/athena/cpp/lib/InterruptJNI.cpp +++ b/wpilibj/src/athena/cpp/lib/InterruptJNI.cpp @@ -257,22 +257,20 @@ Java_edu_wpi_first_wpilibj_hal_InterruptJNI_readFallingTimestamp( /* * Class: edu_wpi_first_wpilibj_hal_InterruptJNI * Method: requestInterrupts - * Signature: (JBIZ)V + * Signature: (III)V */ JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_InterruptJNI_requestInterrupts( - JNIEnv* env, jclass, jint interrupt_handle, jbyte routing_module, - jint routing_pin, jboolean routing_analog_trigger) { + JNIEnv* env, jclass, jint interrupt_handle, jint digitalSourceHandle, + jint analogTriggerType) { INTERRUPTJNI_LOG(logDEBUG) << "Calling INTERRUPTJNI requestInterrupts"; INTERRUPTJNI_LOG(logDEBUG) << "Interrupt Handle = " << (HalInterruptHandle)interrupt_handle; - INTERRUPTJNI_LOG(logDEBUG) << "routing module = " << (jint)routing_module; - INTERRUPTJNI_LOG(logDEBUG) << "routing pin = " << routing_pin; - INTERRUPTJNI_LOG(logDEBUG) << "routing analog trigger = " - << (jint)routing_analog_trigger; + INTERRUPTJNI_LOG(logDEBUG) << "digitalSourceHandle = " << digitalSourceHandle; + INTERRUPTJNI_LOG(logDEBUG) << "analogTriggerType = " << analogTriggerType; int32_t status = 0; - requestInterrupts((HalInterruptHandle)interrupt_handle, (uint8_t)routing_module, - (uint32_t)routing_pin, routing_analog_trigger, &status); + requestInterrupts((HalInterruptHandle)interrupt_handle, (HalHandle)digitalSourceHandle, + (AnalogTriggerType)analogTriggerType, &status); INTERRUPTJNI_LOG(logDEBUG) << "Status = " << status; CheckStatus(env, status); diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/AnalogTriggerOutput.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/AnalogTriggerOutput.java index 8a4b25804e..722786eda4 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/AnalogTriggerOutput.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/AnalogTriggerOutput.java @@ -101,23 +101,23 @@ public class AnalogTriggerOutput extends DigitalSource { } @Override - public int getChannelForRouting() { - return (m_trigger.m_index << 2) + m_outputType.m_value; + public int getPortHandleForRouting() { + return m_trigger.m_port; } @Override - public byte getModuleForRouting() { - return (byte) (m_trigger.m_index >> 2); - } - - @Override - public boolean getAnalogTriggerForRouting() { - return true; + public int getAnalogTriggerTypeForRouting() { + return m_outputType.m_value; } @Override - public int getPortHandle() { - return m_trigger.m_port; + public int getChannel() { + return m_trigger.m_index; + } + + @Override + public boolean isAnalogTrigger() { + return true; } /** diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/Counter.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/Counter.java index f2873e9d52..db72ef18ae 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/Counter.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/Counter.java @@ -230,8 +230,8 @@ public class Counter extends SensorBase implements CounterBase, LiveWindowSendab m_allocatedUpSource = false; } m_upSource = source; - CounterJNI.setCounterUpSource(m_counter, source.getChannelForRouting(), - source.getAnalogTriggerForRouting()); + CounterJNI.setCounterUpSource(m_counter, source.getPortHandleForRouting(), + source.getAnalogTriggerTypeForRouting()); } /** @@ -303,8 +303,8 @@ public class Counter extends SensorBase implements CounterBase, LiveWindowSendab m_downSource.free(); m_allocatedDownSource = false; } - CounterJNI.setCounterDownSource(m_counter, source.getChannelForRouting(), - source.getAnalogTriggerForRouting()); + CounterJNI.setCounterDownSource(m_counter, source.getPortHandleForRouting(), + source.getAnalogTriggerTypeForRouting()); m_downSource = source; } diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalGlitchFilter.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalGlitchFilter.java index 364c6f7cf1..5aa7d2204c 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalGlitchFilter.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalGlitchFilter.java @@ -54,12 +54,12 @@ public class DigitalGlitchFilter extends SensorBase { private static void setFilter(DigitalSource input, int channelIndex) { if (input != null) { // Counter might have just one input // analog triggers are not supported for DigitalGlitchFilters - if (input.getAnalogTriggerForRouting()) { + if (input.isAnalogTrigger()) { throw new IllegalStateException("Analog Triggers not supported for DigitalGlitchFilters"); } - DigitalGlitchFilterJNI.setFilterSelect(input.getPortHandle(), channelIndex); + DigitalGlitchFilterJNI.setFilterSelect(input.getPortHandleForRouting(), channelIndex); - int selected = DigitalGlitchFilterJNI.getFilterSelect(input.getPortHandle()); + int selected = DigitalGlitchFilterJNI.getFilterSelect(input.getPortHandleForRouting()); if (selected != channelIndex) { throw new IllegalStateException("DigitalGlitchFilterJNI.setFilterSelect(" + channelIndex + ") failed -> " + selected); diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalInput.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalInput.java index 1afba3e24a..38ed9ac869 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalInput.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalInput.java @@ -65,37 +65,28 @@ public class DigitalInput extends DigitalSource implements LiveWindowSendable { * * @return The GPIO channel number that this object represents. */ + @Override public int getChannel() { return m_channel; } /** - * Get the channel routing number. + * Get the analog trigger type. * - * @return channel routing number + * @return false */ @Override - public int getChannelForRouting() { - return m_channel; - } - - /** - * Get the module routing number. - * - * @return 0 - */ - @Override - public byte getModuleForRouting() { + public int getAnalogTriggerTypeForRouting() { return 0; } - + /** * Is this an analog trigger. * * @return true if this is an analog trigger */ @Override - public boolean getAnalogTriggerForRouting() { + public boolean isAnalogTrigger() { return false; } @@ -105,11 +96,10 @@ public class DigitalInput extends DigitalSource implements LiveWindowSendable { * @return The HAL Handle to the specified source. */ @Override - public int getPortHandle() { + public int getPortHandleForRouting() { return m_handle; } - @Override public String getSmartDashboardType() { return "Digital Input"; diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalOutput.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalOutput.java index e486b0aa9f..ca774a4a36 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalOutput.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalOutput.java @@ -67,6 +67,7 @@ public class DigitalOutput extends DigitalSource implements LiveWindowSendable { /** * @return The GPIO channel number that this object represents. */ + @Override public int getChannel() { return m_channel; } @@ -170,34 +171,24 @@ public class DigitalOutput extends DigitalSource implements LiveWindowSendable { } DIOJNI.setDigitalPWMDutyCycle(m_pwmGenerator, dutyCycle); } - - /** - * Get the channel routing number. - * - * @return channel routing number - */ - @Override - public int getChannelForRouting() { - return m_channel; - } /** - * Get the module routing number. + * Get the analog trigger type. * - * @return 0 + * @return false */ @Override - public byte getModuleForRouting() { + public int getAnalogTriggerTypeForRouting() { return 0; } - + /** * Is this an analog trigger. * * @return true if this is an analog trigger */ @Override - public boolean getAnalogTriggerForRouting() { + public boolean isAnalogTrigger() { return false; } @@ -207,7 +198,7 @@ public class DigitalOutput extends DigitalSource implements LiveWindowSendable { * @return The HAL Handle to the specified source. */ @Override - public int getPortHandle() { + public int getPortHandleForRouting() { return m_handle; } diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalSource.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalSource.java index c4596145a0..f4626dec1b 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalSource.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/DigitalSource.java @@ -14,5 +14,7 @@ package edu.wpi.first.wpilibj; * source. The source can either be a digital input or analog trigger but not both. */ public abstract class DigitalSource extends InterruptableSensorBase { - public abstract int getPortHandle(); + public abstract boolean isAnalogTrigger(); + + public abstract int getChannel(); } diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/Encoder.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/Encoder.java index d25e4368d6..e93d42a725 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/Encoder.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/Encoder.java @@ -16,6 +16,7 @@ import edu.wpi.first.wpilibj.hal.EncoderJNI; import edu.wpi.first.wpilibj.livewindow.LiveWindow; import edu.wpi.first.wpilibj.livewindow.LiveWindowSendable; import edu.wpi.first.wpilibj.tables.ITable; +import edu.wpi.first.wpilibj.util.AllocationException; /** * Class to read quad encoders. Quadrature encoders are devices that count shaft rotation and can @@ -72,15 +73,14 @@ public class Encoder extends SensorBase implements CounterBase, PIDSource, LiveW * @param reverseDirection If true, counts down instead of up (this is all relative) */ private void initEncoder(boolean reverseDirection, final EncodingType type) { - m_encoder = EncoderJNI.initializeEncoder(m_aSource.getModuleForRouting(), - (byte)m_aSource.getChannelForRouting(), m_aSource.getAnalogTriggerForRouting(), - m_bSource.getModuleForRouting(), (byte)m_bSource.getChannelForRouting(), - m_bSource.getAnalogTriggerForRouting(), reverseDirection, type.value); + m_encoder = EncoderJNI.initializeEncoder(m_aSource.getPortHandleForRouting(), + m_aSource.getAnalogTriggerTypeForRouting(), m_bSource.getPortHandleForRouting(), + m_bSource.getAnalogTriggerTypeForRouting(), reverseDirection, type.value); m_pidSource = PIDSourceType.kDisplacement; UsageReporting.report(tResourceType.kResourceType_Encoder, getFPGAIndex(), type.value); - LiveWindow.addSensor("Encoder", m_aSource.getChannelForRouting(), this); + LiveWindow.addSensor("Encoder", m_aSource.getChannel(), this); } /** @@ -164,7 +164,7 @@ public class Encoder extends SensorBase implements CounterBase, PIDSource, LiveW m_bSource = new DigitalInput(channelB); m_indexSource = new DigitalInput(indexChannel); initEncoder(reverseDirection, EncodingType.k4X); - setIndexSource(indexChannel); + setIndexSource(m_indexSource); } /** @@ -564,7 +564,12 @@ public class Encoder extends SensorBase implements CounterBase, PIDSource, LiveW * @param type The state that will cause the encoder to reset */ public void setIndexSource(int channel, IndexingType type) { - EncoderJNI.setEncoderIndexSource(m_encoder, channel, false, type.value); + if (m_allocatedI) { + throw new AllocationException("Digital Input for Indexing already allocated"); + } + m_indexSource = new DigitalInput(channel); + m_allocatedI = true; + setIndexSource(m_indexSource, type); } /** @@ -575,8 +580,8 @@ public class Encoder extends SensorBase implements CounterBase, PIDSource, LiveW * @param type The state that will cause the encoder to reset */ public void setIndexSource(DigitalSource source, IndexingType type) { - EncoderJNI.setEncoderIndexSource(m_encoder, source.getChannelForRouting(), - source.getAnalogTriggerForRouting(), type.value); + EncoderJNI.setEncoderIndexSource(m_encoder, source.getPortHandleForRouting(), + source.getAnalogTriggerTypeForRouting(), type.value); } /** diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/InterruptableSensorBase.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/InterruptableSensorBase.java index 5655019027..68223820fc 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/InterruptableSensorBase.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/InterruptableSensorBase.java @@ -61,21 +61,14 @@ public abstract class InterruptableSensorBase extends SensorBase { * * @return true if this is an analog trigger. */ - abstract boolean getAnalogTriggerForRouting(); + public abstract int getAnalogTriggerTypeForRouting(); /** * The channel routing number. * * @return channel routing number */ - abstract int getChannelForRouting(); - - /** - * The modules routing number. - * - * @return module routing number - */ - abstract byte getModuleForRouting(); + public abstract int getPortHandleForRouting(); /** * Request one of the 8 interrupts asynchronously on this digital input. @@ -95,8 +88,8 @@ public abstract class InterruptableSensorBase extends SensorBase { assert (m_interrupt != 0); - InterruptJNI.requestInterrupts(m_interrupt, getModuleForRouting(), getChannelForRouting(), - getAnalogTriggerForRouting()); + InterruptJNI.requestInterrupts(m_interrupt, getPortHandleForRouting(), + getAnalogTriggerTypeForRouting()); setUpSourceEdge(true, false); InterruptJNI.attachInterruptHandler(m_interrupt, handler.m_function, handler.overridableParameter()); @@ -116,8 +109,8 @@ public abstract class InterruptableSensorBase extends SensorBase { assert (m_interrupt != 0); - InterruptJNI.requestInterrupts(m_interrupt, getModuleForRouting(), getChannelForRouting(), - getAnalogTriggerForRouting()); + InterruptJNI.requestInterrupts(m_interrupt, getPortHandleForRouting(), + getAnalogTriggerTypeForRouting()); setUpSourceEdge(true, false); } diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/CounterJNI.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/CounterJNI.java index 1d9cf758d2..b3a2549905 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/CounterJNI.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/CounterJNI.java @@ -16,16 +16,16 @@ public class CounterJNI extends JNIWrapper { public static native void setCounterAverageSize(int counterHandle, int size); - public static native void setCounterUpSource(int counterHandle, int pin, - boolean analogTrigger); + public static native void setCounterUpSource(int counterHandle, int digitalSourceHandle, + int analogTriggerType); public static native void setCounterUpSourceEdge(int counterHandle, boolean risingEdge, boolean fallingEdge); public static native void clearCounterUpSource(int counterHandle); - public static native void setCounterDownSource(int counterHandle, int pin, - boolean analogTrigger); + public static native void setCounterDownSource(int counterHandle, int digitalSourceHandle, + int analogTriggerType); public static native void setCounterDownSourceEdge(int counterHandle, boolean risingEdge, boolean fallingEdge); diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/EncoderJNI.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/EncoderJNI.java index f30ed7bd44..ce271aae11 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/EncoderJNI.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/EncoderJNI.java @@ -11,10 +11,9 @@ import java.nio.IntBuffer; public class EncoderJNI extends JNIWrapper { - public static native int initializeEncoder(byte portAModule, int portAPin, - boolean portAAnalogTrigger, byte portBModule, - int portBPin, boolean portBAnalogTrigger, - boolean reverseDirection, int encodingType); + public static native int initializeEncoder(int digitalSourceHandleA, int analogTriggerTypeA, + int digitalSourceHandleB, int analogTriggerTypeB, + boolean reverseDirection, int encodingType); public static native void freeEncoder(int encoderHandle); @@ -50,8 +49,8 @@ public class EncoderJNI extends JNIWrapper { public static native int getEncoderSamplesToAverage(int encoderHandle); - public static native void setEncoderIndexSource(int encoderHandle, int pin, - boolean analogTrigger, int indexingType); + public static native void setEncoderIndexSource(int encoderHandle, int digitalSourceHandle, + int analogTriggerType, int indexingType); @SuppressWarnings("AbbreviationAsWordInName") public static native int getEncoderFPGAIndex(int encoderHandle); diff --git a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/InterruptJNI.java b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/InterruptJNI.java index fd4e60b31a..cfaa71e66b 100644 --- a/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/InterruptJNI.java +++ b/wpilibj/src/athena/java/edu/wpi/first/wpilibj/hal/InterruptJNI.java @@ -29,8 +29,8 @@ public class InterruptJNI extends JNIWrapper { public static native double readFallingTimestamp(int interruptHandle); - public static native void requestInterrupts(int interruptHandle, byte routingModule, - int routingPin, boolean routingAnalogTrigger); + public static native void requestInterrupts(int interruptHandle, int digitalSourceHandle, + int analogTriggerType); public static native void attachInterruptHandler(int interruptHandle, InterruptJNIHandlerFunction handler,