blob: 3b6224c5d47719da963712d09a8686415f201e43 [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 Schuh96341532018-03-09 21:17:24 -080065 output != nullptr ? &(output->claw_grabbed) : nullptr, &(status->arm));
Austin Schuhcb091712018-02-21 20:01:55 -080066
67 status->estopped = status->left_intake.estopped ||
68 status->right_intake.estopped || status->arm.estopped;
69
70 status->zeroed = status->left_intake.zeroed && status->right_intake.zeroed &&
71 status->arm.zeroed;
Sabina Davis8d20ca82018-02-19 13:17:45 -080072
73 if (output && unsafe_goal) {
Austin Schuh96341532018-03-09 21:17:24 -080074 double roller_voltage = ::std::max(
Sabina Davis8d20ca82018-02-19 13:17:45 -080075 -kMaxIntakeRollerVoltage, ::std::min(unsafe_goal->intake.roller_voltage,
76 kMaxIntakeRollerVoltage));
Austin Schuh17dd0892018-03-02 20:06:31 -080077 constexpr int kReverseTime = 15;
78 if (unsafe_goal->intake.roller_voltage < 0.0) {
Sabina Daviscfb872f2018-02-25 16:28:20 -080079 output->left_intake.voltage_rollers = roller_voltage;
80 output->right_intake.voltage_rollers = roller_voltage;
Austin Schuh17dd0892018-03-02 20:06:31 -080081 rotation_state_ = RotationState::NOT_ROTATING;
82 rotation_count_ = 0;
83 } else {
84 switch (rotation_state_) {
85 case RotationState::NOT_ROTATING:
Sabina Daviscfb872f2018-02-25 16:28:20 -080086 if (position->left_intake.beam_break) {
Austin Schuh17dd0892018-03-02 20:06:31 -080087 rotation_state_ = RotationState::ROTATING_RIGHT;
88 rotation_count_ = kReverseTime;
89 break;
Sabina Daviscfb872f2018-02-25 16:28:20 -080090 } else if (position->right_intake.beam_break) {
Austin Schuh17dd0892018-03-02 20:06:31 -080091 rotation_state_ = RotationState::ROTATING_LEFT;
92 rotation_count_ = kReverseTime;
93 break;
94 } else {
95 break;
96 }
97 case RotationState::ROTATING_LEFT:
Sabina Daviscfb872f2018-02-25 16:28:20 -080098 if (position->right_intake.beam_break) {
Austin Schuh17dd0892018-03-02 20:06:31 -080099 rotation_count_ = kReverseTime;
100 } else {
101 --rotation_count_;
102 }
103 if (rotation_count_ == 0) {
104 rotation_state_ = RotationState::NOT_ROTATING;
105 }
106 break;
107 case RotationState::ROTATING_RIGHT:
Sabina Daviscfb872f2018-02-25 16:28:20 -0800108 if (position->left_intake.beam_break) {
Austin Schuh17dd0892018-03-02 20:06:31 -0800109 rotation_count_ = kReverseTime;
110 } else {
111 --rotation_count_;
112 }
113 if (rotation_count_ == 0) {
114 rotation_state_ = RotationState::NOT_ROTATING;
115 }
116 break;
117 }
118
Austin Schuh96341532018-03-09 21:17:24 -0800119 if (position->box_back_beambreak_triggered && roller_voltage > 0.0) {
120 roller_voltage = 0;
121 }
Austin Schuh17dd0892018-03-02 20:06:31 -0800122 switch (rotation_state_) {
123 case RotationState::NOT_ROTATING:
Sabina Daviscfb872f2018-02-25 16:28:20 -0800124 output->left_intake.voltage_rollers = roller_voltage;
125 output->right_intake.voltage_rollers = roller_voltage;
Austin Schuh17dd0892018-03-02 20:06:31 -0800126 break;
127 case RotationState::ROTATING_LEFT:
Sabina Daviscfb872f2018-02-25 16:28:20 -0800128 output->left_intake.voltage_rollers = roller_voltage;
129 output->right_intake.voltage_rollers = -roller_voltage;
Austin Schuh17dd0892018-03-02 20:06:31 -0800130 break;
131 case RotationState::ROTATING_RIGHT:
Sabina Daviscfb872f2018-02-25 16:28:20 -0800132 output->left_intake.voltage_rollers = -roller_voltage;
133 output->right_intake.voltage_rollers = roller_voltage;
Austin Schuh17dd0892018-03-02 20:06:31 -0800134 break;
135 }
136 }
Sabina Davis8d20ca82018-02-19 13:17:45 -0800137 }
138}
139
140} // namespace superstructure
141} // namespace control_loops
142} // namespace y2018