Fridge handles null goal.
Change-Id: I4c9bf6a6e51f351aad3957ed22e8f4eedbb6ea35
diff --git a/frc971/control_loops/fridge/fridge.cc b/frc971/control_loops/fridge/fridge.cc
index 61152e4..83645e9 100644
--- a/frc971/control_loops/fridge/fridge.cc
+++ b/frc971/control_loops/fridge/fridge.cc
@@ -56,15 +56,14 @@
}
Fridge::Fridge(control_loops::FridgeQueue *fridge)
- : aos::controls::ControlLoop<control_loops::FridgeQueue>(fridge),
+ : aos::controls::ControlLoop<control_loops::FridgeQueue, false>(fridge),
arm_loop_(new CappedStateFeedbackLoop(
StateFeedbackLoop<4, 2, 2>(MakeArmLoop()))),
elevator_loop_(new CappedStateFeedbackLoop(
StateFeedbackLoop<4, 2, 2>(MakeElevatorLoop()))),
left_arm_estimator_(constants::GetValues().fridge.left_arm_zeroing),
right_arm_estimator_(constants::GetValues().fridge.right_arm_zeroing),
- left_elevator_estimator_(
- constants::GetValues().fridge.left_elev_zeroing),
+ left_elevator_estimator_(constants::GetValues().fridge.left_elev_zeroing),
right_elevator_estimator_(
constants::GetValues().fridge.right_elev_zeroing) {}
@@ -231,7 +230,7 @@
return arm_zeroing_velocity_;
}
-void Fridge::RunIteration(const control_loops::FridgeQueue::Goal *goal,
+void Fridge::RunIteration(const control_loops::FridgeQueue::Goal *unsafe_goal,
const control_loops::FridgeQueue::Position *position,
control_loops::FridgeQueue::Output *output,
control_loops::FridgeQueue::Status *status) {
@@ -343,14 +342,18 @@
case RUNNING:
LOG(DEBUG, "Running!\n");
- arm_goal_velocity = goal->angular_velocity;
- elevator_goal_velocity = goal->velocity;
+ if (unsafe_goal) {
+ arm_goal_velocity = unsafe_goal->angular_velocity;
+ elevator_goal_velocity = unsafe_goal->velocity;
+ }
// Update state_ to accurately represent the state of the zeroing
// estimators.
UpdateZeroingState();
- arm_goal_ = goal->angle;
- elevator_goal_ = goal->height;
+ if (unsafe_goal) {
+ arm_goal_ = unsafe_goal->angle;
+ elevator_goal_ = unsafe_goal->height;
+ }
if (state_ != RUNNING && state_ != ESTOP) {
state_ = UNINITIALIZED;
@@ -492,7 +495,14 @@
output->right_arm = arm_loop_->U(1, 0);
output->left_elevator = elevator_loop_->U(0, 0);
output->right_elevator = elevator_loop_->U(1, 0);
- output->grabbers = goal->grabbers;
+ if (unsafe_goal) {
+ output->grabbers = unsafe_goal->grabbers;
+ } else {
+ output->grabbers.top_front = false;
+ output->grabbers.top_back = false;
+ output->grabbers.bottom_front = false;
+ output->grabbers.bottom_back = false;
+ }
}
// TODO(austin): Populate these fully.
@@ -500,8 +510,16 @@
status->done = false;
status->angle = arm_loop_->X_hat(0, 0);
status->height = elevator_loop_->X_hat(0, 0);
- status->grabbers = goal->grabbers;
+ if (unsafe_goal) {
+ status->grabbers = unsafe_goal->grabbers;
+ } else {
+ status->grabbers.top_front = false;
+ status->grabbers.top_back = false;
+ status->grabbers.bottom_front = false;
+ status->grabbers.bottom_back = false;
+ }
status->estopped = (state_ == ESTOP);
+ status->state = state_;
last_state_ = state_;
}