Convert actions to event loops
The logic gets significantly simpler due to Watchers. But we also get
to port all the users over as well.
Change-Id: Ib4e75951e65f7431acc6c1548b7f1d20da3da295
diff --git a/y2014/actors/BUILD b/y2014/actors/BUILD
index cb4a8b7..8612d0b 100644
--- a/y2014/actors/BUILD
+++ b/y2014/actors/BUILD
@@ -58,6 +58,7 @@
":shoot_action_lib",
":shoot_action_queue",
"//aos:init",
+ "//aos/events:shm-event-loop",
],
)
diff --git a/y2014/actors/autonomous_actor.cc b/y2014/actors/autonomous_actor.cc
index d4818e2..0a242eb 100644
--- a/y2014/actors/autonomous_actor.cc
+++ b/y2014/actors/autonomous_actor.cc
@@ -28,15 +28,14 @@
using ::aos::monotonic_clock;
using ::frc971::ProfileParameters;
-AutonomousActor::AutonomousActor(
- ::aos::EventLoop *event_loop,
- ::frc971::autonomous::AutonomousActionQueueGroup *s)
+AutonomousActor::AutonomousActor(::aos::EventLoop *event_loop)
: frc971::autonomous::BaseAutonomousActor(
- event_loop, s, control_loops::GetDrivetrainConfig()),
+ event_loop, control_loops::GetDrivetrainConfig()),
auto_mode_fetcher_(event_loop->MakeFetcher<::y2014::sensors::AutoMode>(
".y2014.sensors.auto_mode")),
hot_goal_fetcher_(
- event_loop->MakeFetcher<::y2014::HotGoal>(".y2014.hot_goal")) {}
+ event_loop->MakeFetcher<::y2014::HotGoal>(".y2014.hot_goal")),
+ shoot_action_factory_(actors::ShootActor::MakeFactory(event_loop)) {}
void AutonomousActor::PositionClawVertically(double intake_power,
double centering_power) {
@@ -105,7 +104,7 @@
void AutonomousActor::Shoot() {
// Shoot.
- auto shoot_action = actors::MakeShootAction();
+ auto shoot_action = shoot_action_factory_.Make(0.0);
shoot_action->Start();
WaitUntilDoneOrCanceled(::std::move(shoot_action));
}
diff --git a/y2014/actors/autonomous_actor.h b/y2014/actors/autonomous_actor.h
index 8439151..5529d36 100644
--- a/y2014/actors/autonomous_actor.h
+++ b/y2014/actors/autonomous_actor.h
@@ -9,6 +9,7 @@
#include "frc971/autonomous/base_autonomous_actor.h"
#include "frc971/control_loops/drivetrain/drivetrain.q.h"
#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+#include "y2014/actors/shoot_actor.h"
#include "y2014/queues/auto_mode.q.h"
#include "y2014/queues/hot_goal.q.h"
@@ -17,8 +18,7 @@
class AutonomousActor : public ::frc971::autonomous::BaseAutonomousActor {
public:
- explicit AutonomousActor(::aos::EventLoop *event_loop,
- ::frc971::autonomous::AutonomousActionQueueGroup *s);
+ explicit AutonomousActor(::aos::EventLoop *event_loop);
bool RunAction(
const ::frc971::autonomous::AutonomousActionParams ¶ms) override;
@@ -40,6 +40,8 @@
::aos::Fetcher<::y2014::sensors::AutoMode> auto_mode_fetcher_;
::aos::Fetcher<::y2014::HotGoal> hot_goal_fetcher_;
+
+ actors::ShootActor::Factory shoot_action_factory_;
};
} // namespace actors
diff --git a/y2014/actors/autonomous_actor_main.cc b/y2014/actors/autonomous_actor_main.cc
index 6f8f66c..817f0e4 100644
--- a/y2014/actors/autonomous_actor_main.cc
+++ b/y2014/actors/autonomous_actor_main.cc
@@ -9,9 +9,9 @@
::aos::Init(-1);
::aos::ShmEventLoop event_loop;
- ::y2014::actors::AutonomousActor autonomous(
- &event_loop, &::frc971::autonomous::autonomous_action);
- autonomous.Run();
+ ::y2014::actors::AutonomousActor autonomous(&event_loop);
+
+ event_loop.Run();
::aos::Cleanup();
return 0;
diff --git a/y2014/actors/shoot_action.q b/y2014/actors/shoot_action.q
index ccf6dcf..832153c 100644
--- a/y2014/actors/shoot_action.q
+++ b/y2014/actors/shoot_action.q
@@ -8,5 +8,3 @@
queue aos.common.actions.Goal goal;
queue aos.common.actions.Status status;
};
-
-queue_group ShootActionQueueGroup shoot_action;
diff --git a/y2014/actors/shoot_actor.cc b/y2014/actors/shoot_actor.cc
index ca5168f..5520c49 100644
--- a/y2014/actors/shoot_actor.cc
+++ b/y2014/actors/shoot_actor.cc
@@ -40,8 +40,9 @@
constexpr double ShootActor::kClawShootingSeparation;
constexpr double ShootActor::kClawShootingSeparationGoal;
-ShootActor::ShootActor(actors::ShootActionQueueGroup* s)
- : ::aos::common::actions::ActorBase<actors::ShootActionQueueGroup>(s) {}
+ShootActor::ShootActor(::aos::EventLoop *event_loop)
+ : ::aos::common::actions::ActorBase<actors::ShootActionQueueGroup>(
+ event_loop, ".y2014.actors.shoot_action") {}
double ShootActor::SpeedToAngleOffset(double speed) {
const constants::Values& values = constants::GetValues();
@@ -169,10 +170,5 @@
return false;
}
-::std::unique_ptr<ShootAction> MakeShootAction() {
- return ::std::unique_ptr<ShootAction>(
- new ShootAction(&::y2014::actors::shoot_action, 0.0));
-}
-
} // namespace actors
} // namespace y2014
diff --git a/y2014/actors/shoot_actor.h b/y2014/actors/shoot_actor.h
index 804feee..9b3bcf1 100644
--- a/y2014/actors/shoot_actor.h
+++ b/y2014/actors/shoot_actor.h
@@ -14,7 +14,15 @@
class ShootActor
: public ::aos::common::actions::ActorBase<actors::ShootActionQueueGroup> {
public:
- explicit ShootActor(actors::ShootActionQueueGroup* s);
+ typedef ::aos::common::actions::TypedActionFactory<
+ actors::ShootActionQueueGroup>
+ Factory;
+
+ explicit ShootActor(::aos::EventLoop *event_loop);
+
+ static Factory MakeFactory(::aos::EventLoop *event_loop) {
+ return Factory(event_loop, ".y2014.actors.shoot_action");
+ }
// Actually execute the action of moving the claw and shooter into position
// and actually firing them.
@@ -40,12 +48,6 @@
int previous_shots_;
};
-typedef ::aos::common::actions::TypedAction<actors::ShootActionQueueGroup>
- ShootAction;
-
-// Makes a new ShootActor action.
-::std::unique_ptr<ShootAction> MakeShootAction();
-
} // namespace actors
} // namespace y2014
diff --git a/y2014/actors/shoot_actor_main.cc b/y2014/actors/shoot_actor_main.cc
index e3e7706..8575783 100644
--- a/y2014/actors/shoot_actor_main.cc
+++ b/y2014/actors/shoot_actor_main.cc
@@ -1,5 +1,6 @@
#include <stdio.h>
+#include "aos/events/shm-event-loop.h"
#include "aos/init.h"
#include "y2014/actors/shoot_action.q.h"
#include "y2014/actors/shoot_actor.h"
@@ -7,10 +8,11 @@
int main(int /*argc*/, char * /*argv*/[]) {
::aos::Init(-1);
- ::y2014::actors::ShootActor shoot(&::y2014::actors::shoot_action);
- shoot.Run();
+ ::aos::ShmEventLoop event_loop;
+ ::y2014::actors::ShootActor shoot(&event_loop);
+
+ event_loop.Run();
::aos::Cleanup();
return 0;
}
-
diff --git a/y2014/joystick_reader.cc b/y2014/joystick_reader.cc
index 99c11b4..2b32d2d 100644
--- a/y2014/joystick_reader.cc
+++ b/y2014/joystick_reader.cc
@@ -164,7 +164,8 @@
goal_angle_(0.0),
separation_angle_(kGrabSeparation),
velocity_compensation_(0.0),
- intake_power_(0.0) {}
+ intake_power_(0.0),
+ shoot_action_factory_(actors::ShootActor::MakeFactory(event_loop)) {}
void SetGoal(ClawGoal goal) {
goal_angle_ = goal.angle;
@@ -315,7 +316,7 @@
}
if (data.PosEdge(kFire)) {
- EnqueueAction(actors::MakeShootAction());
+ EnqueueAction(shoot_action_factory_.Make(0.0));
} else if (data.NegEdge(kFire)) {
CancelCurrentAction();
}
@@ -417,6 +418,8 @@
double intake_power_;
bool moving_for_shot_ = false;
+ actors::ShootActor::Factory shoot_action_factory_;
+
::aos::util::SimpleLogInterval no_drivetrain_status_ =
::aos::util::SimpleLogInterval(::std::chrono::milliseconds(200), WARNING,
"no drivetrain status");