blob: ef32c92a1ce9e22ac42aba896b5e4afefe8fb42d [file] [log] [blame]
Austin Schuh6ab08b82015-02-22 21:41:05 -08001#include "frc971/actors/pickup_actor.h"
2
3#include <math.h>
4
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"
9#include "frc971/actors/fridge_profile_actor.h"
10#include "frc971/constants.h"
11#include "frc971/control_loops/claw/claw.q.h"
12
13namespace frc971 {
14namespace actors {
15
16PickupActor::PickupActor(PickupActionQueueGroup* queues)
17 : aos::common::actions::ActorBase<PickupActionQueueGroup>(queues) {}
18
19bool PickupActor::RunAction(const PickupParams& params) {
20 constexpr double kAngleEpsilon = 0.05;
21 {
22 auto message = control_loops::claw_queue.goal.MakeMessage();
23 message->angle = params.pickup_angle;
24 message->angular_velocity = 0.0;
25 message->intake = 0.0;
26 message->rollers_closed = true;
27
28 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
29 message.Send();
30 }
31 while (true) {
32 control_loops::claw_queue.status.FetchAnother();
33 if (ShouldCancel()) return true;
34 const double current_angle = control_loops::claw_queue.status->angle;
35 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
36
37 if (current_angle > params.suck_angle ||
38 ::std::abs(current_angle - params.pickup_angle) < kAngleEpsilon) {
39 break;
40 }
41 }
42
43 {
44 auto message = control_loops::claw_queue.goal.MakeMessage();
45 message->angle = params.pickup_angle;
46 message->angular_velocity = 0.0;
47 message->intake = params.intake_voltage;
48 message->rollers_closed = true;
49
50 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
51 message.Send();
52 }
53
54 while (true) {
55 control_loops::claw_queue.status.FetchAnother();
56 if (ShouldCancel()) return true;
57 const double current_angle = control_loops::claw_queue.status->angle;
58 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
59
60 if (::std::abs(current_angle - params.pickup_angle) < kAngleEpsilon) {
61 break;
62 }
63 }
64
65 {
66 auto message = control_loops::claw_queue.goal.MakeMessage();
67 message->angle = params.suck_angle;
68 message->angular_velocity = 0.0;
69 message->intake = params.intake_voltage;
70 message->rollers_closed = true;
71
72 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
73 message.Send();
74 }
75
76 ::aos::time::Time end_time =
77 ::aos::time::Time::Now() + aos::time::Time::InSeconds(params.intake_time);
78 while ( ::aos::time::Time::Now() <= end_time) {
79 ::aos::time::PhasedLoopXMS(::aos::controls::kLoopFrequency.ToMSec(), 2500);
80 if (ShouldCancel()) return true;
81 }
82
83 {
84 auto message = control_loops::claw_queue.goal.MakeMessage();
85 message->angle = params.pickup_finish_angle;
86 message->angular_velocity = 0.0;
87 message->intake = 0.0;
88 message->rollers_closed = true;
89
90 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
91 message.Send();
92 }
93
94 while (true) {
95 control_loops::claw_queue.status.FetchAnother();
96 if (ShouldCancel()) return true;
97 const double current_angle = control_loops::claw_queue.status->angle;
98 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
99
100 if (::std::abs(current_angle - params.pickup_finish_angle) <
101 kAngleEpsilon) {
102 break;
103 }
104 }
105
106 return true;
107}
108
109::std::unique_ptr<PickupAction> MakePickupAction(const PickupParams& params) {
110 return ::std::unique_ptr<PickupAction>(
111 new PickupAction(&::frc971::actors::pickup_action, params));
112}
113
114} // namespace actors
115} // namespace frc971