blob: 46b20f683e7c976bdfa14a5b4ac210daf0f5d76e [file] [log] [blame]
Brian Silvermanc71537c2016-01-01 13:43:14 -08001#include <stdio.h>
2#include <string.h>
3#include <unistd.h>
4#include <math.h>
5
Austin Schuh3e45c752019-02-02 12:19:11 -08006#include "aos/actions/actions.h"
7#include "aos/events/shm-event-loop.h"
John Park398c74a2018-10-20 21:17:39 -07008#include "aos/init.h"
John Park33858a32018-09-28 23:05:48 -07009#include "aos/input/driver_station_data.h"
Austin Schuh3e45c752019-02-02 12:19:11 -080010#include "aos/input/joystick_input.h"
John Park33858a32018-09-28 23:05:48 -070011#include "aos/logging/logging.h"
12#include "aos/time/time.h"
Brian Silvermanc71537c2016-01-01 13:43:14 -080013
Austin Schuh2a671df2016-11-26 15:00:06 -080014#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Brian Silvermanc71537c2016-01-01 13:43:14 -080015#include "y2012/control_loops/accessories/accessories.q.h"
16
Austin Schuh2a671df2016-11-26 15:00:06 -080017using ::frc971::control_loops::drivetrain_queue;
Brian Silvermanc71537c2016-01-01 13:43:14 -080018using ::y2012::control_loops::accessories_queue;
19
20using ::aos::input::driver_station::ButtonLocation;
21using ::aos::input::driver_station::JoystickAxis;
22using ::aos::input::driver_station::ControlBit;
23
24#define OLD_DS 0
25
26namespace y2012 {
27namespace input {
28namespace joysticks {
29
30const JoystickAxis kSteeringWheel(1, 1), kDriveThrottle(2, 2);
Campbell Crowley5b27f022016-02-20 16:55:35 -080031const ButtonLocation kShiftHigh(2, 3), kShiftLow(2, 1);
Brian Silvermanc71537c2016-01-01 13:43:14 -080032const ButtonLocation kQuickTurn(1, 5);
33
34const ButtonLocation kCatch(3, 10);
35
36#if OLD_DS
37const ButtonLocation kFire(3, 11);
38const ButtonLocation kUnload(1, 4);
39const ButtonLocation kReload(1, 2);
40
41const ButtonLocation kRollersOut(3, 12);
42const ButtonLocation kRollersIn(3, 7);
43
44const ButtonLocation kTuck(3, 9);
45const ButtonLocation kIntakePosition(3, 8);
46const ButtonLocation kIntakeOpenPosition(3, 10);
47const ButtonLocation kVerticalTuck(3, 1);
48const JoystickAxis kFlipRobot(3, 3);
49
50const ButtonLocation kLongShot(3, 5);
51const ButtonLocation kCloseShot(3, 2);
52const ButtonLocation kFenderShot(3, 3);
53const ButtonLocation kTrussShot(2, 11);
54const ButtonLocation kHumanPlayerShot(3, 2);
55#else
56const ButtonLocation kFire(3, 9);
57const ButtonLocation kUnload(1, 4);
58const ButtonLocation kReload(1, 2);
59
60const ButtonLocation kRollersOut(3, 8);
61const ButtonLocation kRollersIn(3, 3);
62
63const ButtonLocation kTuck(3, 4);
64const ButtonLocation kIntakePosition(3, 5);
65const ButtonLocation kIntakeOpenPosition(3, 11);
66const ButtonLocation kVerticalTuck(2, 6);
67const JoystickAxis kFlipRobot(3, 3);
68
69const ButtonLocation kLongShot(3, 7);
70const ButtonLocation kCloseShot(3, 6);
71const ButtonLocation kFenderShot(3, 2);
72const ButtonLocation kTrussShot(2, 11);
73const ButtonLocation kHumanPlayerShot(3, 1);
74#endif
75
76const ButtonLocation kUserLeft(2, 7);
77const ButtonLocation kUserRight(2, 10);
78
79const JoystickAxis kAdjustClawGoal(3, 2);
80const JoystickAxis kAdjustClawSeparation(3, 1);
81
82class Reader : public ::aos::input::JoystickInput {
83 public:
Austin Schuh3e45c752019-02-02 12:19:11 -080084 Reader(::aos::EventLoop *event_loop)
85 : ::aos::input::JoystickInput(event_loop), is_high_gear_(false) {}
Brian Silvermanc71537c2016-01-01 13:43:14 -080086
87 void RunIteration(const ::aos::input::driver_station::Data &data) override {
88 if (!data.GetControlBit(ControlBit::kAutonomous)) {
89 HandleDrivetrain(data);
90 HandleTeleop(data);
91 }
92 }
93
94 void HandleDrivetrain(const ::aos::input::driver_station::Data &data) {
95 const double wheel = -data.GetAxis(kSteeringWheel);
96 const double throttle = -data.GetAxis(kDriveThrottle);
Campbell Crowley5b27f022016-02-20 16:55:35 -080097 if (data.PosEdge(kShiftLow)) {
Brian Silvermanc71537c2016-01-01 13:43:14 -080098 is_high_gear_ = false;
99 }
Campbell Crowley5b27f022016-02-20 16:55:35 -0800100 if (data.PosEdge(kShiftHigh)) {
Brian Silvermanc71537c2016-01-01 13:43:14 -0800101 is_high_gear_ = true;
102 }
103 if (!drivetrain_queue.goal.MakeWithBuilder()
Austin Schuh2b1fce02018-03-02 20:05:20 -0800104 .wheel(wheel)
Brian Silvermanc71537c2016-01-01 13:43:14 -0800105 .throttle(throttle)
106 .highgear(is_high_gear_)
107 .quickturn(data.IsPressed(kQuickTurn))
108 .left_velocity_goal(0)
109 .right_velocity_goal(0)
110 .Send()) {
111 LOG(WARNING, "sending stick values failed\n");
112 }
113 }
114
115 void HandleTeleop(const ::aos::input::driver_station::Data &data) {
116 if (!data.GetControlBit(ControlBit::kEnabled)) {
117 action_queue_.CancelAllActions();
118 LOG(DEBUG, "Canceling\n");
119 }
120
121 {
122 auto accessories_message = accessories_queue.goal.MakeMessage();
123 accessories_message->solenoids[0] = data.IsPressed(kLongShot);
124 accessories_message->solenoids[1] = data.IsPressed(kCloseShot);
125 accessories_message->solenoids[2] = data.IsPressed(kFenderShot);
126 accessories_message->sticks[0] = data.GetAxis(kAdjustClawGoal);
127 accessories_message->sticks[1] = data.GetAxis(kAdjustClawSeparation);
128 if (!accessories_message.Send()) {
129 LOG(WARNING, "sending accessories goal failed\n");
130 }
131 }
132
133 action_queue_.Tick();
134 }
135
136 private:
137 bool is_high_gear_;
138
139 ::aos::common::actions::ActionQueue action_queue_;
140};
141
142} // namespace joysticks
143} // namespace input
144} // namespace y2012
145
146int main() {
Brian Silverman5090c432016-01-02 14:44:26 -0800147 ::aos::Init(-1);
Austin Schuh3e45c752019-02-02 12:19:11 -0800148 ::aos::ShmEventLoop event_loop;
149 ::y2012::input::joysticks::Reader reader(&event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800150 reader.Run();
151 ::aos::Cleanup();
152}