Remove weird invert logic from DMA code and fix missing the first edge.
The invert logic wasn't actually complete, and it would have to get even
more complicated to ever work.
Change-Id: Ie4a40922660651970c3fa16e5b7dab68742395e1
diff --git a/frc971/wpilib/dma_edge_counting.cc b/frc971/wpilib/dma_edge_counting.cc
index 77d84b5..102d12b 100644
--- a/frc971/wpilib/dma_edge_counting.cc
+++ b/frc971/wpilib/dma_edge_counting.cc
@@ -6,29 +6,24 @@
namespace wpilib {
bool DMAEdgeCounter::ExtractValue(const DMASample &sample) const {
- if (inverted_) {
- return !sample.Get(input_);
- } else {
- return sample.Get(input_);
- }
+ return sample.Get(input_);
}
void DMAEdgeCounter::UpdateFromSample(const DMASample &sample) {
- if (!have_prev_sample_) {
- have_prev_sample_ = true;
- } else {
- if (!ExtractValue(prev_sample_) && ExtractValue(sample)) {
- pos_edge_count_++;
- pos_edge_time_ = sample.GetTimestamp();
- pos_last_encoder_ = sample.GetRaw(encoder_);
- } else if (ExtractValue(prev_sample_) && !ExtractValue(sample)) {
- neg_edge_count_++;
- neg_edge_time_ = sample.GetTimestamp();
- neg_last_encoder_ = sample.GetRaw(encoder_);
- }
- }
-
+ const bool previous_value =
+ have_prev_sample_ ? ExtractValue(prev_sample_) : polled_value_;
+ have_prev_sample_ = true;
prev_sample_ = sample;
+
+ if (!previous_value && ExtractValue(sample)) {
+ pos_edge_count_++;
+ pos_edge_time_ = sample.GetTimestamp();
+ pos_last_encoder_ = sample.GetRaw(encoder_);
+ } else if (previous_value && !ExtractValue(sample)) {
+ neg_edge_count_++;
+ neg_edge_time_ = sample.GetTimestamp();
+ neg_last_encoder_ = sample.GetRaw(encoder_);
+ }
}
void DMASynchronizer::CheckDMA() {
diff --git a/frc971/wpilib/dma_edge_counting.h b/frc971/wpilib/dma_edge_counting.h
index 939dc5e..e8bef6f 100644
--- a/frc971/wpilib/dma_edge_counting.h
+++ b/frc971/wpilib/dma_edge_counting.h
@@ -42,9 +42,7 @@
class DMAEdgeCounter : public DMASampleHandlerInterface {
public:
DMAEdgeCounter(Encoder *encoder, DigitalSource *input)
- : encoder_(encoder), input_(input), inverted_(false) {}
- DMAEdgeCounter(Encoder *encoder, HallEffect *input)
- : encoder_(encoder), input_(input), inverted_(true) {}
+ : encoder_(encoder), input_(input) {}
int positive_count() const { return pos_edge_count_; }
int negative_count() const { return neg_edge_count_; }
@@ -71,13 +69,13 @@
void AddToDMA(DMA *dma) override {
dma->Add(encoder_);
dma->Add(input_);
+ dma->SetExternalTrigger(input_, true, true);
}
bool ExtractValue(const DMASample &sample) const;
Encoder *const encoder_;
DigitalSource *const input_;
- const bool inverted_;
// The last DMA reading we got.
DMASample prev_sample_;
@@ -103,8 +101,7 @@
// Reads a hall effect in sync with DMA samples.
class DMADigitalReader : public DMASampleHandlerInterface {
public:
- DMADigitalReader(DigitalSource *input) : input_(input), inverted_(false) {}
- DMADigitalReader(HallEffect *input) : input_(input), inverted_(true) {}
+ DMADigitalReader(DigitalSource *input) : input_(input) {}
bool value() const { return value_; }
@@ -112,18 +109,13 @@
void UpdateFromSample(const DMASample & /*sample*/) override {}
void UpdatePolledValue() override { value_ = input_->Get(); }
void PollFromSample(const DMASample &sample) override {
- if (inverted_) {
- value_ = !sample.Get(input_);
- } else {
- value_ = sample.Get(input_);
- }
+ value_ = sample.Get(input_);
}
void AddToDMA(DMA *dma) override {
dma->Add(input_);
}
DigitalSource *const input_;
- const bool inverted_;
bool value_;