xCounter::xCounter(EncodingType encodingType, DigitalSource *upSource, DigitalSource *downSource, bool inverted) : m_upSource(NULL), m_downSource(NULL), m_counter(NULL), m_encodingType(encodingType) { if (encodingType != k1X && encodingType != k2X) { wpi_setWPIErrorWithContext(ParameterOutOfRange, "Counter only supports 1X and 2X quadrature decoding."); return; } InitCounter(kExternalDirection); SetUpSource(upSource); SetDownSource(downSource); tRioStatusCode localStatus = NiFpga_Status_Success; if (encodingType == k1X) { SetUpSourceEdge(true, false); m_counter->writeTimerConfig_AverageSize(1, &localStatus); } else { SetUpSourceEdge(true, true); m_counter->writeTimerConfig_AverageSize(2, &localStatus); } wpi_setError(localStatus); SetDownSourceEdge(inverted, true); }
/** * Set the source object that causes the counter to count up. * Set the up counting DigitalSource. */ void xCounter::SetUpSource(DigitalSource *source) { if (StatusIsFatal()) return; if (m_allocatedUpSource) { delete m_upSource; m_upSource = NULL; m_allocatedUpSource = false; } m_upSource = source; if (m_upSource->StatusIsFatal()) { CloneError(m_upSource); } else { tRioStatusCode localStatus = NiFpga_Status_Success; m_counter->writeConfig_UpSource_Module(source->GetModuleForRouting(), &localStatus); m_counter->writeConfig_UpSource_Channel(source->GetChannelForRouting(), &localStatus); m_counter->writeConfig_UpSource_AnalogTrigger(source->GetAnalogTriggerForRouting(), &localStatus); if(m_counter->readConfig_Mode(&localStatus) == kTwoPulse || m_counter->readConfig_Mode(&localStatus) == kExternalDirection) { SetUpSourceEdge(true, false); } m_counter->strobeReset(&localStatus); wpi_setError(localStatus); } }
Counter::Counter(EncodingType encodingType, DigitalSource *upSource, DigitalSource *downSource, bool inverted) { wpi_assert(encodingType == k1X || encodingType == k2X); InitCounter(kExternalDirection); SetUpSource(upSource); SetDownSource(downSource); if (encodingType == k1X) { SetUpSourceEdge(true, false); m_counter->writeTimerConfig_AverageSize(1, &status); } else { SetUpSourceEdge(true, true); m_counter->writeTimerConfig_AverageSize(2, &status); } SetDownSourceEdge(inverted, true); }
/** * Set the source object that causes the counter to count up. * Set the up counting DigitalSource. */ void Counter::SetUpSource(DigitalSource *source) { wpi_assert(m_upSource == NULL); m_upSource = source; m_counter->writeConfig_UpSource_Module(source->GetModuleForRouting(), &status); m_counter->writeConfig_UpSource_Channel(source->GetChannelForRouting(), &status); m_counter->writeConfig_UpSource_AnalogTrigger(source->GetAnalogTriggerForRouting(), &status); if(m_counter->readConfig_Mode(&status) == kTwoPulse || m_counter->readConfig_Mode(&status) == kExternalDirection) { SetUpSourceEdge(true, false); } m_counter->strobeReset(&status); wpi_assertCleanStatus(status); }
/** * Request one of the 8 interrupts synchronously on this digital input. * Request interrupts in synchronous mode where the user program will have to * explicitly * wait for the interrupt to occur using WaitForInterrupt. * The default is interrupt on rising edges only. */ void InterruptableSensorBase::RequestInterrupts() { if (StatusIsFatal()) return; uint32_t index = m_interrupts->Allocate("Sync Interrupt"); if (index == std::numeric_limits<uint32_t>::max()) { CloneError(*m_interrupts); return; } m_interruptIndex = index; AllocateInterrupts(true); int32_t status = 0; requestInterrupts(m_interrupt, GetModuleForRouting(), GetChannelForRouting(), GetAnalogTriggerForRouting(), &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); SetUpSourceEdge(true, false); }
/** * Request interrupts synchronously on this digital input. * Request interrupts in synchronus mode where the user program will have to explicitly * wait for the interrupt to occur. * The default is interrupt on rising edges only. */ void DigitalInput::RequestInterrupts() { if (StatusIsFatal()) return; uint32_t index = interruptsResource->Allocate("Sync Interrupt"); if (index == ~0ul) { CloneError(interruptsResource); return; } m_interruptIndex = index; AllocateInterrupts(true); tRioStatusCode localStatus = NiFpga_Status_Success; m_interrupt->writeConfig_Source_AnalogTrigger(GetAnalogTriggerForRouting(), &localStatus); m_interrupt->writeConfig_Source_Channel(GetChannelForRouting(), &localStatus); m_interrupt->writeConfig_Source_Module(GetModuleForRouting(), &localStatus); SetUpSourceEdge(true, false); wpi_setError(localStatus); }
/** * Request one of the 8 interrupts asynchronously on this digital input. * Request interrupts in asynchronous mode where the user's interrupt handler * will be * called when the interrupt fires. Users that want control over the thread * priority * should use the synchronous method with their own spawned thread. * The default is interrupt on rising edges only. */ void InterruptableSensorBase::RequestInterrupts( InterruptHandlerFunction handler, void *param) { if (StatusIsFatal()) return; uint32_t index = m_interrupts->Allocate("Async Interrupt"); if (index == std::numeric_limits<uint32_t>::max()) { CloneError(*m_interrupts); return; } m_interruptIndex = index; // Creates a manager too AllocateInterrupts(false); int32_t status = 0; requestInterrupts(m_interrupt, GetModuleForRouting(), GetChannelForRouting(), GetAnalogTriggerForRouting(), &status); SetUpSourceEdge(true, false); attachInterruptHandler(m_interrupt, handler, param, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); }
/** * Request interrupts asynchronously on this digital input. * @param handler The address of the interrupt handler function of type tInterruptHandler that * will be called whenever there is an interrupt on the digitial input port. * Request interrupts in synchronus mode where the user program interrupt handler will be * called when an interrupt occurs. * The default is interrupt on rising edges only. */ void DigitalInput::RequestInterrupts(tInterruptHandler handler, void *param) { if (StatusIsFatal()) return; uint32_t index = interruptsResource->Allocate("Async Interrupt"); if (index == ~0ul) { CloneError(interruptsResource); return; } m_interruptIndex = index; // Creates a manager too AllocateInterrupts(false); tRioStatusCode localStatus = NiFpga_Status_Success; m_interrupt->writeConfig_WaitForAck(false, &localStatus); m_interrupt->writeConfig_Source_AnalogTrigger(GetAnalogTriggerForRouting(), &localStatus); m_interrupt->writeConfig_Source_Channel(GetChannelForRouting(), &localStatus); m_interrupt->writeConfig_Source_Module(GetModuleForRouting(), &localStatus); SetUpSourceEdge(true, false); m_manager->registerHandler(handler, param, &localStatus); wpi_setError(localStatus); }