blob: f3b97f6841ef619e8afe9ad8b62799c536689ee4 [file] [log] [blame]
Brian Silvermanda45b6c2014-12-28 11:36:50 -08001#include "frc971/wpilib/joystick_sender.h"
2
Alex Perrycb7da4b2019-08-28 19:35:56 -07003#include "aos/logging/logging.h"
Tyler Chatowc92b4872019-02-23 21:42:11 -08004#include "aos/network/team_number.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -07005#include "aos/realtime.h"
James Kuszmaul7077d342021-06-09 20:23:58 -07006#include "frc971/input/driver_station_data.h"
7#include "frc971/input/joystick_state_generated.h"
Parker Schuhd3b7a8872018-02-19 16:42:27 -08008#include "frc971/wpilib/ahal/DriverStation.h"
Austin Schuhf6b94632019-02-02 22:11:27 -08009#include "hal/HAL.h"
Brian Silvermanda45b6c2014-12-28 11:36:50 -080010
Stephan Pleinesf63bde82024-01-13 15:59:33 -080011namespace frc971::wpilib {
Brian Silvermanda45b6c2014-12-28 11:36:50 -080012
Alex Perrycb7da4b2019-08-28 19:35:56 -070013using aos::Joystick;
14
James Kuszmaul57c2baa2020-01-19 14:52:52 -080015JoystickSender::JoystickSender(::aos::ShmEventLoop *event_loop)
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070016 : event_loop_(event_loop),
17 joystick_state_sender_(
Alex Perrycb7da4b2019-08-28 19:35:56 -070018 event_loop_->MakeSender<::aos::JoystickState>("/aos")),
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070019 team_id_(::aos::network::GetTeamNumber()) {
Austin Schuh094d09b2020-11-20 23:26:52 -080020 event_loop_->SetRuntimeRealtimePriority(28);
James Kuszmaul57c2baa2020-01-19 14:52:52 -080021 event_loop->set_name("joystick_sender");
Brian Silvermanbd925f92014-12-31 14:28:06 -080022
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070023 event_loop_->OnRun([this]() {
24 frc::DriverStation *const ds = &frc::DriverStation::GetInstance();
Brian Silvermanda45b6c2014-12-28 11:36:50 -080025
James Kuszmaul9776b392023-01-14 14:08:08 -080026 wpi::Event event{false, false};
27 HAL_ProvideNewDataEventHandle(event.GetHandle());
28
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070029 // TODO(Brian): Fix the potential deadlock when stopping here (condition
30 // variable / mutex needs to get exposed all the way out or something).
31 while (event_loop_->is_running()) {
James Kuszmaul9776b392023-01-14 14:08:08 -080032 wpi::WaitForObject(event.GetHandle());
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070033 ds->RunIteration([&]() {
Alex Perrycb7da4b2019-08-28 19:35:56 -070034 auto builder = joystick_state_sender_.MakeBuilder();
Brian Silvermanda45b6c2014-12-28 11:36:50 -080035
Alex Perrycb7da4b2019-08-28 19:35:56 -070036 std::array<flatbuffers::Offset<Joystick>,
James Kuszmaul7077d342021-06-09 20:23:58 -070037 frc971::input::driver_station::JoystickFeature::kJoysticks>
Alex Perrycb7da4b2019-08-28 19:35:56 -070038 joysticks;
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070039
Alex Perrycb7da4b2019-08-28 19:35:56 -070040 for (size_t i = 0;
James Kuszmaul7077d342021-06-09 20:23:58 -070041 i < frc971::input::driver_station::JoystickFeature::kJoysticks;
42 ++i) {
43 std::array<double, frc971::input::driver_station::JoystickAxis::kAxes>
Alex Perrycb7da4b2019-08-28 19:35:56 -070044 axis;
James Kuszmaul7077d342021-06-09 20:23:58 -070045 for (int j = 0;
46 j < frc971::input::driver_station::JoystickAxis::kAxes; ++j) {
Alex Perrycb7da4b2019-08-28 19:35:56 -070047 axis[j] = ds->GetStickAxis(i, j);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070048 }
Alex Perrycb7da4b2019-08-28 19:35:56 -070049
50 flatbuffers::Offset<flatbuffers::Vector<double>> axis_offset =
51 builder.fbb()->CreateVector(axis.begin(), axis.size());
52
53 Joystick::Builder joystick_builder = builder.MakeBuilder<Joystick>();
54
55 joystick_builder.add_buttons(ds->GetStickButtons(i));
56
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070057 if (ds->GetStickPOVCount(i) > 0) {
Alex Perrycb7da4b2019-08-28 19:35:56 -070058 joystick_builder.add_pov(ds->GetStickPOV(i, 0));
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070059 }
Alex Perrycb7da4b2019-08-28 19:35:56 -070060
61 joystick_builder.add_axis(axis_offset);
62
63 joysticks[i] = joystick_builder.Finish();
Tyler Chatowc92b4872019-02-23 21:42:11 -080064 }
Alex Perrycb7da4b2019-08-28 19:35:56 -070065
66 flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Joystick>>>
67 joysticks_offset = builder.fbb()->CreateVector(joysticks.begin(),
68 joysticks.size());
69
Lee Mracekdb8bde02022-01-08 02:54:21 -050070 flatbuffers::Offset<flatbuffers::String> game_data_offset =
71 builder.fbb()->CreateString(ds->GetGameSpecificMessage());
72
73 flatbuffers::Offset<flatbuffers::String> event_name_offset =
74 builder.fbb()->CreateString(ds->GetEventName());
James Kuszmaula8806732020-02-14 19:45:35 -080075
Alex Perrycb7da4b2019-08-28 19:35:56 -070076 aos::JoystickState::Builder joystick_state_builder =
77 builder.MakeBuilder<aos::JoystickState>();
78
79 joystick_state_builder.add_joysticks(joysticks_offset);
80
Lee Mracekdb8bde02022-01-08 02:54:21 -050081 if (ds->GetGameSpecificMessage().size() >= 2u) {
Alex Perrycb7da4b2019-08-28 19:35:56 -070082 joystick_state_builder.add_switch_left(
Lee Mracekdb8bde02022-01-08 02:54:21 -050083 ds->GetGameSpecificMessage()[0] == 'L' ||
84 ds->GetGameSpecificMessage()[0] == 'l');
Alex Perrycb7da4b2019-08-28 19:35:56 -070085 joystick_state_builder.add_scale_left(
Lee Mracekdb8bde02022-01-08 02:54:21 -050086 ds->GetGameSpecificMessage()[1] == 'L' ||
87 ds->GetGameSpecificMessage()[1] == 'l');
Alex Perrycb7da4b2019-08-28 19:35:56 -070088 }
Lee Mracekdb8bde02022-01-08 02:54:21 -050089 joystick_state_builder.add_game_data(game_data_offset);
Alex Perrycb7da4b2019-08-28 19:35:56 -070090
91 joystick_state_builder.add_test_mode(ds->IsTestMode());
92 joystick_state_builder.add_fms_attached(ds->IsFmsAttached());
93 joystick_state_builder.add_enabled(ds->IsEnabled());
94 joystick_state_builder.add_autonomous(ds->IsAutonomous());
James Kuszmaula8806732020-02-14 19:45:35 -080095 switch (ds->GetAlliance()) {
96 case frc::DriverStation::kRed:
97 joystick_state_builder.add_alliance(aos::Alliance::kRed);
98 break;
99 case frc::DriverStation::kBlue:
100 joystick_state_builder.add_alliance(aos::Alliance::kBlue);
101 break;
102 case frc::DriverStation::kInvalid:
103 joystick_state_builder.add_alliance(aos::Alliance::kInvalid);
104 break;
105 }
Lee Mracekdb8bde02022-01-08 02:54:21 -0500106 joystick_state_builder.add_location(ds->GetLocation());
107
Alex Perrycb7da4b2019-08-28 19:35:56 -0700108 joystick_state_builder.add_team_id(team_id_);
Lee Mracekdb8bde02022-01-08 02:54:21 -0500109 joystick_state_builder.add_match_number(ds->GetMatchNumber());
110 joystick_state_builder.add_replay_number(ds->GetReplayNumber());
111
112 switch (ds->GetMatchType()) {
113 case frc::DriverStation::kNone:
114 joystick_state_builder.add_match_type(aos::MatchType::kNone);
115 break;
116 case frc::DriverStation::kPractice:
117 joystick_state_builder.add_match_type(aos::MatchType::kPractice);
118 break;
119 case frc::DriverStation::kQualification:
120 joystick_state_builder.add_match_type(
121 aos::MatchType::kQualification);
122 break;
123 case frc::DriverStation::kElimination:
124 joystick_state_builder.add_match_type(aos::MatchType::kElimination);
125 break;
126 }
127 joystick_state_builder.add_event_name(event_name_offset);
Alex Perrycb7da4b2019-08-28 19:35:56 -0700128
milind1f1dca32021-07-03 13:50:07 -0700129 if (builder.Send(joystick_state_builder.Finish()) !=
130 aos::RawSender::Error::kOk) {
Austin Schuhf257f3c2019-10-27 21:00:43 -0700131 AOS_LOG(WARNING, "sending joystick_state failed\n");
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700132 }
133 });
134 }
James Kuszmaul9776b392023-01-14 14:08:08 -0800135
136 HAL_RemoveNewDataEventHandle(event.GetHandle());
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700137 });
Brian Silvermanda45b6c2014-12-28 11:36:50 -0800138}
139
Stephan Pleinesf63bde82024-01-13 15:59:33 -0800140} // namespace frc971::wpilib