7 #include "DigitalInput.h"
8 #include "DigitalModule.h"
9 #include "NetworkCommunication/UsageReporting.h"
11 #include "WPIErrors.h"
21 void DigitalInput::InitDigitalInput(uint8_t moduleNumber, uint32_t channel)
28 snprintf(buf, 64,
"Digital Module %d", moduleNumber);
29 wpi_setWPIErrorWithContext(ModuleIndexOutOfRange, buf);
34 snprintf(buf, 64,
"Digital Channel %d", channel);
35 wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf);
42 nUsageReporting::report(nUsageReporting::kResourceType_DigitalInput, channel, moduleNumber - 1);
53 InitDigitalInput(GetDefaultDigitalModule(), channel);
65 InitDigitalInput(moduleNumber, channel);
74 if (m_manager != NULL)
78 interruptsResource->
Free(m_interruptIndex);
87 uint32_t DigitalInput::Get()
90 return m_module->
GetDIO(m_channel);
106 return DigitalModule::RemapDigitalChannel(
GetChannel() - 1);
115 return m_module->GetNumber() - 1;
137 uint32_t index = interruptsResource->
Allocate(
"Async Interrupt");
140 CloneError(interruptsResource);
143 m_interruptIndex = index;
146 AllocateInterrupts(
false);
148 tRioStatusCode localStatus = NiFpga_Status_Success;
149 m_interrupt->writeConfig_WaitForAck(
false, &localStatus);
153 SetUpSourceEdge(
true,
false);
155 m_manager->registerHandler(handler, param, &localStatus);
156 wpi_setError(localStatus);
168 uint32_t index = interruptsResource->
Allocate(
"Sync Interrupt");
171 CloneError(interruptsResource);
174 m_interruptIndex = index;
176 AllocateInterrupts(
true);
178 tRioStatusCode localStatus = NiFpga_Status_Success;
182 SetUpSourceEdge(
true,
false);
183 wpi_setError(localStatus);
186 void DigitalInput::SetUpSourceEdge(
bool risingEdge,
bool fallingEdge)
189 if (m_interrupt == NULL)
191 wpi_setWPIErrorWithContext(NullParameter,
"You must call RequestInterrupts before SetUpSourceEdge");
194 tRioStatusCode localStatus = NiFpga_Status_Success;
195 if (m_interrupt != NULL)
197 m_interrupt->writeConfig_RisingEdge(risingEdge, &localStatus);
198 m_interrupt->writeConfig_FallingEdge(fallingEdge, &localStatus);
200 wpi_setError(localStatus);
204 if (m_table != NULL) {
218 return "DigitalInput";
static bool CheckDigitalChannel(uint32_t channel)
void FreeDIO(uint32_t channel)
bool AllocateDIO(uint32_t channel, bool input)
virtual void PutBoolean(std::string key, bool value)=0
void Free(uint32_t index)
uint32_t Allocate(const char *resourceDesc)
virtual bool StatusIsFatal() const
Check if the current error code represents a fatal error.
static bool CheckDigitalModule(uint8_t moduleNumber)
static DigitalModule * GetInstance(uint8_t moduleNumber)
bool GetDIO(uint32_t channel)
static void CreateResourceObject(Resource **r, uint32_t elements)