Added XY to the fridge profile lib.
Change-Id: I8bfa1f6ab417547a577984cc1c7db88a881bb5fd
diff --git a/frc971/actors/fridge_profile_lib.h b/frc971/actors/fridge_profile_lib.h
index 747f635..2e0dcc2 100644
--- a/frc971/actors/fridge_profile_lib.h
+++ b/frc971/actors/fridge_profile_lib.h
@@ -150,6 +150,133 @@
}
}
}
+
+ void DoFridgeXYProfile(double x, double y, ProfileParams x_parameters,
+ ProfileParams y_parameters, bool grabbers) {
+ DoFridgeXYProfile(x, y, x_parameters, y_parameters, grabbers, grabbers,
+ grabbers);
+ }
+
+ void DoFridgeXYProfile(double x, double y, ProfileParams x_parameters,
+ ProfileParams y_parameters, bool top_grabbers,
+ bool front_grabbers, bool back_grabbers) {
+ if (!StartFridgeXYProfile(x, y, x_parameters, y_parameters, top_grabbers,
+ front_grabbers, back_grabbers)) {
+ return;
+ }
+
+ while (true) {
+ ProfileStatus status =
+ IterateXYProfile(x, y, x_parameters, y_parameters, top_grabbers,
+ front_grabbers, back_grabbers);
+ if (status == DONE || status == CANCELED) {
+ return;
+ }
+ }
+ }
+
+ void CancelXYMotion(ProfileParams x_parameters, ProfileParams y_parameters,
+ bool top_grabbers, bool front_grabbers,
+ bool back_grabbers) {
+ LOG(INFO, "Canceling fridge movement\n");
+ if (!control_loops::fridge_queue.status.get()) {
+ LOG(WARNING, "no fridge status so can't really cancel\n");
+ return;
+ }
+
+ auto new_fridge_goal = control_loops::fridge_queue.goal.MakeMessage();
+ new_fridge_goal->profiling_type = 1;
+ new_fridge_goal->max_x_velocity = x_parameters.velocity;
+ new_fridge_goal->max_x_acceleration = x_parameters.acceleration;
+ new_fridge_goal->x =
+ control_loops::fridge_queue.status->x +
+ (control_loops::fridge_queue.status->goal_x_velocity *
+ ::std::abs(control_loops::fridge_queue.status->goal_x_velocity)) /
+ (2.0 * new_fridge_goal->max_x_acceleration);
+ new_fridge_goal->x_velocity = 0.0;
+
+ new_fridge_goal->max_y_velocity = y_parameters.velocity;
+ new_fridge_goal->max_y_acceleration = y_parameters.acceleration;
+ new_fridge_goal->y =
+ control_loops::fridge_queue.status->y +
+ (control_loops::fridge_queue.status->goal_y_velocity *
+ ::std::abs(control_loops::fridge_queue.status->goal_y_velocity)) /
+ (2.0 * new_fridge_goal->max_y_acceleration);
+ new_fridge_goal->y_velocity = 0.0;
+
+ new_fridge_goal->grabbers.top_front = top_grabbers;
+ new_fridge_goal->grabbers.top_back = top_grabbers;
+ new_fridge_goal->grabbers.bottom_front = front_grabbers;
+ new_fridge_goal->grabbers.bottom_back = back_grabbers;
+
+ if (!new_fridge_goal.Send()) {
+ LOG(ERROR, "Failed to send fridge goal\n");
+ }
+ }
+
+ ProfileStatus IterateXYProfile(double x, double y, ProfileParams x_parameters,
+ ProfileParams y_parameters, bool top_grabbers,
+ bool front_grabbers, bool back_grabbers) {
+ if (this->ShouldCancel()) {
+ CancelXYMotion(x_parameters, y_parameters, top_grabbers, front_grabbers,
+ back_grabbers);
+ return CANCELED;
+ }
+ control_loops::fridge_queue.status.FetchAnother();
+
+ constexpr double kProfileError = 1e-5;
+ constexpr double kXEpsilon = 0.02, kYEpsilon = 0.02;
+
+ if (control_loops::fridge_queue.status->state != 4) {
+ LOG(ERROR, "Fridge no longer running, aborting action\n");
+ return CANCELED;
+ }
+
+ if (::std::abs(control_loops::fridge_queue.status->goal_x - x) <
+ kProfileError &&
+ ::std::abs(control_loops::fridge_queue.status->goal_y - y) <
+ kProfileError &&
+ ::std::abs(control_loops::fridge_queue.status->goal_x_velocity) <
+ kProfileError &&
+ ::std::abs(control_loops::fridge_queue.status->goal_y_velocity) <
+ kProfileError) {
+ LOG(INFO, "Profile done.\n");
+ if (::std::abs(control_loops::fridge_queue.status->x - x) < kXEpsilon &&
+ ::std::abs(control_loops::fridge_queue.status->y - y) < kYEpsilon) {
+ LOG(INFO, "Near goal, done.\n");
+ return DONE;
+ }
+ }
+
+ return RUNNING;
+ }
+
+ bool StartFridgeXYProfile(double x, double y, ProfileParams x_parameters,
+ ProfileParams y_parameters, bool top_grabbers,
+ bool front_grabbers, bool back_grabbers) {
+ auto new_fridge_goal = control_loops::fridge_queue.goal.MakeMessage();
+ new_fridge_goal->profiling_type = 1;
+ new_fridge_goal->max_x_velocity = x_parameters.velocity;
+ new_fridge_goal->max_x_acceleration = x_parameters.acceleration;
+ new_fridge_goal->x = x;
+ new_fridge_goal->x_velocity = 0.0;
+
+ new_fridge_goal->max_y_velocity = y_parameters.velocity;
+ new_fridge_goal->max_y_acceleration = y_parameters.acceleration;
+ new_fridge_goal->y = y;
+ new_fridge_goal->y_velocity = 0.0;
+ new_fridge_goal->grabbers.top_front = top_grabbers;
+ new_fridge_goal->grabbers.top_back = top_grabbers;
+ new_fridge_goal->grabbers.bottom_front = front_grabbers;
+ new_fridge_goal->grabbers.bottom_back = back_grabbers;
+ LOG(INFO, "Starting xy profile to %f, %f\n", x, y);
+
+ if (!new_fridge_goal.Send()) {
+ LOG(ERROR, "Failed to send fridge goal\n");
+ return false;
+ }
+ return true;
+ }
};
} // namespace actors