blob: ddbb7c8920b9bf3dc5ee9b11b1f3e8f73b6a1533 [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
James Kuszmaul4b81d302019-12-14 20:53:14 -080012#include <hal/FRCUsageReporting.h>
Brian Silverman41cdd3e2019-01-19 19:48:58 -080013
14#include "frc/AnalogInput.h"
James Kuszmaul4b81d302019-12-14 20:53:14 -080015#include "frc/DutyCycle.h"
Brian Silverman41cdd3e2019-01-19 19:48:58 -080016#include "frc/WPIErrors.h"
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -080017#include "frc/smartdashboard/SendableRegistry.h"
Brian Silverman41cdd3e2019-01-19 19:48:58 -080018
19using namespace frc;
20
21AnalogTrigger::AnalogTrigger(int channel)
22 : AnalogTrigger(new AnalogInput(channel)) {
23 m_ownsAnalog = true;
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -080024 SendableRegistry::GetInstance().AddChild(this, m_analogInput);
Brian Silverman41cdd3e2019-01-19 19:48:58 -080025}
26
27AnalogTrigger::AnalogTrigger(AnalogInput* input) {
28 m_analogInput = input;
29 int32_t status = 0;
James Kuszmaul4b81d302019-12-14 20:53:14 -080030 m_trigger = HAL_InitializeAnalogTrigger(input->m_port, &status);
Brian Silverman41cdd3e2019-01-19 19:48:58 -080031 if (status != 0) {
James Kuszmaul4b81d302019-12-14 20:53:14 -080032 wpi_setHALError(status);
Brian Silverman41cdd3e2019-01-19 19:48:58 -080033 m_trigger = HAL_kInvalidHandle;
34 return;
35 }
James Kuszmaul4b81d302019-12-14 20:53:14 -080036 int index = GetIndex();
Brian Silverman41cdd3e2019-01-19 19:48:58 -080037
James Kuszmaul4b81d302019-12-14 20:53:14 -080038 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);
Brian Silverman41cdd3e2019-01-19 19:48:58 -080055}
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)),
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -080068 SendableHelper(std::move(rhs)),
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -080069 m_trigger(std::move(rhs.m_trigger)) {
Brian Silverman41cdd3e2019-01-19 19:48:58 -080070 std::swap(m_analogInput, rhs.m_analogInput);
James Kuszmaul4b81d302019-12-14 20:53:14 -080071 std::swap(m_dutyCycle, rhs.m_dutyCycle);
Brian Silverman41cdd3e2019-01-19 19:48:58 -080072 std::swap(m_ownsAnalog, rhs.m_ownsAnalog);
73}
74
75AnalogTrigger& AnalogTrigger::operator=(AnalogTrigger&& rhs) {
76 ErrorBase::operator=(std::move(rhs));
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -080077 SendableHelper::operator=(std::move(rhs));
Brian Silverman41cdd3e2019-01-19 19:48:58 -080078
James Kuszmaul4f3ad3c2019-12-01 16:35:21 -080079 m_trigger = std::move(rhs.m_trigger);
Brian Silverman41cdd3e2019-01-19 19:48:58 -080080 std::swap(m_analogInput, rhs.m_analogInput);
James Kuszmaul4b81d302019-12-14 20:53:14 -080081 std::swap(m_dutyCycle, rhs.m_dutyCycle);
Brian Silverman41cdd3e2019-01-19 19:48:58 -080082 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);
James Kuszmaul4b81d302019-12-14 20:53:14 -080091 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);
Brian Silverman41cdd3e2019-01-19 19:48:58 -080099}
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);
James Kuszmaul4b81d302019-12-14 20:53:14 -0800105 wpi_setHALError(status);
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800106}
107
108void AnalogTrigger::SetAveraged(bool useAveragedValue) {
109 if (StatusIsFatal()) return;
110 int32_t status = 0;
111 HAL_SetAnalogTriggerAveraged(m_trigger, useAveragedValue, &status);
James Kuszmaul4b81d302019-12-14 20:53:14 -0800112 wpi_setHALError(status);
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800113}
114
115void AnalogTrigger::SetFiltered(bool useFilteredValue) {
116 if (StatusIsFatal()) return;
117 int32_t status = 0;
118 HAL_SetAnalogTriggerFiltered(m_trigger, useFilteredValue, &status);
James Kuszmaul4b81d302019-12-14 20:53:14 -0800119 wpi_setHALError(status);
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800120}
121
122int AnalogTrigger::GetIndex() const {
123 if (StatusIsFatal()) return -1;
James Kuszmaul4b81d302019-12-14 20:53:14 -0800124 int32_t status = 0;
125 auto ret = HAL_GetAnalogTriggerFPGAIndex(m_trigger, &status);
126 wpi_setHALError(status);
127 return ret;
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800128}
129
130bool AnalogTrigger::GetInWindow() {
131 if (StatusIsFatal()) return false;
132 int32_t status = 0;
133 bool result = HAL_GetAnalogTriggerInWindow(m_trigger, &status);
James Kuszmaul4b81d302019-12-14 20:53:14 -0800134 wpi_setHALError(status);
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800135 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);
James Kuszmaul4b81d302019-12-14 20:53:14 -0800142 wpi_setHALError(status);
Brian Silverman41cdd3e2019-01-19 19:48:58 -0800143 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}