blob: 4683b2972a0a6cd11e7704e9b2034942eaea4bc8 [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"
Alex Perrycb7da4b2019-08-28 19:35:56 -07007#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
Alex Perrycb7da4b2019-08-28 19:35:56 -070014#include "frc971/control_loops/drivetrain/drivetrain_goal_generated.h"
15#include "y2012/control_loops/accessories/accessories_generated.h"
Brian Silvermanc71537c2016-01-01 13:43:14 -080016
Brian Silvermanc71537c2016-01-01 13:43:14 -080017using ::aos::input::driver_station::ButtonLocation;
18using ::aos::input::driver_station::JoystickAxis;
19using ::aos::input::driver_station::ControlBit;
20
21#define OLD_DS 0
22
23namespace y2012 {
24namespace input {
25namespace joysticks {
26
27const JoystickAxis kSteeringWheel(1, 1), kDriveThrottle(2, 2);
Campbell Crowley5b27f022016-02-20 16:55:35 -080028const ButtonLocation kShiftHigh(2, 3), kShiftLow(2, 1);
Brian Silvermanc71537c2016-01-01 13:43:14 -080029const ButtonLocation kQuickTurn(1, 5);
30
31const ButtonLocation kCatch(3, 10);
32
33#if OLD_DS
34const ButtonLocation kFire(3, 11);
35const ButtonLocation kUnload(1, 4);
36const ButtonLocation kReload(1, 2);
37
38const ButtonLocation kRollersOut(3, 12);
39const ButtonLocation kRollersIn(3, 7);
40
41const ButtonLocation kTuck(3, 9);
42const ButtonLocation kIntakePosition(3, 8);
43const ButtonLocation kIntakeOpenPosition(3, 10);
44const ButtonLocation kVerticalTuck(3, 1);
45const JoystickAxis kFlipRobot(3, 3);
46
47const ButtonLocation kLongShot(3, 5);
48const ButtonLocation kCloseShot(3, 2);
49const ButtonLocation kFenderShot(3, 3);
50const ButtonLocation kTrussShot(2, 11);
51const ButtonLocation kHumanPlayerShot(3, 2);
52#else
53const ButtonLocation kFire(3, 9);
54const ButtonLocation kUnload(1, 4);
55const ButtonLocation kReload(1, 2);
56
57const ButtonLocation kRollersOut(3, 8);
58const ButtonLocation kRollersIn(3, 3);
59
60const ButtonLocation kTuck(3, 4);
61const ButtonLocation kIntakePosition(3, 5);
62const ButtonLocation kIntakeOpenPosition(3, 11);
63const ButtonLocation kVerticalTuck(2, 6);
64const JoystickAxis kFlipRobot(3, 3);
65
66const ButtonLocation kLongShot(3, 7);
67const ButtonLocation kCloseShot(3, 6);
68const ButtonLocation kFenderShot(3, 2);
69const ButtonLocation kTrussShot(2, 11);
70const ButtonLocation kHumanPlayerShot(3, 1);
71#endif
72
73const ButtonLocation kUserLeft(2, 7);
74const ButtonLocation kUserRight(2, 10);
75
76const JoystickAxis kAdjustClawGoal(3, 2);
77const JoystickAxis kAdjustClawSeparation(3, 1);
78
79class Reader : public ::aos::input::JoystickInput {
80 public:
Austin Schuh3e45c752019-02-02 12:19:11 -080081 Reader(::aos::EventLoop *event_loop)
Austin Schuhe4526232019-06-29 16:51:33 -070082 : ::aos::input::JoystickInput(event_loop),
Austin Schuhbd0a40f2019-06-30 14:56:31 -070083 drivetrain_goal_sender_(
Alex Perrycb7da4b2019-08-28 19:35:56 -070084 event_loop->MakeSender<::frc971::control_loops::drivetrain::Goal>(
85 "/drivetrain")),
Austin Schuhe4526232019-06-29 16:51:33 -070086 accessories_goal_sender_(
87 event_loop
Alex Perrycb7da4b2019-08-28 19:35:56 -070088 ->MakeSender<::y2012::control_loops::accessories::Message>(
89 "/accessories")),
Austin Schuhe4526232019-06-29 16:51:33 -070090 is_high_gear_(false) {}
Brian Silvermanc71537c2016-01-01 13:43:14 -080091
92 void RunIteration(const ::aos::input::driver_station::Data &data) override {
93 if (!data.GetControlBit(ControlBit::kAutonomous)) {
94 HandleDrivetrain(data);
95 HandleTeleop(data);
96 }
97 }
98
99 void HandleDrivetrain(const ::aos::input::driver_station::Data &data) {
100 const double wheel = -data.GetAxis(kSteeringWheel);
101 const double throttle = -data.GetAxis(kDriveThrottle);
Campbell Crowley5b27f022016-02-20 16:55:35 -0800102 if (data.PosEdge(kShiftLow)) {
Brian Silvermanc71537c2016-01-01 13:43:14 -0800103 is_high_gear_ = false;
104 }
Campbell Crowley5b27f022016-02-20 16:55:35 -0800105 if (data.PosEdge(kShiftHigh)) {
Brian Silvermanc71537c2016-01-01 13:43:14 -0800106 is_high_gear_ = true;
107 }
Alex Perrycb7da4b2019-08-28 19:35:56 -0700108 auto builder = drivetrain_goal_sender_.MakeBuilder();
109 frc971::control_loops::drivetrain::Goal::Builder goal_builder =
110 builder.MakeBuilder<frc971::control_loops::drivetrain::Goal>();
111 goal_builder.add_wheel(wheel);
112 goal_builder.add_throttle(throttle);
113 goal_builder.add_highgear(is_high_gear_);
114 goal_builder.add_quickturn(data.IsPressed(kQuickTurn));
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700115
Alex Perrycb7da4b2019-08-28 19:35:56 -0700116 if (!builder.Send(goal_builder.Finish())) {
Austin Schuhf257f3c2019-10-27 21:00:43 -0700117 AOS_LOG(WARNING, "sending stick values failed\n");
Brian Silvermanc71537c2016-01-01 13:43:14 -0800118 }
119 }
120
121 void HandleTeleop(const ::aos::input::driver_station::Data &data) {
Alex Perrycb7da4b2019-08-28 19:35:56 -0700122 auto builder = accessories_goal_sender_.MakeBuilder();
123 flatbuffers::Offset<flatbuffers::Vector<uint8_t>> solenoids_offset =
124 builder.fbb()->CreateVector<uint8_t>({data.IsPressed(kLongShot),
125 data.IsPressed(kCloseShot),
126 data.IsPressed(kFenderShot)});
127
128 flatbuffers::Offset<flatbuffers::Vector<double>> sticks_offset =
129 builder.fbb()->CreateVector<double>({data.GetAxis(kAdjustClawGoal),
130 data.GetAxis(kAdjustClawSeparation)});
131
132 y2012::control_loops::accessories::Message::Builder message_builder =
133 builder.MakeBuilder<y2012::control_loops::accessories::Message>();
134 message_builder.add_solenoids(solenoids_offset);
135 message_builder.add_sticks(sticks_offset);
136 if (!builder.Send(message_builder.Finish())) {
Austin Schuhf257f3c2019-10-27 21:00:43 -0700137 AOS_LOG(WARNING, "sending accessories goal failed\n");
Brian Silvermanc71537c2016-01-01 13:43:14 -0800138 }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800139 }
140
141 private:
Alex Perrycb7da4b2019-08-28 19:35:56 -0700142 ::aos::Sender<::frc971::control_loops::drivetrain::Goal>
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700143 drivetrain_goal_sender_;
Alex Perrycb7da4b2019-08-28 19:35:56 -0700144 ::aos::Sender<::y2012::control_loops::accessories::Message>
Austin Schuhe4526232019-06-29 16:51:33 -0700145 accessories_goal_sender_;
Brian Silvermanc71537c2016-01-01 13:43:14 -0800146
Austin Schuhe4526232019-06-29 16:51:33 -0700147 bool is_high_gear_;
Brian Silvermanc71537c2016-01-01 13:43:14 -0800148};
149
150} // namespace joysticks
151} // namespace input
152} // namespace y2012
153
154int main() {
James Kuszmaulad8a8082020-02-14 21:21:58 -0800155 ::aos::InitNRT();
Austin Schuh9fe68f72019-08-10 19:32:03 -0700156
Alex Perrycb7da4b2019-08-28 19:35:56 -0700157 aos::FlatbufferDetachedBuffer<aos::Configuration> config =
158 aos::configuration::ReadConfig("config.json");
159
160 ::aos::ShmEventLoop event_loop(&config.message());
Austin Schuh3e45c752019-02-02 12:19:11 -0800161 ::y2012::input::joysticks::Reader reader(&event_loop);
Austin Schuh9fe68f72019-08-10 19:32:03 -0700162
163 event_loop.Run();
164
Brian Silvermanc71537c2016-01-01 13:43:14 -0800165 ::aos::Cleanup();
166}