blob: 3c028c1d92f2936cbbf86bcb23cf74de0bcc1a5b [file] [log] [blame]
Sabina Davis91b23602019-01-21 00:06:01 -08001#include <math.h>
2#include <stdio.h>
3#include <string.h>
4#include <unistd.h>
Tyler Chatow4fedeea2019-03-10 15:33:36 -07005#include <chrono>
Sabina Davis91b23602019-01-21 00:06:01 -08006
7#include "aos/actions/actions.h"
8#include "aos/init.h"
9#include "aos/input/action_joystick_input.h"
10#include "aos/input/driver_station_data.h"
11#include "aos/input/drivetrain_input.h"
12#include "aos/input/joystick_input.h"
13#include "aos/logging/logging.h"
14#include "aos/logging/logging.h"
Tyler Chatowe0241452019-03-08 21:07:50 -080015#include "aos/network/team_number.h"
Sabina Davis91b23602019-01-21 00:06:01 -080016#include "aos/util/log_interval.h"
Tyler Chatowe0241452019-03-08 21:07:50 -080017#include "aos/vision/events/udp.h"
18#include "external/com_google_protobuf/src/google/protobuf/stubs/stringprintf.h"
Sabina Davis91b23602019-01-21 00:06:01 -080019#include "frc971/autonomous/auto.q.h"
20#include "frc971/autonomous/base_autonomous_actor.h"
21#include "frc971/control_loops/drivetrain/drivetrain.q.h"
James Kuszmauld8deb682019-03-10 10:38:42 -070022#include "frc971/control_loops/drivetrain/localizer.q.h"
Sabina Davis91b23602019-01-21 00:06:01 -080023
24#include "y2019/control_loops/drivetrain/drivetrain_base.h"
James Kuszmaul7d1ef442019-03-23 20:20:50 -070025#include "y2019/control_loops/drivetrain/target_selector.q.h"
Sabina Davis91b23602019-01-21 00:06:01 -080026#include "y2019/control_loops/superstructure/superstructure.q.h"
Sabina Davisc6329342019-03-01 20:44:42 -080027#include "y2019/status_light.q.h"
Tyler Chatowe0241452019-03-08 21:07:50 -080028#include "y2019/vision.pb.h"
Sabina Davis91b23602019-01-21 00:06:01 -080029
30using ::y2019::control_loops::superstructure::superstructure_queue;
31using ::aos::input::driver_station::ButtonLocation;
32using ::aos::input::driver_station::ControlBit;
33using ::aos::input::driver_station::JoystickAxis;
34using ::aos::input::driver_station::POVLocation;
Tyler Chatowe0241452019-03-08 21:07:50 -080035using ::aos::events::ProtoTXUdpSocket;
Sabina Davis91b23602019-01-21 00:06:01 -080036
Austin Schuhaab7e162019-03-13 22:44:58 -070037namespace chrono = ::std::chrono;
38
Sabina Davis91b23602019-01-21 00:06:01 -080039namespace y2019 {
40namespace input {
41namespace joysticks {
42
Tyler Chatowe0241452019-03-08 21:07:50 -080043using google::protobuf::StringPrintf;
44
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080045struct ElevatorWristPosition {
46 double elevator;
47 double wrist;
48};
Sabina Davis91b23602019-01-21 00:06:01 -080049
Tyler Chatow5eeee902019-04-12 20:47:48 -070050const ButtonLocation kSuctionBall(4, 2);
51const ButtonLocation kSuctionHatch(3, 15);
52const ButtonLocation kDeployStilt(4, 1);
53const ButtonLocation kHalfStilt(4, 3);
54const ButtonLocation kFallOver(3, 16);
55
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080056const ButtonLocation kRocketForwardLower(5, 1);
57const ButtonLocation kRocketForwardMiddle(5, 2);
58const ButtonLocation kRocketForwardUpper(5, 4);
59const ButtonLocation kCargoForward(5, 3);
60
61const POVLocation kRocketBackwardUnpressed(5, -1);
62const POVLocation kRocketBackwardLower(5, 180);
63const POVLocation kRocketBackwardMiddle(5, 90);
64const POVLocation kRocketBackwardUpper(5, 0);
65const POVLocation kCargoBackward(5, 270);
66
67const ButtonLocation kPanelSwitch(5, 7);
68const ButtonLocation kCargoSwitch(5, 8);
69
70const ButtonLocation kBallHPIntakeForward(5, 6);
71const ButtonLocation kBallHPIntakeBackward(5, 5);
72const JoystickAxis kBallOutake(5, 3);
73const JoystickAxis kBallIntake(5, 4);
74
75const ButtonLocation kPanelHPIntakeForward(5, 6);
76const ButtonLocation kPanelHPIntakeBackward(5, 5);
77
78const ButtonLocation kRelease(2, 4);
James Kuszmaulccc368b2019-04-11 20:00:07 -070079// Reuse quickturn for the cancel button.
80const ButtonLocation kCancelAutoMode(2, 3);
Tyler Chatow5eeee902019-04-12 20:47:48 -070081const ButtonLocation kReleaseButtonBoard(3, 4);
82const ButtonLocation kResetLocalizerLeftForwards(3, 10);
83const ButtonLocation kResetLocalizerLeftBackwards(3, 9);
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080084
Tyler Chatow5eeee902019-04-12 20:47:48 -070085const ButtonLocation kResetLocalizerRightForwards(3, 8);
86const ButtonLocation kResetLocalizerRightBackwards(3, 7);
Tyler Chatow07c906b2019-03-09 21:29:06 -080087
James Kuszmaul518640d2019-04-13 15:50:50 -070088const ButtonLocation kResetLocalizerLeft(3, 11);
89const ButtonLocation kResetLocalizerRight(3, 13);
90
Tyler Chatow5eeee902019-04-12 20:47:48 -070091const ButtonLocation kNearCargoHint(3, 3);
92const ButtonLocation kMidCargoHint(3, 5);
93const ButtonLocation kFarCargoHint(3, 6);
James Kuszmaul7d1ef442019-03-23 20:20:50 -070094
James Kuszmaul518640d2019-04-13 15:50:50 -070095const JoystickAxis kCargoSelectorY(5, 6);
96const JoystickAxis kCargoSelectorX(5, 5);
97
Tyler Chatow5eeee902019-04-12 20:47:48 -070098const ButtonLocation kCameraLog(3, 14);
Austin Schuh4e2629d2019-03-28 14:44:37 -070099
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800100const ElevatorWristPosition kStowPos{0.36, 0.0};
Austin Schuh02be8b92019-03-24 16:04:14 -0700101const ElevatorWristPosition kClimbPos{0.0, M_PI / 4.0};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800102
Austin Schuh139f59d2019-03-17 18:16:13 -0700103const ElevatorWristPosition kPanelHPIntakeForwrdPos{0.01, M_PI / 2.0};
104const ElevatorWristPosition kPanelHPIntakeBackwardPos{0.015, -M_PI / 2.0};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800105
106const ElevatorWristPosition kPanelForwardLowerPos{0.0, M_PI / 2.0};
107const ElevatorWristPosition kPanelBackwardLowerPos{0.0, -M_PI / 2.0};
108
Sabina Davise48004f2019-03-02 23:15:24 -0800109const ElevatorWristPosition kPanelForwardMiddlePos{0.75, M_PI / 2.0};
110const ElevatorWristPosition kPanelBackwardMiddlePos{0.78, -M_PI / 2.0};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800111
Sabina Davise48004f2019-03-02 23:15:24 -0800112const ElevatorWristPosition kPanelForwardUpperPos{1.51, M_PI / 2.0};
113const ElevatorWristPosition kPanelBackwardUpperPos{1.50, -M_PI / 2.0};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800114
Sabina Davise6fe6c52019-03-03 15:48:51 -0800115const ElevatorWristPosition kPanelCargoForwardPos{0.0, M_PI / 2.0};
116const ElevatorWristPosition kPanelCargoBackwardPos{0.0, -M_PI / 2.0};
117
Austin Schuh6c5deb12019-03-24 16:48:32 -0700118const ElevatorWristPosition kBallForwardLowerPos{0.21, 1.27};
Austin Schuh20dc0502019-03-30 07:24:07 -0700119const ElevatorWristPosition kBallBackwardLowerPos{0.43, -1.99};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800120
Austin Schuh20dc0502019-03-30 07:24:07 -0700121const ElevatorWristPosition kBallForwardMiddlePos{0.925, 1.21};
122const ElevatorWristPosition kBallBackwardMiddlePos{1.19, -1.98};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800123
Austin Schuh139f59d2019-03-17 18:16:13 -0700124const ElevatorWristPosition kBallForwardUpperPos{1.51, 0.961};
125const ElevatorWristPosition kBallBackwardUpperPos{1.44, -1.217};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800126
Austin Schuh20dc0502019-03-30 07:24:07 -0700127const ElevatorWristPosition kBallCargoForwardPos{0.59, 1.2};
128const ElevatorWristPosition kBallCargoBackwardPos{0.868265, -2.1};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800129
Sabina Davise6fe6c52019-03-03 15:48:51 -0800130const ElevatorWristPosition kBallHPIntakeForwardPos{0.55, 1.097};
131const ElevatorWristPosition kBallHPIntakeBackwardPos{0.89, -2.018};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800132
Austin Schuh20dc0502019-03-30 07:24:07 -0700133const ElevatorWristPosition kBallIntakePos{0.309, 2.13};
Austin Schuh2cf16b82019-02-15 23:23:22 -0800134
Sabina Davis91b23602019-01-21 00:06:01 -0800135class Reader : public ::aos::input::ActionJoystickInput {
136 public:
137 Reader(::aos::EventLoop *event_loop)
138 : ::aos::input::ActionJoystickInput(
139 event_loop,
James Kuszmaulccc368b2019-04-11 20:00:07 -0700140 ::y2019::control_loops::drivetrain::GetDrivetrainConfig(),
Austin Schuhbfb04122019-05-22 21:16:51 -0700141 ::aos::input::DrivetrainInputReader::InputType::kPistol,
James Kuszmaulccc368b2019-04-11 20:00:07 -0700142 {.run_teleop_in_auto = true,
Austin Schuhc087b102019-05-12 15:33:12 -0700143 .cancel_auto_button = kCancelAutoMode}),
144 target_selector_hint_sender_(
145 event_loop->MakeSender<
146 ::y2019::control_loops::drivetrain::TargetSelectorHint>(
Austin Schuheb99d072019-05-12 21:03:38 -0700147 ".y2019.control_loops.drivetrain.target_selector_hint")),
148 localizer_control_sender_(
149 event_loop->MakeSender<
150 ::frc971::control_loops::drivetrain::LocalizerControl>(
Austin Schuh5671a8c2019-05-19 17:01:04 -0700151 ".frc971.control_loops.drivetrain.localizer_control")),
152 camera_log_sender_(
153 event_loop->MakeSender<::y2019::CameraLog>(".y2019.camera_log")) {
Tyler Chatowe0241452019-03-08 21:07:50 -0800154 const uint16_t team = ::aos::network::GetTeamNumber();
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800155 superstructure_queue.goal.FetchLatest();
156 if (superstructure_queue.goal.get()) {
Sabina Davisc6329342019-03-01 20:44:42 -0800157 grab_piece_ = superstructure_queue.goal->suction.grab_piece;
Austin Schuhbb1df6f2019-03-17 18:15:43 -0700158 switch_ball_ = superstructure_queue.goal->suction.gamepiece_mode == 0;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800159 }
Tyler Chatowe0241452019-03-08 21:07:50 -0800160 video_tx_.reset(new ProtoTXUdpSocket<VisionControl>(
161 StringPrintf("10.%d.%d.179", team / 100, team % 100), 5000));
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800162 }
Sabina Davis91b23602019-01-21 00:06:01 -0800163
Austin Schuha78857f2019-03-13 22:43:41 -0700164 void AutoEnded() override {
165 LOG(INFO, "Auto ended, assuming disc and have piece\n");
166 grab_piece_ = true;
167 switch_ball_ = false;
168 }
169
170 void HandleTeleop(const ::aos::input::driver_station::Data &data) override {
Austin Schuhaab7e162019-03-13 22:44:58 -0700171 ::aos::monotonic_clock::time_point monotonic_now =
172 ::aos::monotonic_clock::now();
Sabina Davis91b23602019-01-21 00:06:01 -0800173 superstructure_queue.position.FetchLatest();
174 superstructure_queue.status.FetchLatest();
175 if (!superstructure_queue.status.get() ||
176 !superstructure_queue.position.get()) {
Austin Schuhe2f22482019-04-13 23:05:43 -0700177 LOG(ERROR, "Got no superstructure status or position packet.\n");
Sabina Davis91b23602019-01-21 00:06:01 -0800178 return;
179 }
180
Austin Schuhaab7e162019-03-13 22:44:58 -0700181 if (!superstructure_queue.status->has_piece) {
182 last_not_has_piece_ = monotonic_now;
183 }
184
Sabina Davis91b23602019-01-21 00:06:01 -0800185 auto new_superstructure_goal = superstructure_queue.goal.MakeMessage();
186
James Kuszmaul7d1ef442019-03-23 20:20:50 -0700187 {
Austin Schuhc087b102019-05-12 15:33:12 -0700188 auto target_hint = target_selector_hint_sender_.MakeMessage();
James Kuszmaul7d1ef442019-03-23 20:20:50 -0700189 if (data.IsPressed(kNearCargoHint)) {
190 target_hint->suggested_target = 1;
191 } else if (data.IsPressed(kMidCargoHint)) {
192 target_hint->suggested_target = 2;
193 } else if (data.IsPressed(kFarCargoHint)) {
194 target_hint->suggested_target = 3;
195 } else {
James Kuszmaul518640d2019-04-13 15:50:50 -0700196 const double cargo_joy_y = data.GetAxis(kCargoSelectorY);
197 const double cargo_joy_x = data.GetAxis(kCargoSelectorX);
198 if (cargo_joy_y > 0.5) {
James Kuszmaul518640d2019-04-13 15:50:50 -0700199 target_hint->suggested_target = 1;
James Kuszmaul1b822b42019-04-14 14:27:35 -0700200 } else if (cargo_joy_y < -0.5) {
201 target_hint->suggested_target = 3;
James Kuszmaul518640d2019-04-13 15:50:50 -0700202 } else if (::std::abs(cargo_joy_x) > 0.5) {
203 target_hint->suggested_target = 2;
204 } else {
205 target_hint->suggested_target = 0;
206 }
James Kuszmaul7d1ef442019-03-23 20:20:50 -0700207 }
208 if (!target_hint.Send()) {
209 LOG(ERROR, "Failed to send target selector hint.\n");
210 }
211 }
212
James Kuszmaul518640d2019-04-13 15:50:50 -0700213 if (data.PosEdge(kResetLocalizerLeft)) {
Austin Schuheb99d072019-05-12 21:03:38 -0700214 auto localizer_resetter = localizer_control_sender_.MakeMessage();
James Kuszmaul518640d2019-04-13 15:50:50 -0700215 // Start at the left feeder station.
216 localizer_resetter->x = 0.6;
217 localizer_resetter->y = 3.4;
218 localizer_resetter->keep_current_theta = true;
219
220 if (!localizer_resetter.Send()) {
221 LOG(ERROR, "Failed to reset localizer.\n");
222 }
223 }
224
225 if (data.PosEdge(kResetLocalizerRight)) {
Austin Schuheb99d072019-05-12 21:03:38 -0700226 auto localizer_resetter = localizer_control_sender_.MakeMessage();
James Kuszmaul518640d2019-04-13 15:50:50 -0700227 // Start at the left feeder station.
228 localizer_resetter->x = 0.6;
229 localizer_resetter->y = -3.4;
230 localizer_resetter->keep_current_theta = true;
231
232 if (!localizer_resetter.Send()) {
233 LOG(ERROR, "Failed to reset localizer.\n");
234 }
235 }
236
Austin Schuhbb1df6f2019-03-17 18:15:43 -0700237 if (data.PosEdge(kResetLocalizerLeftForwards)) {
Austin Schuheb99d072019-05-12 21:03:38 -0700238 auto localizer_resetter = localizer_control_sender_.MakeMessage();
Austin Schuh3632f8d2019-03-22 21:14:14 -0700239 // Start at the left feeder station.
James Kuszmauld8deb682019-03-10 10:38:42 -0700240 localizer_resetter->x = 0.4;
241 localizer_resetter->y = 3.4;
242 localizer_resetter->theta = 0.0;
Austin Schuhbb1df6f2019-03-17 18:15:43 -0700243
244 if (!localizer_resetter.Send()) {
245 LOG(ERROR, "Failed to reset localizer.\n");
246 }
247 }
248
249 if (data.PosEdge(kResetLocalizerLeftBackwards)) {
Austin Schuheb99d072019-05-12 21:03:38 -0700250 auto localizer_resetter = localizer_control_sender_.MakeMessage();
Austin Schuhbb1df6f2019-03-17 18:15:43 -0700251 // Start at the left feeder station.
252 localizer_resetter->x = 0.4;
253 localizer_resetter->y = 3.4;
254 localizer_resetter->theta = M_PI;
255
256 if (!localizer_resetter.Send()) {
257 LOG(ERROR, "Failed to reset localizer.\n");
258 }
259 }
260
Austin Schuhbb1df6f2019-03-17 18:15:43 -0700261 if (data.PosEdge(kResetLocalizerRightForwards)) {
Austin Schuheb99d072019-05-12 21:03:38 -0700262 auto localizer_resetter = localizer_control_sender_.MakeMessage();
Austin Schuh3632f8d2019-03-22 21:14:14 -0700263 // Start at the right feeder station.
Austin Schuhbb1df6f2019-03-17 18:15:43 -0700264 localizer_resetter->x = 0.4;
265 localizer_resetter->y = -3.4;
266 localizer_resetter->theta = 0.0;
267
268 if (!localizer_resetter.Send()) {
269 LOG(ERROR, "Failed to reset localizer.\n");
270 }
271 }
272
273 if (data.PosEdge(kResetLocalizerRightBackwards)) {
Austin Schuheb99d072019-05-12 21:03:38 -0700274 auto localizer_resetter = localizer_control_sender_.MakeMessage();
Austin Schuh3632f8d2019-03-22 21:14:14 -0700275 // Start at the right feeder station.
Austin Schuhbb1df6f2019-03-17 18:15:43 -0700276 localizer_resetter->x = 0.4;
277 localizer_resetter->y = -3.4;
278 localizer_resetter->theta = M_PI;
279
James Kuszmauld8deb682019-03-10 10:38:42 -0700280 if (!localizer_resetter.Send()) {
281 LOG(ERROR, "Failed to reset localizer.\n");
282 }
283 }
284
James Kuszmaul13738862019-04-14 10:48:00 -0700285 if (data.PosEdge(kRelease) &&
286 monotonic_now >
287 last_release_button_press_ + ::std::chrono::milliseconds(500)) {
288 if (superstructure_queue.status->has_piece) {
289 release_mode_ = ReleaseButtonMode::kRelease;
290 } else {
291 release_mode_ = ReleaseButtonMode::kBallIntake;
292 }
293 }
294
295 if (data.IsPressed(kRelease)) {
296 last_release_button_press_ = monotonic_now;
297 }
298
Austin Schuh1a8fb572019-05-08 20:07:58 -0700299 LOG(INFO, "has_piece: %d\n", superstructure_queue.status->has_piece);
Austin Schuh1a17e132019-02-17 15:05:06 -0800300 if (data.IsPressed(kSuctionBall)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800301 grab_piece_ = true;
Austin Schuh1a17e132019-02-17 15:05:06 -0800302 } else if (data.IsPressed(kSuctionHatch)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800303 grab_piece_ = true;
James Kuszmaul13738862019-04-14 10:48:00 -0700304 } else if ((release_mode_ == ReleaseButtonMode::kRelease &&
305 data.IsPressed(kRelease)) ||
Tyler Chatow5eeee902019-04-12 20:47:48 -0700306 data.IsPressed(kReleaseButtonBoard) ||
Austin Schuh1a17e132019-02-17 15:05:06 -0800307 !superstructure_queue.status->has_piece) {
Sabina Davisc6329342019-03-01 20:44:42 -0800308 grab_piece_ = false;
Austin Schuh1a8fb572019-05-08 20:07:58 -0700309 LOG(INFO, "releasing due to other thing\n");
Austin Schuh1a17e132019-02-17 15:05:06 -0800310 }
Sabina Davis91b23602019-01-21 00:06:01 -0800311
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800312 if (data.IsPressed(kRocketBackwardUnpressed)) {
313 elevator_wrist_pos_ = kStowPos;
314 }
315 new_superstructure_goal->intake.unsafe_goal = -1.2;
316 new_superstructure_goal->roller_voltage = 0.0;
317
James Kuszmaul13738862019-04-14 10:48:00 -0700318 const bool kDoBallIntake =
319 (!climbed_ && release_mode_ == ReleaseButtonMode::kBallIntake &&
320 data.IsPressed(kRelease)) ||
321 data.GetAxis(kBallIntake) > 0.9;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800322 const bool kDoBallOutake = data.GetAxis(kBallOutake) > 0.9;
323
324 if (data.IsPressed(kPanelSwitch)) {
325 switch_ball_ = false;
326 } else if (data.IsPressed(kCargoSwitch)) {
327 switch_ball_ = true;
328 }
329
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800330 if (switch_ball_) {
331 if (superstructure_queue.status->has_piece) {
332 new_superstructure_goal->wrist.profile_params.max_acceleration = 20;
Austin Schuh1a17e132019-02-17 15:05:06 -0800333 }
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800334
335 // Go to intake position and apply vacuum
336 if (data.IsPressed(kBallHPIntakeForward)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800337 grab_piece_ = true;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800338 elevator_wrist_pos_ = kBallHPIntakeForwardPos;
339 } else if (data.IsPressed(kBallHPIntakeBackward)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800340 grab_piece_ = true;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800341 elevator_wrist_pos_ = kBallHPIntakeBackwardPos;
342 }
343
344 // Go to elevator/wrist position. Overrides intake position if pressed so
345 // we can re-grab the ball.
346 if (data.IsPressed(kRocketForwardLower)) {
347 elevator_wrist_pos_ = kBallForwardLowerPos;
348 } else if (data.IsPressed(kRocketBackwardLower)) {
349 elevator_wrist_pos_ = kBallBackwardLowerPos;
350 } else if (data.IsPressed(kRocketForwardMiddle)) {
351 elevator_wrist_pos_ = kBallForwardMiddlePos;
352 } else if (data.IsPressed(kRocketBackwardMiddle)) {
353 elevator_wrist_pos_ = kBallBackwardMiddlePos;
354 } else if (data.IsPressed(kRocketForwardUpper)) {
355 elevator_wrist_pos_ = kBallForwardUpperPos;
356 } else if (data.IsPressed(kRocketBackwardUpper)) {
357 elevator_wrist_pos_ = kBallBackwardUpperPos;
358 } else if (data.IsPressed(kCargoForward)) {
359 elevator_wrist_pos_ = kBallCargoForwardPos;
360 } else if (data.IsPressed(kCargoBackward)) {
361 elevator_wrist_pos_ = kBallCargoBackwardPos;
362 }
Austin Schuh1a17e132019-02-17 15:05:06 -0800363 } else {
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800364 if (data.IsPressed(kPanelHPIntakeForward)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800365 grab_piece_ = true;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800366 elevator_wrist_pos_ = kPanelHPIntakeForwrdPos;
367 } else if (data.IsPressed(kPanelHPIntakeBackward)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800368 grab_piece_ = true;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800369 elevator_wrist_pos_ = kPanelHPIntakeBackwardPos;
370 }
371
372 // Go to elevator/wrist position. Overrides intake position if pressed so
373 // we can re-grab the panel.
374 if (data.IsPressed(kRocketForwardLower)) {
375 elevator_wrist_pos_ = kPanelForwardLowerPos;
376 } else if (data.IsPressed(kRocketBackwardLower)) {
377 elevator_wrist_pos_ = kPanelBackwardLowerPos;
378 } else if (data.IsPressed(kRocketForwardMiddle)) {
379 elevator_wrist_pos_ = kPanelForwardMiddlePos;
380 } else if (data.IsPressed(kRocketBackwardMiddle)) {
381 elevator_wrist_pos_ = kPanelBackwardMiddlePos;
382 } else if (data.IsPressed(kRocketForwardUpper)) {
383 elevator_wrist_pos_ = kPanelForwardUpperPos;
384 } else if (data.IsPressed(kRocketBackwardUpper)) {
385 elevator_wrist_pos_ = kPanelBackwardUpperPos;
Sabina Davise6fe6c52019-03-03 15:48:51 -0800386 } else if (data.IsPressed(kCargoForward)) {
387 elevator_wrist_pos_ = kPanelCargoForwardPos;
388 } else if (data.IsPressed(kCargoBackward)) {
389 elevator_wrist_pos_ = kPanelCargoBackwardPos;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800390 }
Austin Schuh1a17e132019-02-17 15:05:06 -0800391 }
392
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800393 if (switch_ball_) {
394 if (kDoBallOutake ||
Austin Schuhaab7e162019-03-13 22:44:58 -0700395 (kDoBallIntake &&
Austin Schuh20dc0502019-03-30 07:24:07 -0700396 monotonic_now < last_not_has_piece_ + chrono::milliseconds(200))) {
Austin Schuhd8098b42019-05-08 20:48:17 -0700397 new_superstructure_goal->intake.unsafe_goal = 0.83;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800398 }
Austin Schuh23a51632019-02-19 16:50:36 -0800399
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800400 if (kDoBallIntake && !superstructure_queue.status->has_piece) {
401 elevator_wrist_pos_ = kBallIntakePos;
402 new_superstructure_goal->roller_voltage = 9.0;
Sabina Davisc6329342019-03-01 20:44:42 -0800403 grab_piece_ = true;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800404 } else {
405 if (kDoBallOutake) {
406 new_superstructure_goal->roller_voltage = -6.0;
407 } else {
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800408 new_superstructure_goal->roller_voltage = 0.0;
409 }
410 }
Austin Schuh23a51632019-02-19 16:50:36 -0800411 }
Austin Schuh1a17e132019-02-17 15:05:06 -0800412
Austin Schuh457bde32019-03-17 18:16:41 -0700413 constexpr double kDeployStiltPosition = 0.5;
414
Austin Schuh457bde32019-03-17 18:16:41 -0700415 if (data.IsPressed(kFallOver)) {
416 new_superstructure_goal->stilts.unsafe_goal = 0.71;
417 new_superstructure_goal->stilts.profile_params.max_velocity = 0.65;
418 new_superstructure_goal->stilts.profile_params.max_acceleration = 1.25;
Austin Schuhe2f22482019-04-13 23:05:43 -0700419 } else if (data.IsPressed(kHalfStilt)) {
420 was_above_ = false;
421 new_superstructure_goal->stilts.unsafe_goal = 0.345;
422 new_superstructure_goal->stilts.profile_params.max_velocity = 0.65;
423 } else if (data.IsPressed(kDeployStilt) || was_above_) {
Austin Schuh457bde32019-03-17 18:16:41 -0700424 new_superstructure_goal->stilts.unsafe_goal = kDeployStiltPosition;
425 new_superstructure_goal->stilts.profile_params.max_velocity = 0.65;
426 new_superstructure_goal->stilts.profile_params.max_acceleration = 2.0;
Austin Schuh457bde32019-03-17 18:16:41 -0700427 } else {
428 new_superstructure_goal->stilts.unsafe_goal = 0.005;
429 new_superstructure_goal->stilts.profile_params.max_velocity = 0.65;
430 new_superstructure_goal->stilts.profile_params.max_acceleration = 2.0;
431 }
432
James Kuszmaul0448f142019-03-24 16:22:34 -0700433 if (superstructure_queue.status->stilts.position > 0.1) {
Austin Schuh02be8b92019-03-24 16:04:14 -0700434 elevator_wrist_pos_ = kClimbPos;
James Kuszmaul13738862019-04-14 10:48:00 -0700435 climbed_ = true;
Austin Schuhd8a18bb2019-03-24 19:21:38 -0700436 new_superstructure_goal->wrist.profile_params.max_acceleration = 10;
437 new_superstructure_goal->elevator.profile_params.max_acceleration = 6;
Austin Schuh02be8b92019-03-24 16:04:14 -0700438 }
439
Austin Schuhe2f22482019-04-13 23:05:43 -0700440 // If we've been asked to go above deploy and made it up that high, latch
441 // was_above.
442 if (new_superstructure_goal->stilts.unsafe_goal > kDeployStiltPosition &&
443 superstructure_queue.status->stilts.position >= kDeployStiltPosition) {
444 was_above_ = true;
Austin Schuh255ff342019-04-14 19:56:12 -0700445 } else if ((superstructure_queue.position->platform_left_detect &&
Austin Schuhe2f22482019-04-13 23:05:43 -0700446 superstructure_queue.position->platform_right_detect) &&
447 !data.IsPressed(kDeployStilt) && !data.IsPressed(kFallOver)) {
Austin Schuhe2f22482019-04-13 23:05:43 -0700448 was_above_ = false;
449 }
450
Austin Schuh457bde32019-03-17 18:16:41 -0700451 if (superstructure_queue.status->stilts.position > kDeployStiltPosition &&
452 new_superstructure_goal->stilts.unsafe_goal == kDeployStiltPosition) {
453 new_superstructure_goal->stilts.profile_params.max_velocity = 0.30;
454 new_superstructure_goal->stilts.profile_params.max_acceleration = 0.75;
455 }
456
James Kuszmaul13738862019-04-14 10:48:00 -0700457 if ((release_mode_ == ReleaseButtonMode::kRelease &&
458 data.IsPressed(kRelease)) ||
459 data.IsPressed(kReleaseButtonBoard)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800460 grab_piece_ = false;
Austin Schuh1a8fb572019-05-08 20:07:58 -0700461 LOG(INFO, "Releasing due to button\n");
Austin Schuh1a17e132019-02-17 15:05:06 -0800462 }
463
Sabina Davisc6329342019-03-01 20:44:42 -0800464 if (switch_ball_) {
465 new_superstructure_goal->suction.gamepiece_mode = 0;
466 } else {
467 new_superstructure_goal->suction.gamepiece_mode = 1;
468 }
469
Tyler Chatowe0241452019-03-08 21:07:50 -0800470 vision_control_.set_flip_image(elevator_wrist_pos_.wrist < 0);
471
Sabina Davisc6329342019-03-01 20:44:42 -0800472 new_superstructure_goal->suction.grab_piece = grab_piece_;
Sabina Davis91b23602019-01-21 00:06:01 -0800473
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800474 new_superstructure_goal->elevator.unsafe_goal =
475 elevator_wrist_pos_.elevator;
476 new_superstructure_goal->wrist.unsafe_goal = elevator_wrist_pos_.wrist;
Sabina Davis91b23602019-01-21 00:06:01 -0800477
478 LOG_STRUCT(DEBUG, "sending goal", *new_superstructure_goal);
479 if (!new_superstructure_goal.Send()) {
480 LOG(ERROR, "Sending superstructure goal failed.\n");
481 }
Tyler Chatowe0241452019-03-08 21:07:50 -0800482
Austin Schuhaab7e162019-03-13 22:44:58 -0700483 if (monotonic_now >
484 last_vision_control_ + ::std::chrono::milliseconds(50)) {
Tyler Chatow4fedeea2019-03-10 15:33:36 -0700485 video_tx_->Send(vision_control_);
Austin Schuhaab7e162019-03-13 22:44:58 -0700486 last_vision_control_ = monotonic_now;
Tyler Chatow4fedeea2019-03-10 15:33:36 -0700487 }
Austin Schuh4e2629d2019-03-28 14:44:37 -0700488
489 {
Austin Schuh5671a8c2019-05-19 17:01:04 -0700490 auto camera_log_message = camera_log_sender_.MakeMessage();
Austin Schuh4e2629d2019-03-28 14:44:37 -0700491 camera_log_message->log = data.IsPressed(kCameraLog);
492 LOG_STRUCT(DEBUG, "camera_log", *camera_log_message);
493 camera_log_message.Send();
494 }
Sabina Davis91b23602019-01-21 00:06:01 -0800495 }
496
497 private:
Austin Schuha9644062019-03-28 14:31:52 -0700498 uint32_t GetAutonomousMode() override {
499 ::frc971::autonomous::auto_mode.FetchLatest();
500 if (::frc971::autonomous::auto_mode.get() == nullptr) {
501 LOG(WARNING, "no auto mode values\n");
502 return 0;
503 }
504 return ::frc971::autonomous::auto_mode->mode;
505 }
506
Austin Schuhc087b102019-05-12 15:33:12 -0700507 ::aos::Sender<::y2019::control_loops::drivetrain::TargetSelectorHint>
508 target_selector_hint_sender_;
509
Austin Schuheb99d072019-05-12 21:03:38 -0700510 ::aos::Sender<::frc971::control_loops::drivetrain::LocalizerControl>
511 localizer_control_sender_;
512
Austin Schuh5671a8c2019-05-19 17:01:04 -0700513 ::aos::Sender<::y2019::CameraLog> camera_log_sender_;
514
Austin Schuhe2f22482019-04-13 23:05:43 -0700515 // Bool to track if we've been above the deploy position. Once this bool is
516 // set, don't let the stilts retract until we see the platform.
517 bool was_above_ = false;
518
Sabina Davis91b23602019-01-21 00:06:01 -0800519 // Current goals here.
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800520 ElevatorWristPosition elevator_wrist_pos_ = kStowPos;
Sabina Davisc6329342019-03-01 20:44:42 -0800521 bool grab_piece_ = false;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800522
523 bool switch_ball_ = false;
Tyler Chatowe0241452019-03-08 21:07:50 -0800524
James Kuszmaul13738862019-04-14 10:48:00 -0700525 bool climbed_ = false;
526
527 enum class ReleaseButtonMode {
528 kBallIntake,
529 kRelease,
530 };
531
532 ReleaseButtonMode release_mode_ = ReleaseButtonMode::kRelease;
533 aos::monotonic_clock::time_point last_release_button_press_ =
534 aos::monotonic_clock::min_time;
535
Tyler Chatowe0241452019-03-08 21:07:50 -0800536 VisionControl vision_control_;
537 ::std::unique_ptr<ProtoTXUdpSocket<VisionControl>> video_tx_;
Tyler Chatow4fedeea2019-03-10 15:33:36 -0700538 ::aos::monotonic_clock::time_point last_vision_control_ =
539 ::aos::monotonic_clock::time_point::min();
Austin Schuhaab7e162019-03-13 22:44:58 -0700540
541 // Time at which we last did not have a game piece.
542 ::aos::monotonic_clock::time_point last_not_has_piece_ =
543 ::aos::monotonic_clock::time_point::min();
Sabina Davis91b23602019-01-21 00:06:01 -0800544};
545
546} // namespace joysticks
547} // namespace input
548} // namespace y2019
549
550int main() {
551 ::aos::Init(-1);
552 ::aos::ShmEventLoop event_loop;
553 ::y2019::input::joysticks::Reader reader(&event_loop);
554 reader.Run();
555 ::aos::Cleanup();
556}