blob: 8d0405658a837b6583ffe56758b8f2157f90d0b6 [file] [log] [blame]
Maxwell Hendersonad312342023-01-10 12:07:47 -08001#include <unistd.h>
2
3#include <cmath>
4#include <cstdio>
5#include <cstring>
6
7#include "aos/actions/actions.h"
8#include "aos/init.h"
9#include "aos/logging/logging.h"
10#include "aos/network/team_number.h"
11#include "aos/util/log_interval.h"
12#include "frc971/autonomous/base_autonomous_actor.h"
13#include "frc971/control_loops/drivetrain/localizer_generated.h"
14#include "frc971/control_loops/profiled_subsystem_generated.h"
15#include "frc971/input/action_joystick_input.h"
16#include "frc971/input/driver_station_data.h"
17#include "frc971/input/drivetrain_input.h"
18#include "frc971/input/joystick_input.h"
19#include "frc971/zeroing/wrap.h"
20#include "y2023/constants.h"
21#include "y2023/control_loops/drivetrain/drivetrain_base.h"
James Kuszmaul4e171432023-02-26 13:39:37 -080022#include "y2023/control_loops/drivetrain/target_selector_hint_generated.h"
milind-udefab712023-02-20 22:22:02 -080023#include "y2023/control_loops/superstructure/arm/generated_graph.h"
Maxwell Hendersonad312342023-01-10 12:07:47 -080024#include "y2023/control_loops/superstructure/superstructure_goal_generated.h"
25#include "y2023/control_loops/superstructure/superstructure_status_generated.h"
26
27using frc971::CreateProfileParameters;
28using frc971::control_loops::CreateStaticZeroingSingleDOFProfiledSubsystemGoal;
29using frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemGoal;
30using frc971::input::driver_station::ButtonLocation;
31using frc971::input::driver_station::ControlBit;
32using frc971::input::driver_station::JoystickAxis;
33using frc971::input::driver_station::POVLocation;
James Kuszmaul4e171432023-02-26 13:39:37 -080034using y2023::control_loops::drivetrain::GridSelectionHint;
James Kuszmaul055fe762023-03-03 21:14:01 -080035using y2023::control_loops::drivetrain::RowSelectionHint;
James Kuszmaul4e171432023-02-26 13:39:37 -080036using y2023::control_loops::drivetrain::SpotSelectionHint;
37using y2023::control_loops::drivetrain::TargetSelectorHint;
James Kuszmaul055fe762023-03-03 21:14:01 -080038using y2023::control_loops::superstructure::RollerGoal;
39using Side = frc971::control_loops::drivetrain::RobotSide;
Maxwell Hendersonad312342023-01-10 12:07:47 -080040
41namespace y2023 {
42namespace input {
43namespace joysticks {
44
Austin Schuh99dda682023-03-11 00:18:37 -080045constexpr double kConeWrist = 0.4;
46constexpr double kCubeWrist = 1.0;
47
milind-udefab712023-02-20 22:22:02 -080048// TODO(milind): add correct locations
Austin Schuh8e6f2872023-03-08 20:55:27 -080049const ButtonLocation kDriverSpit(2, 1);
Austin Schuh23a90022023-02-24 22:13:39 -080050const ButtonLocation kSpit(4, 13);
51
Austin Schuh9b3e41c2023-02-26 22:29:53 -080052const ButtonLocation kHighConeScoreLeft(4, 14);
53const ButtonLocation kHighConeScoreRight(3, 1);
54
55const ButtonLocation kMidConeScoreLeft(4, 15);
56const ButtonLocation kMidConeScoreRight(3, 2);
57
Austin Schuhe062be02023-03-04 21:12:07 -080058const ButtonLocation kLowConeScoreLeft(4, 16);
59const ButtonLocation kLowConeScoreRight(3, 3);
60
Austin Schuh9b3e41c2023-02-26 22:29:53 -080061const ButtonLocation kHighCube(4, 1);
62const ButtonLocation kMidCube(4, 2);
63const ButtonLocation kLowCube(4, 3);
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -080064
65const ButtonLocation kGroundPickupConeUp(4, 7);
Austin Schuh99dda682023-03-11 00:18:37 -080066const ButtonLocation kGroundPickupConeDown(4, 8);
milind-u71da5392023-02-26 12:45:00 -080067const ButtonLocation kGroundPickupCube(4, 10);
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -080068const ButtonLocation kHPConePickup(4, 6);
69
Austin Schuh9b3e41c2023-02-26 22:29:53 -080070const ButtonLocation kSuck(4, 11);
71const ButtonLocation kBack(4, 12);
milind-udefab712023-02-20 22:22:02 -080072
Austin Schuh6dc925b2023-02-24 16:23:32 -080073const ButtonLocation kWrist(4, 10);
Austin Schuh038b5452023-03-08 20:55:45 -080074const ButtonLocation kStayIn(3, 4);
Austin Schuh6dc925b2023-02-24 16:23:32 -080075
Austin Schuh99dda682023-03-11 00:18:37 -080076const ButtonLocation kConeDownTip(4, 4);
77const ButtonLocation kConeDownBase(4, 5);
78
Maxwell Hendersonad312342023-01-10 12:07:47 -080079namespace superstructure = y2023::control_loops::superstructure;
milind-udefab712023-02-20 22:22:02 -080080namespace arm = superstructure::arm;
Maxwell Hendersonad312342023-01-10 12:07:47 -080081
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -080082enum class GamePiece {
83 CONE_UP = 0,
84 CONE_DOWN = 1,
85 CUBE = 2,
Austin Schuh99dda682023-03-11 00:18:37 -080086 CONE_TIP = 4,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -080087};
88
James Kuszmaul4ac45762023-03-04 19:10:55 -080089struct ButtonData {
90 ButtonLocation button;
91 std::optional<SpotSelectionHint> spot = std::nullopt;
92};
93
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -080094struct ArmSetpoint {
95 uint32_t index;
Austin Schuh99dda682023-03-11 00:18:37 -080096 std::optional<uint32_t> place_index = std::nullopt;
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -080097 double wrist_goal;
98 std::optional<double> score_wrist_goal = std::nullopt;
99 GamePiece game_piece;
James Kuszmaul4ac45762023-03-04 19:10:55 -0800100 std::vector<ButtonData> buttons;
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800101 Side side;
James Kuszmaul4e171432023-02-26 13:39:37 -0800102 std::optional<RowSelectionHint> row_hint = std::nullopt;
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800103};
104
105const std::vector<ArmSetpoint> setpoints = {
106 {
107 .index = arm::GroundPickupBackConeUpIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800108 .wrist_goal = 0.7,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800109 .game_piece = GamePiece::CONE_UP,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800110 .buttons = {{kGroundPickupConeUp}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800111 .side = Side::BACK,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800112 },
113 {
Austin Schuhe062be02023-03-04 21:12:07 -0800114 .index = arm::GroundPickupFrontConeUpIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800115 .wrist_goal = 0.6,
Austin Schuhe062be02023-03-04 21:12:07 -0800116 .game_piece = GamePiece::CONE_UP,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800117 .buttons = {{kGroundPickupConeUp}},
Austin Schuhe062be02023-03-04 21:12:07 -0800118 .side = Side::FRONT,
119 },
120 {
121 .index = arm::GroundPickupBackConeDownBaseIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800122 .wrist_goal = kConeWrist,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800123 .game_piece = GamePiece::CONE_DOWN,
Austin Schuh99dda682023-03-11 00:18:37 -0800124 .buttons = {{kGroundPickupConeDown}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800125 .side = Side::BACK,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800126 },
127 {
Austin Schuhe062be02023-03-04 21:12:07 -0800128 .index = arm::GroundPickupFrontConeDownBaseIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800129 .wrist_goal = 0.6,
Austin Schuhe062be02023-03-04 21:12:07 -0800130 .game_piece = GamePiece::CONE_DOWN,
Austin Schuh99dda682023-03-11 00:18:37 -0800131 .buttons = {{kGroundPickupConeDown}},
Austin Schuhe062be02023-03-04 21:12:07 -0800132 .side = Side::FRONT,
133 },
134 {
Austin Schuh99dda682023-03-11 00:18:37 -0800135 .index = arm::ScoreBackLowConeDownTipIndex(),
136 .wrist_goal = 0.7,
137 .game_piece = GamePiece::CONE_TIP,
138 .buttons = {{kLowConeScoreRight, SpotSelectionHint::RIGHT},
139 {kLowCube, SpotSelectionHint::MIDDLE},
140 {kLowConeScoreLeft, SpotSelectionHint::LEFT}},
141 .side = Side::BACK,
142 .row_hint = RowSelectionHint::BOTTOM,
143 },
144 {
145 .index = arm::ScoreBackMidConeDownTipIndex(),
146 .place_index = arm::ScoreBackMidConeDownTipPlacedIndex(),
147 .wrist_goal = 0.8,
148 .score_wrist_goal = 2.0,
149 .game_piece = GamePiece::CONE_TIP,
150 .buttons = {{kMidConeScoreRight, SpotSelectionHint::RIGHT},
151 {kMidConeScoreLeft, SpotSelectionHint::LEFT}},
152 .side = Side::BACK,
153 .row_hint = RowSelectionHint::MIDDLE,
154 },
155 {
156 .index = arm::ScoreFrontMidConeDownTipIndex(),
157 .place_index = arm::ScoreFrontMidConeDownTipPlacedIndex(),
Austin Schuhe062be02023-03-04 21:12:07 -0800158 .wrist_goal = 0.0,
Austin Schuh99dda682023-03-11 00:18:37 -0800159 .score_wrist_goal = 1.4,
160 .game_piece = GamePiece::CONE_TIP,
161 .buttons = {{kMidConeScoreRight, SpotSelectionHint::RIGHT},
162 {kMidConeScoreLeft, SpotSelectionHint::LEFT}},
163 .side = Side::FRONT,
164 .row_hint = RowSelectionHint::MIDDLE,
165 },
166 {
167 .index = arm::ScoreFrontHighConeDownTipIndex(),
168 .place_index = arm::ScoreFrontHighConeDownTipPlacedIndex(),
169 .wrist_goal = 0.4,
170 .score_wrist_goal = 1.4,
171 .game_piece = GamePiece::CONE_TIP,
172 .buttons = {{kHighConeScoreRight, SpotSelectionHint::RIGHT},
173 {kHighConeScoreLeft, SpotSelectionHint::LEFT}},
174 .side = Side::FRONT,
175 .row_hint = RowSelectionHint::TOP,
176 },
177 {
178 .index = arm::ScoreFrontLowConeDownTipIndex(),
179 .wrist_goal = 2.8,
180 .game_piece = GamePiece::CONE_TIP,
181 .buttons = {{kLowConeScoreRight, SpotSelectionHint::RIGHT},
182 {kLowCube, SpotSelectionHint::MIDDLE},
183 {kLowConeScoreLeft, SpotSelectionHint::LEFT}},
184 .side = Side::FRONT,
185 .row_hint = RowSelectionHint::TOP,
186 },
187 {
188 .index = arm::ScoreBackMidConeUpIndex(),
189 .wrist_goal = kConeWrist,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800190 .game_piece = GamePiece::CONE_UP,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800191 .buttons = {{kMidConeScoreRight, SpotSelectionHint::RIGHT},
192 {kMidConeScoreLeft, SpotSelectionHint::LEFT}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800193 .side = Side::BACK,
James Kuszmaul4e171432023-02-26 13:39:37 -0800194 .row_hint = RowSelectionHint::MIDDLE,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800195 },
196 {
Austin Schuhe062be02023-03-04 21:12:07 -0800197 .index = arm::ScoreBackLowConeUpIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800198 .wrist_goal = kConeWrist,
Austin Schuhe062be02023-03-04 21:12:07 -0800199 .game_piece = GamePiece::CONE_UP,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800200 .buttons = {{kLowConeScoreLeft, SpotSelectionHint::LEFT},
Austin Schuh6be75772023-03-11 15:12:33 -0800201 {kLowCube, SpotSelectionHint::MIDDLE},
James Kuszmaul4ac45762023-03-04 19:10:55 -0800202 {kLowConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuhe062be02023-03-04 21:12:07 -0800203 .side = Side::BACK,
204 .row_hint = RowSelectionHint::BOTTOM,
Austin Schuhe062be02023-03-04 21:12:07 -0800205 },
206 {
207 .index = arm::ScoreFrontLowConeUpIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800208 .wrist_goal = kConeWrist,
Austin Schuhe062be02023-03-04 21:12:07 -0800209 .game_piece = GamePiece::CONE_UP,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800210 .buttons = {{kLowConeScoreLeft, SpotSelectionHint::LEFT},
Austin Schuh6be75772023-03-11 15:12:33 -0800211 {kLowCube, SpotSelectionHint::MIDDLE},
James Kuszmaul4ac45762023-03-04 19:10:55 -0800212 {kLowConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuhe062be02023-03-04 21:12:07 -0800213 .side = Side::FRONT,
214 .row_hint = RowSelectionHint::BOTTOM,
Austin Schuhe062be02023-03-04 21:12:07 -0800215 },
216 {
217 .index = arm::ScoreBackMidConeDownBaseIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800218 .wrist_goal = 2.5,
219 .score_wrist_goal = kConeWrist,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800220 .game_piece = GamePiece::CONE_DOWN,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800221 .buttons = {{kMidConeScoreLeft, SpotSelectionHint::LEFT},
222 {kMidConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800223 .side = Side::BACK,
James Kuszmaul4e171432023-02-26 13:39:37 -0800224 .row_hint = RowSelectionHint::MIDDLE,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800225 },
226 {
Austin Schuhe062be02023-03-04 21:12:07 -0800227 .index = arm::ScoreBackLowConeDownBaseIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800228 .wrist_goal = kConeWrist,
Austin Schuhe062be02023-03-04 21:12:07 -0800229 .game_piece = GamePiece::CONE_DOWN,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800230 .buttons = {{kLowConeScoreLeft, SpotSelectionHint::LEFT},
Austin Schuh6be75772023-03-11 15:12:33 -0800231 {kLowCube, SpotSelectionHint::MIDDLE},
James Kuszmaul4ac45762023-03-04 19:10:55 -0800232 {kLowConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuhe062be02023-03-04 21:12:07 -0800233 .side = Side::BACK,
234 .row_hint = RowSelectionHint::BOTTOM,
Austin Schuhe062be02023-03-04 21:12:07 -0800235 },
236 {
237 .index = arm::ScoreFrontLowConeDownBaseIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800238 .wrist_goal = kConeWrist,
Austin Schuhe062be02023-03-04 21:12:07 -0800239 .game_piece = GamePiece::CONE_DOWN,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800240 .buttons = {{kLowConeScoreLeft, SpotSelectionHint::LEFT},
Austin Schuh6be75772023-03-11 15:12:33 -0800241 {kLowCube, SpotSelectionHint::MIDDLE},
James Kuszmaul4ac45762023-03-04 19:10:55 -0800242 {kLowConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuhe062be02023-03-04 21:12:07 -0800243 .side = Side::FRONT,
244 .row_hint = RowSelectionHint::BOTTOM,
Austin Schuhe062be02023-03-04 21:12:07 -0800245 },
246 {
247 .index = arm::ScoreFrontMidConeDownBaseIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800248 .wrist_goal = 2.6,
249 .score_wrist_goal = 0.2,
Austin Schuhe062be02023-03-04 21:12:07 -0800250 .game_piece = GamePiece::CONE_DOWN,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800251 .buttons = {{kMidConeScoreLeft, SpotSelectionHint::LEFT},
252 {kMidConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuhe062be02023-03-04 21:12:07 -0800253 .side = Side::FRONT,
254 .row_hint = RowSelectionHint::MIDDLE,
Austin Schuhe062be02023-03-04 21:12:07 -0800255 },
256 {
257 .index = arm::ScoreFrontHighConeDownBaseIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800258 .wrist_goal = 2.6,
259 .score_wrist_goal = 0.2,
Austin Schuhe062be02023-03-04 21:12:07 -0800260 .game_piece = GamePiece::CONE_DOWN,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800261 .buttons = {{kHighConeScoreLeft, SpotSelectionHint::LEFT},
262 {kHighConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuhe062be02023-03-04 21:12:07 -0800263 .side = Side::FRONT,
264 .row_hint = RowSelectionHint::TOP,
Austin Schuhe062be02023-03-04 21:12:07 -0800265 },
266 {
267 .index = arm::HPPickupFrontConeUpIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800268 .wrist_goal = kConeWrist,
Austin Schuhe062be02023-03-04 21:12:07 -0800269 .game_piece = GamePiece::CONE_UP,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800270 .buttons = {{kHPConePickup}},
Austin Schuhe062be02023-03-04 21:12:07 -0800271 .side = Side::FRONT,
272 },
273 {
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800274 .index = arm::HPPickupBackConeUpIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800275 .wrist_goal = 0.5,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800276 .game_piece = GamePiece::CONE_UP,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800277 .buttons = {{kHPConePickup}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800278 .side = Side::BACK,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800279 },
280 {
Austin Schuhe062be02023-03-04 21:12:07 -0800281 .index = arm::ScoreFrontHighConeUpIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800282 .wrist_goal = kConeWrist + 0.05,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800283 .game_piece = GamePiece::CONE_UP,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800284 .buttons = {{kHighConeScoreLeft, SpotSelectionHint::LEFT},
285 {kHighConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800286 .side = Side::FRONT,
James Kuszmaul4e171432023-02-26 13:39:37 -0800287 .row_hint = RowSelectionHint::TOP,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800288 },
289 {
Austin Schuhe062be02023-03-04 21:12:07 -0800290 .index = arm::ScoreFrontMidConeUpIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800291 .wrist_goal = kConeWrist + 0.05,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800292 .game_piece = GamePiece::CONE_UP,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800293 .buttons = {{kMidConeScoreLeft, SpotSelectionHint::LEFT},
294 {kMidConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800295 .side = Side::FRONT,
James Kuszmaul4e171432023-02-26 13:39:37 -0800296 .row_hint = RowSelectionHint::MIDDLE,
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800297 },
milind-u68842e12023-02-26 12:45:40 -0800298 {
299 .index = arm::GroundPickupBackCubeIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800300 .wrist_goal = kCubeWrist,
milind-u68842e12023-02-26 12:45:40 -0800301 .game_piece = GamePiece::CUBE,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800302 .buttons = {{kGroundPickupCube}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800303 .side = Side::BACK,
304 },
305 {
306 .index = arm::ScoreFrontMidCubeIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800307 .wrist_goal = kCubeWrist,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800308 .game_piece = GamePiece::CUBE,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800309 .buttons = {{kMidCube, SpotSelectionHint::MIDDLE}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800310 .side = Side::FRONT,
James Kuszmaul4e171432023-02-26 13:39:37 -0800311 .row_hint = RowSelectionHint::MIDDLE,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800312 },
313 {
314 .index = arm::ScoreBackMidCubeIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800315 .wrist_goal = kCubeWrist,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800316 .game_piece = GamePiece::CUBE,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800317 .buttons = {{kMidCube, SpotSelectionHint::MIDDLE}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800318 .side = Side::BACK,
James Kuszmaul4e171432023-02-26 13:39:37 -0800319 .row_hint = RowSelectionHint::MIDDLE,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800320 },
321 {
322 .index = arm::ScoreFrontLowCubeIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800323 .wrist_goal = kCubeWrist,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800324 .game_piece = GamePiece::CUBE,
Austin Schuh6be75772023-03-11 15:12:33 -0800325 .buttons = {{kLowConeScoreLeft, SpotSelectionHint::LEFT},
326 {kLowCube, SpotSelectionHint::MIDDLE},
327 {kLowConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800328 .side = Side::FRONT,
James Kuszmaul4e171432023-02-26 13:39:37 -0800329 .row_hint = RowSelectionHint::BOTTOM,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800330 },
331 {
332 .index = arm::ScoreBackLowCubeIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800333 .wrist_goal = kCubeWrist,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800334 .game_piece = GamePiece::CUBE,
Austin Schuh6be75772023-03-11 15:12:33 -0800335 .buttons = {{kLowConeScoreLeft, SpotSelectionHint::LEFT},
336 {kLowCube, SpotSelectionHint::MIDDLE},
337 {kLowConeScoreRight, SpotSelectionHint::RIGHT}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800338 .side = Side::BACK,
James Kuszmaul4e171432023-02-26 13:39:37 -0800339 .row_hint = RowSelectionHint::BOTTOM,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800340 },
341 {
342 .index = arm::ScoreFrontHighCubeIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800343 .wrist_goal = kCubeWrist,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800344 .game_piece = GamePiece::CUBE,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800345 .buttons = {{kHighCube, SpotSelectionHint::MIDDLE}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800346 .side = Side::FRONT,
James Kuszmaul4e171432023-02-26 13:39:37 -0800347 .row_hint = RowSelectionHint::TOP,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800348 },
349 {
350 .index = arm::ScoreBackHighCubeIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800351 .wrist_goal = kCubeWrist,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800352 .game_piece = GamePiece::CUBE,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800353 .buttons = {{kHighCube, SpotSelectionHint::MIDDLE}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800354 .side = Side::BACK,
James Kuszmaul4e171432023-02-26 13:39:37 -0800355 .row_hint = RowSelectionHint::TOP,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800356 },
357 {
358 .index = arm::GroundPickupFrontCubeIndex(),
Austin Schuh99dda682023-03-11 00:18:37 -0800359 .wrist_goal = kCubeWrist,
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800360 .game_piece = GamePiece::CUBE,
James Kuszmaul4ac45762023-03-04 19:10:55 -0800361 .buttons = {{kGroundPickupCube}},
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800362 .side = Side::FRONT,
milind-u68842e12023-02-26 12:45:40 -0800363 },
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800364};
365
Maxwell Hendersonad312342023-01-10 12:07:47 -0800366class Reader : public ::frc971::input::ActionJoystickInput {
367 public:
368 Reader(::aos::EventLoop *event_loop)
369 : ::frc971::input::ActionJoystickInput(
370 event_loop,
371 ::y2023::control_loops::drivetrain::GetDrivetrainConfig(),
372 ::frc971::input::DrivetrainInputReader::InputType::kPistol, {}),
373 superstructure_goal_sender_(
374 event_loop->MakeSender<superstructure::Goal>("/superstructure")),
James Kuszmaul4e171432023-02-26 13:39:37 -0800375 target_selector_hint_sender_(
376 event_loop->MakeSender<TargetSelectorHint>("/drivetrain")),
Maxwell Hendersonad312342023-01-10 12:07:47 -0800377 superstructure_status_fetcher_(
378 event_loop->MakeFetcher<superstructure::Status>(
379 "/superstructure")) {}
380
381 void AutoEnded() override { AOS_LOG(INFO, "Auto ended.\n"); }
382
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800383 GamePiece current_game_piece_ = GamePiece::CONE_UP;
384
Maxwell Hendersonad312342023-01-10 12:07:47 -0800385 void HandleTeleop(
386 const ::frc971::input::driver_station::Data &data) override {
387 superstructure_status_fetcher_.Fetch();
388 if (!superstructure_status_fetcher_.get()) {
389 AOS_LOG(ERROR, "Got no superstructure status message.\n");
390 return;
391 }
392
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800393 if (!superstructure_status_fetcher_->has_wrist()) {
394 AOS_LOG(ERROR, "Got no superstructure status message.\n");
395 return;
396 }
milind-udefab712023-02-20 22:22:02 -0800397
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800398 double wrist_goal = 0.0;
399 RollerGoal roller_goal = RollerGoal::IDLE;
Austin Schuh9a11ebd2023-02-26 14:16:31 -0800400 arm_goal_position_ = arm::NeutralIndex();
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800401 std::optional<double> score_wrist_goal = std::nullopt;
Austin Schuh99dda682023-03-11 00:18:37 -0800402 std::optional<double> place_index = std::nullopt;
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800403
404 if (data.IsPressed(kGroundPickupConeUp) || data.IsPressed(kHPConePickup)) {
Maxwell Hendersonbf1bcec2023-03-05 18:00:20 -0800405 roller_goal = RollerGoal::INTAKE_CONE_UP;
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800406 current_game_piece_ = GamePiece::CONE_UP;
Austin Schuh99dda682023-03-11 00:18:37 -0800407 } else if (data.IsPressed(kGroundPickupConeDown)) {
Maxwell Hendersonbf1bcec2023-03-05 18:00:20 -0800408 roller_goal = RollerGoal::INTAKE_CONE_DOWN;
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800409 current_game_piece_ = GamePiece::CONE_DOWN;
milind-u71da5392023-02-26 12:45:00 -0800410 } else if (data.IsPressed(kGroundPickupCube)) {
411 roller_goal = RollerGoal::INTAKE_CUBE;
412 current_game_piece_ = GamePiece::CUBE;
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800413 }
414
Austin Schuh99dda682023-03-11 00:18:37 -0800415 if (current_game_piece_ == GamePiece::CONE_DOWN ||
416 current_game_piece_ == GamePiece::CONE_TIP) {
417 if (data.IsPressed(kConeDownTip)) {
418 current_game_piece_ = GamePiece::CONE_TIP;
419 } else if (data.IsPressed(kConeDownBase)) {
420 current_game_piece_ = GamePiece::CONE_DOWN;
421 }
422 }
423
milind-u68842e12023-02-26 12:45:40 -0800424 if (current_game_piece_ == GamePiece::CUBE) {
Austin Schuh99dda682023-03-11 00:18:37 -0800425 wrist_goal = kCubeWrist;
milind-u68842e12023-02-26 12:45:40 -0800426 }
427
James Kuszmaul4e171432023-02-26 13:39:37 -0800428 std::optional<RowSelectionHint> placing_row;
429 std::optional<SpotSelectionHint> placing_spot;
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800430
Austin Schuhe062be02023-03-04 21:12:07 -0800431 // Keep the setpoint if the button is still held. This lets us release the
432 // back button once a side has been selected.
433 if (current_setpoint_ != nullptr) {
434 bool found = false;
James Kuszmaul4ac45762023-03-04 19:10:55 -0800435 for (const auto &button : current_setpoint_->buttons) {
436 if (data.IsPressed(button.button)) {
Austin Schuhe062be02023-03-04 21:12:07 -0800437 found = true;
James Kuszmaul4ac45762023-03-04 19:10:55 -0800438 placing_spot = button.spot;
Austin Schuhe062be02023-03-04 21:12:07 -0800439 }
440 }
441 if (!found) {
442 current_setpoint_ = nullptr;
443 }
444 }
445
446 // Ok, no active setpoint. Search for the right one.
447 if (current_setpoint_ == nullptr) {
448 const Side current_side =
449 data.IsPressed(kBack) ? Side::BACK : Side::FRONT;
450 // Search for the active setpoint.
451 for (const ArmSetpoint &setpoint : setpoints) {
James Kuszmaul4ac45762023-03-04 19:10:55 -0800452 for (const auto &button : setpoint.buttons) {
453 if (data.IsPressed(button.button)) {
Austin Schuhe062be02023-03-04 21:12:07 -0800454 if (setpoint.game_piece == current_game_piece_ &&
455 setpoint.side == current_side) {
456 current_setpoint_ = &setpoint;
James Kuszmaul4ac45762023-03-04 19:10:55 -0800457 placing_spot = button.spot;
Austin Schuhe062be02023-03-04 21:12:07 -0800458 }
Austin Schuh9b3e41c2023-02-26 22:29:53 -0800459 }
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800460 }
461 }
Austin Schuh6dc925b2023-02-24 16:23:32 -0800462 }
Austin Schuhe062be02023-03-04 21:12:07 -0800463
464 // And, pull the bits out of it.
465 if (current_setpoint_ != nullptr) {
Austin Schuh038b5452023-03-08 20:55:45 -0800466 if (!data.IsPressed(kStayIn)) {
467 wrist_goal = current_setpoint_->wrist_goal;
468 arm_goal_position_ = current_setpoint_->index;
469 score_wrist_goal = current_setpoint_->score_wrist_goal;
Austin Schuh99dda682023-03-11 00:18:37 -0800470 place_index = current_setpoint_->place_index;
Austin Schuh038b5452023-03-08 20:55:45 -0800471 }
472
Austin Schuhe062be02023-03-04 21:12:07 -0800473 placing_row = current_setpoint_->row_hint;
Austin Schuhe062be02023-03-04 21:12:07 -0800474 }
475
James Kuszmaul4e171432023-02-26 13:39:37 -0800476 CHECK_EQ(placing_row.has_value(), placing_spot.has_value());
Austin Schuh6dc925b2023-02-24 16:23:32 -0800477
Austin Schuh23a90022023-02-24 22:13:39 -0800478 if (data.IsPressed(kSuck)) {
milind-u71da5392023-02-26 12:45:00 -0800479 roller_goal = RollerGoal::INTAKE_LAST;
Austin Schuh8e6f2872023-03-08 20:55:27 -0800480 } else if (data.IsPressed(kSpit) || data.IsPressed(kDriverSpit)) {
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800481 if (score_wrist_goal.has_value()) {
482 wrist_goal = score_wrist_goal.value();
Austin Schuh23a90022023-02-24 22:13:39 -0800483
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800484 // If we are supposed to dunk it, wait until we are close enough to
485 // spit.
486 if (std::abs(score_wrist_goal.value() -
Austin Schuh99dda682023-03-11 00:18:37 -0800487 superstructure_status_fetcher_->wrist()->goal_position()) <
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800488 0.1) {
Austin Schuh99dda682023-03-11 00:18:37 -0800489 if (place_index.has_value()) {
490 arm_goal_position_ = place_index.value();
491 if (arm_goal_position_ ==
492 superstructure_status_fetcher_->arm()->current_node() &&
493 superstructure_status_fetcher_->arm()->path_distance_to_go() <
494 0.01) {
495 roller_goal = RollerGoal::SPIT;
496 }
497 } else {
498 roller_goal = RollerGoal::SPIT;
499 }
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800500 }
501 } else {
502 roller_goal = RollerGoal::SPIT;
503 }
milind-udefab712023-02-20 22:22:02 -0800504 }
505
Maxwell Hendersonad312342023-01-10 12:07:47 -0800506 {
507 auto builder = superstructure_goal_sender_.MakeBuilder();
508
Austin Schuh6dc925b2023-02-24 16:23:32 -0800509 flatbuffers::Offset<StaticZeroingSingleDOFProfiledSubsystemGoal>
Maxwell Henderson1ac7aac2023-02-23 17:35:32 -0800510 wrist_offset = CreateStaticZeroingSingleDOFProfiledSubsystemGoal(
511 *builder.fbb(), wrist_goal,
512 CreateProfileParameters(*builder.fbb(), 12.0, 90.0));
Austin Schuh6dc925b2023-02-24 16:23:32 -0800513
Maxwell Hendersonad312342023-01-10 12:07:47 -0800514 superstructure::Goal::Builder superstructure_goal_builder =
515 builder.MakeBuilder<superstructure::Goal>();
milind-udefab712023-02-20 22:22:02 -0800516 superstructure_goal_builder.add_arm_goal_position(arm_goal_position_);
Maxwell Henderson5938a832023-02-23 09:33:15 -0800517 superstructure_goal_builder.add_roller_goal(roller_goal);
Austin Schuh6dc925b2023-02-24 16:23:32 -0800518 superstructure_goal_builder.add_wrist(wrist_offset);
Maxwell Hendersonad312342023-01-10 12:07:47 -0800519 if (builder.Send(superstructure_goal_builder.Finish()) !=
520 aos::RawSender::Error::kOk) {
521 AOS_LOG(ERROR, "Sending superstructure goal failed.\n");
522 }
523 }
James Kuszmaul5a66f8a2023-03-11 14:28:30 -0800524 // TODO(james): Is there a more principled way to detect Human Player
525 // pickup? Probably don't bother fixing it until/unless we add more buttons
526 // that can select human player pickup.
527 if (data.IsPressed(kHPConePickup)) {
528 auto builder = target_selector_hint_sender_.MakeBuilder();
529 auto hint_builder = builder.MakeBuilder<TargetSelectorHint>();
530 hint_builder.add_substation_pickup(true);
James Kuszmaul7e167652023-03-11 17:52:46 -0800531 hint_builder.add_robot_side(CHECK_NOTNULL(current_setpoint_)->side);
James Kuszmaul5a66f8a2023-03-11 14:28:30 -0800532 if (builder.Send(hint_builder.Finish()) != aos::RawSender::Error::kOk) {
533 AOS_LOG(ERROR, "Sending target selector hint failed.\n");
534 }
535 } else if (placing_row.has_value()) {
James Kuszmaul4e171432023-02-26 13:39:37 -0800536 auto builder = target_selector_hint_sender_.MakeBuilder();
537 auto hint_builder = builder.MakeBuilder<TargetSelectorHint>();
538 hint_builder.add_row(placing_row.value());
539 hint_builder.add_spot(placing_spot.value());
James Kuszmaul055fe762023-03-03 21:14:01 -0800540 hint_builder.add_robot_side(CHECK_NOTNULL(current_setpoint_)->side);
James Kuszmaul4e171432023-02-26 13:39:37 -0800541 if (builder.Send(hint_builder.Finish()) != aos::RawSender::Error::kOk) {
542 AOS_LOG(ERROR, "Sending target selector hint failed.\n");
543 }
544 }
Maxwell Hendersonad312342023-01-10 12:07:47 -0800545 }
546
547 private:
548 ::aos::Sender<superstructure::Goal> superstructure_goal_sender_;
James Kuszmaul4e171432023-02-26 13:39:37 -0800549 ::aos::Sender<TargetSelectorHint> target_selector_hint_sender_;
Maxwell Hendersonad312342023-01-10 12:07:47 -0800550
551 ::aos::Fetcher<superstructure::Status> superstructure_status_fetcher_;
milind-udefab712023-02-20 22:22:02 -0800552
553 uint32_t arm_goal_position_;
Austin Schuhe062be02023-03-04 21:12:07 -0800554
555 const ArmSetpoint *current_setpoint_ = nullptr;
Maxwell Hendersonad312342023-01-10 12:07:47 -0800556};
557
558} // namespace joysticks
559} // namespace input
560} // namespace y2023
561
562int main(int argc, char **argv) {
563 ::aos::InitGoogle(&argc, &argv);
564
565 aos::FlatbufferDetachedBuffer<aos::Configuration> config =
566 aos::configuration::ReadConfig("aos_config.json");
567
568 ::aos::ShmEventLoop event_loop(&config.message());
569 ::y2023::input::joysticks::Reader reader(&event_loop);
570
571 event_loop.Run();
572
573 return 0;
574}