blob: 39116db946621eed2dc75c64e3452825d4f4b0c7 [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.
4
5#include <frc/AnalogInput.h>
6#include <frc/AnalogOutput.h>
7#include <frc/DigitalOutput.h>
8#include <frc/Timer.h>
9#include <frc/motorcontrol/Jaguar.h>
10
11#include "TestBench.h"
12#include "frc/DMA.h"
13#include "frc/DMASample.h"
14#include "gtest/gtest.h"
15
16using namespace frc;
17
18static constexpr auto kDelayTime = 100_ms;
19
20class DMATest : public testing::Test {
21 protected:
22 AnalogInput m_analogInput{TestBench::kAnalogOutputChannel};
23 AnalogOutput m_analogOutput{TestBench::kFakeAnalogOutputChannel};
24 DigitalOutput m_manualTrigger{TestBench::kLoop1InputChannel};
25 Jaguar m_pwm{TestBench::kFakePwmOutput};
26 DMA m_dma;
27
28 void SetUp() override {
29 m_dma.AddAnalogInput(&m_analogInput);
30 m_dma.SetExternalTrigger(&m_manualTrigger, false, true);
31 m_manualTrigger.Set(true);
32 }
33};
34
35TEST_F(DMATest, DISABLED_PausingWorks) {
36 m_dma.Start(1024);
37 m_dma.SetPause(true);
38 m_manualTrigger.Set(false);
39
40 frc::DMASample sample;
41 int32_t remaining = 0;
42 int32_t status = 0;
43
44 auto timedOut = sample.Update(&m_dma, 5_ms, &remaining, &status);
45
46 ASSERT_EQ(DMASample::DMAReadStatus::kTimeout, timedOut);
47}
48
49TEST_F(DMATest, DISABLED_RemovingTriggersWorks) {
50 m_dma.ClearExternalTriggers();
51 m_dma.Start(1024);
52 m_manualTrigger.Set(false);
53
54 frc::DMASample sample;
55 int32_t remaining = 0;
56 int32_t status = 0;
57
58 auto timedOut = sample.Update(&m_dma, 5_ms, &remaining, &status);
59
60 ASSERT_EQ(DMASample::DMAReadStatus::kTimeout, timedOut);
61}
62
63TEST_F(DMATest, DISABLED_ManualTriggerOnlyHappensOnce) {
64 m_dma.Start(1024);
65 m_manualTrigger.Set(false);
66
67 frc::DMASample sample;
68 int32_t remaining = 0;
69 int32_t status = 0;
70
71 auto timedOut = sample.Update(&m_dma, 5_ms, &remaining, &status);
72
73 ASSERT_EQ(DMASample::DMAReadStatus::kOk, timedOut);
74 ASSERT_EQ(0, remaining);
75 timedOut = sample.Update(&m_dma, 5_ms, &remaining, &status);
76 ASSERT_EQ(DMASample::DMAReadStatus::kTimeout, timedOut);
77}
78
79TEST_F(DMATest, DISABLED_AnalogIndividualTriggers) {
80 m_dma.Start(1024);
81 for (double i = 0; i < 5; i += 0.5) {
82 frc::DMASample sample;
83 int32_t remaining = 0;
84 int32_t status = 0;
85
86 m_analogOutput.SetVoltage(i);
87 frc::Wait(kDelayTime);
88 m_manualTrigger.Set(false);
89 auto timedOut = sample.Update(&m_dma, 1_ms, &remaining, &status);
90 m_manualTrigger.Set(true);
91 ASSERT_EQ(DMASample::DMAReadStatus::kOk, timedOut);
92 ASSERT_EQ(0, status);
93 ASSERT_EQ(0, remaining);
94 ASSERT_DOUBLE_EQ(m_analogInput.GetVoltage(),
95 sample.GetAnalogInputVoltage(&m_analogInput, &status));
96 }
97}
98
99TEST_F(DMATest, DISABLED_AnalogMultipleTriggers) {
100 m_dma.Start(1024);
101 std::vector<double> values;
102 for (double i = 0; i < 5; i += 0.5) {
103 values.push_back(i);
104 m_analogOutput.SetVoltage(i);
105 frc::Wait(kDelayTime);
106 m_manualTrigger.Set(false);
107 frc::Wait(kDelayTime);
108 m_manualTrigger.Set(true);
109 }
110
111 for (size_t i = 0; i < values.size(); i++) {
112 frc::DMASample sample;
113 int32_t remaining = 0;
114 int32_t status = 0;
115 auto timedOut = sample.Update(&m_dma, 1_ms, &remaining, &status);
116 ASSERT_EQ(DMASample::DMAReadStatus::kOk, timedOut);
117 ASSERT_EQ(0, status);
118 ASSERT_EQ(values.size() - i - 1, (uint32_t)remaining);
119 ASSERT_DOUBLE_EQ(values[i],
120 sample.GetAnalogInputVoltage(&m_analogInput, &status));
121 }
122}
123
124TEST_F(DMATest, DISABLED_TimedTriggers) {
125 m_dma.SetTimedTrigger(10_ms);
126 m_dma.Start(1024);
127 frc::Wait(kDelayTime);
128 m_dma.SetPause(true);
129
130 frc::DMASample sample;
131 int32_t remaining = 0;
132 int32_t status = 0;
133
134 auto timedOut = sample.Update(&m_dma, 1_ms, &remaining, &status);
135 ASSERT_EQ(DMASample::DMAReadStatus::kOk, timedOut);
136 ASSERT_EQ(0, status);
137 ASSERT_GT(remaining, 5);
138}
139
140TEST_F(DMATest, DISABLED_PWMTimedTriggers) {
141 m_dma.ClearExternalTriggers();
142 m_dma.SetPwmEdgeTrigger(&m_pwm, true, false);
143 m_dma.Start(1024);
144 frc::Wait(kDelayTime);
145 m_dma.SetPause(true);
146
147 frc::DMASample sample;
148 int32_t remaining = 0;
149 int32_t status = 0;
150
151 auto timedOut = sample.Update(&m_dma, 1_ms, &remaining, &status);
152 ASSERT_EQ(DMASample::DMAReadStatus::kOk, timedOut);
153 ASSERT_EQ(0, status);
154 ASSERT_GT(remaining, 5);
155}