blob: 80c0adba20abc0d1e49ca04f8f4c22544a92b50d [file] [log] [blame]
Austin Schuh812d0d12021-11-04 20:16:48 -07001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
Brian Silverman8fce7482020-01-05 13:18:21 -08004
5#include "frc/DMA.h"
6
7#include <frc/AnalogInput.h>
8#include <frc/Counter.h>
9#include <frc/DigitalSource.h>
10#include <frc/DutyCycle.h>
11#include <frc/Encoder.h>
Austin Schuh812d0d12021-11-04 20:16:48 -070012#include <frc/PWM.h>
13#include <frc/motorcontrol/PWMMotorController.h>
Brian Silverman8fce7482020-01-05 13:18:21 -080014
15#include <hal/DMA.h>
16#include <hal/HALBase.h>
17
Austin Schuh812d0d12021-11-04 20:16:48 -070018#include "frc/AnalogInput.h"
19#include "frc/Counter.h"
20#include "frc/DigitalSource.h"
21#include "frc/DutyCycle.h"
22#include "frc/Encoder.h"
23#include "frc/Errors.h"
24
Brian Silverman8fce7482020-01-05 13:18:21 -080025using namespace frc;
26
27DMA::DMA() {
28 int32_t status = 0;
29 dmaHandle = HAL_InitializeDMA(&status);
Austin Schuh812d0d12021-11-04 20:16:48 -070030 FRC_CheckErrorStatus(status, "{}", "InitializeDMA");
Brian Silverman8fce7482020-01-05 13:18:21 -080031}
32
Austin Schuh812d0d12021-11-04 20:16:48 -070033DMA::~DMA() {
34 HAL_FreeDMA(dmaHandle);
35}
Brian Silverman8fce7482020-01-05 13:18:21 -080036
37void DMA::SetPause(bool pause) {
38 int32_t status = 0;
39 HAL_SetDMAPause(dmaHandle, pause, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070040 FRC_CheckErrorStatus(status, "{}", "SetPause");
Brian Silverman8fce7482020-01-05 13:18:21 -080041}
42
Austin Schuh812d0d12021-11-04 20:16:48 -070043void DMA::SetTimedTrigger(units::second_t seconds) {
Brian Silverman8fce7482020-01-05 13:18:21 -080044 int32_t status = 0;
Austin Schuh812d0d12021-11-04 20:16:48 -070045 HAL_SetDMATimedTrigger(dmaHandle, seconds.value(), &status);
46 FRC_CheckErrorStatus(status, "{}", "SetTimedTrigger");
47}
48
49void DMA::SetTimedTriggerCycles(int cycles) {
50 int32_t status = 0;
51 HAL_SetDMATimedTriggerCycles(dmaHandle, cycles, &status);
52 FRC_CheckErrorStatus(status, "{}", "SetTimedTriggerCycles");
Brian Silverman8fce7482020-01-05 13:18:21 -080053}
54
55void DMA::AddEncoder(const Encoder* encoder) {
56 int32_t status = 0;
57 HAL_AddDMAEncoder(dmaHandle, encoder->m_encoder, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070058 FRC_CheckErrorStatus(status, "{}", "AddEncoder");
Brian Silverman8fce7482020-01-05 13:18:21 -080059}
60
61void DMA::AddEncoderPeriod(const Encoder* encoder) {
62 int32_t status = 0;
63 HAL_AddDMAEncoderPeriod(dmaHandle, encoder->m_encoder, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070064 FRC_CheckErrorStatus(status, "{}", "AddEncoderPeriod");
Brian Silverman8fce7482020-01-05 13:18:21 -080065}
66
67void DMA::AddCounter(const Counter* counter) {
68 int32_t status = 0;
69 HAL_AddDMACounter(dmaHandle, counter->m_counter, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070070 FRC_CheckErrorStatus(status, "{}", "AddCounter");
Brian Silverman8fce7482020-01-05 13:18:21 -080071}
72
73void DMA::AddCounterPeriod(const Counter* counter) {
74 int32_t status = 0;
75 HAL_AddDMACounterPeriod(dmaHandle, counter->m_counter, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070076 FRC_CheckErrorStatus(status, "{}", "AddCounterPeriod");
Brian Silverman8fce7482020-01-05 13:18:21 -080077}
78
79void DMA::AddDigitalSource(const DigitalSource* digitalSource) {
80 int32_t status = 0;
81 HAL_AddDMADigitalSource(dmaHandle, digitalSource->GetPortHandleForRouting(),
82 &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070083 FRC_CheckErrorStatus(status, "{}", "AddDigitalSource");
Brian Silverman8fce7482020-01-05 13:18:21 -080084}
85
86void DMA::AddDutyCycle(const DutyCycle* dutyCycle) {
87 int32_t status = 0;
88 HAL_AddDMADutyCycle(dmaHandle, dutyCycle->m_handle, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070089 FRC_CheckErrorStatus(status, "{}", "AddDutyCycle");
Brian Silverman8fce7482020-01-05 13:18:21 -080090}
91
92void DMA::AddAnalogInput(const AnalogInput* analogInput) {
93 int32_t status = 0;
94 HAL_AddDMAAnalogInput(dmaHandle, analogInput->m_port, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070095 FRC_CheckErrorStatus(status, "{}", "AddAnalogInput");
Brian Silverman8fce7482020-01-05 13:18:21 -080096}
97
98void DMA::AddAveragedAnalogInput(const AnalogInput* analogInput) {
99 int32_t status = 0;
100 HAL_AddDMAAveragedAnalogInput(dmaHandle, analogInput->m_port, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -0700101 FRC_CheckErrorStatus(status, "{}", "AddAveragedAnalogInput");
Brian Silverman8fce7482020-01-05 13:18:21 -0800102}
103
104void DMA::AddAnalogAccumulator(const AnalogInput* analogInput) {
105 int32_t status = 0;
106 HAL_AddDMAAnalogAccumulator(dmaHandle, analogInput->m_port, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -0700107 FRC_CheckErrorStatus(status, "{}", "AddAnalogAccumulator");
Brian Silverman8fce7482020-01-05 13:18:21 -0800108}
109
Austin Schuh812d0d12021-11-04 20:16:48 -0700110int DMA::SetExternalTrigger(DigitalSource* source, bool rising, bool falling) {
Brian Silverman8fce7482020-01-05 13:18:21 -0800111 int32_t status = 0;
Austin Schuh812d0d12021-11-04 20:16:48 -0700112 int32_t idx =
113 HAL_SetDMAExternalTrigger(dmaHandle, source->GetPortHandleForRouting(),
114 static_cast<HAL_AnalogTriggerType>(
115 source->GetAnalogTriggerTypeForRouting()),
116 rising, falling, &status);
117 FRC_CheckErrorStatus(status, "{}", "SetExternalTrigger");
118 return idx;
Brian Silverman8fce7482020-01-05 13:18:21 -0800119}
120
Austin Schuh812d0d12021-11-04 20:16:48 -0700121int DMA::SetPwmEdgeTrigger(PWMMotorController* source, bool rising,
122 bool falling) {
123 int32_t status = 0;
124 int32_t idx = HAL_SetDMAExternalTrigger(
125 dmaHandle, source->GetPwm()->m_handle,
126 HAL_AnalogTriggerType::HAL_Trigger_kInWindow, rising, falling, &status);
127 FRC_CheckErrorStatus(status, "{}", "SetPWmEdgeTrigger");
128 return idx;
129}
130
131int DMA::SetPwmEdgeTrigger(PWM* source, bool rising, bool falling) {
132 int32_t status = 0;
133 int32_t idx = HAL_SetDMAExternalTrigger(
134 dmaHandle, source->m_handle, HAL_AnalogTriggerType::HAL_Trigger_kInWindow,
135 rising, falling, &status);
136 FRC_CheckErrorStatus(status, "{}", "SetPWmEdgeTrigger");
137 return idx;
138}
139
140void DMA::ClearSensors() {
141 int32_t status = 0;
142 HAL_ClearDMASensors(dmaHandle, &status);
143 FRC_CheckErrorStatus(status, "{}", "ClearSensors");
144}
145
146void DMA::ClearExternalTriggers() {
147 int32_t status = 0;
148 HAL_ClearDMAExternalTriggers(dmaHandle, &status);
149 FRC_CheckErrorStatus(status, "{}", "ClearExternalTriggers");
150}
151
152void DMA::Start(int queueDepth) {
Brian Silverman8fce7482020-01-05 13:18:21 -0800153 int32_t status = 0;
154 HAL_StartDMA(dmaHandle, queueDepth, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -0700155 FRC_CheckErrorStatus(status, "{}", "Start");
Brian Silverman8fce7482020-01-05 13:18:21 -0800156}
157
Austin Schuh812d0d12021-11-04 20:16:48 -0700158void DMA::Stop() {
Brian Silverman8fce7482020-01-05 13:18:21 -0800159 int32_t status = 0;
160 HAL_StopDMA(dmaHandle, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -0700161 FRC_CheckErrorStatus(status, "{}", "Stop");
Brian Silverman8fce7482020-01-05 13:18:21 -0800162}