Skip to content
This repository has been archived by the owner on Jan 13, 2025. It is now read-only.

Commit

Permalink
add support for CANcoder to MaroonFramework (#21)
Browse files Browse the repository at this point in the history
* start adding support for CANcoder in MaroonFramework

* remove CANcoderEncoder.get()

* add support for CANcoders

* responding to PR comments
  • Loading branch information
dejabot authored Feb 1, 2024
1 parent 38bedf9 commit 5592608
Show file tree
Hide file tree
Showing 8 changed files with 118 additions and 8 deletions.
4 changes: 4 additions & 0 deletions src/main/java/com/team766/hal/EncoderReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

public interface EncoderReader extends ControlInputReader {

enum Type {
CANcoder
};

/**
* Reset the Encoder distance to zero. Resets the current count to zero on the encoder.
*/
Expand Down
13 changes: 11 additions & 2 deletions src/main/java/com/team766/hal/RobotProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ protected abstract MotorController getMotor(

public abstract EncoderReader getEncoder(int index1, int index2);

public abstract EncoderReader getEncoder(int index, String configPrefix);

public abstract DigitalInputReader getDigitalInput(int index);

public abstract AnalogInputReader getAnalogInput(int index);
Expand Down Expand Up @@ -158,6 +160,13 @@ public MotorController getMotor(final String configName) {

public EncoderReader getEncoder(final String configName) {
try {
// check for a single port encoder
final ValueProvider<Integer> deviceId =
ConfigFileReader.getInstance().getInt(configName + ".deviceId");
if (deviceId.hasValue()) {
return getEncoder(deviceId.get(), configName);
}
// or a dual-port encoder
final ValueProvider<Integer[]> ports =
ConfigFileReader.getInstance().getInts(configName + ".ports");
final ValueProvider<Double> distancePerPulseConfig =
Expand All @@ -171,7 +180,7 @@ public EncoderReader getEncoder(final String configName) {
"Encoder %s has %d config values, but expected 2",
configName,
portsValue.length);
return new MockEncoder(0, 0);
return new MockEncoder();
}
checkDeviceName("encoder/digital input", digitalIoNames, portsValue[0], configName);
checkDeviceName("encoder/digital input", digitalIoNames, portsValue[1], configName);
Expand All @@ -186,7 +195,7 @@ public EncoderReader getEncoder(final String configName) {
Severity.ERROR,
"Encoder %s not found in config file, using mock encoder instead",
configName);
return new MockEncoder(0, 0);
return new MockEncoder();
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/team766/hal/mock/MockEncoder.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public class MockEncoder implements EncoderReader {
private double rate = 0;
private double distancePerPulse = 1;

public MockEncoder(final int a, final int b) {}
public MockEncoder() {}

@Override
public void reset() {
Expand Down
9 changes: 7 additions & 2 deletions src/main/java/com/team766/hal/mock/TestRobotProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,24 @@ public MotorController getMotor(
new LocalMotorController(
configPrefix,
new MockMotorController(index),
localSensor != null ? localSensor : new MockEncoder(-1, -1));
localSensor != null ? localSensor : new MockEncoder());
}
return motors[index];
}

@Override
public EncoderReader getEncoder(final int index1, final int index2) {
if (encoders[index1] == null) {
encoders[index1] = new MockEncoder(index1, index2);
encoders[index1] = new MockEncoder();
}
return encoders[index1];
}

@Override
public EncoderReader getEncoder(final int index1, String configPrefix) {
return new MockEncoder();
}

@Override
public SolenoidController getSolenoid(final int index) {
if (solenoids[index] == null) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/team766/hal/simulator/Encoder.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ public class Encoder implements EncoderReader {
private final int channel;
private double distancePerPulse = 1.0;

public Encoder(final int a, final int b) {
this.channel = a;
public Encoder(final int channel) {
this.channel = channel;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,15 @@ public MotorController getMotor(
@Override
public EncoderReader getEncoder(final int index1, final int index2) {
if (encoders[index1] == null) {
encoders[index1] = new Encoder(index1, index2);
encoders[index1] = new Encoder(index1);
}
return encoders[index1];
}

@Override
public EncoderReader getEncoder(final int index1, String configPrefix) {
if (encoders[index1] == null) {
encoders[index1] = new Encoder(index1);
}
return encoders[index1];
}
Expand Down
61 changes: 61 additions & 0 deletions src/main/java/com/team766/hal/wpilib/CANcoderEncoder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.team766.hal.wpilib;

import com.ctre.phoenix6.StatusSignal;
import com.ctre.phoenix6.hardware.CANcoder;
import com.team766.hal.EncoderReader;
import com.team766.logging.Category;
import com.team766.logging.Logger;
import com.team766.logging.Severity;

public class CANcoderEncoder implements EncoderReader {

private final CANcoder cancoder;
private double distancePerPulse = 1;

public CANcoderEncoder(int deviceId) {
cancoder = new CANcoder(deviceId);
}

public CANcoderEncoder(int deviceId, String canBus) {
cancoder = new CANcoder(deviceId, canBus);
}

@Override
public double getDistance() {
StatusSignal<Double> position = cancoder.getPosition();
if (!position.getStatus().isOK()) {
Logger.get(Category.HAL)
.logData(
Severity.ERROR,
"Unable to get position: %s",
position.getStatus().toString());
return 0;
}
return distancePerPulse * position.getValueAsDouble();
}

@Override
public double getRate() {
StatusSignal<Double> velocity = cancoder.getVelocity();
if (!velocity.getStatus().isOK()) {
Logger.get(Category.HAL)
.logData(
Severity.ERROR,
"Unable to get rate: %s",
velocity.getStatus().toString());
return 0;
}
return distancePerPulse * velocity.getValueAsDouble();
}

@Override
public void reset() {
cancoder.setPosition(0);
}

@Override
public void setDistancePerPulse(double distancePerPulse) {
// each "pulse" is a rotation
this.distancePerPulse = distancePerPulse;
}
}
23 changes: 23 additions & 0 deletions src/main/java/com/team766/hal/wpilib/WPIRobotProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.team766.hal.RobotProvider;
import com.team766.hal.SolenoidController;
import com.team766.hal.mock.MockBeaconSensor;
import com.team766.hal.mock.MockEncoder;
import com.team766.hal.mock.MockGyro;
import com.team766.hal.mock.MockMotorController;
import com.team766.hal.mock.MockPositionSensor;
Expand Down Expand Up @@ -177,6 +178,28 @@ public EncoderReader getEncoder(int index1, int index2) {
return encoders[index1];
}

@Override
public EncoderReader getEncoder(int index1, String configPrefix) {
final ValueProvider<EncoderReader.Type> type =
ConfigFileReader.getInstance()
.getEnum(EncoderReader.Type.class, configPrefix + ".type");

if (type.hasValue()) {
if (type.get() == EncoderReader.Type.CANcoder) {
ValueProvider<String> canBus =
ConfigFileReader.getInstance().getString(configPrefix + ".CANBus");
return new CANcoderEncoder(index1, canBus.get());
} else {
Logger.get(Category.CONFIGURATION)
.logData(
Severity.WARNING,
"Unknown encoder type: %s",
type.get().toString());
}
}
return new MockEncoder();
}

@Override
public SolenoidController getSolenoid(int index) {
if (solenoids[index] == null) {
Expand Down

0 comments on commit 5592608

Please sign in to comment.