blob: 887ac5ee5d6fba0a9fcaa7fe2f0b373d97ac91f7 [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>
5
6#include "aos/actions/actions.h"
7#include "aos/init.h"
8#include "aos/input/action_joystick_input.h"
9#include "aos/input/driver_station_data.h"
10#include "aos/input/drivetrain_input.h"
11#include "aos/input/joystick_input.h"
12#include "aos/logging/logging.h"
13#include "aos/logging/logging.h"
14#include "aos/util/log_interval.h"
15#include "frc971/autonomous/auto.q.h"
16#include "frc971/autonomous/base_autonomous_actor.h"
17#include "frc971/control_loops/drivetrain/drivetrain.q.h"
18
19#include "y2019/control_loops/drivetrain/drivetrain_base.h"
20#include "y2019/control_loops/superstructure/superstructure.q.h"
Sabina Davisc6329342019-03-01 20:44:42 -080021#include "y2019/status_light.q.h"
Sabina Davis91b23602019-01-21 00:06:01 -080022
23using ::y2019::control_loops::superstructure::superstructure_queue;
24using ::aos::input::driver_station::ButtonLocation;
25using ::aos::input::driver_station::ControlBit;
26using ::aos::input::driver_station::JoystickAxis;
27using ::aos::input::driver_station::POVLocation;
28
29namespace y2019 {
30namespace input {
31namespace joysticks {
32
Austin Schuh1a17e132019-02-17 15:05:06 -080033const ButtonLocation kSuctionBall(3, 13);
34const ButtonLocation kSuctionHatch(3, 12);
35const ButtonLocation kDeployStilt(3, 8);
36const ButtonLocation kFallOver(3, 9);
Austin Schuh2cf16b82019-02-15 23:23:22 -080037
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080038struct ElevatorWristPosition {
39 double elevator;
40 double wrist;
41};
Sabina Davis91b23602019-01-21 00:06:01 -080042
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080043const ButtonLocation kRocketForwardLower(5, 1);
44const ButtonLocation kRocketForwardMiddle(5, 2);
45const ButtonLocation kRocketForwardUpper(5, 4);
46const ButtonLocation kCargoForward(5, 3);
47
48const POVLocation kRocketBackwardUnpressed(5, -1);
49const POVLocation kRocketBackwardLower(5, 180);
50const POVLocation kRocketBackwardMiddle(5, 90);
51const POVLocation kRocketBackwardUpper(5, 0);
52const POVLocation kCargoBackward(5, 270);
53
54const ButtonLocation kPanelSwitch(5, 7);
55const ButtonLocation kCargoSwitch(5, 8);
56
57const ButtonLocation kBallHPIntakeForward(5, 6);
58const ButtonLocation kBallHPIntakeBackward(5, 5);
59const JoystickAxis kBallOutake(5, 3);
60const JoystickAxis kBallIntake(5, 4);
61
62const ButtonLocation kPanelHPIntakeForward(5, 6);
63const ButtonLocation kPanelHPIntakeBackward(5, 5);
64
65const ButtonLocation kRelease(2, 4);
66
67const ElevatorWristPosition kStowPos{0.36, 0.0};
68
69const ElevatorWristPosition kPanelHPIntakeForwrdPos{0.04, M_PI / 2.0};
70const ElevatorWristPosition kPanelHPIntakeBackwardPos{0.04, -M_PI / 2.0};
71
72const ElevatorWristPosition kPanelForwardLowerPos{0.0, M_PI / 2.0};
73const ElevatorWristPosition kPanelBackwardLowerPos{0.0, -M_PI / 2.0};
74
Sabina Davise48004f2019-03-02 23:15:24 -080075const ElevatorWristPosition kPanelForwardMiddlePos{0.75, M_PI / 2.0};
76const ElevatorWristPosition kPanelBackwardMiddlePos{0.78, -M_PI / 2.0};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080077
Sabina Davise48004f2019-03-02 23:15:24 -080078const ElevatorWristPosition kPanelForwardUpperPos{1.51, M_PI / 2.0};
79const ElevatorWristPosition kPanelBackwardUpperPos{1.50, -M_PI / 2.0};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080080
Sabina Davise48004f2019-03-02 23:15:24 -080081const ElevatorWristPosition kBallForwardLowerPos{0.4598, 1.5863};
82const ElevatorWristPosition kBallBackwardLowerPos{0.175, -1.61};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080083
Sabina Davise48004f2019-03-02 23:15:24 -080084const ElevatorWristPosition kBallForwardMiddlePos{1.16, 1.546};
85const ElevatorWristPosition kBallBackwardMiddlePos{0.876021, -1.546};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080086
Sabina Davise48004f2019-03-02 23:15:24 -080087const ElevatorWristPosition kBallForwardUpperPos{1.50, 0.961};
88const ElevatorWristPosition kBallBackwardUpperPos{1.41, -1.217};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080089
Sabina Davise48004f2019-03-02 23:15:24 -080090const ElevatorWristPosition kBallCargoForwardPos{0.699044, 1.353};
91const ElevatorWristPosition kBallCargoBackwardPos{0.828265, -1.999};
Tyler Chatow7bcb52f2019-02-24 00:16:54 -080092
93const ElevatorWristPosition kBallHPIntakeForwardPos{0.340, 0.737};
94const ElevatorWristPosition kBallHPIntakeBackwardPos{0.52, -1.1};
95
96const ElevatorWristPosition kBallIntakePos{0.29, 2.14};
Austin Schuh2cf16b82019-02-15 23:23:22 -080097
Sabina Davis91b23602019-01-21 00:06:01 -080098class Reader : public ::aos::input::ActionJoystickInput {
99 public:
100 Reader(::aos::EventLoop *event_loop)
101 : ::aos::input::ActionJoystickInput(
102 event_loop,
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800103 ::y2019::control_loops::drivetrain::GetDrivetrainConfig()) {
104 superstructure_queue.goal.FetchLatest();
105 if (superstructure_queue.goal.get()) {
Sabina Davisc6329342019-03-01 20:44:42 -0800106 grab_piece_ = superstructure_queue.goal->suction.grab_piece;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800107 }
108 }
Sabina Davis91b23602019-01-21 00:06:01 -0800109
110 void HandleTeleop(const ::aos::input::driver_station::Data &data) {
111 superstructure_queue.position.FetchLatest();
112 superstructure_queue.status.FetchLatest();
113 if (!superstructure_queue.status.get() ||
114 !superstructure_queue.position.get()) {
115 LOG(ERROR, "Got no superstructure status packet.\n");
116 return;
117 }
118
119 auto new_superstructure_goal = superstructure_queue.goal.MakeMessage();
120
Austin Schuh1a17e132019-02-17 15:05:06 -0800121 if (data.IsPressed(kSuctionBall)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800122 grab_piece_ = true;
Austin Schuh1a17e132019-02-17 15:05:06 -0800123 } else if (data.IsPressed(kSuctionHatch)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800124 grab_piece_ = true;
Austin Schuh1a17e132019-02-17 15:05:06 -0800125 } else if (data.IsPressed(kRelease) ||
126 !superstructure_queue.status->has_piece) {
Sabina Davisc6329342019-03-01 20:44:42 -0800127 grab_piece_ = false;
Austin Schuh1a17e132019-02-17 15:05:06 -0800128 }
Sabina Davis91b23602019-01-21 00:06:01 -0800129
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800130 if (data.IsPressed(kRocketBackwardUnpressed)) {
131 elevator_wrist_pos_ = kStowPos;
132 }
133 new_superstructure_goal->intake.unsafe_goal = -1.2;
134 new_superstructure_goal->roller_voltage = 0.0;
135
136 const bool kDoBallIntake = data.GetAxis(kBallIntake) > 0.9;
137 const bool kDoBallOutake = data.GetAxis(kBallOutake) > 0.9;
138
139 if (data.IsPressed(kPanelSwitch)) {
140 switch_ball_ = false;
141 } else if (data.IsPressed(kCargoSwitch)) {
142 switch_ball_ = true;
143 }
144
Sabina Davis91b23602019-01-21 00:06:01 -0800145 // TODO(sabina): max height please?
Austin Schuh77ac3212019-02-19 16:50:14 -0800146 if (data.IsPressed(kFallOver)) {
Austin Schuh1a17e132019-02-17 15:05:06 -0800147 new_superstructure_goal->stilts.unsafe_goal = 0.71;
Michael Schuh587dcb52019-02-28 21:31:03 -0800148 new_superstructure_goal->stilts.profile_params.max_velocity = 0.65;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800149 new_superstructure_goal->stilts.profile_params.max_acceleration = 2.0;
Austin Schuh77ac3212019-02-19 16:50:14 -0800150 } else if (data.IsPressed(kDeployStilt)) {
151 new_superstructure_goal->stilts.unsafe_goal = 0.50;
Michael Schuh587dcb52019-02-28 21:31:03 -0800152 new_superstructure_goal->stilts.profile_params.max_velocity = 0.65;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800153 if (stilts_was_above_) {
154 new_superstructure_goal->stilts.profile_params.max_acceleration = 0.75;
155 } else {
156 new_superstructure_goal->stilts.profile_params.max_acceleration = 2.0;
157 }
Sabina Davis91b23602019-01-21 00:06:01 -0800158 } else {
Austin Schuh2cf16b82019-02-15 23:23:22 -0800159 new_superstructure_goal->stilts.unsafe_goal = 0.01;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800160 new_superstructure_goal->stilts.profile_params.max_velocity = 0.25;
161 new_superstructure_goal->stilts.profile_params.max_acceleration = 2.0;
Sabina Davis91b23602019-01-21 00:06:01 -0800162 }
163
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800164 if (superstructure_queue.status->stilts.position > 0.65) {
165 stilts_was_above_ = true;
166 } else if (superstructure_queue.status->stilts.position < 0.1) {
167 stilts_was_above_ = false;
Austin Schuh2cf16b82019-02-15 23:23:22 -0800168 }
169
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800170 if (switch_ball_) {
171 if (superstructure_queue.status->has_piece) {
172 new_superstructure_goal->wrist.profile_params.max_acceleration = 20;
Austin Schuh1a17e132019-02-17 15:05:06 -0800173 }
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800174
175 // Go to intake position and apply vacuum
176 if (data.IsPressed(kBallHPIntakeForward)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800177 grab_piece_ = true;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800178 elevator_wrist_pos_ = kBallHPIntakeForwardPos;
179 } else if (data.IsPressed(kBallHPIntakeBackward)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800180 grab_piece_ = true;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800181 elevator_wrist_pos_ = kBallHPIntakeBackwardPos;
182 }
183
184 // Go to elevator/wrist position. Overrides intake position if pressed so
185 // we can re-grab the ball.
186 if (data.IsPressed(kRocketForwardLower)) {
187 elevator_wrist_pos_ = kBallForwardLowerPos;
188 } else if (data.IsPressed(kRocketBackwardLower)) {
189 elevator_wrist_pos_ = kBallBackwardLowerPos;
190 } else if (data.IsPressed(kRocketForwardMiddle)) {
191 elevator_wrist_pos_ = kBallForwardMiddlePos;
192 } else if (data.IsPressed(kRocketBackwardMiddle)) {
193 elevator_wrist_pos_ = kBallBackwardMiddlePos;
194 } else if (data.IsPressed(kRocketForwardUpper)) {
195 elevator_wrist_pos_ = kBallForwardUpperPos;
196 } else if (data.IsPressed(kRocketBackwardUpper)) {
197 elevator_wrist_pos_ = kBallBackwardUpperPos;
198 } else if (data.IsPressed(kCargoForward)) {
199 elevator_wrist_pos_ = kBallCargoForwardPos;
200 } else if (data.IsPressed(kCargoBackward)) {
201 elevator_wrist_pos_ = kBallCargoBackwardPos;
202 }
Austin Schuh1a17e132019-02-17 15:05:06 -0800203 } else {
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800204 if (data.IsPressed(kPanelHPIntakeForward)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800205 grab_piece_ = true;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800206 elevator_wrist_pos_ = kPanelHPIntakeForwrdPos;
207 } else if (data.IsPressed(kPanelHPIntakeBackward)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800208 grab_piece_ = true;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800209 elevator_wrist_pos_ = kPanelHPIntakeBackwardPos;
210 }
211
212 // Go to elevator/wrist position. Overrides intake position if pressed so
213 // we can re-grab the panel.
214 if (data.IsPressed(kRocketForwardLower)) {
215 elevator_wrist_pos_ = kPanelForwardLowerPos;
216 } else if (data.IsPressed(kRocketBackwardLower)) {
217 elevator_wrist_pos_ = kPanelBackwardLowerPos;
218 } else if (data.IsPressed(kRocketForwardMiddle)) {
219 elevator_wrist_pos_ = kPanelForwardMiddlePos;
220 } else if (data.IsPressed(kRocketBackwardMiddle)) {
221 elevator_wrist_pos_ = kPanelBackwardMiddlePos;
222 } else if (data.IsPressed(kRocketForwardUpper)) {
223 elevator_wrist_pos_ = kPanelForwardUpperPos;
224 } else if (data.IsPressed(kRocketBackwardUpper)) {
225 elevator_wrist_pos_ = kPanelBackwardUpperPos;
226 }
Austin Schuh1a17e132019-02-17 15:05:06 -0800227 }
228
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800229 if (switch_ball_) {
230 if (kDoBallOutake ||
231 (kDoBallIntake && !superstructure_queue.status->has_piece)) {
232 new_superstructure_goal->intake.unsafe_goal = 0.959327;
233 }
Austin Schuh23a51632019-02-19 16:50:36 -0800234
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800235 if (kDoBallIntake && !superstructure_queue.status->has_piece) {
236 elevator_wrist_pos_ = kBallIntakePos;
237 new_superstructure_goal->roller_voltage = 9.0;
Sabina Davisc6329342019-03-01 20:44:42 -0800238 grab_piece_ = true;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800239 } else {
240 if (kDoBallOutake) {
241 new_superstructure_goal->roller_voltage = -6.0;
242 } else {
243 new_superstructure_goal->intake.unsafe_goal = -1.2;
244 new_superstructure_goal->roller_voltage = 0.0;
245 }
246 }
Austin Schuh23a51632019-02-19 16:50:36 -0800247 }
Austin Schuh1a17e132019-02-17 15:05:06 -0800248
249 if (data.IsPressed(kRelease)) {
Sabina Davisc6329342019-03-01 20:44:42 -0800250 grab_piece_ = false;
Austin Schuh1a17e132019-02-17 15:05:06 -0800251 }
252
Sabina Davisc6329342019-03-01 20:44:42 -0800253 if (switch_ball_) {
254 new_superstructure_goal->suction.gamepiece_mode = 0;
255 } else {
256 new_superstructure_goal->suction.gamepiece_mode = 1;
257 }
258
259 new_superstructure_goal->suction.grab_piece = grab_piece_;
Sabina Davis91b23602019-01-21 00:06:01 -0800260
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800261 new_superstructure_goal->elevator.unsafe_goal =
262 elevator_wrist_pos_.elevator;
263 new_superstructure_goal->wrist.unsafe_goal = elevator_wrist_pos_.wrist;
Sabina Davis91b23602019-01-21 00:06:01 -0800264
265 LOG_STRUCT(DEBUG, "sending goal", *new_superstructure_goal);
266 if (!new_superstructure_goal.Send()) {
267 LOG(ERROR, "Sending superstructure goal failed.\n");
268 }
269 }
270
271 private:
272 // Current goals here.
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800273 ElevatorWristPosition elevator_wrist_pos_ = kStowPos;
Sabina Davisc6329342019-03-01 20:44:42 -0800274 bool grab_piece_ = false;
Tyler Chatow7bcb52f2019-02-24 00:16:54 -0800275
276 bool switch_ball_ = false;
277 bool stilts_was_above_ = false;
Sabina Davis91b23602019-01-21 00:06:01 -0800278};
279
280} // namespace joysticks
281} // namespace input
282} // namespace y2019
283
284int main() {
285 ::aos::Init(-1);
286 ::aos::ShmEventLoop event_loop;
287 ::y2019::input::joysticks::Reader reader(&event_loop);
288 reader.Run();
289 ::aos::Cleanup();
290}