blob: 8a378c59eee1ea703f786d3a1c3a7bbe0f51f6b9 [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 Kuszmaulb13e13f2023-11-22 20:44:04 -080011#include <units/dimensionless.h>
12#include <units/math.h>
13#include <wpi/deprecated.h>
James Kuszmaulcf324122023-01-14 14:07:17 -080014
15#include "frc/event/BooleanEvent.h"
Brian Silverman8fce7482020-01-05 13:18:21 -080016
Brian Silverman8fce7482020-01-05 13:18:21 -080017using namespace frc;
18
19Joystick::Joystick(int port) : GenericHID(port) {
20 m_axes[Axis::kX] = kDefaultXChannel;
21 m_axes[Axis::kY] = kDefaultYChannel;
22 m_axes[Axis::kZ] = kDefaultZChannel;
23 m_axes[Axis::kTwist] = kDefaultTwistChannel;
24 m_axes[Axis::kThrottle] = kDefaultThrottleChannel;
25
26 HAL_Report(HALUsageReporting::kResourceType_Joystick, port + 1);
27}
28
Austin Schuh812d0d12021-11-04 20:16:48 -070029void Joystick::SetXChannel(int channel) {
30 m_axes[Axis::kX] = channel;
31}
Brian Silverman8fce7482020-01-05 13:18:21 -080032
Austin Schuh812d0d12021-11-04 20:16:48 -070033void Joystick::SetYChannel(int channel) {
34 m_axes[Axis::kY] = channel;
35}
Brian Silverman8fce7482020-01-05 13:18:21 -080036
Austin Schuh812d0d12021-11-04 20:16:48 -070037void Joystick::SetZChannel(int channel) {
38 m_axes[Axis::kZ] = channel;
39}
Brian Silverman8fce7482020-01-05 13:18:21 -080040
Austin Schuh812d0d12021-11-04 20:16:48 -070041void Joystick::SetTwistChannel(int channel) {
42 m_axes[Axis::kTwist] = channel;
43}
Brian Silverman8fce7482020-01-05 13:18:21 -080044
45void Joystick::SetThrottleChannel(int channel) {
46 m_axes[Axis::kThrottle] = channel;
47}
48
Austin Schuh812d0d12021-11-04 20:16:48 -070049int Joystick::GetXChannel() const {
50 return m_axes[Axis::kX];
51}
Brian Silverman8fce7482020-01-05 13:18:21 -080052
Austin Schuh812d0d12021-11-04 20:16:48 -070053int Joystick::GetYChannel() const {
54 return m_axes[Axis::kY];
55}
Brian Silverman8fce7482020-01-05 13:18:21 -080056
Austin Schuh812d0d12021-11-04 20:16:48 -070057int Joystick::GetZChannel() const {
58 return m_axes[Axis::kZ];
59}
Brian Silverman8fce7482020-01-05 13:18:21 -080060
Austin Schuh812d0d12021-11-04 20:16:48 -070061int Joystick::GetTwistChannel() const {
62 return m_axes[Axis::kTwist];
63}
Brian Silverman8fce7482020-01-05 13:18:21 -080064
Austin Schuh812d0d12021-11-04 20:16:48 -070065int Joystick::GetThrottleChannel() const {
66 return m_axes[Axis::kThrottle];
67}
Brian Silverman8fce7482020-01-05 13:18:21 -080068
Austin Schuh812d0d12021-11-04 20:16:48 -070069double Joystick::GetX() const {
Brian Silverman8fce7482020-01-05 13:18:21 -080070 return GetRawAxis(m_axes[Axis::kX]);
71}
72
Austin Schuh812d0d12021-11-04 20:16:48 -070073double Joystick::GetY() const {
Brian Silverman8fce7482020-01-05 13:18:21 -080074 return GetRawAxis(m_axes[Axis::kY]);
75}
76
Austin Schuh812d0d12021-11-04 20:16:48 -070077double Joystick::GetZ() const {
78 return GetRawAxis(m_axes[Axis::kZ]);
79}
Brian Silverman8fce7482020-01-05 13:18:21 -080080
Austin Schuh812d0d12021-11-04 20:16:48 -070081double Joystick::GetTwist() const {
82 return GetRawAxis(m_axes[Axis::kTwist]);
83}
Brian Silverman8fce7482020-01-05 13:18:21 -080084
85double Joystick::GetThrottle() const {
86 return GetRawAxis(m_axes[Axis::kThrottle]);
87}
88
Austin Schuh812d0d12021-11-04 20:16:48 -070089bool Joystick::GetTrigger() const {
90 return GetRawButton(Button::kTrigger);
91}
Brian Silverman8fce7482020-01-05 13:18:21 -080092
93bool Joystick::GetTriggerPressed() {
94 return GetRawButtonPressed(Button::kTrigger);
95}
96
97bool Joystick::GetTriggerReleased() {
98 return GetRawButtonReleased(Button::kTrigger);
99}
100
James Kuszmaulcf324122023-01-14 14:07:17 -0800101BooleanEvent Joystick::Trigger(EventLoop* loop) const {
102 return BooleanEvent(loop, [this]() { return this->GetTrigger(); });
103}
104
Austin Schuh812d0d12021-11-04 20:16:48 -0700105bool Joystick::GetTop() const {
106 return GetRawButton(Button::kTop);
107}
Brian Silverman8fce7482020-01-05 13:18:21 -0800108
Austin Schuh812d0d12021-11-04 20:16:48 -0700109bool Joystick::GetTopPressed() {
110 return GetRawButtonPressed(Button::kTop);
111}
Brian Silverman8fce7482020-01-05 13:18:21 -0800112
Austin Schuh812d0d12021-11-04 20:16:48 -0700113bool Joystick::GetTopReleased() {
114 return GetRawButtonReleased(Button::kTop);
115}
Brian Silverman8fce7482020-01-05 13:18:21 -0800116
James Kuszmaulcf324122023-01-14 14:07:17 -0800117BooleanEvent Joystick::Top(EventLoop* loop) const {
118 return BooleanEvent(loop, [this]() { return this->GetTop(); });
119}
120
Brian Silverman8fce7482020-01-05 13:18:21 -0800121double Joystick::GetMagnitude() const {
James Kuszmaulcf324122023-01-14 14:07:17 -0800122 return std::hypot(GetX(), GetY());
Brian Silverman8fce7482020-01-05 13:18:21 -0800123}
124
125double Joystick::GetDirectionRadians() const {
126 return std::atan2(GetX(), -GetY());
127}
128
129double Joystick::GetDirectionDegrees() const {
James Kuszmaulb13e13f2023-11-22 20:44:04 -0800130 WPI_IGNORE_DEPRECATED
James Kuszmaulcf324122023-01-14 14:07:17 -0800131 return (180 / std::numbers::pi) * GetDirectionRadians();
James Kuszmaulb13e13f2023-11-22 20:44:04 -0800132 WPI_UNIGNORE_DEPRECATED
133}
134
135units::radian_t Joystick::GetDirection() const {
136 return units::math::atan2(units::dimensionless::scalar_t{GetX()},
137 units::dimensionless::scalar_t{-GetY()});
Brian Silverman8fce7482020-01-05 13:18:21 -0800138}