blob: 8329220e9363bad94d60abc8dfe58dcb16b3592e [file] [log] [blame]
Brian Silverman20141f92015-01-05 17:39:01 -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"
8#include "aos/common/input/driver_station_data.h"
9#include "aos/common/logging/logging.h"
10#include "aos/common/util/log_interval.h"
11#include "aos/common/time.h"
Ben Fredricksond69f38b2015-01-28 20:06:15 -080012#include "aos/common/actions/actions.h"
Brian Silverman20141f92015-01-05 17:39:01 -080013
14#include "frc971/control_loops/drivetrain/drivetrain.q.h"
15#include "frc971/constants.h"
16#include "frc971/queues/gyro.q.h"
17#include "frc971/autonomous/auto.q.h"
Brian Silverman20141f92015-01-05 17:39:01 -080018
Brian Silvermanada5f2c2015-02-01 02:41:14 -050019using ::frc971::control_loops::drivetrain_queue;
Brian Silverman20141f92015-01-05 17:39:01 -080020using ::frc971::sensors::gyro_reading;
21
22using ::aos::input::driver_station::ButtonLocation;
23using ::aos::input::driver_station::JoystickAxis;
24using ::aos::input::driver_station::ControlBit;
25
26namespace frc971 {
27namespace input {
28namespace joysticks {
29
Brian Silverman20141f92015-01-05 17:39:01 -080030const JoystickAxis kSteeringWheel(1, 1), kDriveThrottle(2, 2);
31const ButtonLocation kShiftHigh(2, 1), kShiftLow(2, 3);
32const ButtonLocation kQuickTurn(1, 5);
33
Brian Silverman20141f92015-01-05 17:39:01 -080034
35class Reader : public ::aos::input::JoystickInput {
36 public:
Austin Schuh331e13d2015-02-15 00:16:51 -080037 Reader() : was_running_(false) {}
Brian Silverman20141f92015-01-05 17:39:01 -080038
39 virtual void RunIteration(const ::aos::input::driver_station::Data &data) {
Austin Schuh6182f8d2015-02-14 22:15:04 -080040 bool last_auto_running = auto_running_;
41 auto_running_ = data.GetControlBit(ControlBit::kAutonomous) &&
Brian Silvermane1103e62015-02-15 02:03:38 -050042 data.GetControlBit(ControlBit::kEnabled);
Austin Schuh6182f8d2015-02-14 22:15:04 -080043 if (auto_running_ != last_auto_running) {
44 if (auto_running_) {
45 StartAuto();
46 } else {
47 StopAuto();
Brian Silverman20141f92015-01-05 17:39:01 -080048 }
Austin Schuh6182f8d2015-02-14 22:15:04 -080049 }
50
51 if (!data.GetControlBit(ControlBit::kAutonomous)) {
Brian Silverman20141f92015-01-05 17:39:01 -080052 HandleTeleop(data);
53 }
54 }
55
56 void HandleDrivetrain(const ::aos::input::driver_station::Data &data) {
Brian Silverman20141f92015-01-05 17:39:01 -080057 const double wheel = -data.GetAxis(kSteeringWheel);
58 const double throttle = -data.GetAxis(kDriveThrottle);
Brian Silverman20141f92015-01-05 17:39:01 -080059
Brian Silvermanada5f2c2015-02-01 02:41:14 -050060 if (!drivetrain_queue.goal.MakeWithBuilder()
Brian Silverman20141f92015-01-05 17:39:01 -080061 .steering(wheel)
62 .throttle(throttle)
Brian Silverman20141f92015-01-05 17:39:01 -080063 .quickturn(data.IsPressed(kQuickTurn))
Austin Schuh331e13d2015-02-15 00:16:51 -080064 .control_loop_driving(false)
Brian Silverman20141f92015-01-05 17:39:01 -080065 .Send()) {
66 LOG(WARNING, "sending stick values failed\n");
67 }
Brian Silverman20141f92015-01-05 17:39:01 -080068 }
69
70 void HandleTeleop(const ::aos::input::driver_station::Data &data) {
71 HandleDrivetrain(data);
72 if (!data.GetControlBit(ControlBit::kEnabled)) {
73 action_queue_.CancelAllActions();
Austin Schuh6182f8d2015-02-14 22:15:04 -080074 LOG(DEBUG, "Canceling\n");
Brian Silverman20141f92015-01-05 17:39:01 -080075 }
76
77 action_queue_.Tick();
78 was_running_ = action_queue_.Running();
79 }
80
81 private:
Austin Schuh6182f8d2015-02-14 22:15:04 -080082 void StartAuto() {
83 LOG(INFO, "Starting auto mode\n");
84 ::frc971::autonomous::autonomous.MakeWithBuilder().run_auto(true).Send();
85 }
86
87 void StopAuto() {
88 LOG(INFO, "Stopping auto mode\n");
89 ::frc971::autonomous::autonomous.MakeWithBuilder().run_auto(false).Send();
90 }
91
Brian Silverman20141f92015-01-05 17:39:01 -080092 bool was_running_;
Austin Schuh6182f8d2015-02-14 22:15:04 -080093 bool auto_running_ = false;
94
Austin Schuh331e13d2015-02-15 00:16:51 -080095 ::aos::common::actions::ActionQueue action_queue_;
Brian Silverman20141f92015-01-05 17:39:01 -080096
97 ::aos::util::SimpleLogInterval no_drivetrain_status_ =
98 ::aos::util::SimpleLogInterval(::aos::time::Time::InSeconds(0.2), WARNING,
99 "no drivetrain status");
100};
101
102} // namespace joysticks
103} // namespace input
104} // namespace frc971
105
106int main() {
107 ::aos::Init();
108 ::frc971::input::joysticks::Reader reader;
109 reader.Run();
110 ::aos::Cleanup();
111}