blob: c0c3b2a0ac6a73e88e15594ef762fea2259097fc [file] [log] [blame]
Austin Schuh6ab08b82015-02-22 21:41:05 -08001#include "frc971/actors/pickup_actor.h"
2
Austin Schuh6e242ac2015-03-07 17:08:21 -08003#include <cmath>
Austin Schuh6ab08b82015-02-22 21:41:05 -08004
5#include "aos/common/logging/logging.h"
6#include "aos/common/controls/control_loop.h"
7#include "aos/common/util/phased_loop.h"
8#include "aos/common/time.h"
Austin Schuh6ab08b82015-02-22 21:41:05 -08009#include "frc971/control_loops/claw/claw.q.h"
10
11namespace frc971 {
12namespace actors {
Austin Schuhe4e59ef2015-03-01 00:05:37 -080013namespace {
14constexpr double kClawPickupVelocity = 3.00;
15constexpr double kClawPickupAcceleration = 4.0;
16constexpr double kClawMoveVelocity = 3.00;
17constexpr double kClawMoveAcceleration = 8.0;
18} // namespace
Austin Schuh6ab08b82015-02-22 21:41:05 -080019
20PickupActor::PickupActor(PickupActionQueueGroup* queues)
21 : aos::common::actions::ActorBase<PickupActionQueueGroup>(queues) {}
22
23bool PickupActor::RunAction(const PickupParams& params) {
Austin Schuhe4e59ef2015-03-01 00:05:37 -080024 constexpr double kAngleEpsilon = 0.10;
Austin Schuh6ab08b82015-02-22 21:41:05 -080025 {
26 auto message = control_loops::claw_queue.goal.MakeMessage();
27 message->angle = params.pickup_angle;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080028 message->max_velocity = kClawPickupVelocity;
29 message->max_acceleration = kClawPickupAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080030 message->angular_velocity = 0.0;
31 message->intake = 0.0;
32 message->rollers_closed = true;
33
34 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
35 message.Send();
36 }
37 while (true) {
38 control_loops::claw_queue.status.FetchAnother();
39 if (ShouldCancel()) return true;
40 const double current_angle = control_loops::claw_queue.status->angle;
41 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
42
43 if (current_angle > params.suck_angle ||
44 ::std::abs(current_angle - params.pickup_angle) < kAngleEpsilon) {
45 break;
46 }
47 }
48
49 {
50 auto message = control_loops::claw_queue.goal.MakeMessage();
51 message->angle = params.pickup_angle;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080052 message->max_velocity = kClawPickupVelocity;
53 message->max_acceleration = kClawPickupAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080054 message->angular_velocity = 0.0;
55 message->intake = params.intake_voltage;
56 message->rollers_closed = true;
57
58 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
59 message.Send();
60 }
61
62 while (true) {
63 control_loops::claw_queue.status.FetchAnother();
64 if (ShouldCancel()) return true;
65 const double current_angle = control_loops::claw_queue.status->angle;
66 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
67
68 if (::std::abs(current_angle - params.pickup_angle) < kAngleEpsilon) {
69 break;
70 }
71 }
72
73 {
74 auto message = control_loops::claw_queue.goal.MakeMessage();
Austin Schuhe4e59ef2015-03-01 00:05:37 -080075 message->angle = params.suck_angle_finish;
76 message->max_velocity = kClawMoveVelocity;
77 message->max_acceleration = kClawMoveAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080078 message->angular_velocity = 0.0;
79 message->intake = params.intake_voltage;
80 message->rollers_closed = true;
81
82 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
83 message.Send();
84 }
85
86 ::aos::time::Time end_time =
87 ::aos::time::Time::Now() + aos::time::Time::InSeconds(params.intake_time);
88 while ( ::aos::time::Time::Now() <= end_time) {
89 ::aos::time::PhasedLoopXMS(::aos::controls::kLoopFrequency.ToMSec(), 2500);
90 if (ShouldCancel()) return true;
91 }
92
93 {
94 auto message = control_loops::claw_queue.goal.MakeMessage();
95 message->angle = params.pickup_finish_angle;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080096 message->max_velocity = kClawMoveVelocity;
97 message->max_acceleration = kClawMoveAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080098 message->angular_velocity = 0.0;
99 message->intake = 0.0;
100 message->rollers_closed = true;
101
102 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
103 message.Send();
104 }
105
106 while (true) {
107 control_loops::claw_queue.status.FetchAnother();
108 if (ShouldCancel()) return true;
109 const double current_angle = control_loops::claw_queue.status->angle;
110 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
111
112 if (::std::abs(current_angle - params.pickup_finish_angle) <
113 kAngleEpsilon) {
114 break;
115 }
116 }
117
118 return true;
119}
120
121::std::unique_ptr<PickupAction> MakePickupAction(const PickupParams& params) {
122 return ::std::unique_ptr<PickupAction>(
123 new PickupAction(&::frc971::actors::pickup_action, params));
124}
125
126} // namespace actors
127} // namespace frc971