blob: f4d26b64def65c181e3e8890ecaf1163a4868896 [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/GenericHID.h"
6
7#include <hal/DriverStation.h>
Brian Silverman8fce7482020-01-05 13:18:21 -08008
9#include "frc/DriverStation.h"
Austin Schuh812d0d12021-11-04 20:16:48 -070010#include "frc/Errors.h"
James Kuszmaulcf324122023-01-14 14:07:17 -080011#include "frc/event/BooleanEvent.h"
Brian Silverman8fce7482020-01-05 13:18:21 -080012
13using namespace frc;
14
Austin Schuh812d0d12021-11-04 20:16:48 -070015GenericHID::GenericHID(int port) {
16 if (port < 0 || port >= DriverStation::kJoystickPorts) {
17 throw FRC_MakeError(warn::BadJoystickIndex, "port {} out of range", port);
Brian Silverman8fce7482020-01-05 13:18:21 -080018 }
19 m_port = port;
20}
21
22bool GenericHID::GetRawButton(int button) const {
Austin Schuh812d0d12021-11-04 20:16:48 -070023 return DriverStation::GetStickButton(m_port, button);
Brian Silverman8fce7482020-01-05 13:18:21 -080024}
25
26bool GenericHID::GetRawButtonPressed(int button) {
Austin Schuh812d0d12021-11-04 20:16:48 -070027 return DriverStation::GetStickButtonPressed(m_port, button);
Brian Silverman8fce7482020-01-05 13:18:21 -080028}
29
30bool GenericHID::GetRawButtonReleased(int button) {
Austin Schuh812d0d12021-11-04 20:16:48 -070031 return DriverStation::GetStickButtonReleased(m_port, button);
Brian Silverman8fce7482020-01-05 13:18:21 -080032}
33
James Kuszmaulcf324122023-01-14 14:07:17 -080034BooleanEvent GenericHID::Button(int button, EventLoop* loop) const {
35 return BooleanEvent(loop,
36 [this, button]() { return this->GetRawButton(button); });
37}
38
Brian Silverman8fce7482020-01-05 13:18:21 -080039double GenericHID::GetRawAxis(int axis) const {
Austin Schuh812d0d12021-11-04 20:16:48 -070040 return DriverStation::GetStickAxis(m_port, axis);
Brian Silverman8fce7482020-01-05 13:18:21 -080041}
42
Austin Schuh812d0d12021-11-04 20:16:48 -070043int GenericHID::GetPOV(int pov) const {
44 return DriverStation::GetStickPOV(m_port, pov);
45}
Brian Silverman8fce7482020-01-05 13:18:21 -080046
James Kuszmaulcf324122023-01-14 14:07:17 -080047BooleanEvent GenericHID::POV(int angle, EventLoop* loop) const {
48 return POV(0, angle, loop);
49}
50
51BooleanEvent GenericHID::POV(int pov, int angle, EventLoop* loop) const {
52 return BooleanEvent(
53 loop, [this, pov, angle] { return this->GetPOV(pov) == angle; });
54}
55
56BooleanEvent GenericHID::POVUp(EventLoop* loop) const {
57 return POV(0, loop);
58}
59
60BooleanEvent GenericHID::POVUpRight(EventLoop* loop) const {
61 return POV(45, loop);
62}
63
64BooleanEvent GenericHID::POVRight(EventLoop* loop) const {
65 return POV(90, loop);
66}
67
68BooleanEvent GenericHID::POVDownRight(EventLoop* loop) const {
69 return POV(135, loop);
70}
71
72BooleanEvent GenericHID::POVDown(EventLoop* loop) const {
73 return POV(180, loop);
74}
75
76BooleanEvent GenericHID::POVDownLeft(EventLoop* loop) const {
77 return POV(225, loop);
78}
79
80BooleanEvent GenericHID::POVLeft(EventLoop* loop) const {
81 return POV(270, loop);
82}
83
84BooleanEvent GenericHID::POVUpLeft(EventLoop* loop) const {
85 return POV(315, loop);
86}
87
88BooleanEvent GenericHID::POVCenter(EventLoop* loop) const {
89 return POV(360, loop);
90}
91
92BooleanEvent GenericHID::AxisLessThan(int axis, double threshold,
93 EventLoop* loop) const {
94 return BooleanEvent(loop, [this, axis, threshold]() {
95 return this->GetRawAxis(axis) < threshold;
96 });
97}
98
99BooleanEvent GenericHID::AxisGreaterThan(int axis, double threshold,
100 EventLoop* loop) const {
101 return BooleanEvent(loop, [this, axis, threshold]() {
102 return this->GetRawAxis(axis) > threshold;
103 });
104}
105
Austin Schuh812d0d12021-11-04 20:16:48 -0700106int GenericHID::GetAxisCount() const {
107 return DriverStation::GetStickAxisCount(m_port);
108}
Brian Silverman8fce7482020-01-05 13:18:21 -0800109
Austin Schuh812d0d12021-11-04 20:16:48 -0700110int GenericHID::GetPOVCount() const {
111 return DriverStation::GetStickPOVCount(m_port);
112}
Brian Silverman8fce7482020-01-05 13:18:21 -0800113
114int GenericHID::GetButtonCount() const {
Austin Schuh812d0d12021-11-04 20:16:48 -0700115 return DriverStation::GetStickButtonCount(m_port);
Brian Silverman8fce7482020-01-05 13:18:21 -0800116}
117
Austin Schuh1e69f942020-11-14 15:06:14 -0800118bool GenericHID::IsConnected() const {
Austin Schuh812d0d12021-11-04 20:16:48 -0700119 return DriverStation::IsJoystickConnected(m_port);
Austin Schuh1e69f942020-11-14 15:06:14 -0800120}
121
Brian Silverman8fce7482020-01-05 13:18:21 -0800122GenericHID::HIDType GenericHID::GetType() const {
Austin Schuh812d0d12021-11-04 20:16:48 -0700123 return static_cast<HIDType>(DriverStation::GetJoystickType(m_port));
Brian Silverman8fce7482020-01-05 13:18:21 -0800124}
125
126std::string GenericHID::GetName() const {
Austin Schuh812d0d12021-11-04 20:16:48 -0700127 return DriverStation::GetJoystickName(m_port);
Brian Silverman8fce7482020-01-05 13:18:21 -0800128}
129
130int GenericHID::GetAxisType(int axis) const {
Austin Schuh812d0d12021-11-04 20:16:48 -0700131 return DriverStation::GetJoystickAxisType(m_port, axis);
Brian Silverman8fce7482020-01-05 13:18:21 -0800132}
133
Austin Schuh812d0d12021-11-04 20:16:48 -0700134int GenericHID::GetPort() const {
135 return m_port;
136}
Brian Silverman8fce7482020-01-05 13:18:21 -0800137
138void GenericHID::SetOutput(int outputNumber, bool value) {
139 m_outputs =
140 (m_outputs & ~(1 << (outputNumber - 1))) | (value << (outputNumber - 1));
141
142 HAL_SetJoystickOutputs(m_port, m_outputs, m_leftRumble, m_rightRumble);
143}
144
145void GenericHID::SetOutputs(int value) {
146 m_outputs = value;
147 HAL_SetJoystickOutputs(m_port, m_outputs, m_leftRumble, m_rightRumble);
148}
149
150void GenericHID::SetRumble(RumbleType type, double value) {
James Kuszmaulcf324122023-01-14 14:07:17 -0800151 value = std::clamp(value, 0.0, 1.0);
152 double rumbleValue = value * 65535;
153
Brian Silverman8fce7482020-01-05 13:18:21 -0800154 if (type == kLeftRumble) {
James Kuszmaulcf324122023-01-14 14:07:17 -0800155 m_leftRumble = rumbleValue;
156 } else if (type == kRightRumble) {
157 m_rightRumble = rumbleValue;
Brian Silverman8fce7482020-01-05 13:18:21 -0800158 } else {
James Kuszmaulcf324122023-01-14 14:07:17 -0800159 m_leftRumble = rumbleValue;
160 m_rightRumble = rumbleValue;
Brian Silverman8fce7482020-01-05 13:18:21 -0800161 }
James Kuszmaulcf324122023-01-14 14:07:17 -0800162
Brian Silverman8fce7482020-01-05 13:18:21 -0800163 HAL_SetJoystickOutputs(m_port, m_outputs, m_leftRumble, m_rightRumble);
164}