// Copyright (c) FIRST and other WPILib contributors. // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. #include "frc/DMA.h" #include #include #include #include #include #include #include #include #include #include "frc/AnalogInput.h" #include "frc/Counter.h" #include "frc/DigitalSource.h" #include "frc/DutyCycle.h" #include "frc/Encoder.h" #include "frc/Errors.h" using namespace frc; DMA::DMA() { int32_t status = 0; dmaHandle = HAL_InitializeDMA(&status); FRC_CheckErrorStatus(status, "InitializeDMA"); } DMA::~DMA() { HAL_FreeDMA(dmaHandle); } void DMA::SetPause(bool pause) { int32_t status = 0; HAL_SetDMAPause(dmaHandle, pause, &status); FRC_CheckErrorStatus(status, "SetPause"); } void DMA::SetTimedTrigger(units::second_t seconds) { int32_t status = 0; HAL_SetDMATimedTrigger(dmaHandle, seconds.value(), &status); FRC_CheckErrorStatus(status, "SetTimedTrigger"); } void DMA::SetTimedTriggerCycles(int cycles) { int32_t status = 0; HAL_SetDMATimedTriggerCycles(dmaHandle, cycles, &status); FRC_CheckErrorStatus(status, "SetTimedTriggerCycles"); } void DMA::AddEncoder(const Encoder* encoder) { int32_t status = 0; HAL_AddDMAEncoder(dmaHandle, encoder->m_encoder, &status); FRC_CheckErrorStatus(status, "AddEncoder"); } void DMA::AddEncoderPeriod(const Encoder* encoder) { int32_t status = 0; HAL_AddDMAEncoderPeriod(dmaHandle, encoder->m_encoder, &status); FRC_CheckErrorStatus(status, "AddEncoderPeriod"); } void DMA::AddCounter(const Counter* counter) { int32_t status = 0; HAL_AddDMACounter(dmaHandle, counter->m_counter, &status); FRC_CheckErrorStatus(status, "AddCounter"); } void DMA::AddCounterPeriod(const Counter* counter) { int32_t status = 0; HAL_AddDMACounterPeriod(dmaHandle, counter->m_counter, &status); FRC_CheckErrorStatus(status, "AddCounterPeriod"); } void DMA::AddDigitalSource(const DigitalSource* digitalSource) { int32_t status = 0; HAL_AddDMADigitalSource(dmaHandle, digitalSource->GetPortHandleForRouting(), &status); FRC_CheckErrorStatus(status, "AddDigitalSource"); } void DMA::AddDutyCycle(const DutyCycle* dutyCycle) { int32_t status = 0; HAL_AddDMADutyCycle(dmaHandle, dutyCycle->m_handle, &status); FRC_CheckErrorStatus(status, "AddDutyCycle"); } void DMA::AddAnalogInput(const AnalogInput* analogInput) { int32_t status = 0; HAL_AddDMAAnalogInput(dmaHandle, analogInput->m_port, &status); FRC_CheckErrorStatus(status, "AddAnalogInput"); } void DMA::AddAveragedAnalogInput(const AnalogInput* analogInput) { int32_t status = 0; HAL_AddDMAAveragedAnalogInput(dmaHandle, analogInput->m_port, &status); FRC_CheckErrorStatus(status, "AddAveragedAnalogInput"); } void DMA::AddAnalogAccumulator(const AnalogInput* analogInput) { int32_t status = 0; HAL_AddDMAAnalogAccumulator(dmaHandle, analogInput->m_port, &status); FRC_CheckErrorStatus(status, "AddAnalogAccumulator"); } int DMA::SetExternalTrigger(DigitalSource* source, bool rising, bool falling) { int32_t status = 0; int32_t idx = HAL_SetDMAExternalTrigger(dmaHandle, source->GetPortHandleForRouting(), static_cast( source->GetAnalogTriggerTypeForRouting()), rising, falling, &status); FRC_CheckErrorStatus(status, "SetExternalTrigger"); return idx; } int DMA::SetPwmEdgeTrigger(PWMMotorController* source, bool rising, bool falling) { int32_t status = 0; int32_t idx = HAL_SetDMAExternalTrigger( dmaHandle, source->GetPwm()->m_handle, HAL_AnalogTriggerType::HAL_Trigger_kInWindow, rising, falling, &status); FRC_CheckErrorStatus(status, "SetPWmEdgeTrigger"); return idx; } int DMA::SetPwmEdgeTrigger(PWM* source, bool rising, bool falling) { int32_t status = 0; int32_t idx = HAL_SetDMAExternalTrigger( dmaHandle, source->m_handle, HAL_AnalogTriggerType::HAL_Trigger_kInWindow, rising, falling, &status); FRC_CheckErrorStatus(status, "SetPWmEdgeTrigger"); return idx; } void DMA::ClearSensors() { int32_t status = 0; HAL_ClearDMASensors(dmaHandle, &status); FRC_CheckErrorStatus(status, "ClearSensors"); } void DMA::ClearExternalTriggers() { int32_t status = 0; HAL_ClearDMAExternalTriggers(dmaHandle, &status); FRC_CheckErrorStatus(status, "ClearExternalTriggers"); } void DMA::Start(int queueDepth) { int32_t status = 0; HAL_StartDMA(dmaHandle, queueDepth, &status); FRC_CheckErrorStatus(status, "Start"); } void DMA::Stop() { int32_t status = 0; HAL_StopDMA(dmaHandle, &status); FRC_CheckErrorStatus(status, "Stop"); }