blob: 0eff22612f394ddab6d0fbcbcbf0f96377549f31 [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/Joystick.h"
6
7#include <cmath>
James Kuszmaulcf324122023-01-14 14:07:17 -08008#include <numbers>
Brian Silverman8fce7482020-01-05 13:18:21 -08009
10#include <hal/FRCUsageReporting.h>
James Kuszmaulcf324122023-01-14 14:07:17 -080011
12#include "frc/event/BooleanEvent.h"
Brian Silverman8fce7482020-01-05 13:18:21 -080013
Brian Silverman8fce7482020-01-05 13:18:21 -080014using namespace frc;
15
16Joystick::Joystick(int port) : GenericHID(port) {
17 m_axes[Axis::kX] = kDefaultXChannel;
18 m_axes[Axis::kY] = kDefaultYChannel;
19 m_axes[Axis::kZ] = kDefaultZChannel;
20 m_axes[Axis::kTwist] = kDefaultTwistChannel;
21 m_axes[Axis::kThrottle] = kDefaultThrottleChannel;
22
23 HAL_Report(HALUsageReporting::kResourceType_Joystick, port + 1);
24}
25
Austin Schuh812d0d12021-11-04 20:16:48 -070026void Joystick::SetXChannel(int channel) {
27 m_axes[Axis::kX] = channel;
28}
Brian Silverman8fce7482020-01-05 13:18:21 -080029
Austin Schuh812d0d12021-11-04 20:16:48 -070030void Joystick::SetYChannel(int channel) {
31 m_axes[Axis::kY] = channel;
32}
Brian Silverman8fce7482020-01-05 13:18:21 -080033
Austin Schuh812d0d12021-11-04 20:16:48 -070034void Joystick::SetZChannel(int channel) {
35 m_axes[Axis::kZ] = channel;
36}
Brian Silverman8fce7482020-01-05 13:18:21 -080037
Austin Schuh812d0d12021-11-04 20:16:48 -070038void Joystick::SetTwistChannel(int channel) {
39 m_axes[Axis::kTwist] = channel;
40}
Brian Silverman8fce7482020-01-05 13:18:21 -080041
42void Joystick::SetThrottleChannel(int channel) {
43 m_axes[Axis::kThrottle] = channel;
44}
45
Austin Schuh812d0d12021-11-04 20:16:48 -070046int Joystick::GetXChannel() const {
47 return m_axes[Axis::kX];
48}
Brian Silverman8fce7482020-01-05 13:18:21 -080049
Austin Schuh812d0d12021-11-04 20:16:48 -070050int Joystick::GetYChannel() const {
51 return m_axes[Axis::kY];
52}
Brian Silverman8fce7482020-01-05 13:18:21 -080053
Austin Schuh812d0d12021-11-04 20:16:48 -070054int Joystick::GetZChannel() const {
55 return m_axes[Axis::kZ];
56}
Brian Silverman8fce7482020-01-05 13:18:21 -080057
Austin Schuh812d0d12021-11-04 20:16:48 -070058int Joystick::GetTwistChannel() const {
59 return m_axes[Axis::kTwist];
60}
Brian Silverman8fce7482020-01-05 13:18:21 -080061
Austin Schuh812d0d12021-11-04 20:16:48 -070062int Joystick::GetThrottleChannel() const {
63 return m_axes[Axis::kThrottle];
64}
Brian Silverman8fce7482020-01-05 13:18:21 -080065
Austin Schuh812d0d12021-11-04 20:16:48 -070066double Joystick::GetX() const {
Brian Silverman8fce7482020-01-05 13:18:21 -080067 return GetRawAxis(m_axes[Axis::kX]);
68}
69
Austin Schuh812d0d12021-11-04 20:16:48 -070070double Joystick::GetY() const {
Brian Silverman8fce7482020-01-05 13:18:21 -080071 return GetRawAxis(m_axes[Axis::kY]);
72}
73
Austin Schuh812d0d12021-11-04 20:16:48 -070074double Joystick::GetZ() const {
75 return GetRawAxis(m_axes[Axis::kZ]);
76}
Brian Silverman8fce7482020-01-05 13:18:21 -080077
Austin Schuh812d0d12021-11-04 20:16:48 -070078double Joystick::GetTwist() const {
79 return GetRawAxis(m_axes[Axis::kTwist]);
80}
Brian Silverman8fce7482020-01-05 13:18:21 -080081
82double Joystick::GetThrottle() const {
83 return GetRawAxis(m_axes[Axis::kThrottle]);
84}
85
Austin Schuh812d0d12021-11-04 20:16:48 -070086bool Joystick::GetTrigger() const {
87 return GetRawButton(Button::kTrigger);
88}
Brian Silverman8fce7482020-01-05 13:18:21 -080089
90bool Joystick::GetTriggerPressed() {
91 return GetRawButtonPressed(Button::kTrigger);
92}
93
94bool Joystick::GetTriggerReleased() {
95 return GetRawButtonReleased(Button::kTrigger);
96}
97
James Kuszmaulcf324122023-01-14 14:07:17 -080098BooleanEvent Joystick::Trigger(EventLoop* loop) const {
99 return BooleanEvent(loop, [this]() { return this->GetTrigger(); });
100}
101
Austin Schuh812d0d12021-11-04 20:16:48 -0700102bool Joystick::GetTop() const {
103 return GetRawButton(Button::kTop);
104}
Brian Silverman8fce7482020-01-05 13:18:21 -0800105
Austin Schuh812d0d12021-11-04 20:16:48 -0700106bool Joystick::GetTopPressed() {
107 return GetRawButtonPressed(Button::kTop);
108}
Brian Silverman8fce7482020-01-05 13:18:21 -0800109
Austin Schuh812d0d12021-11-04 20:16:48 -0700110bool Joystick::GetTopReleased() {
111 return GetRawButtonReleased(Button::kTop);
112}
Brian Silverman8fce7482020-01-05 13:18:21 -0800113
James Kuszmaulcf324122023-01-14 14:07:17 -0800114BooleanEvent Joystick::Top(EventLoop* loop) const {
115 return BooleanEvent(loop, [this]() { return this->GetTop(); });
116}
117
Brian Silverman8fce7482020-01-05 13:18:21 -0800118double Joystick::GetMagnitude() const {
James Kuszmaulcf324122023-01-14 14:07:17 -0800119 return std::hypot(GetX(), GetY());
Brian Silverman8fce7482020-01-05 13:18:21 -0800120}
121
122double Joystick::GetDirectionRadians() const {
123 return std::atan2(GetX(), -GetY());
124}
125
126double Joystick::GetDirectionDegrees() const {
James Kuszmaulcf324122023-01-14 14:07:17 -0800127 return (180 / std::numbers::pi) * GetDirectionRadians();
Brian Silverman8fce7482020-01-05 13:18:21 -0800128}