blob: aeb58dfbee2832de8b6f1cf296730e6e881b5fb2 [file] [log] [blame]
Brian Silverman41cdd3e2019-01-19 19:48:58 -08001/*----------------------------------------------------------------------------*/
2/* Copyright (c) 2008-2018 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/HAL.h>
13
14#include "frc/AnalogInput.h"
15#include "frc/WPIErrors.h"
16
17using namespace frc;
18
19AnalogTrigger::AnalogTrigger(int channel)
20 : AnalogTrigger(new AnalogInput(channel)) {
21 m_ownsAnalog = true;
22 AddChild(m_analogInput);
23}
24
25AnalogTrigger::AnalogTrigger(AnalogInput* input) {
26 m_analogInput = input;
27 int32_t status = 0;
28 int index = 0;
29 m_trigger = HAL_InitializeAnalogTrigger(input->m_port, &index, &status);
30 if (status != 0) {
31 wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
32 m_index = std::numeric_limits<int>::max();
33 m_trigger = HAL_kInvalidHandle;
34 return;
35 }
36 m_index = index;
37
38 HAL_Report(HALUsageReporting::kResourceType_AnalogTrigger, input->m_channel);
39 SetName("AnalogTrigger", input->GetChannel());
40}
41
42AnalogTrigger::~AnalogTrigger() {
43 int32_t status = 0;
44 HAL_CleanAnalogTrigger(m_trigger, &status);
45
46 if (m_ownsAnalog) {
47 delete m_analogInput;
48 }
49}
50
51AnalogTrigger::AnalogTrigger(AnalogTrigger&& rhs)
52 : ErrorBase(std::move(rhs)),
53 SendableBase(std::move(rhs)),
54 m_index(std::move(rhs.m_index)) {
55 std::swap(m_trigger, rhs.m_trigger);
56 std::swap(m_analogInput, rhs.m_analogInput);
57 std::swap(m_ownsAnalog, rhs.m_ownsAnalog);
58}
59
60AnalogTrigger& AnalogTrigger::operator=(AnalogTrigger&& rhs) {
61 ErrorBase::operator=(std::move(rhs));
62 SendableBase::operator=(std::move(rhs));
63
64 m_index = std::move(rhs.m_index);
65 std::swap(m_trigger, rhs.m_trigger);
66 std::swap(m_analogInput, rhs.m_analogInput);
67 std::swap(m_ownsAnalog, rhs.m_ownsAnalog);
68
69 return *this;
70}
71
72void AnalogTrigger::SetLimitsVoltage(double lower, double upper) {
73 if (StatusIsFatal()) return;
74 int32_t status = 0;
75 HAL_SetAnalogTriggerLimitsVoltage(m_trigger, lower, upper, &status);
76 wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
77}
78
79void AnalogTrigger::SetLimitsRaw(int lower, int upper) {
80 if (StatusIsFatal()) return;
81 int32_t status = 0;
82 HAL_SetAnalogTriggerLimitsRaw(m_trigger, lower, upper, &status);
83 wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
84}
85
86void AnalogTrigger::SetAveraged(bool useAveragedValue) {
87 if (StatusIsFatal()) return;
88 int32_t status = 0;
89 HAL_SetAnalogTriggerAveraged(m_trigger, useAveragedValue, &status);
90 wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
91}
92
93void AnalogTrigger::SetFiltered(bool useFilteredValue) {
94 if (StatusIsFatal()) return;
95 int32_t status = 0;
96 HAL_SetAnalogTriggerFiltered(m_trigger, useFilteredValue, &status);
97 wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
98}
99
100int AnalogTrigger::GetIndex() const {
101 if (StatusIsFatal()) return -1;
102 return m_index;
103}
104
105bool AnalogTrigger::GetInWindow() {
106 if (StatusIsFatal()) return false;
107 int32_t status = 0;
108 bool result = HAL_GetAnalogTriggerInWindow(m_trigger, &status);
109 wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
110 return result;
111}
112
113bool AnalogTrigger::GetTriggerState() {
114 if (StatusIsFatal()) return false;
115 int32_t status = 0;
116 bool result = HAL_GetAnalogTriggerTriggerState(m_trigger, &status);
117 wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
118 return result;
119}
120
121std::shared_ptr<AnalogTriggerOutput> AnalogTrigger::CreateOutput(
122 AnalogTriggerType type) const {
123 if (StatusIsFatal()) return nullptr;
124 return std::shared_ptr<AnalogTriggerOutput>(
125 new AnalogTriggerOutput(*this, type), NullDeleter<AnalogTriggerOutput>());
126}
127
128void AnalogTrigger::InitSendable(SendableBuilder& builder) {
129 if (m_ownsAnalog) m_analogInput->InitSendable(builder);
130}