Skip to content

Commit

Permalink
Expand DutyCycleEncoderSim API
Browse files Browse the repository at this point in the history
  • Loading branch information
Gold856 committed Jul 13, 2023
1 parent 7ac9329 commit 1ea194c
Show file tree
Hide file tree
Showing 7 changed files with 253 additions and 3 deletions.
3 changes: 3 additions & 0 deletions wpilibc/src/main/native/cpp/DutyCycleEncoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,9 @@ void DutyCycleEncoder::SetDistancePerRotation(double distancePerRotation) {
}

double DutyCycleEncoder::GetDistancePerRotation() const {
if (m_simDistancePerRotation) {
return m_simDistancePerRotation.Get();
}
return m_distancePerRotation;
}

Expand Down
34 changes: 34 additions & 0 deletions wpilibc/src/main/native/cpp/simulation/DutyCycleEncoderSim.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,46 @@ DutyCycleEncoderSim::DutyCycleEncoderSim(int channel) {
frc::sim::SimDeviceSim deviceSim{"DutyCycle:DutyCycleEncoder", channel};
m_simPosition = deviceSim.GetDouble("position");
m_simDistancePerRotation = deviceSim.GetDouble("distance_per_rot");
m_simAbsolutePosition = deviceSim.GetDouble("absPosition");
m_simIsConnected = deviceSim.GetBoolean("connected");
}

double DutyCycleEncoderSim::Get() {
return m_simPosition.Get();
}

void DutyCycleEncoderSim::Set(units::turn_t turns) {
m_simPosition.Set(turns.value());
}

double DutyCycleEncoderSim::GetDistance() {
return m_simPosition.Get() * m_simDistancePerRotation.Get();
}

void DutyCycleEncoderSim::SetDistance(double distance) {
m_simPosition.Set(distance / m_simDistancePerRotation.Get());
}

double DutyCycleEncoderSim::GetAbsolutePosition() {
return m_simAbsolutePosition.Get();
}

void DutyCycleEncoderSim::SetAbsolutePosition(double position) {
m_simAbsolutePosition.Set(position);
}

double DutyCycleEncoderSim::GetDistancePerRotation() {
return m_simDistancePerRotation.Get();
}

void DutyCycleEncoderSim::SetDistancePerRotation(double distancePerRotation) {
m_simDistancePerRotation.Set(distancePerRotation);
}

bool DutyCycleEncoderSim::IsConnected() {
return m_simIsConnected.Get();
}

void DutyCycleEncoderSim::SetConnected(bool isConnected) {
m_simIsConnected.Set(isConnected);
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@ class DutyCycleEncoderSim {
*/
explicit DutyCycleEncoderSim(int channel);

/**
* Get the position in turns.
*
* @return The position.
*/
double Get();

/**
* Set the position in turns.
*
Expand All @@ -40,13 +47,68 @@ class DutyCycleEncoderSim {
void Set(units::turn_t turns);

/**
* Set the position.
* Get the distance.
*
* @return The distance.
*/

double GetDistance();
/**
* Set the distance.
*
* @return The distance.
*/
void SetDistance(double distance);

/**
* Get the absolute position.
*
* @return The absolute position
*/
double GetAbsolutePosition();

/**
* Set the absolute position.
*
* @param position The absolute position
*/
void SetAbsolutePosition(double position);

/**
* Get the distance per rotation for this encoder.
*
* @return The scale factor that will be used to convert rotation to useful
* units.
*/
double GetDistancePerRotation();

/**
* Set the distance per rotation for this encoder.
*
* @param distancePerRotation The scale factor that will be used to convert
* rotation to useful units.
*/
void SetDistancePerRotation(double distancePerRotation);

/**
* Get if the encoder is connected.
*
* @return true if the encoder is connected.
*/
bool IsConnected();

/**
* Set if the encoder is connected.
*
* @param isConnected Whether or not the sensor is connected.
*/
void SetConnected(bool isConnected);

private:
hal::SimDouble m_simPosition;
hal::SimDouble m_simDistancePerRotation;
hal::SimDouble m_simAbsolutePosition;
hal::SimBoolean m_simIsConnected;
};

} // namespace sim
Expand Down
30 changes: 30 additions & 0 deletions wpilibc/src/test/native/cpp/simulation/DutyCycleEncoderSimTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,34 @@ TEST(DutyCycleEncoderSimTest, SetDistance) {
EXPECT_EQ(19.1, enc.GetDistance());
}

TEST(DutyCycleEncoderSimTest, SetDistancePerRotation) {
HAL_Initialize(500, 0);

DutyCycleEncoder enc{0};
DutyCycleEncoderSim sim(enc);
sim.Set(units::turn_t{1.5});
sim.SetDistancePerRotation(42);
EXPECT_EQ(63, enc.GetDistance());
}

TEST(DutyCycleEncoderSimTest, SetAbsolutePosition) {
HAL_Initialize(500, 0);

DutyCycleEncoder enc{0};
DutyCycleEncoderSim sim(enc);
sim.SetAbsolutePosition(0.75);
EXPECT_EQ(0.75, enc.GetAbsolutePosition());
}

TEST(DutyCycleEncoderSimTest, SetIsConnected) {
HAL_Initialize(500, 0);

DutyCycleEncoder enc{0};
DutyCycleEncoderSim sim(enc);
sim.SetConnected(true);
EXPECT_TRUE(enc.IsConnected());
sim.SetConnected(false);
EXPECT_FALSE(enc.IsConnected());
}

} // namespace frc::sim
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,9 @@ public void setDistancePerRotation(double distancePerRotation) {
* @return The scale factor that will be used to convert rotation to useful units.
*/
public double getDistancePerRotation() {
if (m_simDistancePerRotation != null) {
return m_simDistancePerRotation.get();
}
return m_distancePerRotation;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@

package edu.wpi.first.wpilibj.simulation;

import edu.wpi.first.hal.SimBoolean;
import edu.wpi.first.hal.SimDouble;
import edu.wpi.first.wpilibj.DutyCycleEncoder;

/** Class to control a simulated duty cycle encoder. */
public class DutyCycleEncoderSim {
private final SimDouble m_simPosition;
private final SimDouble m_simDistancePerRotation;
private final SimDouble m_simAbsolutePosition;
private final SimBoolean m_simIsConnected;

/**
* Constructs from an DutyCycleEncoder object.
Expand All @@ -30,6 +33,17 @@ public DutyCycleEncoderSim(int channel) {
SimDeviceSim wrappedSimDevice = new SimDeviceSim("DutyCycle:DutyCycleEncoder", channel);
m_simPosition = wrappedSimDevice.getDouble("position");
m_simDistancePerRotation = wrappedSimDevice.getDouble("distance_per_rot");
m_simAbsolutePosition = wrappedSimDevice.getDouble("absPosition");
m_simIsConnected = wrappedSimDevice.getBoolean("connected");
}

/**
* Get the position in turns.
*
* @return The position.
*/
public double get() {
return m_simPosition.get();
}

/**
Expand All @@ -42,11 +56,75 @@ public void set(double turns) {
}

/**
* Set the position.
* Get the distance.
*
* @return The distance.
*/
public double getDistance() {
return m_simPosition.get() * m_simDistancePerRotation.get();
}

/**
* Set the distance.
*
* @param distance The position.
* @param distance The distance.
*/
public void setDistance(double distance) {
m_simPosition.set(distance / m_simDistancePerRotation.get());
}

/**
* Get the absolute position.
*
* @return The absolute position
*/
public double getAbsolutePosition() {
return m_simAbsolutePosition.get();
}

/**
* Set the absolute position.
*
* @param position The absolute position
*/
public void setAbsolutePosition(double position) {
m_simAbsolutePosition.set(position);
}

/**
* Get the distance per rotation for this encoder.
*
* @return The scale factor that will be used to convert rotation to useful units.
*/
public double getDistancePerRotation() {
return m_simDistancePerRotation.get();
}

/**
* Set the distance per rotation for this encoder.
*
* @param distancePerRotation The scale factor that will be used to convert rotation to useful
* units.
*/
public void setDistancePerRotation(double distancePerRotation) {
m_simDistancePerRotation.set(distancePerRotation);
}

/**
* Get if the encoder is connected.
*
* @return true if the encoder is connected.
*/
public boolean getConnected() {
return m_simIsConnected.get();
}

/**
* Set if the encoder is connected.
*
* @param isConnected Whether or not the sensor is connected.
*/
public void setConnected(boolean isConnected) {
m_simIsConnected.set(isConnected);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
package edu.wpi.first.wpilibj.simulation;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import edu.wpi.first.hal.HAL;
import edu.wpi.first.wpilibj.DutyCycleEncoder;
Expand Down Expand Up @@ -32,4 +34,42 @@ void setDistanceTest() {
assertEquals(19.1, encoder.getDistance());
}
}

@Test
void setDistancePerRotationTest() {
HAL.initialize(500, 0);

try (DutyCycleEncoder encoder = new DutyCycleEncoder(0)) {
DutyCycleEncoderSim sim = new DutyCycleEncoderSim(encoder);
sim.set(1.5);
sim.setDistancePerRotation(42);
assertEquals(63.0, encoder.getDistance());
}
}

@Test
void setAbsolutePositionTest() {
HAL.initialize(500, 0);

try (DutyCycleEncoder encoder = new DutyCycleEncoder(0)) {
DutyCycleEncoderSim sim = new DutyCycleEncoderSim(encoder);

sim.setAbsolutePosition(0.75);
assertEquals(0.75, encoder.getAbsolutePosition());
}
}

@Test
void setIsConnectedTest() {
HAL.initialize(500, 0);

try (DutyCycleEncoder encoder = new DutyCycleEncoder(0)) {
DutyCycleEncoderSim sim = new DutyCycleEncoderSim(encoder);

sim.setConnected(true);
assertTrue(encoder.isConnected());
sim.setConnected(false);
assertFalse(encoder.isConnected());
}
}
}

0 comments on commit 1ea194c

Please sign in to comment.