blob: 45821bae7a939eee1d64ae7562107bdf362f0d3d [file] [log] [blame]
Brian Silverman8fce7482020-01-05 13:18:21 -08001/*----------------------------------------------------------------------------*/
Austin Schuh1e69f942020-11-14 15:06:14 -08002/* Copyright (c) 2008-2020 FIRST. All Rights Reserved. */
Brian Silverman8fce7482020-01-05 13:18:21 -08003/* Open Source Software - may be modified and shared by FRC teams. The code */
4/* must be accompanied by the FIRST BSD license file in the root directory of */
5/* the project. */
6/*----------------------------------------------------------------------------*/
7
8#include "frc/AnalogTrigger.h"
9
10#include <utility>
11
12#include <hal/FRCUsageReporting.h>
13
14#include "frc/AnalogInput.h"
Austin Schuh1e69f942020-11-14 15:06:14 -080015#include "frc/Base.h"
Brian Silverman8fce7482020-01-05 13:18:21 -080016#include "frc/DutyCycle.h"
17#include "frc/WPIErrors.h"
18#include "frc/smartdashboard/SendableRegistry.h"
19
20using namespace frc;
21
22AnalogTrigger::AnalogTrigger(int channel)
23 : AnalogTrigger(new AnalogInput(channel)) {
24 m_ownsAnalog = true;
25 SendableRegistry::GetInstance().AddChild(this, m_analogInput);
26}
27
28AnalogTrigger::AnalogTrigger(AnalogInput* input) {
29 m_analogInput = input;
30 int32_t status = 0;
31 m_trigger = HAL_InitializeAnalogTrigger(input->m_port, &status);
32 if (status != 0) {
33 wpi_setHALError(status);
34 m_trigger = HAL_kInvalidHandle;
35 return;
36 }
37 int index = GetIndex();
38
39 HAL_Report(HALUsageReporting::kResourceType_AnalogTrigger, index + 1);
40 SendableRegistry::GetInstance().AddLW(this, "AnalogTrigger", index);
41}
42
43AnalogTrigger::AnalogTrigger(DutyCycle* input) {
44 m_dutyCycle = input;
45 int32_t status = 0;
46 m_trigger = HAL_InitializeAnalogTriggerDutyCycle(input->m_handle, &status);
47 if (status != 0) {
48 wpi_setHALError(status);
49 m_trigger = HAL_kInvalidHandle;
50 return;
51 }
52 int index = GetIndex();
53
54 HAL_Report(HALUsageReporting::kResourceType_AnalogTrigger, index + 1);
55 SendableRegistry::GetInstance().AddLW(this, "AnalogTrigger", index);
56}
57
58AnalogTrigger::~AnalogTrigger() {
59 int32_t status = 0;
60 HAL_CleanAnalogTrigger(m_trigger, &status);
61
62 if (m_ownsAnalog) {
63 delete m_analogInput;
64 }
65}
66
67AnalogTrigger::AnalogTrigger(AnalogTrigger&& rhs)
68 : ErrorBase(std::move(rhs)),
69 SendableHelper(std::move(rhs)),
70 m_trigger(std::move(rhs.m_trigger)) {
71 std::swap(m_analogInput, rhs.m_analogInput);
72 std::swap(m_dutyCycle, rhs.m_dutyCycle);
73 std::swap(m_ownsAnalog, rhs.m_ownsAnalog);
74}
75
76AnalogTrigger& AnalogTrigger::operator=(AnalogTrigger&& rhs) {
77 ErrorBase::operator=(std::move(rhs));
78 SendableHelper::operator=(std::move(rhs));
79
80 m_trigger = std::move(rhs.m_trigger);
81 std::swap(m_analogInput, rhs.m_analogInput);
82 std::swap(m_dutyCycle, rhs.m_dutyCycle);
83 std::swap(m_ownsAnalog, rhs.m_ownsAnalog);
84
85 return *this;
86}
87
88void AnalogTrigger::SetLimitsVoltage(double lower, double upper) {
89 if (StatusIsFatal()) return;
90 int32_t status = 0;
91 HAL_SetAnalogTriggerLimitsVoltage(m_trigger, lower, upper, &status);
92 wpi_setHALError(status);
93}
94
95void AnalogTrigger::SetLimitsDutyCycle(double lower, double upper) {
96 if (StatusIsFatal()) return;
97 int32_t status = 0;
98 HAL_SetAnalogTriggerLimitsDutyCycle(m_trigger, lower, upper, &status);
99 wpi_setHALError(status);
100}
101
102void AnalogTrigger::SetLimitsRaw(int lower, int upper) {
103 if (StatusIsFatal()) return;
104 int32_t status = 0;
105 HAL_SetAnalogTriggerLimitsRaw(m_trigger, lower, upper, &status);
106 wpi_setHALError(status);
107}
108
109void AnalogTrigger::SetAveraged(bool useAveragedValue) {
110 if (StatusIsFatal()) return;
111 int32_t status = 0;
112 HAL_SetAnalogTriggerAveraged(m_trigger, useAveragedValue, &status);
113 wpi_setHALError(status);
114}
115
116void AnalogTrigger::SetFiltered(bool useFilteredValue) {
117 if (StatusIsFatal()) return;
118 int32_t status = 0;
119 HAL_SetAnalogTriggerFiltered(m_trigger, useFilteredValue, &status);
120 wpi_setHALError(status);
121}
122
123int AnalogTrigger::GetIndex() const {
124 if (StatusIsFatal()) return -1;
125 int32_t status = 0;
126 auto ret = HAL_GetAnalogTriggerFPGAIndex(m_trigger, &status);
127 wpi_setHALError(status);
128 return ret;
129}
130
131bool AnalogTrigger::GetInWindow() {
132 if (StatusIsFatal()) return false;
133 int32_t status = 0;
134 bool result = HAL_GetAnalogTriggerInWindow(m_trigger, &status);
135 wpi_setHALError(status);
136 return result;
137}
138
139bool AnalogTrigger::GetTriggerState() {
140 if (StatusIsFatal()) return false;
141 int32_t status = 0;
142 bool result = HAL_GetAnalogTriggerTriggerState(m_trigger, &status);
143 wpi_setHALError(status);
144 return result;
145}
146
147std::shared_ptr<AnalogTriggerOutput> AnalogTrigger::CreateOutput(
148 AnalogTriggerType type) const {
149 if (StatusIsFatal()) return nullptr;
150 return std::shared_ptr<AnalogTriggerOutput>(
151 new AnalogTriggerOutput(*this, type), NullDeleter<AnalogTriggerOutput>());
152}
153
154void AnalogTrigger::InitSendable(SendableBuilder& builder) {
155 if (m_ownsAnalog) m_analogInput->InitSendable(builder);
156}