Convert y2014 over to use the new SensorReader class
Another step in converting to event loops.
Change-Id: I1faa643596128b53e1ab166abcf74c8d72fe039b
diff --git a/frc971/wpilib/sensor_reader.cc b/frc971/wpilib/sensor_reader.cc
index 6ce1995..dc33698 100644
--- a/frc971/wpilib/sensor_reader.cc
+++ b/frc971/wpilib/sensor_reader.cc
@@ -53,7 +53,7 @@
void SensorReader::set_pwm_trigger(
::std::unique_ptr<frc::DigitalInput> pwm_trigger) {
- medium_encoder_filter_.Add(pwm_trigger.get());
+ fast_encoder_filter_.Add(pwm_trigger.get());
pwm_trigger_ = ::std::move(pwm_trigger);
}
@@ -129,7 +129,9 @@
int32_t my_pid = getpid();
+ Start();
dma_synchronizer_->Start();
+
if (pwm_trigger_) {
last_period_ = chrono::microseconds(5050);
LOG(INFO, "Using PWM trigger and a 5.05 ms period\n");
@@ -159,6 +161,7 @@
::frc971::wpilib::SendRobotState(my_pid);
RunIteration();
dma_synchronizer_->RunIteration();
+ RunDmaIteration();
if (pwm_trigger_) {
monotonic_clock::time_point last_tick_timepoint;
@@ -181,6 +184,7 @@
phased_loop.set_interval_and_offset(period, new_offset);
}
}
+
if (pwm_trigger_) {
pwm_detecter_thread.join();
}
diff --git a/frc971/wpilib/sensor_reader.h b/frc971/wpilib/sensor_reader.h
index 0ce203c..47ca95c 100644
--- a/frc971/wpilib/sensor_reader.h
+++ b/frc971/wpilib/sensor_reader.h
@@ -20,6 +20,7 @@
class SensorReader {
public:
SensorReader();
+ virtual ~SensorReader() {}
// Updates the fast and medium encoder filter frequencies.
void UpdateFastEncoderFilterHz(int hz);
@@ -34,6 +35,10 @@
// Sets the dma.
void set_dma(::std::unique_ptr<DMA> dma);
+ void AddToDMA(DMASampleHandlerInterface *handler) {
+ dma_synchronizer_->Add(handler);
+ }
+
// Sets the pwm trigger.
void set_pwm_trigger(::std::unique_ptr<frc::DigitalInput> pwm_trigger);
@@ -41,6 +46,7 @@
void Quit() { run_ = false; }
virtual void RunIteration() = 0;
+ virtual void RunDmaIteration() {}
void operator()();
@@ -51,6 +57,9 @@
drivetrain_right_encoder_;
private:
+ // Gets called right before the DMA synchronizer is up and running.
+ virtual void Start() {}
+
// Uses the pwm trigger to find the pwm cycle width and offset for that
// iteration.
void RunPWMDetecter();
diff --git a/y2014/BUILD b/y2014/BUILD
index e4ad2ed..d83a477 100644
--- a/y2014/BUILD
+++ b/y2014/BUILD
@@ -100,6 +100,7 @@
"//frc971/wpilib:logging_queue",
"//frc971/wpilib:loop_output_handler",
"//frc971/wpilib:pdp_fetcher",
+ "//frc971/wpilib:sensor_reader",
"//frc971/wpilib:wpilib_interface",
"//frc971/wpilib:wpilib_robot_base",
"//third_party:wpilib",
diff --git a/y2014/wpilib_interface.cc b/y2014/wpilib_interface.cc
index af28012..d7aa8ee 100644
--- a/y2014/wpilib_interface.cc
+++ b/y2014/wpilib_interface.cc
@@ -28,28 +28,25 @@
#include "aos/util/log_interval.h"
#include "aos/util/phased_loop.h"
#include "aos/util/wrapping_counter.h"
-
-#include "frc971/shifter_hall_effect.h"
-
#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/shifter_hall_effect.h"
+#include "frc971/wpilib/buffered_pcm.h"
+#include "frc971/wpilib/buffered_solenoid.h"
+#include "frc971/wpilib/dma.h"
+#include "frc971/wpilib/dma_edge_counting.h"
+#include "frc971/wpilib/encoder_and_potentiometer.h"
+#include "frc971/wpilib/gyro_sender.h"
+#include "frc971/wpilib/interrupt_edge_counting.h"
+#include "frc971/wpilib/joystick_sender.h"
+#include "frc971/wpilib/logging.q.h"
+#include "frc971/wpilib/loop_output_handler.h"
+#include "frc971/wpilib/pdp_fetcher.h"
+#include "frc971/wpilib/sensor_reader.h"
+#include "y2014/constants.h"
#include "y2014/control_loops/claw/claw.q.h"
#include "y2014/control_loops/shooter/shooter.q.h"
-#include "y2014/constants.h"
#include "y2014/queues/auto_mode.q.h"
-#include "frc971/wpilib/joystick_sender.h"
-#include "frc971/wpilib/loop_output_handler.h"
-#include "frc971/wpilib/buffered_solenoid.h"
-#include "frc971/wpilib/buffered_pcm.h"
-#include "frc971/wpilib/gyro_sender.h"
-#include "frc971/wpilib/dma_edge_counting.h"
-#include "frc971/wpilib/interrupt_edge_counting.h"
-#include "frc971/wpilib/encoder_and_potentiometer.h"
-#include "frc971/wpilib/logging.q.h"
-#include "frc971/wpilib/wpilib_interface.h"
-#include "frc971/wpilib/pdp_fetcher.h"
-#include "frc971/wpilib/dma.h"
-
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
@@ -113,34 +110,28 @@
static const double kMaximumEncoderPulsesPerSecond =
5600.0 /* free speed RPM */ * 14.0 / 48.0 /* bottom gear reduction */ *
- 18.0 / 32.0 /* big belt reduction */ *
- 18.0 / 66.0 /* top gear reduction */ * 48.0 / 18.0 /* encoder gears */ /
- 60.0 /* seconds / minute */ * 256.0 /* CPR */;
+ 18.0 / 32.0 /* big belt reduction */ * 18.0 /
+ 66.0 /* top gear reduction */ * 48.0 / 18.0 /* encoder gears */ /
+ 60.0 /* seconds / minute */ * 256.0 /* CPR */ * 4.0 /* edges / pulse */;
-class SensorReader {
+class SensorReader : public ::frc971::wpilib::SensorReader {
public:
SensorReader() {
// Set it to filter out anything shorter than 1/4 of the minimum pulse width
// we should ever see.
- encoder_filter_.SetPeriodNanoSeconds(
- static_cast<int>(1 / 4.0 / kMaximumEncoderPulsesPerSecond * 1e9 + 0.5));
+ UpdateMediumEncoderFilterHz(kMaximumEncoderPulsesPerSecond);
hall_filter_.SetPeriodNanoSeconds(100000);
}
+ ~SensorReader() override {
+ top_reader_.Quit();
+ bottom_reader_.Quit();
+ }
+
void set_auto_selector_analog(::std::unique_ptr<AnalogInput> analog) {
auto_selector_analog_ = ::std::move(analog);
}
- void set_drivetrain_left_encoder(::std::unique_ptr<Encoder> encoder) {
- drivetrain_left_encoder_ = ::std::move(encoder);
- drivetrain_left_encoder_->SetMaxPeriod(0.005);
- }
-
- void set_drivetrain_right_encoder(::std::unique_ptr<Encoder> encoder) {
- drivetrain_right_encoder_ = ::std::move(encoder);
- drivetrain_right_encoder_->SetMaxPeriod(0.005);
- }
-
void set_high_left_drive_hall(::std::unique_ptr<AnalogInput> analog) {
high_left_drive_hall_ = ::std::move(analog);
}
@@ -158,7 +149,7 @@
}
void set_top_claw_encoder(::std::unique_ptr<Encoder> encoder) {
- encoder_filter_.Add(encoder.get());
+ medium_encoder_filter_.Add(encoder.get());
top_reader_.set_encoder(::std::move(encoder));
}
@@ -178,7 +169,7 @@
}
void set_bottom_claw_encoder(::std::unique_ptr<Encoder> encoder) {
- encoder_filter_.Add(encoder.get());
+ medium_encoder_filter_.Add(encoder.get());
bottom_reader_.set_encoder(::std::move(encoder));
}
@@ -198,7 +189,7 @@
}
void set_shooter_encoder(::std::unique_ptr<Encoder> encoder) {
- encoder_filter_.Add(encoder.get());
+ medium_encoder_filter_.Add(encoder.get());
shooter_encoder_ = ::std::move(encoder);
}
@@ -226,52 +217,22 @@
make_unique<::frc971::wpilib::DMADigitalReader>(shooter_latch_.get());
}
- // All of the DMA-related set_* calls must be made before this, and it doesn't
- // hurt to do all of them.
- void set_dma(::std::unique_ptr<DMA> dma) {
+ void Start() override {
shooter_proximal_counter_ = make_unique<::frc971::wpilib::DMAEdgeCounter>(
shooter_encoder_.get(), shooter_proximal_.get());
shooter_distal_counter_ = make_unique<::frc971::wpilib::DMAEdgeCounter>(
shooter_encoder_.get(), shooter_distal_.get());
- dma_synchronizer_.reset(
- new ::frc971::wpilib::DMASynchronizer(::std::move(dma)));
- dma_synchronizer_->Add(shooter_proximal_counter_.get());
- dma_synchronizer_->Add(shooter_distal_counter_.get());
- dma_synchronizer_->Add(shooter_plunger_reader_.get());
- dma_synchronizer_->Add(shooter_latch_reader_.get());
- }
-
- void operator()() {
- ::aos::SetCurrentThreadName("SensorReader");
-
- my_pid_ = getpid();
+ AddToDMA(shooter_proximal_counter_.get());
+ AddToDMA(shooter_distal_counter_.get());
+ AddToDMA(shooter_plunger_reader_.get());
+ AddToDMA(shooter_latch_reader_.get());
top_reader_.Start();
bottom_reader_.Start();
- dma_synchronizer_->Start();
-
- ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
- ::std::chrono::milliseconds(4));
-
- ::aos::SetCurrentThreadRealtimePriority(40);
- while (run_) {
- {
- const int iterations = phased_loop.SleepUntilNext();
- if (iterations != 1) {
- LOG(WARNING, "SensorReader skipped %d iterations\n", iterations - 1);
- }
- }
- RunIteration();
- }
-
- top_reader_.Quit();
- bottom_reader_.Quit();
}
void RunIteration() {
- ::frc971::wpilib::SendRobotState(my_pid_);
-
const auto &values = constants::GetValues();
{
@@ -304,9 +265,9 @@
::y2014::sensors::auto_mode.MakeWithBuilder()
.voltage(auto_selector_analog_->GetVoltage())
.Send();
+ }
- dma_synchronizer_->RunIteration();
-
+ void RunDmaIteration() {
{
auto shooter_message = shooter_queue.position.MakeMessage();
shooter_message->position = shooter_translate(shooter_encoder_->GetRaw());
@@ -329,8 +290,6 @@
}
}
- void Quit() { run_ = false; }
-
private:
class HalfClawReader {
public:
@@ -428,14 +387,8 @@
shooter_translate(counter->last_negative_encoder_value());
}
- int32_t my_pid_;
-
- ::std::unique_ptr<::frc971::wpilib::DMASynchronizer> dma_synchronizer_;
-
::std::unique_ptr<AnalogInput> auto_selector_analog_;
- ::std::unique_ptr<Encoder> drivetrain_left_encoder_;
- ::std::unique_ptr<Encoder> drivetrain_right_encoder_;
::std::unique_ptr<AnalogInput> low_left_drive_hall_;
::std::unique_ptr<AnalogInput> high_left_drive_hall_;
::std::unique_ptr<AnalogInput> low_right_drive_hall_;
@@ -451,8 +404,7 @@
::std::unique_ptr<::frc971::wpilib::DMADigitalReader> shooter_plunger_reader_,
shooter_latch_reader_;
- ::std::atomic<bool> run_{true};
- DigitalGlitchFilter encoder_filter_, hall_filter_;
+ DigitalGlitchFilter hall_filter_;
};
class SolenoidWriter {