blob: 825a6558f00b642f0c285029efa6168541c43b3b [file] [log] [blame]
Parker Schuhd3b7a8872018-02-19 16:42:27 -08001/*----------------------------------------------------------------------------*/
James Kuszmaul41fa78a2019-12-14 20:53:14 -08002/* Copyright (c) 2008-2019 FIRST. All Rights Reserved. */
Parker Schuhd3b7a8872018-02-19 16:42:27 -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 "frc971/wpilib/ahal/AnalogTrigger.h"
9
10#include <memory>
James Kuszmaul41fa78a2019-12-14 20:53:14 -080011#include <utility>
Parker Schuhd3b7a8872018-02-19 16:42:27 -080012
James Kuszmaul41fa78a2019-12-14 20:53:14 -080013#include <hal/FRCUsageReporting.h>
Austin Schuhf6b94632019-02-02 22:11:27 -080014#include <hal/HAL.h>
Parker Schuhd3b7a8872018-02-19 16:42:27 -080015
16#include "frc971/wpilib/ahal/AnalogInput.h"
James Kuszmaul41fa78a2019-12-14 20:53:14 -080017#include "frc971/wpilib/ahal/Base.h"
18#include "frc971/wpilib/ahal/DutyCycle.h"
Parker Schuhd3b7a8872018-02-19 16:42:27 -080019#include "frc971/wpilib/ahal/WPIErrors.h"
20
21using namespace frc;
22
Parker Schuhd3b7a8872018-02-19 16:42:27 -080023AnalogTrigger::AnalogTrigger(int channel)
24 : AnalogTrigger(new AnalogInput(channel)) {
25 m_ownsAnalog = true;
26}
27
James Kuszmaul41fa78a2019-12-14 20:53:14 -080028AnalogTrigger::AnalogTrigger(AnalogInput* input) {
Parker Schuhd3b7a8872018-02-19 16:42:27 -080029 m_analogInput = input;
30 int32_t status = 0;
James Kuszmaul41fa78a2019-12-14 20:53:14 -080031 m_trigger = HAL_InitializeAnalogTrigger(input->m_port, &status);
Parker Schuhd3b7a8872018-02-19 16:42:27 -080032 if (status != 0) {
James Kuszmaul41fa78a2019-12-14 20:53:14 -080033 wpi_setHALError(status);
Parker Schuhd3b7a8872018-02-19 16:42:27 -080034 m_trigger = HAL_kInvalidHandle;
35 return;
36 }
James Kuszmaul41fa78a2019-12-14 20:53:14 -080037 int index = GetIndex();
Parker Schuhd3b7a8872018-02-19 16:42:27 -080038
James Kuszmaul41fa78a2019-12-14 20:53:14 -080039 HAL_Report(HALUsageReporting::kResourceType_AnalogTrigger, index + 1);
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);
Parker Schuhd3b7a8872018-02-19 16:42:27 -080054}
55
56AnalogTrigger::~AnalogTrigger() {
57 int32_t status = 0;
58 HAL_CleanAnalogTrigger(m_trigger, &status);
59
James Kuszmaul41fa78a2019-12-14 20:53:14 -080060 if (m_ownsAnalog) {
Parker Schuhd3b7a8872018-02-19 16:42:27 -080061 delete m_analogInput;
62 }
63}
64
James Kuszmaul41fa78a2019-12-14 20:53:14 -080065AnalogTrigger::AnalogTrigger(AnalogTrigger &&rhs)
66 : m_trigger(std::move(rhs.m_trigger)) {
67 std::swap(m_analogInput, rhs.m_analogInput);
68 std::swap(m_dutyCycle, rhs.m_dutyCycle);
69 std::swap(m_ownsAnalog, rhs.m_ownsAnalog);
Parker Schuhd3b7a8872018-02-19 16:42:27 -080070}
71
James Kuszmaul41fa78a2019-12-14 20:53:14 -080072AnalogTrigger& AnalogTrigger::operator=(AnalogTrigger&& rhs) {
73 m_trigger = std::move(rhs.m_trigger);
74 std::swap(m_analogInput, rhs.m_analogInput);
75 std::swap(m_dutyCycle, rhs.m_dutyCycle);
76 std::swap(m_ownsAnalog, rhs.m_ownsAnalog);
77
78 return *this;
79}
80
Parker Schuhd3b7a8872018-02-19 16:42:27 -080081void AnalogTrigger::SetLimitsVoltage(double lower, double upper) {
82 if (StatusIsFatal()) return;
83 int32_t status = 0;
84 HAL_SetAnalogTriggerLimitsVoltage(m_trigger, lower, upper, &status);
James Kuszmaul41fa78a2019-12-14 20:53:14 -080085 wpi_setHALError(status);
Parker Schuhd3b7a8872018-02-19 16:42:27 -080086}
87
James Kuszmaul41fa78a2019-12-14 20:53:14 -080088void AnalogTrigger::SetLimitsDutyCycle(double lower, double upper) {
89 if (StatusIsFatal()) return;
90 int32_t status = 0;
91 HAL_SetAnalogTriggerLimitsDutyCycle(m_trigger, lower, upper, &status);
92 wpi_setHALError(status);
93}
94
95void AnalogTrigger::SetLimitsRaw(int lower, int upper) {
96 if (StatusIsFatal()) return;
97 int32_t status = 0;
98 HAL_SetAnalogTriggerLimitsRaw(m_trigger, lower, upper, &status);
99 wpi_setHALError(status);
100}
101
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800102void AnalogTrigger::SetAveraged(bool useAveragedValue) {
103 if (StatusIsFatal()) return;
104 int32_t status = 0;
105 HAL_SetAnalogTriggerAveraged(m_trigger, useAveragedValue, &status);
James Kuszmaul41fa78a2019-12-14 20:53:14 -0800106 wpi_setHALError(status);
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800107}
108
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800109void AnalogTrigger::SetFiltered(bool useFilteredValue) {
110 if (StatusIsFatal()) return;
111 int32_t status = 0;
112 HAL_SetAnalogTriggerFiltered(m_trigger, useFilteredValue, &status);
James Kuszmaul41fa78a2019-12-14 20:53:14 -0800113 wpi_setHALError(status);
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800114}
115
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800116int AnalogTrigger::GetIndex() const {
117 if (StatusIsFatal()) return -1;
James Kuszmaul41fa78a2019-12-14 20:53:14 -0800118 int32_t status = 0;
119 auto ret = HAL_GetAnalogTriggerFPGAIndex(m_trigger, &status);
120 wpi_setHALError(status);
121 return ret;
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800122}
123
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800124bool AnalogTrigger::GetInWindow() {
125 if (StatusIsFatal()) return false;
126 int32_t status = 0;
127 bool result = HAL_GetAnalogTriggerInWindow(m_trigger, &status);
James Kuszmaul41fa78a2019-12-14 20:53:14 -0800128 wpi_setHALError(status);
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800129 return result;
130}
131
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800132bool AnalogTrigger::GetTriggerState() {
133 if (StatusIsFatal()) return false;
134 int32_t status = 0;
135 bool result = HAL_GetAnalogTriggerTriggerState(m_trigger, &status);
James Kuszmaul41fa78a2019-12-14 20:53:14 -0800136 wpi_setHALError(status);
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800137 return result;
138}
139
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800140std::shared_ptr<AnalogTriggerOutput> AnalogTrigger::CreateOutput(
141 AnalogTriggerType type) const {
142 if (StatusIsFatal()) return nullptr;
143 return std::shared_ptr<AnalogTriggerOutput>(
144 new AnalogTriggerOutput(*this, type), NullDeleter<AnalogTriggerOutput>());
145}