blob: ea33c73f8dd50b9ca9a5c354a545bf9ad36c5fa9 [file] [log] [blame]
Austin Schuh812d0d12021-11-04 20:16:48 -07001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
Brian Silverman8fce7482020-01-05 13:18:21 -08004
5#include "frc/AnalogTrigger.h"
6
7#include <utility>
8
Austin Schuh812d0d12021-11-04 20:16:48 -07009#include <hal/AnalogTrigger.h>
Brian Silverman8fce7482020-01-05 13:18:21 -080010#include <hal/FRCUsageReporting.h>
Austin Schuh812d0d12021-11-04 20:16:48 -070011#include <wpi/NullDeleter.h>
12#include <wpi/sendable/SendableRegistry.h>
Brian Silverman8fce7482020-01-05 13:18:21 -080013
14#include "frc/AnalogInput.h"
Brian Silverman8fce7482020-01-05 13:18:21 -080015#include "frc/DutyCycle.h"
Austin Schuh812d0d12021-11-04 20:16:48 -070016#include "frc/Errors.h"
Brian Silverman8fce7482020-01-05 13:18:21 -080017
18using namespace frc;
19
20AnalogTrigger::AnalogTrigger(int channel)
21 : AnalogTrigger(new AnalogInput(channel)) {
22 m_ownsAnalog = true;
Austin Schuh812d0d12021-11-04 20:16:48 -070023 wpi::SendableRegistry::AddChild(this, m_analogInput);
Brian Silverman8fce7482020-01-05 13:18:21 -080024}
25
26AnalogTrigger::AnalogTrigger(AnalogInput* input) {
27 m_analogInput = input;
28 int32_t status = 0;
29 m_trigger = HAL_InitializeAnalogTrigger(input->m_port, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070030 FRC_CheckErrorStatus(status, "Channel {}", input->GetChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080031 int index = GetIndex();
32
33 HAL_Report(HALUsageReporting::kResourceType_AnalogTrigger, index + 1);
Austin Schuh812d0d12021-11-04 20:16:48 -070034 wpi::SendableRegistry::AddLW(this, "AnalogTrigger", index);
Brian Silverman8fce7482020-01-05 13:18:21 -080035}
36
37AnalogTrigger::AnalogTrigger(DutyCycle* input) {
38 m_dutyCycle = input;
39 int32_t status = 0;
40 m_trigger = HAL_InitializeAnalogTriggerDutyCycle(input->m_handle, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070041 FRC_CheckErrorStatus(status, "Channel {}", m_dutyCycle->GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080042 int index = GetIndex();
43
44 HAL_Report(HALUsageReporting::kResourceType_AnalogTrigger, index + 1);
Austin Schuh812d0d12021-11-04 20:16:48 -070045 wpi::SendableRegistry::AddLW(this, "AnalogTrigger", index);
Brian Silverman8fce7482020-01-05 13:18:21 -080046}
47
48AnalogTrigger::~AnalogTrigger() {
49 int32_t status = 0;
50 HAL_CleanAnalogTrigger(m_trigger, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070051 FRC_ReportError(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080052
53 if (m_ownsAnalog) {
54 delete m_analogInput;
55 }
56}
57
Brian Silverman8fce7482020-01-05 13:18:21 -080058void AnalogTrigger::SetLimitsVoltage(double lower, double upper) {
Brian Silverman8fce7482020-01-05 13:18:21 -080059 int32_t status = 0;
60 HAL_SetAnalogTriggerLimitsVoltage(m_trigger, lower, upper, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070061 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080062}
63
64void AnalogTrigger::SetLimitsDutyCycle(double lower, double upper) {
Brian Silverman8fce7482020-01-05 13:18:21 -080065 int32_t status = 0;
66 HAL_SetAnalogTriggerLimitsDutyCycle(m_trigger, lower, upper, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070067 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080068}
69
70void AnalogTrigger::SetLimitsRaw(int lower, int upper) {
Brian Silverman8fce7482020-01-05 13:18:21 -080071 int32_t status = 0;
72 HAL_SetAnalogTriggerLimitsRaw(m_trigger, lower, upper, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070073 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080074}
75
76void AnalogTrigger::SetAveraged(bool useAveragedValue) {
Brian Silverman8fce7482020-01-05 13:18:21 -080077 int32_t status = 0;
78 HAL_SetAnalogTriggerAveraged(m_trigger, useAveragedValue, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070079 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080080}
81
82void AnalogTrigger::SetFiltered(bool useFilteredValue) {
Brian Silverman8fce7482020-01-05 13:18:21 -080083 int32_t status = 0;
84 HAL_SetAnalogTriggerFiltered(m_trigger, useFilteredValue, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070085 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080086}
87
88int AnalogTrigger::GetIndex() const {
Brian Silverman8fce7482020-01-05 13:18:21 -080089 int32_t status = 0;
90 auto ret = HAL_GetAnalogTriggerFPGAIndex(m_trigger, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070091 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080092 return ret;
93}
94
95bool AnalogTrigger::GetInWindow() {
Brian Silverman8fce7482020-01-05 13:18:21 -080096 int32_t status = 0;
97 bool result = HAL_GetAnalogTriggerInWindow(m_trigger, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070098 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080099 return result;
100}
101
102bool AnalogTrigger::GetTriggerState() {
Brian Silverman8fce7482020-01-05 13:18:21 -0800103 int32_t status = 0;
104 bool result = HAL_GetAnalogTriggerTriggerState(m_trigger, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -0700105 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -0800106 return result;
107}
108
109std::shared_ptr<AnalogTriggerOutput> AnalogTrigger::CreateOutput(
110 AnalogTriggerType type) const {
Brian Silverman8fce7482020-01-05 13:18:21 -0800111 return std::shared_ptr<AnalogTriggerOutput>(
Austin Schuh812d0d12021-11-04 20:16:48 -0700112 new AnalogTriggerOutput(*this, type));
Brian Silverman8fce7482020-01-05 13:18:21 -0800113}
114
Austin Schuh812d0d12021-11-04 20:16:48 -0700115void AnalogTrigger::InitSendable(wpi::SendableBuilder& builder) {
116 if (m_ownsAnalog) {
117 m_analogInput->InitSendable(builder);
118 }
119}
120
121int AnalogTrigger::GetSourceChannel() const {
122 if (m_analogInput) {
123 return m_analogInput->GetChannel();
124 } else if (m_dutyCycle) {
125 return m_dutyCycle->GetSourceChannel();
126 } else {
127 return -1;
128 }
Brian Silverman8fce7482020-01-05 13:18:21 -0800129}