blob: 37fb4f9907e84eb67f8fa1b85a1b504357ac1c22 [file] [log] [blame]
Sabina Davis8d20ca82018-02-19 13:17:45 -08001#include "y2018/control_loops/superstructure/superstructure.h"
2
3#include "aos/common/controls/control_loops.q.h"
4#include "aos/common/logging/logging.h"
5#include "frc971/control_loops/control_loops.q.h"
6#include "y2018/constants.h"
7#include "y2018/control_loops/superstructure/intake/intake.h"
8
9namespace y2018 {
10namespace control_loops {
11namespace superstructure {
12
13namespace {
14// The maximum voltage the intake roller will be allowed to use.
15constexpr double kMaxIntakeRollerVoltage = 12.0;
16} // namespace
17
18Superstructure::Superstructure(
19 control_loops::SuperstructureQueue *superstructure_queue)
20 : aos::controls::ControlLoop<control_loops::SuperstructureQueue>(
21 superstructure_queue),
22 intake_left_(constants::GetValues().left_intake.zeroing),
23 intake_right_(constants::GetValues().right_intake.zeroing) {}
24
25void Superstructure::RunIteration(
26 const control_loops::SuperstructureQueue::Goal *unsafe_goal,
27 const control_loops::SuperstructureQueue::Position *position,
28 control_loops::SuperstructureQueue::Output *output,
29 control_loops::SuperstructureQueue::Status *status) {
30 if (WasReset()) {
31 LOG(ERROR, "WPILib reset, restarting\n");
32 intake_left_.Reset();
33 intake_right_.Reset();
Austin Schuhcb091712018-02-21 20:01:55 -080034 arm_.Reset();
Sabina Davis8d20ca82018-02-19 13:17:45 -080035 }
36
Austin Schuh96341532018-03-09 21:17:24 -080037 const double left_intake_goal = ::std::min(
38 arm_.max_intake_override(),
39 (unsafe_goal == nullptr ? 0.0 : unsafe_goal->intake.left_intake_angle));
40 intake_left_.Iterate(unsafe_goal != nullptr ? &(left_intake_goal) : nullptr,
Sabina Daviscfb872f2018-02-25 16:28:20 -080041 &(position->left_intake),
42 output != nullptr ? &(output->left_intake) : nullptr,
Sabina Davis8d20ca82018-02-19 13:17:45 -080043 &(status->left_intake));
44
Austin Schuh96341532018-03-09 21:17:24 -080045 const double right_intake_goal = ::std::min(
46 arm_.max_intake_override(),
47 (unsafe_goal == nullptr ? 0.0 : unsafe_goal->intake.right_intake_angle));
48
49 intake_right_.Iterate(unsafe_goal != nullptr ? &(right_intake_goal) : nullptr,
Sabina Daviscfb872f2018-02-25 16:28:20 -080050 &(position->right_intake),
51 output != nullptr ? &(output->right_intake) : nullptr,
Sabina Davis8d20ca82018-02-19 13:17:45 -080052 &(status->right_intake));
53
Austin Schuh96341532018-03-09 21:17:24 -080054 const bool intake_clear_of_box =
55 intake_left_.clear_of_box() && intake_right_.clear_of_box();
Austin Schuhcb091712018-02-21 20:01:55 -080056 arm_.Iterate(
57 unsafe_goal != nullptr ? &(unsafe_goal->arm_goal_position) : nullptr,
Austin Schuh96341532018-03-09 21:17:24 -080058 unsafe_goal != nullptr ? unsafe_goal->grab_box : false,
59 unsafe_goal != nullptr ? unsafe_goal->open_claw : false, &(position->arm),
60 position->claw_beambreak_triggered,
61 position->box_back_beambreak_triggered, intake_clear_of_box,
Austin Schuhcb091712018-02-21 20:01:55 -080062 output != nullptr ? &(output->voltage_proximal) : nullptr,
63 output != nullptr ? &(output->voltage_distal) : nullptr,
64 output != nullptr ? &(output->release_arm_brake) : nullptr,
Austin Schuh17e484e2018-03-11 01:11:36 -080065 output != nullptr ? &(output->claw_grabbed) : nullptr, &(status->arm),
66 unsafe_goal != nullptr ? unsafe_goal->voltage_winch > 1.0 : false);
67
68 if (output) {
69 if (unsafe_goal) {
70 output->hook_release = unsafe_goal->hook_release;
71 output->voltage_winch = unsafe_goal->voltage_winch;
72 output->forks_release = unsafe_goal->deploy_fork;
73 } else {
74 output->voltage_winch = 0.0;
75 output->hook_release = false;
76 output->forks_release = false;
77 }
78 }
Austin Schuhcb091712018-02-21 20:01:55 -080079
80 status->estopped = status->left_intake.estopped ||
81 status->right_intake.estopped || status->arm.estopped;
82
83 status->zeroed = status->left_intake.zeroed && status->right_intake.zeroed &&
84 status->arm.zeroed;
Sabina Davis8d20ca82018-02-19 13:17:45 -080085
86 if (output && unsafe_goal) {
Austin Schuh96341532018-03-09 21:17:24 -080087 double roller_voltage = ::std::max(
Sabina Davis8d20ca82018-02-19 13:17:45 -080088 -kMaxIntakeRollerVoltage, ::std::min(unsafe_goal->intake.roller_voltage,
89 kMaxIntakeRollerVoltage));
Austin Schuh17dd0892018-03-02 20:06:31 -080090 constexpr int kReverseTime = 15;
91 if (unsafe_goal->intake.roller_voltage < 0.0) {
Sabina Daviscfb872f2018-02-25 16:28:20 -080092 output->left_intake.voltage_rollers = roller_voltage;
93 output->right_intake.voltage_rollers = roller_voltage;
Austin Schuh17dd0892018-03-02 20:06:31 -080094 rotation_state_ = RotationState::NOT_ROTATING;
95 rotation_count_ = 0;
96 } else {
97 switch (rotation_state_) {
98 case RotationState::NOT_ROTATING:
Sabina Daviscfb872f2018-02-25 16:28:20 -080099 if (position->left_intake.beam_break) {
Austin Schuh17dd0892018-03-02 20:06:31 -0800100 rotation_state_ = RotationState::ROTATING_RIGHT;
101 rotation_count_ = kReverseTime;
102 break;
Sabina Daviscfb872f2018-02-25 16:28:20 -0800103 } else if (position->right_intake.beam_break) {
Austin Schuh17dd0892018-03-02 20:06:31 -0800104 rotation_state_ = RotationState::ROTATING_LEFT;
105 rotation_count_ = kReverseTime;
106 break;
107 } else {
108 break;
109 }
110 case RotationState::ROTATING_LEFT:
Sabina Daviscfb872f2018-02-25 16:28:20 -0800111 if (position->right_intake.beam_break) {
Austin Schuh17dd0892018-03-02 20:06:31 -0800112 rotation_count_ = kReverseTime;
113 } else {
114 --rotation_count_;
115 }
116 if (rotation_count_ == 0) {
117 rotation_state_ = RotationState::NOT_ROTATING;
118 }
119 break;
120 case RotationState::ROTATING_RIGHT:
Sabina Daviscfb872f2018-02-25 16:28:20 -0800121 if (position->left_intake.beam_break) {
Austin Schuh17dd0892018-03-02 20:06:31 -0800122 rotation_count_ = kReverseTime;
123 } else {
124 --rotation_count_;
125 }
126 if (rotation_count_ == 0) {
127 rotation_state_ = RotationState::NOT_ROTATING;
128 }
129 break;
130 }
131
Austin Schuh96341532018-03-09 21:17:24 -0800132 if (position->box_back_beambreak_triggered && roller_voltage > 0.0) {
133 roller_voltage = 0;
134 }
Austin Schuh17dd0892018-03-02 20:06:31 -0800135 switch (rotation_state_) {
136 case RotationState::NOT_ROTATING:
Sabina Daviscfb872f2018-02-25 16:28:20 -0800137 output->left_intake.voltage_rollers = roller_voltage;
138 output->right_intake.voltage_rollers = roller_voltage;
Austin Schuh17dd0892018-03-02 20:06:31 -0800139 break;
140 case RotationState::ROTATING_LEFT:
Sabina Daviscfb872f2018-02-25 16:28:20 -0800141 output->left_intake.voltage_rollers = roller_voltage;
142 output->right_intake.voltage_rollers = -roller_voltage;
Austin Schuh17dd0892018-03-02 20:06:31 -0800143 break;
144 case RotationState::ROTATING_RIGHT:
Sabina Daviscfb872f2018-02-25 16:28:20 -0800145 output->left_intake.voltage_rollers = -roller_voltage;
146 output->right_intake.voltage_rollers = roller_voltage;
Austin Schuh17dd0892018-03-02 20:06:31 -0800147 break;
148 }
149 }
Sabina Davis8d20ca82018-02-19 13:17:45 -0800150 }
151}
152
153} // namespace superstructure
154} // namespace control_loops
155} // namespace y2018