Now you can download a copy of these docs so you can use them offline! Download now
DigitalInput.cpp
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) FIRST 2008. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
5 /*----------------------------------------------------------------------------*/
6 
7 #include "DigitalInput.h"
8 #include "DigitalModule.h"
9 #include "NetworkCommunication/UsageReporting.h"
10 #include "Resource.h"
11 #include "WPIErrors.h"
12 
13 // TODO: This is not a good place for this...
14 Resource *interruptsResource = NULL;
15 
21 void DigitalInput::InitDigitalInput(uint8_t moduleNumber, uint32_t channel)
22 {
23  m_table = NULL;
24  char buf[64];
25  Resource::CreateResourceObject(&interruptsResource, tInterrupt::kNumSystems);
26  if (!CheckDigitalModule(moduleNumber))
27  {
28  snprintf(buf, 64, "Digital Module %d", moduleNumber);
29  wpi_setWPIErrorWithContext(ModuleIndexOutOfRange, buf);
30  return;
31  }
32  if (!CheckDigitalChannel(channel))
33  {
34  snprintf(buf, 64, "Digital Channel %d", channel);
35  wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf);
36  return;
37  }
38  m_channel = channel;
39  m_module = DigitalModule::GetInstance(moduleNumber);
40  m_module->AllocateDIO(channel, true);
41 
42  nUsageReporting::report(nUsageReporting::kResourceType_DigitalInput, channel, moduleNumber - 1);
43 }
44 
51 DigitalInput::DigitalInput(uint32_t channel)
52 {
53  InitDigitalInput(GetDefaultDigitalModule(), channel);
54 }
55 
63 DigitalInput::DigitalInput(uint8_t moduleNumber, uint32_t channel)
64 {
65  InitDigitalInput(moduleNumber, channel);
66 }
67 
72 {
73  if (StatusIsFatal()) return;
74  if (m_manager != NULL)
75  {
76  delete m_manager;
77  delete m_interrupt;
78  interruptsResource->Free(m_interruptIndex);
79  }
80  m_module->FreeDIO(m_channel);
81 }
82 
83 /*
84  * Get the value from a digital input channel.
85  * Retrieve the value of a single digital input channel from the FPGA.
86  */
87 uint32_t DigitalInput::Get()
88 {
89  if (StatusIsFatal()) return 0;
90  return m_module->GetDIO(m_channel);
91 }
92 
97 {
98  return m_channel;
99 }
100 
105 {
106  return DigitalModule::RemapDigitalChannel(GetChannel() - 1);
107 }
108 
113 {
114  if (StatusIsFatal()) return 0;
115  return m_module->GetNumber() - 1;
116 }
117 
122 {
123  return false;
124 }
125 
134 void DigitalInput::RequestInterrupts(tInterruptHandler handler, void *param)
135 {
136  if (StatusIsFatal()) return;
137  uint32_t index = interruptsResource->Allocate("Async Interrupt");
138  if (index == ~0ul)
139  {
140  CloneError(interruptsResource);
141  return;
142  }
143  m_interruptIndex = index;
144 
145  // Creates a manager too
146  AllocateInterrupts(false);
147 
148  tRioStatusCode localStatus = NiFpga_Status_Success;
149  m_interrupt->writeConfig_WaitForAck(false, &localStatus);
150  m_interrupt->writeConfig_Source_AnalogTrigger(GetAnalogTriggerForRouting(), &localStatus);
151  m_interrupt->writeConfig_Source_Channel(GetChannelForRouting(), &localStatus);
152  m_interrupt->writeConfig_Source_Module(GetModuleForRouting(), &localStatus);
153  SetUpSourceEdge(true, false);
154 
155  m_manager->registerHandler(handler, param, &localStatus);
156  wpi_setError(localStatus);
157 }
158 
166 {
167  if (StatusIsFatal()) return;
168  uint32_t index = interruptsResource->Allocate("Sync Interrupt");
169  if (index == ~0ul)
170  {
171  CloneError(interruptsResource);
172  return;
173  }
174  m_interruptIndex = index;
175 
176  AllocateInterrupts(true);
177 
178  tRioStatusCode localStatus = NiFpga_Status_Success;
179  m_interrupt->writeConfig_Source_AnalogTrigger(GetAnalogTriggerForRouting(), &localStatus);
180  m_interrupt->writeConfig_Source_Channel(GetChannelForRouting(), &localStatus);
181  m_interrupt->writeConfig_Source_Module(GetModuleForRouting(), &localStatus);
182  SetUpSourceEdge(true, false);
183  wpi_setError(localStatus);
184 }
185 
186 void DigitalInput::SetUpSourceEdge(bool risingEdge, bool fallingEdge)
187 {
188  if (StatusIsFatal()) return;
189  if (m_interrupt == NULL)
190  {
191  wpi_setWPIErrorWithContext(NullParameter, "You must call RequestInterrupts before SetUpSourceEdge");
192  return;
193  }
194  tRioStatusCode localStatus = NiFpga_Status_Success;
195  if (m_interrupt != NULL)
196  {
197  m_interrupt->writeConfig_RisingEdge(risingEdge, &localStatus);
198  m_interrupt->writeConfig_FallingEdge(fallingEdge, &localStatus);
199  }
200  wpi_setError(localStatus);
201 }
202 
204  if (m_table != NULL) {
205  m_table->PutBoolean("Value", Get());
206  }
207 }
208 
210 
211 }
212 
214 
215 }
216 
218  return "DigitalInput";
219 }
220 
222  m_table = subTable;
223  UpdateTable();
224 }
225 
227  return m_table;
228 }
static bool CheckDigitalChannel(uint32_t channel)
Definition: SensorBase.cpp:132
ITable * GetTable()
std::string GetSmartDashboardType()
Definition: ITable.h:26
virtual uint32_t GetModuleForRouting()
void InitTable(ITable *subTable)
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)
Definition: Resource.cpp:105
uint32_t Allocate(const char *resourceDesc)
Definition: Resource.cpp:62
virtual ~DigitalInput()
void UpdateTable()
virtual bool StatusIsFatal() const
Check if the current error code represents a fatal error.
Definition: ErrorBase.cpp:178
static bool CheckDigitalModule(uint8_t moduleNumber)
Definition: SensorBase.cpp:86
DigitalInput(uint32_t channel)
static DigitalModule * GetInstance(uint8_t moduleNumber)
bool GetDIO(uint32_t channel)
static void CreateResourceObject(Resource **r, uint32_t elements)
Definition: Resource.cpp:39
virtual uint32_t GetChannelForRouting()
virtual void RequestInterrupts()
Synchronus Wait version.
virtual bool GetAnalogTriggerForRouting()
void StopLiveWindowMode()
uint32_t GetChannel()
void StartLiveWindowMode()

Generated on Sat Apr 26 2014 12:26:45 for WPILibC++ by doxygen 1.8.6