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