Now you can download a copy of these docs so you can use them offline! Download now
AnalogTrigger.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 "AnalogTrigger.h"
8 
9 #include "AnalogChannel.h"
10 #include "AnalogModule.h"
11 #include "NetworkCommunication/UsageReporting.h"
12 #include "Resource.h"
13 #include "WPIErrors.h"
14 
15 static Resource *triggers = NULL;
16 
21 void AnalogTrigger::InitTrigger(uint8_t moduleNumber, uint32_t channel)
22 {
23  Resource::CreateResourceObject(&triggers, tAnalogTrigger::kNumSystems);
24  uint32_t index = triggers->Allocate("Analog Trigger");
25  if (index == ~0ul)
26  {
27  CloneError(triggers);
28  return;
29  }
30  m_index = (uint8_t)index;
31  m_channel = channel;
32  m_analogModule = AnalogModule::GetInstance(moduleNumber);
33 
34  tRioStatusCode localStatus = NiFpga_Status_Success;
35  m_trigger = tAnalogTrigger::create(m_index, &localStatus);
36  m_trigger->writeSourceSelect_Channel(m_channel - 1, &localStatus);
37  m_trigger->writeSourceSelect_Module(moduleNumber - 1, &localStatus);
38  wpi_setError(localStatus);
39 
40  nUsageReporting::report(nUsageReporting::kResourceType_AnalogTrigger, m_channel, moduleNumber - 1);
41 }
42 
50 {
51  InitTrigger(GetDefaultAnalogModule(), channel);
52 }
53 
60 AnalogTrigger::AnalogTrigger(uint8_t moduleNumber, uint32_t channel)
61 {
62  InitTrigger(moduleNumber, channel);
63 }
64 
71 {
72  InitTrigger(channel->GetModuleNumber(), channel->GetChannel());
73 }
74 
75 AnalogTrigger::~AnalogTrigger()
76 {
77  triggers->Free(m_index);
78  delete m_trigger;
79 }
80 
86 void AnalogTrigger::SetLimitsRaw(int32_t lower, int32_t upper)
87 {
88  if (StatusIsFatal()) return;
89  if (lower > upper)
90  {
91  wpi_setWPIError(AnalogTriggerLimitOrderError);
92  }
93  tRioStatusCode localStatus = NiFpga_Status_Success;
94  m_trigger->writeLowerLimit(lower, &localStatus);
95  m_trigger->writeUpperLimit(upper, &localStatus);
96  wpi_setError(localStatus);
97 }
98 
103 void AnalogTrigger::SetLimitsVoltage(float lower, float upper)
104 {
105  if (StatusIsFatal()) return;
106  if (lower > upper)
107  {
108  wpi_setWPIError(AnalogTriggerLimitOrderError);
109  }
110  // TODO: This depends on the averaged setting. Only raw values will work as is.
111  tRioStatusCode localStatus = NiFpga_Status_Success;
112  m_trigger->writeLowerLimit(m_analogModule->VoltsToValue(m_channel, lower), &localStatus);
113  m_trigger->writeUpperLimit(m_analogModule->VoltsToValue(m_channel, upper), &localStatus);
114  wpi_setError(localStatus);
115 }
116 
122 void AnalogTrigger::SetAveraged(bool useAveragedValue)
123 {
124  if (StatusIsFatal()) return;
125  tRioStatusCode localStatus = NiFpga_Status_Success;
126  if (m_trigger->readSourceSelect_Filter(&localStatus) != 0)
127  wpi_setWPIErrorWithContext(IncompatibleMode, "Hardware does not support average and filtering at the same time.");
128  m_trigger->writeSourceSelect_Averaged(useAveragedValue, &localStatus);
129  wpi_setError(localStatus);
130 }
131 
137 void AnalogTrigger::SetFiltered(bool useFilteredValue)
138 {
139  if (StatusIsFatal()) return;
140  tRioStatusCode localStatus = NiFpga_Status_Success;
141  if (m_trigger->readSourceSelect_Averaged(&localStatus) != 0)
142  wpi_setWPIErrorWithContext(IncompatibleMode, "Hardware does not support average and filtering at the same time.");
143  m_trigger->writeSourceSelect_Filter(useFilteredValue, &localStatus);
144  wpi_setError(localStatus);
145 }
146 
153 {
154  if (StatusIsFatal()) return ~0ul;
155  return m_index;
156 }
157 
164 {
165  if (StatusIsFatal()) return false;
166  tRioStatusCode localStatus = NiFpga_Status_Success;
167  bool result = m_trigger->readOutput_InHysteresis(m_index, &localStatus) != 0;
168  wpi_setError(localStatus);
169  return result;
170 }
171 
180 {
181  if (StatusIsFatal()) return false;
182  tRioStatusCode localStatus = NiFpga_Status_Success;
183  bool result = m_trigger->readOutput_OverLimit(m_index, &localStatus) != 0;
184  wpi_setError(localStatus);
185  return result;
186 }
187 
195 AnalogTriggerOutput *AnalogTrigger::CreateOutput(AnalogTriggerOutput::Type type)
196 {
197  if (StatusIsFatal()) return NULL;
198  return new AnalogTriggerOutput(this, type);
199 }
200 
AnalogTriggerOutput * CreateOutput(AnalogTriggerOutput::Type type)
void SetFiltered(bool useFilteredValue)
uint32_t GetChannel()
bool GetTriggerState()
void SetLimitsVoltage(float lower, float upper)
uint8_t GetModuleNumber()
static AnalogModule * GetInstance(uint8_t moduleNumber)
void Free(uint32_t index)
Definition: Resource.cpp:105
uint32_t Allocate(const char *resourceDesc)
Definition: Resource.cpp:62
uint32_t GetIndex()
virtual bool StatusIsFatal() const
Check if the current error code represents a fatal error.
Definition: ErrorBase.cpp:178
void SetAveraged(bool useAveragedValue)
static void CreateResourceObject(Resource **r, uint32_t elements)
Definition: Resource.cpp:39
void SetLimitsRaw(int32_t lower, int32_t upper)
AnalogTrigger(uint8_t moduleNumber, uint32_t channel)
int32_t VoltsToValue(int32_t channel, float voltage)

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