7 #include "AnalogModule.h"
8 #include "Synchronized.h"
10 #include "WPIErrors.h"
11 #include "NetworkCommunication/AICalibration.h"
14 const long AnalogModule::kDefaultOversampleBits;
15 const long AnalogModule::kDefaultAverageBits;
16 constexpr
float AnalogModule::kDefaultSampleRate;
17 SEM_ID AnalogModule::m_registerWindowSemaphore = NULL;
37 snprintf(buf, 64,
"Analog Module %d", moduleNumber);
38 wpi_setGlobalWPIErrorWithContext(ModuleIndexOutOfRange, buf);
55 :
Module(nLoadOut::kModuleType_Analog, moduleNumber)
57 , m_sampleRateSet (false)
58 , m_numChannelsToActivate (0)
61 tRioStatusCode localStatus = NiFpga_Status_Success;
63 wpi_setError(localStatus);
64 SetNumChannelsToActivate(kAnalogChannels);
67 for (uint32_t i = 0; i < kAnalogChannels; i++)
69 m_module->writeScanList(i, i, &localStatus);
70 wpi_setError(localStatus);
75 if (m_registerWindowSemaphore == NULL)
78 m_registerWindowSemaphore = semMCreate(SEM_Q_PRIORITY | SEM_DELETE_SAFE | SEM_INVERSION_SAFE);
102 m_sampleRateSet =
true;
105 uint32_t ticksPerSample = (uint32_t)((
float)
kTimebase / samplesPerSecond);
106 uint32_t ticksPerConversion = ticksPerSample / GetNumChannelsToActivate();
108 if (ticksPerConversion < 80)
110 wpi_setWPIError(SampleRateTooHigh);
111 ticksPerConversion = 80;
116 config.ScanSize = GetNumChannelsToActivate();
117 config.ConvertRate = ticksPerConversion;
118 tRioStatusCode localStatus = NiFpga_Status_Success;
119 m_module->writeConfig(config, &localStatus);
120 wpi_setError(localStatus);
123 SetNumChannelsToActivate(0);
136 tRioStatusCode localStatus = NiFpga_Status_Success;
137 uint32_t ticksPerConversion = m_module->readLoopTiming(&localStatus);
138 wpi_setError(localStatus);
139 uint32_t ticksPerSample = ticksPerConversion * GetNumActiveChannels();
140 return (
float)
kTimebase / (float)ticksPerSample;
148 uint32_t AnalogModule::GetNumActiveChannels()
150 tRioStatusCode localStatus = NiFpga_Status_Success;
151 uint32_t scanSize = m_module->readConfig_ScanSize(&localStatus);
152 wpi_setError(localStatus);
169 uint32_t AnalogModule::GetNumChannelsToActivate()
171 if(m_numChannelsToActivate == 0)
return GetNumActiveChannels();
172 return m_numChannelsToActivate;
183 void AnalogModule::SetNumChannelsToActivate(uint32_t channels)
185 m_numChannelsToActivate = channels;
200 tRioStatusCode localStatus = NiFpga_Status_Success;
201 m_module->writeAverageBits(channel - 1, bits, &localStatus);
202 wpi_setError(localStatus);
216 tRioStatusCode localStatus = NiFpga_Status_Success;
217 uint32_t result = m_module->readAverageBits(channel - 1, &localStatus);
218 wpi_setError(localStatus);
234 tRioStatusCode localStatus = NiFpga_Status_Success;
235 m_module->writeOversampleBits(channel - 1, bits, &localStatus);
236 wpi_setError(localStatus);
250 tRioStatusCode localStatus = NiFpga_Status_Success;
251 uint32_t result = m_module->readOversampleBits(channel - 1, &localStatus);
252 wpi_setError(localStatus);
269 tAI::tReadSelect readSelect;
270 readSelect.Channel = channel - 1;
272 readSelect.Averaged =
false;
273 tRioStatusCode localStatus = NiFpga_Status_Success;
277 m_module->writeReadSelect(readSelect, &localStatus);
278 m_module->strobeLatchOutput(&localStatus);
279 value = (int16_t) m_module->readOutput(&localStatus);
282 wpi_setError(localStatus);
303 tAI::tReadSelect readSelect;
304 readSelect.Channel = channel - 1;
306 readSelect.Averaged =
true;
307 tRioStatusCode localStatus = NiFpga_Status_Success;
311 m_module->writeReadSelect(readSelect, &localStatus);
312 m_module->strobeLatchOutput(&localStatus);
313 value = m_module->readOutput(&localStatus);
316 wpi_setError(localStatus);
337 wpi_setWPIError(VoltageOutOfRange);
342 wpi_setWPIError(VoltageOutOfRange);
346 int32_t value = (int32_t) ((voltage + offset * 1.0e-9) / (LSBWeight * 1.0e-9));
363 float voltage = LSBWeight * 1.0e-9 * value - offset * 1.0e-9;
383 float voltage = ((LSBWeight * 1.0e-9 * value) / (
float)(1 << oversampleBits)) - offset * 1.0e-9;
399 tRioStatusCode localStatus = NiFpga_Status_Success;
400 uint32_t lsbWeight = FRC_NetworkCommunication_nAICalibration_getLSBWeight(m_module->getSystemIndex(), channel - 1, (int32_t*)&localStatus);
401 wpi_setError(localStatus);
417 tRioStatusCode localStatus = NiFpga_Status_Success;
418 int32_t offset = FRC_NetworkCommunication_nAICalibration_getOffset(m_module->getSystemIndex(), channel - 1, (int32_t*)&localStatus);
419 wpi_setError(localStatus);
static bool CheckAnalogModule(uint8_t moduleNumber)
int32_t GetOffset(uint32_t channel)
static const long kTimebase
40 MHz clock
AnalogModule(uint8_t moduleNumber)
void SetSampleRate(float samplesPerSecond)
static AnalogModule * GetInstance(uint8_t moduleNumber)
void SetOversampleBits(uint32_t channel, uint32_t bits)
int16_t GetValue(uint32_t channel)
float GetAverageVoltage(uint32_t channel)
uint8_t m_moduleNumber
The module index within the module type.
uint32_t GetLSBWeight(uint32_t channel)
uint32_t GetOversampleBits(uint32_t channel)
void SetAverageBits(uint32_t channel, uint32_t bits)
static Module * GetModule(nLoadOut::tModuleType type, uint8_t number)
int32_t VoltsToValue(int32_t channel, float voltage)
void AddToSingletonList()
int32_t GetAverageValue(uint32_t channel)
uint32_t GetAverageBits(uint32_t channel)
float GetVoltage(uint32_t channel)
static bool CheckAnalogChannel(uint32_t channel)