mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
DutyCycleEncoder: Fix simulation support (#2387)
The DutyCycleEncoder class initializes AnalogTrigger, which is not supported in simulation. To avoid this, do not use AnalogTrigger (or Counter) in simulation mode. Fixes #2367 Co-authored-by: Peter Johnson <johnson.peter@gmail.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Copyright (c) 2019 FIRST. All Rights Reserved. */
|
||||
/* Copyright (c) 2019-2020 FIRST. All Rights Reserved. */
|
||||
/* Open Source Software - may be modified and shared by FRC teams. The code */
|
||||
/* must be accompanied by the FIRST BSD license file in the root directory of */
|
||||
/* the project. */
|
||||
@@ -18,51 +18,37 @@ using namespace frc;
|
||||
|
||||
DutyCycleEncoder::DutyCycleEncoder(int channel)
|
||||
: m_dutyCycle{std::make_shared<DutyCycle>(
|
||||
std::make_shared<DigitalInput>(channel))},
|
||||
m_analogTrigger{m_dutyCycle.get()},
|
||||
m_counter{} {
|
||||
std::make_shared<DigitalInput>(channel))} {
|
||||
Init();
|
||||
}
|
||||
|
||||
DutyCycleEncoder::DutyCycleEncoder(DutyCycle& dutyCycle)
|
||||
: m_dutyCycle{&dutyCycle, NullDeleter<DutyCycle>{}},
|
||||
m_analogTrigger{m_dutyCycle.get()},
|
||||
m_counter{} {
|
||||
: m_dutyCycle{&dutyCycle, NullDeleter<DutyCycle>{}} {
|
||||
Init();
|
||||
}
|
||||
|
||||
DutyCycleEncoder::DutyCycleEncoder(DutyCycle* dutyCycle)
|
||||
: m_dutyCycle{dutyCycle, NullDeleter<DutyCycle>{}},
|
||||
m_analogTrigger{m_dutyCycle.get()},
|
||||
m_counter{} {
|
||||
: m_dutyCycle{dutyCycle, NullDeleter<DutyCycle>{}} {
|
||||
Init();
|
||||
}
|
||||
|
||||
DutyCycleEncoder::DutyCycleEncoder(std::shared_ptr<DutyCycle> dutyCycle)
|
||||
: m_dutyCycle{std::move(dutyCycle)},
|
||||
m_analogTrigger{m_dutyCycle.get()},
|
||||
m_counter{} {
|
||||
: m_dutyCycle{std::move(dutyCycle)} {
|
||||
Init();
|
||||
}
|
||||
|
||||
DutyCycleEncoder::DutyCycleEncoder(DigitalSource& digitalSource)
|
||||
: m_dutyCycle{std::make_shared<DutyCycle>(digitalSource)},
|
||||
m_analogTrigger{m_dutyCycle.get()},
|
||||
m_counter{} {
|
||||
: m_dutyCycle{std::make_shared<DutyCycle>(digitalSource)} {
|
||||
Init();
|
||||
}
|
||||
|
||||
DutyCycleEncoder::DutyCycleEncoder(DigitalSource* digitalSource)
|
||||
: m_dutyCycle{std::make_shared<DutyCycle>(digitalSource)},
|
||||
m_analogTrigger{m_dutyCycle.get()},
|
||||
m_counter{} {
|
||||
: m_dutyCycle{std::make_shared<DutyCycle>(digitalSource)} {
|
||||
Init();
|
||||
}
|
||||
|
||||
DutyCycleEncoder::DutyCycleEncoder(std::shared_ptr<DigitalSource> digitalSource)
|
||||
: m_dutyCycle{std::make_shared<DutyCycle>(digitalSource)},
|
||||
m_analogTrigger{m_dutyCycle.get()},
|
||||
m_counter{} {
|
||||
: m_dutyCycle{std::make_shared<DutyCycle>(digitalSource)} {
|
||||
Init();
|
||||
}
|
||||
|
||||
@@ -72,14 +58,16 @@ void DutyCycleEncoder::Init() {
|
||||
if (m_simDevice) {
|
||||
m_simPosition = m_simDevice.CreateDouble("Position", false, 0.0);
|
||||
m_simIsConnected = m_simDevice.CreateBoolean("Connected", false, true);
|
||||
} else {
|
||||
m_analogTrigger = std::make_unique<AnalogTrigger>(m_dutyCycle.get());
|
||||
m_analogTrigger->SetLimitsDutyCycle(0.25, 0.75);
|
||||
m_counter = std::make_unique<Counter>();
|
||||
m_counter->SetUpSource(
|
||||
m_analogTrigger->CreateOutput(AnalogTriggerType::kRisingPulse));
|
||||
m_counter->SetDownSource(
|
||||
m_analogTrigger->CreateOutput(AnalogTriggerType::kFallingPulse));
|
||||
}
|
||||
|
||||
m_analogTrigger.SetLimitsDutyCycle(0.25, 0.75);
|
||||
m_counter.SetUpSource(
|
||||
m_analogTrigger.CreateOutput(AnalogTriggerType::kRisingPulse));
|
||||
m_counter.SetDownSource(
|
||||
m_analogTrigger.CreateOutput(AnalogTriggerType::kFallingPulse));
|
||||
|
||||
SendableRegistry::GetInstance().AddLW(this, "DutyCycle Encoder",
|
||||
m_dutyCycle->GetSourceChannel());
|
||||
}
|
||||
@@ -90,9 +78,9 @@ units::turn_t DutyCycleEncoder::Get() const {
|
||||
// As the values are not atomic, keep trying until we get 2 reads of the same
|
||||
// value If we don't within 10 attempts, error
|
||||
for (int i = 0; i < 10; i++) {
|
||||
auto counter = m_counter.Get();
|
||||
auto counter = m_counter->Get();
|
||||
auto pos = m_dutyCycle->GetOutput();
|
||||
auto counter2 = m_counter.Get();
|
||||
auto counter2 = m_counter->Get();
|
||||
auto pos2 = m_dutyCycle->GetOutput();
|
||||
if (counter == counter2 && pos == pos2) {
|
||||
units::turn_t turns{counter + pos - m_positionOffset};
|
||||
@@ -124,7 +112,7 @@ int DutyCycleEncoder::GetFrequency() const {
|
||||
}
|
||||
|
||||
void DutyCycleEncoder::Reset() {
|
||||
m_counter.Reset();
|
||||
if (m_counter) m_counter->Reset();
|
||||
m_positionOffset = m_dutyCycle->GetOutput();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user