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