blob: 17f13637c5de871d890b438de267e40146ad0c50 [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"
7#include "frc971/autonomous/auto.q.h"
8#include "frc971/autonomous/base_autonomous_actor.h"
9
10namespace aos {
11namespace input {
12
13// Class to abstract out managing actions, autonomous mode, and drivetrains.
14// Turns out we do the same thing every year, so let's stop copying it.
15class ActionJoystickInput : public ::aos::input::JoystickInput {
16 public:
James Kuszmaulccc368b2019-04-11 20:00:07 -070017 // Configuration parameters that don't really belong in the DrivetrainConfig.
18 struct InputConfig {
19 // If true, we will run teleop during auto mode after auto mode ends. This
20 // is to support the 2019 sandstorm mode. Auto will run, and then when the
21 // action ends (either when it's done, or when the driver triggers it to
22 // finish early), we will run teleop regardless of the mode.
23 bool run_teleop_in_auto = false;
24 // A button, for use with the run_teleop_in_auto, that will cancel the auto
25 // mode, and if run_telop_in_auto is specified, resume teloperation.
Austin Schuhbfb04122019-05-22 21:16:51 -070026 const driver_station::ButtonLocation cancel_auto_button = {-1, -1};
James Kuszmaulccc368b2019-04-11 20:00:07 -070027 };
Sabina Davis91b23602019-01-21 00:06:01 -080028 ActionJoystickInput(
29 ::aos::EventLoop *event_loop,
Austin Schuhbfb04122019-05-22 21:16:51 -070030 const ::frc971::control_loops::drivetrain::DrivetrainConfig<double>
31 &dt_config,
32 DrivetrainInputReader::InputType input_type,
James Kuszmaulccc368b2019-04-11 20:00:07 -070033 const InputConfig &input_config)
Sabina Davis91b23602019-01-21 00:06:01 -080034 : ::aos::input::JoystickInput(event_loop),
James Kuszmaulccc368b2019-04-11 20:00:07 -070035 input_config_(input_config),
Austin Schuh1bf8a212019-05-26 22:13:14 -070036 drivetrain_input_reader_(
37 DrivetrainInputReader::Make(input_type, dt_config)),
Austin Schuha250b2d2019-05-27 16:14:02 -070038 dt_config_(dt_config),
Austin Schuh1bf8a212019-05-26 22:13:14 -070039 autonomous_action_factory_(
Austin Schuha250b2d2019-05-27 16:14:02 -070040 ::frc971::autonomous::BaseAutonomousActor::MakeFactory(event_loop)),
41 autonomous_mode_fetcher_(
42 event_loop->MakeFetcher<::frc971::autonomous::AutonomousMode>(
43 ".frc971.autonomous.auto_mode")) {}
Sabina Davis91b23602019-01-21 00:06:01 -080044
45 virtual ~ActionJoystickInput() {}
46
Austin Schuhbfb04122019-05-22 21:16:51 -070047 protected:
48 bool was_running_action() { return was_running_; }
49
Austin Schuha250b2d2019-05-27 16:14:02 -070050 // Returns true if an action is running.
Austin Schuhbfb04122019-05-22 21:16:51 -070051 bool ActionRunning() { return action_queue_.Running(); }
Austin Schuha250b2d2019-05-27 16:14:02 -070052 // Cancels all actions.
Austin Schuhbfb04122019-05-22 21:16:51 -070053 void CancelAllActions() { action_queue_.CancelAllActions(); }
Austin Schuha250b2d2019-05-27 16:14:02 -070054 // Cancels the current action.
Austin Schuhbfb04122019-05-22 21:16:51 -070055 void CancelCurrentAction() { action_queue_.CancelCurrentAction(); }
56
Austin Schuha250b2d2019-05-27 16:14:02 -070057 // Enqueues an action.
Austin Schuhbfb04122019-05-22 21:16:51 -070058 void EnqueueAction(::std::unique_ptr<::aos::common::actions::Action> action) {
59 action_queue_.EnqueueAction(::std::move(action));
60 }
61
Austin Schuha250b2d2019-05-27 16:14:02 -070062 // Returns the current robot velocity.
63 double robot_velocity() const {
64 return drivetrain_input_reader_->robot_velocity();
65 }
66
67 // Returns the drivetrain config.
68 const ::frc971::control_loops::drivetrain::DrivetrainConfig<double>
69 dt_config() const {
70 return dt_config_;
71 }
72
73 // Sets the vision align function. This function runs before the normal
74 // drivetrain code runs. If it returns true, we are in vision align mode and
75 // no drivetain code is run. If it returns false, the vision align function
76 // is assumed to be disabled and normal drive code is run.
77 void set_vision_align_fn(
78 ::std::function<bool(const ::aos::input::driver_station::Data &data)>
79 vision_align_fn) {
80 drivetrain_input_reader_->set_vision_align_fn(vision_align_fn);
81 }
82
Sabina Davis91b23602019-01-21 00:06:01 -080083 private:
Austin Schuh59a62e72019-03-13 22:39:03 -070084 // Handles anything that needs to be cleaned up when the auto action exits.
85 virtual void AutoEnded() {}
Sabina Davis91b23602019-01-21 00:06:01 -080086 // Handles any year specific superstructure code.
87 virtual void HandleTeleop(const ::aos::input::driver_station::Data &data) = 0;
88
89 void RunIteration(const ::aos::input::driver_station::Data &data) override;
90
91 void StartAuto();
92 void StopAuto();
93
Austin Schuha9644062019-03-28 14:31:52 -070094 // Returns the current autonomous mode which has been selected by robot
95 // inputs.
Austin Schuha250b2d2019-05-27 16:14:02 -070096 virtual uint32_t GetAutonomousMode() {
97 autonomous_mode_fetcher_.Fetch();
98 if (autonomous_mode_fetcher_.get() == nullptr) {
99 LOG(WARNING, "no auto mode values\n");
100 return 0;
101 }
102 return autonomous_mode_fetcher_->mode;
103 }
Austin Schuha9644062019-03-28 14:31:52 -0700104
Sabina Davis91b23602019-01-21 00:06:01 -0800105 // True if the internal state machine thinks auto is running right now.
106 bool auto_running_ = false;
James Kuszmaulccc368b2019-04-11 20:00:07 -0700107 // True if we think that the auto *action* is running right now.
108 bool auto_action_running_ = false;
Sabina Davis91b23602019-01-21 00:06:01 -0800109 // True if an action was running last cycle.
110 bool was_running_ = false;
111
James Kuszmaulccc368b2019-04-11 20:00:07 -0700112 const InputConfig input_config_;
Austin Schuh30cc40a2019-03-12 21:02:13 -0700113
Austin Schuh59a62e72019-03-13 22:39:03 -0700114 // Bool to track if auto was running the last cycle through. This lets us
115 // call AutoEnded when the auto mode function stops.
116 bool auto_was_running_ = false;
Sabina Davis91b23602019-01-21 00:06:01 -0800117 ::std::unique_ptr<DrivetrainInputReader> drivetrain_input_reader_;
118 ::aos::common::actions::ActionQueue action_queue_;
Austin Schuh1bf8a212019-05-26 22:13:14 -0700119
Austin Schuha250b2d2019-05-27 16:14:02 -0700120 const ::frc971::control_loops::drivetrain::DrivetrainConfig<double>
121 dt_config_;
122
Austin Schuh1bf8a212019-05-26 22:13:14 -0700123 ::frc971::autonomous::BaseAutonomousActor::Factory autonomous_action_factory_;
Austin Schuha250b2d2019-05-27 16:14:02 -0700124
125 ::aos::Fetcher<::frc971::autonomous::AutonomousMode> autonomous_mode_fetcher_;
Sabina Davis91b23602019-01-21 00:06:01 -0800126};
127
128} // namespace input
129} // namespace aos
130
131#endif // AOS_INPUT_ACTION_JOYSTICK_INPUT_H_