blob: dd0e7367f809a4da9aa099c2bda1d1b3ee400f1e [file] [log] [blame]
Brian Silverman756f9ff2014-01-17 23:40:23 -08001#include <stdio.h>
2#include <string.h>
3#include <unistd.h>
4#include <math.h>
5
6#include "aos/linux_code/init.h"
7#include "aos/prime/input/joystick_input.h"
Austin Schuh06cbbf12014-02-22 02:07:31 -08008#include "aos/common/input/driver_station_data.h"
Brian Silverman756f9ff2014-01-17 23:40:23 -08009#include "aos/common/logging/logging.h"
10
11#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Austin Schuh5d8c5e72014-03-07 20:24:34 -080012#include "frc971/constants.h"
Brian Silverman6bf0d3c2014-03-08 12:52:54 -080013#include "frc971/queues/other_sensors.q.h"
Brian Silverman756f9ff2014-01-17 23:40:23 -080014#include "frc971/autonomous/auto.q.h"
Brian Silvermanfac5c292014-02-17 15:26:57 -080015#include "frc971/control_loops/claw/claw.q.h"
16#include "frc971/control_loops/shooter/shooter.q.h"
Ben Fredricksonaa450452014-03-01 09:41:18 +000017#include "frc971/actions/shoot_action.q.h"
Austin Schuh80ff2e12014-03-08 12:06:19 -080018#include "frc971/actions/action_client.h"
19#include "frc971/actions/catch_action.q.h"
20#include "frc971/actions/shoot_action.h"
Brian Silverman756f9ff2014-01-17 23:40:23 -080021
22using ::frc971::control_loops::drivetrain;
Brian Silverman6bf0d3c2014-03-08 12:52:54 -080023using ::frc971::sensors::gyro_reading;
Brian Silverman756f9ff2014-01-17 23:40:23 -080024
25using ::aos::input::driver_station::ButtonLocation;
26using ::aos::input::driver_station::JoystickAxis;
27using ::aos::input::driver_station::ControlBit;
28
29namespace frc971 {
30namespace input {
31namespace joysticks {
32
33const ButtonLocation kDriveControlLoopEnable1(1, 7),
34 kDriveControlLoopEnable2(1, 11);
35const JoystickAxis kSteeringWheel(1, 1), kDriveThrottle(2, 2);
36const ButtonLocation kShiftHigh(2, 1), kShiftLow(2, 3);
37const ButtonLocation kQuickTurn(1, 5);
Austin Schuh58d23682014-02-23 01:39:50 -080038
Austin Schuh80ff2e12014-03-08 12:06:19 -080039const ButtonLocation kCatch(3, 10);
40
41const ButtonLocation kFire(3, 9);
Austin Schuh9cb836e2014-02-23 19:25:55 -080042const ButtonLocation kUnload(2, 11);
43const ButtonLocation kReload(2, 6);
Austin Schuh58d23682014-02-23 01:39:50 -080044
Austin Schuh80ff2e12014-03-08 12:06:19 -080045const ButtonLocation kRollersOut(3, 8);
46const ButtonLocation kRollersIn(3, 3);
Austin Schuh58d23682014-02-23 01:39:50 -080047
Austin Schuh80ff2e12014-03-08 12:06:19 -080048const ButtonLocation kTuck(3, 4);
49const ButtonLocation kIntakePosition(3, 5);
50const ButtonLocation kIntakeOpenPosition(3, 11);
Austin Schuh80ff2e12014-03-08 12:06:19 -080051const JoystickAxis kFlipRobot(3, 3);
Austin Schuh58d23682014-02-23 01:39:50 -080052
Austin Schuh80ff2e12014-03-08 12:06:19 -080053const ButtonLocation kLongShot(3, 7);
54const ButtonLocation kMediumShot(3, 6);
55const ButtonLocation kShortShot(3, 2);
Austin Schuhade6d082014-03-09 00:53:06 -080056const ButtonLocation kTrussShot(3, 1);
Austin Schuh58d23682014-02-23 01:39:50 -080057
Brian Silverman18f6e642014-03-13 18:52:47 -070058const JoystickAxis kAdjustClawGoal(3, 2);
59const JoystickAxis kAdjustClawSeparation(3, 1);
60
Austin Schuh58d23682014-02-23 01:39:50 -080061struct ClawGoal {
62 double angle;
63 double separation;
64};
65
Austin Schuh5d8c5e72014-03-07 20:24:34 -080066struct ShotGoal {
67 ClawGoal claw;
68 double shot_power;
69 bool velocity_compensation;
70 double intake_power;
71};
72
Brian Silverman545f2ad2014-03-14 12:31:42 -070073const double kIntakePower = 4.0;
Brian Silvermanb3cf0ef2014-03-22 12:45:55 -070074// TODO(brians): This wants to be -0.04 on the comp bot. Make them both the
75// same.
76const double kGrabSeparation = 0;
Brian Silverman545f2ad2014-03-14 12:31:42 -070077const double kShootSeparation = 0.11 + kGrabSeparation;
78
Austin Schuh58d23682014-02-23 01:39:50 -080079const ClawGoal kTuckGoal = {-2.273474, -0.749484};
Brian Silverman545f2ad2014-03-14 12:31:42 -070080const ClawGoal kIntakeGoal = {-2.273474, kGrabSeparation};
Austin Schuh9cb836e2014-02-23 19:25:55 -080081const ClawGoal kIntakeOpenGoal = {-2.0, 1.2};
Austin Schuh58d23682014-02-23 01:39:50 -080082
Austin Schuh80ff2e12014-03-08 12:06:19 -080083// TODO(austin): Tune these by hand...
84const ClawGoal kFlippedTuckGoal = {2.733474, -0.75};
Brian Silverman545f2ad2014-03-14 12:31:42 -070085const ClawGoal kFlippedIntakeGoal = {2.0, kGrabSeparation};
Austin Schuh80ff2e12014-03-08 12:06:19 -080086const ClawGoal kFlippedIntakeOpenGoal = {0.95, 1.0};
87
Austin Schuhade6d082014-03-09 00:53:06 -080088//const ShotGoal kLongShotGoal = {
89 //{-M_PI / 2.0 + 0.46, kShootSeparation}, 120, false, kIntakePower};
Austin Schuh5d8c5e72014-03-07 20:24:34 -080090const ShotGoal kLongShotGoal = {
Austin Schuh5f4944e2014-03-09 16:40:39 -070091 {-0.60, kShootSeparation}, 80, false, kIntakePower};
Austin Schuh80ff2e12014-03-08 12:06:19 -080092const ShotGoal kMediumShotGoal = {
Austin Schuh5f4944e2014-03-09 16:40:39 -070093 {-0.90, kShootSeparation}, 105, true, kIntakePower};
Austin Schuh80ff2e12014-03-08 12:06:19 -080094const ShotGoal kShortShotGoal = {
Austin Schuhade6d082014-03-09 00:53:06 -080095 {-0.670, kShootSeparation}, 71.0, false, kIntakePower};
96const ShotGoal kTrussShotGoal = {
97 {-0.05, kShootSeparation}, 61.0, false, kIntakePower};
Brian Silverman756f9ff2014-01-17 23:40:23 -080098
Austin Schuh80ff2e12014-03-08 12:06:19 -080099const ShotGoal kFlippedLongShotGoal = {
Austin Schuh5f4944e2014-03-09 16:40:39 -0700100 {0.55, kShootSeparation}, 80, false, kIntakePower};
Austin Schuh80ff2e12014-03-08 12:06:19 -0800101const ShotGoal kFlippedMediumShotGoal = {
Austin Schuhade6d082014-03-09 00:53:06 -0800102 {0.85, kShootSeparation}, 105, true, kIntakePower};
Austin Schuh80ff2e12014-03-08 12:06:19 -0800103const ShotGoal kFlippedShortShotGoal = {
Austin Schuhade6d082014-03-09 00:53:06 -0800104 {0.57, kShootSeparation}, 80.0, false, kIntakePower};
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800105
106// Makes a new ShootAction action.
Austin Schuh80ff2e12014-03-08 12:06:19 -0800107::std::unique_ptr<TypedAction< ::frc971::actions::CatchActionGroup>>
108MakeCatchAction() {
109 return ::std::unique_ptr<TypedAction< ::frc971::actions::CatchActionGroup>>(
110 new TypedAction< ::frc971::actions::CatchActionGroup>(
111 &::frc971::actions::catch_action));
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800112}
113
114// A queue which queues Actions and cancels them.
115class ActionQueue {
116 public:
117 // Queues up an action for sending.
118 void QueueAction(::std::unique_ptr<Action> action) {
119 if (current_action_) {
Austin Schuhc95c2b72014-03-02 11:56:49 -0800120 LOG(INFO, "Queueing action, canceling prior\n");
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800121 current_action_->Cancel();
122 next_action_ = ::std::move(action);
123 } else {
Austin Schuhc95c2b72014-03-02 11:56:49 -0800124 LOG(INFO, "Queueing action\n");
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800125 current_action_ = ::std::move(action);
126 current_action_->Start();
127 }
128 }
129
130 // Cancels the current action, and runs the next one when the current one has
131 // finished.
132 void CancelCurrentAction() {
Austin Schuhc95c2b72014-03-02 11:56:49 -0800133 LOG(INFO, "Canceling current action\n");
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800134 if (current_action_) {
135 current_action_->Cancel();
136 }
137 }
138
139 // Cancels all running actions.
140 void CancelAllActions() {
Brian Silverman101b9642014-03-08 12:45:16 -0800141 LOG(DEBUG, "Cancelling all actions\n");
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800142 if (current_action_) {
143 current_action_->Cancel();
144 }
145 next_action_.reset();
146 }
147
148 // Runs the next action when the current one is finished running.
149 void Tick() {
150 if (current_action_) {
151 if (!current_action_->Running()) {
Austin Schuhc95c2b72014-03-02 11:56:49 -0800152 LOG(INFO, "Action is done.\n");
153 current_action_ = ::std::move(next_action_);
154 if (current_action_) {
155 LOG(INFO, "Running next action\n");
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800156 current_action_->Start();
157 }
158 }
159 }
160 }
161
162 // Returns true if any action is running or could be running.
163 // For a one cycle faster response, call Tick before running this.
164 bool Running() { return (bool)current_action_; }
165
166 private:
167 ::std::unique_ptr<Action> current_action_;
168 ::std::unique_ptr<Action> next_action_;
169};
170
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800171
Brian Silverman756f9ff2014-01-17 23:40:23 -0800172class Reader : public ::aos::input::JoystickInput {
173 public:
Austin Schuh58d23682014-02-23 01:39:50 -0800174 Reader()
175 : is_high_gear_(false),
Austin Schuh9cb836e2014-02-23 19:25:55 -0800176 shot_power_(80.0),
Austin Schuh58d23682014-02-23 01:39:50 -0800177 goal_angle_(0.0),
Brian Silverman545f2ad2014-03-14 12:31:42 -0700178 separation_angle_(kGrabSeparation),
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800179 velocity_compensation_(false),
180 intake_power_(0.0),
181 was_running_(false) {}
Brian Silverman756f9ff2014-01-17 23:40:23 -0800182
183 virtual void RunIteration(const ::aos::input::driver_station::Data &data) {
Brian Silverman756f9ff2014-01-17 23:40:23 -0800184 if (data.GetControlBit(ControlBit::kAutonomous)) {
185 if (data.PosEdge(ControlBit::kEnabled)){
186 LOG(INFO, "Starting auto mode\n");
187 ::frc971::autonomous::autonomous.MakeWithBuilder()
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800188 .run_auto(true)
189 .Send();
Brian Silverman756f9ff2014-01-17 23:40:23 -0800190 } else if (data.NegEdge(ControlBit::kEnabled)) {
191 LOG(INFO, "Stopping auto mode\n");
192 ::frc971::autonomous::autonomous.MakeWithBuilder()
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800193 .run_auto(false)
194 .Send();
Brian Silverman756f9ff2014-01-17 23:40:23 -0800195 }
Austin Schuh58d23682014-02-23 01:39:50 -0800196 } else {
197 HandleTeleop(data);
Brian Silverman756f9ff2014-01-17 23:40:23 -0800198 }
199 }
Austin Schuh58d23682014-02-23 01:39:50 -0800200
201 void HandleDrivetrain(const ::aos::input::driver_station::Data &data) {
202 bool is_control_loop_driving = false;
203 double left_goal = 0.0;
204 double right_goal = 0.0;
205 const double wheel = -data.GetAxis(kSteeringWheel);
206 const double throttle = -data.GetAxis(kDriveThrottle);
207 const double kThrottleGain = 1.0 / 2.5;
208 if (false && (data.IsPressed(kDriveControlLoopEnable1) ||
209 data.IsPressed(kDriveControlLoopEnable2))) {
210 // TODO(austin): Static sucks!
211 static double distance = 0.0;
212 static double angle = 0.0;
213 static double filtered_goal_distance = 0.0;
214 if (data.PosEdge(kDriveControlLoopEnable1) ||
215 data.PosEdge(kDriveControlLoopEnable2)) {
Brian Silverman6bf0d3c2014-03-08 12:52:54 -0800216 if (drivetrain.position.FetchLatest() && gyro_reading.FetchLatest()) {
Austin Schuh58d23682014-02-23 01:39:50 -0800217 distance = (drivetrain.position->left_encoder +
218 drivetrain.position->right_encoder) /
219 2.0 -
220 throttle * kThrottleGain / 2.0;
Brian Silverman6bf0d3c2014-03-08 12:52:54 -0800221 angle = gyro_reading->angle;
Austin Schuh58d23682014-02-23 01:39:50 -0800222 filtered_goal_distance = distance;
223 }
224 }
225 is_control_loop_driving = true;
226
227 // const double gyro_angle = Gyro.View().angle;
228 const double goal_theta = angle - wheel * 0.27;
229 const double goal_distance = distance + throttle * kThrottleGain;
230 const double robot_width = 22.0 / 100.0 * 2.54;
231 const double kMaxVelocity = 0.6;
232 if (goal_distance > kMaxVelocity * 0.02 + filtered_goal_distance) {
233 filtered_goal_distance += kMaxVelocity * 0.02;
234 } else if (goal_distance <
235 -kMaxVelocity * 0.02 + filtered_goal_distance) {
236 filtered_goal_distance -= kMaxVelocity * 0.02;
237 } else {
238 filtered_goal_distance = goal_distance;
239 }
240 left_goal = filtered_goal_distance - robot_width * goal_theta / 2.0;
241 right_goal = filtered_goal_distance + robot_width * goal_theta / 2.0;
242 is_high_gear_ = false;
243
244 LOG(DEBUG, "Left goal %f Right goal %f\n", left_goal, right_goal);
245 }
246 if (!drivetrain.goal.MakeWithBuilder()
247 .steering(wheel)
248 .throttle(throttle)
249 .highgear(is_high_gear_)
250 .quickturn(data.IsPressed(kQuickTurn))
251 .control_loop_driving(is_control_loop_driving)
252 .left_goal(left_goal)
253 .right_goal(right_goal)
254 .Send()) {
255 LOG(WARNING, "sending stick values failed\n");
256 }
257 if (data.PosEdge(kShiftHigh)) {
258 is_high_gear_ = false;
259 }
260 if (data.PosEdge(kShiftLow)) {
261 is_high_gear_ = true;
262 }
263 }
264
265 void SetGoal(ClawGoal goal) {
266 goal_angle_ = goal.angle;
267 separation_angle_ = goal.separation;
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800268 velocity_compensation_ = false;
269 intake_power_ = 0.0;
270 }
271
272 void SetGoal(ShotGoal goal) {
273 goal_angle_ = goal.claw.angle;
274 separation_angle_ = goal.claw.separation;
275 shot_power_ = goal.shot_power;
276 velocity_compensation_ = goal.velocity_compensation;
277 intake_power_ = goal.intake_power;
Austin Schuh58d23682014-02-23 01:39:50 -0800278 }
279
280 void HandleTeleop(const ::aos::input::driver_station::Data &data) {
281 HandleDrivetrain(data);
Austin Schuhc95c2b72014-03-02 11:56:49 -0800282 if (!data.GetControlBit(ControlBit::kEnabled)) {
283 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800284 LOG(DEBUG, "Canceling\n");
Austin Schuhc95c2b72014-03-02 11:56:49 -0800285 }
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800286 if (data.IsPressed(kRollersIn) || data.IsPressed(kRollersOut)) {
287 intake_power_ = 0.0;
Brian Silverman545f2ad2014-03-14 12:31:42 -0700288 separation_angle_ = kGrabSeparation;
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800289 }
Austin Schuh58d23682014-02-23 01:39:50 -0800290
Brian Silverman18f6e642014-03-13 18:52:47 -0700291 static const double kAdjustClawGoalDeadband = 0.08;
292 double claw_goal_adjust = data.GetAxis(kAdjustClawGoal);
293 if (::std::abs(claw_goal_adjust) < kAdjustClawGoalDeadband) {
294 claw_goal_adjust = 0;
295 } else {
296 claw_goal_adjust = (claw_goal_adjust -
297 ((claw_goal_adjust < 0) ? -kAdjustClawGoalDeadband
298 : kAdjustClawGoalDeadband)) *
299 0.035;
300 }
301 double claw_separation_adjust = data.GetAxis(kAdjustClawSeparation);
302 if (::std::abs(claw_separation_adjust) < kAdjustClawGoalDeadband) {
303 claw_separation_adjust = 0;
304 } else {
305 claw_separation_adjust =
306 (claw_separation_adjust -
307 ((claw_separation_adjust < 0) ? -kAdjustClawGoalDeadband
308 : kAdjustClawGoalDeadband)) *
309 -0.035;
310 }
311
Brian Silverman4d1795d2014-03-13 15:53:40 -0700312 if (data.GetAxis(kFlipRobot) > 0.5) {
Brian Silverman18f6e642014-03-13 18:52:47 -0700313 claw_goal_adjust += claw_separation_adjust;
314 claw_goal_adjust *= -1;
315
Austin Schuh80ff2e12014-03-08 12:06:19 -0800316 if (data.IsPressed(kIntakeOpenPosition)) {
317 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800318 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800319 SetGoal(kFlippedIntakeOpenGoal);
320 } else if (data.IsPressed(kIntakePosition)) {
321 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800322 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800323 SetGoal(kFlippedIntakeGoal);
324 } else if (data.IsPressed(kTuck)) {
325 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800326 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800327 SetGoal(kFlippedTuckGoal);
328 } else if (data.PosEdge(kLongShot)) {
329 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800330 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800331 SetGoal(kFlippedLongShotGoal);
332 } else if (data.PosEdge(kMediumShot)) {
333 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800334 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800335 SetGoal(kFlippedMediumShotGoal);
336 } else if (data.PosEdge(kShortShot)) {
337 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800338 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800339 SetGoal(kFlippedShortShotGoal);
Austin Schuhade6d082014-03-09 00:53:06 -0800340 } else if (data.PosEdge(kTrussShot)) {
341 action_queue_.CancelAllActions();
342 LOG(DEBUG, "Canceling\n");
343 SetGoal(kTrussShotGoal);
Austin Schuh80ff2e12014-03-08 12:06:19 -0800344 }
345 } else {
346 if (data.IsPressed(kIntakeOpenPosition)) {
347 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800348 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800349 SetGoal(kIntakeOpenGoal);
350 } else if (data.IsPressed(kIntakePosition)) {
351 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800352 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800353 SetGoal(kIntakeGoal);
354 } else if (data.IsPressed(kTuck)) {
355 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800356 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800357 SetGoal(kTuckGoal);
358 } else if (data.PosEdge(kLongShot)) {
359 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800360 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800361 SetGoal(kLongShotGoal);
362 } else if (data.PosEdge(kMediumShot)) {
363 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800364 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800365 SetGoal(kMediumShotGoal);
366 } else if (data.PosEdge(kShortShot)) {
367 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800368 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800369 SetGoal(kShortShotGoal);
Austin Schuhade6d082014-03-09 00:53:06 -0800370 } else if (data.PosEdge(kTrussShot)) {
371 action_queue_.CancelAllActions();
372 LOG(DEBUG, "Canceling\n");
373 SetGoal(kTrussShotGoal);
Austin Schuh80ff2e12014-03-08 12:06:19 -0800374 }
Austin Schuh58d23682014-02-23 01:39:50 -0800375 }
376
Austin Schuhade6d082014-03-09 00:53:06 -0800377 /*
Austin Schuh80ff2e12014-03-08 12:06:19 -0800378 if (data.PosEdge(kCatch)) {
379 auto catch_action = MakeCatchAction();
380 catch_action->GetGoal()->catch_angle = goal_angle_;
381 action_queue_.QueueAction(::std::move(catch_action));
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800382 }
Austin Schuhade6d082014-03-09 00:53:06 -0800383 */
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800384
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800385 if (data.PosEdge(kFire)) {
Austin Schuh80ff2e12014-03-08 12:06:19 -0800386 action_queue_.QueueAction(actions::MakeShootAction());
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800387 }
388
389 action_queue_.Tick();
Austin Schuhc95c2b72014-03-02 11:56:49 -0800390 if (data.IsPressed(kUnload) || data.IsPressed(kReload)) {
391 action_queue_.CancelAllActions();
Austin Schuhade6d082014-03-09 00:53:06 -0800392 LOG(DEBUG, "Canceling\n");
Austin Schuh80ff2e12014-03-08 12:06:19 -0800393 intake_power_ = 0.0;
394 velocity_compensation_ = false;
Austin Schuhc95c2b72014-03-02 11:56:49 -0800395 }
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800396
397 // Send out the claw and shooter goals if no actions are running.
398 if (!action_queue_.Running()) {
Brian Silverman18f6e642014-03-13 18:52:47 -0700399 goal_angle_ += claw_goal_adjust;
400 separation_angle_ += claw_separation_adjust;
401
Austin Schuh80ff2e12014-03-08 12:06:19 -0800402 // If the action just ended, turn the intake off and stop velocity
403 // compensating.
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800404 if (was_running_) {
405 intake_power_ = 0.0;
406 velocity_compensation_ = false;
407 }
408
409 control_loops::drivetrain.status.FetchLatest();
Austin Schuhade6d082014-03-09 00:53:06 -0800410 double goal_angle =
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800411 goal_angle_ +
412 (velocity_compensation_
413 ? SpeedToAngleOffset(
414 control_loops::drivetrain.status->robot_speed)
415 : 0.0);
Austin Schuhade6d082014-03-09 00:53:06 -0800416 double separation_angle = separation_angle_;
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800417
Austin Schuhade6d082014-03-09 00:53:06 -0800418 if (data.IsPressed(kCatch)) {
419 const double kCatchSeparation = 1.0;
420 goal_angle -= kCatchSeparation / 2.0;
421 separation_angle = kCatchSeparation;
422 }
423
424 bool intaking =
425 data.IsPressed(kRollersIn) || data.IsPressed(kIntakePosition) ||
426 data.IsPressed(kIntakeOpenPosition) || data.IsPressed(kCatch);
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800427 if (!control_loops::claw_queue_group.goal.MakeWithBuilder()
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800428 .bottom_angle(goal_angle)
Austin Schuhade6d082014-03-09 00:53:06 -0800429 .separation_angle(separation_angle)
Austin Schuh80ff2e12014-03-08 12:06:19 -0800430 .intake(intaking ? 12.0
431 : (data.IsPressed(kRollersOut) ? -12.0
432 : intake_power_))
433 .centering(intaking ? 12.0 : 0.0)
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800434 .Send()) {
435 LOG(WARNING, "sending claw goal failed\n");
436 }
437
438 if (!control_loops::shooter_queue_group.goal.MakeWithBuilder()
439 .shot_power(shot_power_)
440 .shot_requested(data.IsPressed(kFire))
441 .unload_requested(data.IsPressed(kUnload))
442 .load_requested(data.IsPressed(kReload))
443 .Send()) {
444 LOG(WARNING, "sending shooter goal failed\n");
445 }
Austin Schuh58d23682014-02-23 01:39:50 -0800446 }
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800447 was_running_ = action_queue_.Running();
448 }
449
450 double SpeedToAngleOffset(double speed) {
451 const frc971::constants::Values &values = frc971::constants::GetValues();
452 // scale speed to a [0.0-1.0] on something close to the max
453 // TODO(austin): Change the scale factor for different shots.
Austin Schuhade6d082014-03-09 00:53:06 -0800454 return (speed / values.drivetrain_max_speed) * 0.2;
Austin Schuh58d23682014-02-23 01:39:50 -0800455 }
456
Austin Schuh01c652b2014-02-21 23:13:42 -0800457 private:
Austin Schuh58d23682014-02-23 01:39:50 -0800458 bool is_high_gear_;
459 double shot_power_;
460 double goal_angle_;
461 double separation_angle_;
Austin Schuh5d8c5e72014-03-07 20:24:34 -0800462 bool velocity_compensation_;
463 double intake_power_;
464 bool was_running_;
Austin Schuhb7dfabc2014-03-01 18:57:42 -0800465
466 ActionQueue action_queue_;
Brian Silverman756f9ff2014-01-17 23:40:23 -0800467};
468
469} // namespace joysticks
470} // namespace input
471} // namespace frc971
472
473int main() {
474 ::aos::Init();
475 ::frc971::input::joysticks::Reader reader;
476 reader.Run();
477 ::aos::Cleanup();
478}