Convert all year's robots to proper event loops
Each robot has a couple of event loops, one per thread. Each of these
threads corresponds to the threads from before the change. y2016 has
been tested on real hardware.
Change-Id: I99f726a8bc0498204c1a3b99f15508119eed9ad3
diff --git a/frc971/wpilib/pdp_fetcher.cc b/frc971/wpilib/pdp_fetcher.cc
index 01c9613..98da761 100644
--- a/frc971/wpilib/pdp_fetcher.cc
+++ b/frc971/wpilib/pdp_fetcher.cc
@@ -5,41 +5,42 @@
#include "aos/events/event-loop.h"
#include "aos/init.h"
#include "aos/logging/queue_logging.h"
-#include "aos/util/phased_loop.h"
#include "frc971/wpilib/ahal/PowerDistributionPanel.h"
#include "frc971/wpilib/pdp_values.q.h"
namespace frc971 {
namespace wpilib {
-void PDPFetcher::operator()() {
- ::aos::SetCurrentThreadName("PDPFetcher");
- ::std::unique_ptr<frc::PowerDistributionPanel> pdp(
- new frc::PowerDistributionPanel());
+namespace chrono = ::std::chrono;
- ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(20),
- ::aos::monotonic_clock::now(),
- ::std::chrono::milliseconds(4));
+PDPFetcher::PDPFetcher(::aos::EventLoop *event_loop)
+ : event_loop_(event_loop),
+ pdp_values_sender_(
+ event_loop_->MakeSender<::frc971::PDPValues>(".frc971.pdp_values")),
+ pdp_(new frc::PowerDistributionPanel()) {
+ event_loop_->set_name("PDPFetcher");
- // TODO(austin): Event loop instead of while loop.
- while (true) {
- {
- const int iterations = phased_loop.SleepUntilNext();
- if (iterations != 1) {
- LOG(DEBUG, "PDPFetcher skipped %d iterations\n", iterations - 1);
- }
- }
- auto message = pdp_values_sender_.MakeMessage();
- message->voltage = pdp->GetVoltage();
- message->temperature = pdp->GetTemperature();
- message->power = pdp->GetTotalPower();
- for (int i = 0; i < 16; ++i) {
- message->currents[i] = pdp->GetCurrent(i);
- }
- LOG_STRUCT(DEBUG, "got", *message);
- if (!message.Send()) {
- LOG(WARNING, "sending pdp values failed\n");
- }
+ // SCHED_OTHER on purpose.
+ event_loop_->AddPhasedLoop([this](int iterations) { Loop(iterations); },
+ chrono::milliseconds(20), chrono::milliseconds(4));
+}
+
+PDPFetcher::~PDPFetcher() {}
+
+void PDPFetcher::Loop(int iterations) {
+ if (iterations != 1) {
+ LOG(DEBUG, "PDPFetcher skipped %d iterations\n", iterations - 1);
+ }
+ auto message = pdp_values_sender_.MakeMessage();
+ message->voltage = pdp_->GetVoltage();
+ message->temperature = pdp_->GetTemperature();
+ message->power = pdp_->GetTotalPower();
+ for (int i = 0; i < 16; ++i) {
+ message->currents[i] = pdp_->GetCurrent(i);
+ }
+ LOG_STRUCT(DEBUG, "got", *message);
+ if (!message.Send()) {
+ LOG(WARNING, "sending pdp values failed\n");
}
}