7 #include "DigitalOutput.h"
8 #include "DigitalModule.h"
9 #include "NetworkCommunication/UsageReporting.h"
11 #include "WPIErrors.h"
20 void DigitalOutput::InitDigitalOutput(uint8_t moduleNumber, uint32_t channel)
26 snprintf(buf, 64,
"Digital Module %d", moduleNumber);
27 wpi_setWPIErrorWithContext(ModuleIndexOutOfRange, buf);
32 snprintf(buf, 64,
"Digital Channel %d", channel);
33 wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf);
37 m_pwmGenerator = ~0ul;
41 nUsageReporting::report(nUsageReporting::kResourceType_DigitalOutput, channel, moduleNumber - 1);
52 InitDigitalOutput(GetDefaultDigitalModule(), channel);
64 InitDigitalOutput(moduleNumber, channel);
85 m_module->
SetDIO(m_channel, value);
105 m_module->
Pulse(m_channel, length);
148 if (m_pwmGenerator != ~0ul)
return;
165 m_pwmGenerator = ~0ul;
187 return DigitalModule::RemapDigitalChannel(
GetChannel() - 1);
196 return m_module->GetNumber() - 1;
218 uint32_t index = interruptsResource->
Allocate(
"Sync Interrupt");
221 CloneError(interruptsResource);
224 m_interruptIndex = index;
227 AllocateInterrupts(
false);
229 tRioStatusCode localStatus = NiFpga_Status_Success;
230 m_interrupt->writeConfig_WaitForAck(
false, &localStatus);
234 SetUpSourceEdge(
true,
false);
236 m_manager->registerHandler(handler, param, &localStatus);
237 wpi_setError(localStatus);
249 uint32_t index = interruptsResource->
Allocate(
"Sync Interrupt");
252 CloneError(interruptsResource);
255 m_interruptIndex = index;
257 AllocateInterrupts(
true);
259 tRioStatusCode localStatus = NiFpga_Status_Success;
263 SetUpSourceEdge(
true,
false);
264 wpi_setError(localStatus);
267 void DigitalOutput::SetUpSourceEdge(
bool risingEdge,
bool fallingEdge)
270 if (m_interrupt == NULL)
272 wpi_setWPIErrorWithContext(NullParameter,
"You must call RequestInterrupts before SetUpSourceEdge");
275 tRioStatusCode localStatus = NiFpga_Status_Success;
276 if (m_interrupt != NULL)
278 m_interrupt->writeConfig_RisingEdge(risingEdge, &localStatus);
279 m_interrupt->writeConfig_FallingEdge(fallingEdge, &localStatus);
281 wpi_setError(localStatus);
292 if (m_table != NULL) {
298 if (m_table != NULL) {
304 return "Digital Output";
virtual void ValueChanged(ITable *source, const std::string &key, EntryValue value, bool isNew)
virtual void RequestInterrupts()
static bool CheckDigitalChannel(uint32_t channel)
virtual void RemoveTableListener(ITableListener *listener)=0
bool IsPulsing(uint32_t channel)
virtual void AddTableListener(ITableListener *listener)=0
void SetDIO(uint32_t channel, short value)
void StartLiveWindowMode()
void EnablePWM(float initialDutyCycle)
void InitTable(ITable *subTable)
void Pulse(uint32_t channel, float pulseLength)
void SetDO_PWMOutputChannel(uint32_t pwmGenerator, uint32_t channel)
virtual uint32_t GetModuleForRouting()
void FreeDIO(uint32_t channel)
void SetDO_PWMDutyCycle(uint32_t pwmGenerator, float dutyCycle)
bool AllocateDIO(uint32_t channel, bool input)
void SetDO_PWMRate(float rate)
std::string GetSmartDashboardType()
uint32_t Allocate(const char *resourceDesc)
uint32_t AllocateDO_PWM()
DigitalOutput(uint32_t channel)
void UpdateDutyCycle(float dutyCycle)
void StopLiveWindowMode()
virtual bool GetAnalogTriggerForRouting()
virtual bool StatusIsFatal() const
Check if the current error code represents a fatal error.
static bool CheckDigitalModule(uint8_t moduleNumber)
virtual uint32_t GetChannelForRouting()
static DigitalModule * GetInstance(uint8_t moduleNumber)
void SetPWMRate(float rate)
void FreeDO_PWM(uint32_t pwmGenerator)