blob: 562d41a6bcafa346d85fad716db7930f7f71d81c [file] [log] [blame]
Sabina Davis91b23602019-01-21 00:06:01 -08001#ifndef AOS_INPUT_ACTION_JOYSTICK_INPUT_H_
2#define AOS_INPUT_ACTION_JOYSTICK_INPUT_H_
3
4#include "aos/input/driver_station_data.h"
5#include "aos/input/drivetrain_input.h"
6#include "aos/input/joystick_input.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -07007#include "frc971/autonomous/auto_generated.h"
Austin Schuhed5b26d2019-12-05 20:51:59 -08008#include "frc971/autonomous/auto_mode_generated.h"
Sabina Davis91b23602019-01-21 00:06:01 -08009#include "frc971/autonomous/base_autonomous_actor.h"
10
11namespace aos {
12namespace input {
13
14// Class to abstract out managing actions, autonomous mode, and drivetrains.
15// Turns out we do the same thing every year, so let's stop copying it.
16class ActionJoystickInput : public ::aos::input::JoystickInput {
17 public:
James Kuszmaulccc368b2019-04-11 20:00:07 -070018 // Configuration parameters that don't really belong in the DrivetrainConfig.
19 struct InputConfig {
20 // If true, we will run teleop during auto mode after auto mode ends. This
21 // is to support the 2019 sandstorm mode. Auto will run, and then when the
22 // action ends (either when it's done, or when the driver triggers it to
23 // finish early), we will run teleop regardless of the mode.
24 bool run_teleop_in_auto = false;
25 // A button, for use with the run_teleop_in_auto, that will cancel the auto
26 // mode, and if run_telop_in_auto is specified, resume teloperation.
Austin Schuhbfb04122019-05-22 21:16:51 -070027 const driver_station::ButtonLocation cancel_auto_button = {-1, -1};
James Kuszmaulccc368b2019-04-11 20:00:07 -070028 };
Sabina Davis91b23602019-01-21 00:06:01 -080029 ActionJoystickInput(
30 ::aos::EventLoop *event_loop,
Austin Schuhbfb04122019-05-22 21:16:51 -070031 const ::frc971::control_loops::drivetrain::DrivetrainConfig<double>
32 &dt_config,
33 DrivetrainInputReader::InputType input_type,
James Kuszmaulccc368b2019-04-11 20:00:07 -070034 const InputConfig &input_config)
Sabina Davis91b23602019-01-21 00:06:01 -080035 : ::aos::input::JoystickInput(event_loop),
James Kuszmaulccc368b2019-04-11 20:00:07 -070036 input_config_(input_config),
Austin Schuh1bf8a212019-05-26 22:13:14 -070037 drivetrain_input_reader_(
Austin Schuhbd0a40f2019-06-30 14:56:31 -070038 DrivetrainInputReader::Make(event_loop, input_type, dt_config)),
Austin Schuha250b2d2019-05-27 16:14:02 -070039 dt_config_(dt_config),
Austin Schuh1bf8a212019-05-26 22:13:14 -070040 autonomous_action_factory_(
Austin Schuha250b2d2019-05-27 16:14:02 -070041 ::frc971::autonomous::BaseAutonomousActor::MakeFactory(event_loop)),
42 autonomous_mode_fetcher_(
43 event_loop->MakeFetcher<::frc971::autonomous::AutonomousMode>(
Austin Schuhed5b26d2019-12-05 20:51:59 -080044 "/autonomous")) {}
Sabina Davis91b23602019-01-21 00:06:01 -080045
46 virtual ~ActionJoystickInput() {}
47
Austin Schuhbfb04122019-05-22 21:16:51 -070048 protected:
49 bool was_running_action() { return was_running_; }
50
Austin Schuha250b2d2019-05-27 16:14:02 -070051 // Returns true if an action is running.
Austin Schuhbfb04122019-05-22 21:16:51 -070052 bool ActionRunning() { return action_queue_.Running(); }
Austin Schuha250b2d2019-05-27 16:14:02 -070053 // Cancels all actions.
Austin Schuhbfb04122019-05-22 21:16:51 -070054 void CancelAllActions() { action_queue_.CancelAllActions(); }
Austin Schuha250b2d2019-05-27 16:14:02 -070055 // Cancels the current action.
Austin Schuhbfb04122019-05-22 21:16:51 -070056 void CancelCurrentAction() { action_queue_.CancelCurrentAction(); }
57
Austin Schuha250b2d2019-05-27 16:14:02 -070058 // Enqueues an action.
Austin Schuhbfb04122019-05-22 21:16:51 -070059 void EnqueueAction(::std::unique_ptr<::aos::common::actions::Action> action) {
60 action_queue_.EnqueueAction(::std::move(action));
61 }
62
Austin Schuha250b2d2019-05-27 16:14:02 -070063 // Returns the current robot velocity.
64 double robot_velocity() const {
65 return drivetrain_input_reader_->robot_velocity();
66 }
67
68 // Returns the drivetrain config.
69 const ::frc971::control_loops::drivetrain::DrivetrainConfig<double>
70 dt_config() const {
71 return dt_config_;
72 }
73
74 // Sets the vision align function. This function runs before the normal
75 // drivetrain code runs. If it returns true, we are in vision align mode and
76 // no drivetain code is run. If it returns false, the vision align function
77 // is assumed to be disabled and normal drive code is run.
78 void set_vision_align_fn(
79 ::std::function<bool(const ::aos::input::driver_station::Data &data)>
80 vision_align_fn) {
81 drivetrain_input_reader_->set_vision_align_fn(vision_align_fn);
82 }
83
Sabina Davis91b23602019-01-21 00:06:01 -080084 private:
Austin Schuh59a62e72019-03-13 22:39:03 -070085 // Handles anything that needs to be cleaned up when the auto action exits.
86 virtual void AutoEnded() {}
Sabina Davis91b23602019-01-21 00:06:01 -080087 // Handles any year specific superstructure code.
88 virtual void HandleTeleop(const ::aos::input::driver_station::Data &data) = 0;
89
90 void RunIteration(const ::aos::input::driver_station::Data &data) override;
91
92 void StartAuto();
93 void StopAuto();
94
Austin Schuha9644062019-03-28 14:31:52 -070095 // Returns the current autonomous mode which has been selected by robot
96 // inputs.
Austin Schuha250b2d2019-05-27 16:14:02 -070097 virtual uint32_t GetAutonomousMode() {
98 autonomous_mode_fetcher_.Fetch();
99 if (autonomous_mode_fetcher_.get() == nullptr) {
Austin Schuhf257f3c2019-10-27 21:00:43 -0700100 AOS_LOG(WARNING, "no auto mode values\n");
Austin Schuha250b2d2019-05-27 16:14:02 -0700101 return 0;
102 }
Alex Perrycb7da4b2019-08-28 19:35:56 -0700103 return autonomous_mode_fetcher_->mode();
Austin Schuha250b2d2019-05-27 16:14:02 -0700104 }
Austin Schuha9644062019-03-28 14:31:52 -0700105
Sabina Davis91b23602019-01-21 00:06:01 -0800106 // True if the internal state machine thinks auto is running right now.
107 bool auto_running_ = false;
James Kuszmaulccc368b2019-04-11 20:00:07 -0700108 // True if we think that the auto *action* is running right now.
109 bool auto_action_running_ = false;
Sabina Davis91b23602019-01-21 00:06:01 -0800110 // True if an action was running last cycle.
111 bool was_running_ = false;
112
James Kuszmaulccc368b2019-04-11 20:00:07 -0700113 const InputConfig input_config_;
Austin Schuh30cc40a2019-03-12 21:02:13 -0700114
Austin Schuh59a62e72019-03-13 22:39:03 -0700115 // Bool to track if auto was running the last cycle through. This lets us
116 // call AutoEnded when the auto mode function stops.
117 bool auto_was_running_ = false;
Sabina Davis91b23602019-01-21 00:06:01 -0800118 ::std::unique_ptr<DrivetrainInputReader> drivetrain_input_reader_;
119 ::aos::common::actions::ActionQueue action_queue_;
Austin Schuh1bf8a212019-05-26 22:13:14 -0700120
Austin Schuha250b2d2019-05-27 16:14:02 -0700121 const ::frc971::control_loops::drivetrain::DrivetrainConfig<double>
122 dt_config_;
123
Austin Schuh1bf8a212019-05-26 22:13:14 -0700124 ::frc971::autonomous::BaseAutonomousActor::Factory autonomous_action_factory_;
Austin Schuha250b2d2019-05-27 16:14:02 -0700125
126 ::aos::Fetcher<::frc971::autonomous::AutonomousMode> autonomous_mode_fetcher_;
Sabina Davis91b23602019-01-21 00:06:01 -0800127};
128
129} // namespace input
130} // namespace aos
131
132#endif // AOS_INPUT_ACTION_JOYSTICK_INPUT_H_