Use Java 17 features (#6691)

Uses enhanced instanceof (and simplify equals methods)
Uses switch expressions and arrow labels
Seal and finalize some Shuffleboard classes

Co-authored-by: Sam Carlberg <sam@slfc.dev>
This commit is contained in:
Gold856
2024-06-05 00:09:10 -04:00
committed by GitHub
parent d6b66bfa55
commit b99d9c1710
95 changed files with 957 additions and 1594 deletions

View File

@@ -39,11 +39,7 @@ public class AprilTag {
@Override
public boolean equals(Object obj) {
if (obj instanceof AprilTag) {
var other = (AprilTag) obj;
return ID == other.ID && pose.equals(other.pose);
}
return false;
return obj instanceof AprilTag tag && ID == tag.ID && pose.equals(tag.pose);
}
@Override

View File

@@ -99,12 +99,8 @@ public class AprilTagDetector implements AutoCloseable {
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Config)) {
return false;
}
Config other = (Config) obj;
return numThreads == other.numThreads
return obj instanceof Config other
&& numThreads == other.numThreads
&& quadDecimate == other.quadDecimate
&& quadSigma == other.quadSigma
&& refineEdges == other.refineEdges
@@ -194,12 +190,8 @@ public class AprilTagDetector implements AutoCloseable {
@Override
public boolean equals(Object obj) {
if (!(obj instanceof QuadThresholdParameters)) {
return false;
}
QuadThresholdParameters other = (QuadThresholdParameters) obj;
return minClusterPixels == other.minClusterPixels
return obj instanceof QuadThresholdParameters other
&& minClusterPixels == other.minClusterPixels
&& maxNumMaxima == other.maxNumMaxima
&& criticalAngle == other.criticalAngle
&& maxLineFitMSE == other.maxLineFitMSE

View File

@@ -148,19 +148,14 @@ public class AprilTagFieldLayout {
*/
@JsonIgnore
public final void setOrigin(OriginPosition origin) {
switch (origin) {
case kBlueAllianceWallRightSide:
setOrigin(Pose3d.kZero);
break;
case kRedAllianceWallRightSide:
setOrigin(
new Pose3d(
new Translation3d(m_fieldDimensions.fieldLength, m_fieldDimensions.fieldWidth, 0),
new Rotation3d(0, 0, Math.PI)));
break;
default:
throw new IllegalArgumentException("Unsupported enum value");
}
var pose =
switch (origin) {
case kBlueAllianceWallRightSide -> Pose3d.kZero;
case kRedAllianceWallRightSide -> new Pose3d(
new Translation3d(m_fieldDimensions.fieldLength, m_fieldDimensions.fieldWidth, 0),
new Rotation3d(0, 0, Math.PI));
};
setOrigin(pose);
}
/**
@@ -271,11 +266,9 @@ public class AprilTagFieldLayout {
@Override
public boolean equals(Object obj) {
if (obj instanceof AprilTagFieldLayout) {
var other = (AprilTagFieldLayout) obj;
return m_apriltags.equals(other.m_apriltags) && m_origin.equals(other.m_origin);
}
return false;
return obj instanceof AprilTagFieldLayout layout
&& m_apriltags.equals(layout.m_apriltags)
&& m_origin.equals(layout.m_origin);
}
@Override

View File

@@ -55,12 +55,8 @@ public class AprilTagPoseEstimator {
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Config)) {
return false;
}
Config other = (Config) obj;
return tagSize == other.tagSize
return obj instanceof Config other
&& tagSize == other.tagSize
&& fx == other.fx
&& fy == other.fy
&& cx == other.cx

View File

@@ -94,24 +94,24 @@ public final class CameraServer {
void update(VideoEvent event) {
switch (event.propertyKind) {
case kBoolean:
case kBoolean -> {
if (m_booleanValueEntry != null) {
m_booleanValueEntry.set(event.value != 0);
}
break;
case kInteger:
case kEnum:
}
case kInteger, kEnum -> {
if (m_integerValueEntry != null) {
m_integerValueEntry.set(event.value);
}
break;
case kString:
}
case kString -> {
if (m_stringValueEntry != null) {
m_stringValueEntry.set(event.valueStr);
}
break;
default:
break;
}
default -> {
// NOP
}
}
}
@@ -231,112 +231,93 @@ public final class CameraServer {
event -> {
synchronized (CameraServer.class) {
switch (event.kind) {
case kSourceCreated:
{
// Create subtable for the camera
NetworkTable table = m_publishTable.getSubTable(event.name);
m_publishers.put(
event.sourceHandle, new SourcePublisher(table, event.sourceHandle));
break;
case kSourceCreated -> {
// Create subtable for the camera
NetworkTable table = m_publishTable.getSubTable(event.name);
m_publishers.put(
event.sourceHandle, new SourcePublisher(table, event.sourceHandle));
}
case kSourceDestroyed -> {
SourcePublisher publisher = m_publishers.remove(event.sourceHandle);
if (publisher != null) {
try {
publisher.close();
} catch (Exception e) {
// ignore (nothing we can do about it)
}
}
case kSourceDestroyed:
{
SourcePublisher publisher = m_publishers.remove(event.sourceHandle);
if (publisher != null) {
}
case kSourceConnected -> {
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
// update the description too (as it may have changed)
publisher.m_descriptionPublisher.set(
CameraServerJNI.getSourceDescription(event.sourceHandle));
publisher.m_connectedPublisher.set(true);
}
}
case kSourceDisconnected -> {
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
publisher.m_connectedPublisher.set(false);
}
}
case kSourceVideoModesUpdated -> {
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
publisher.m_modesPublisher.set(getSourceModeValues(event.sourceHandle));
}
}
case kSourceVideoModeChanged -> {
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
publisher.m_modeEntry.set(videoModeToString(event.mode));
}
}
case kSourcePropertyCreated -> {
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
publisher.m_properties.put(
event.propertyHandle, new PropertyPublisher(publisher.m_table, event));
}
}
case kSourcePropertyValueUpdated -> {
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
PropertyPublisher pp = publisher.m_properties.get(event.propertyHandle);
if (pp != null) {
pp.update(event);
}
}
}
case kSourcePropertyChoicesUpdated -> {
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
PropertyPublisher pp = publisher.m_properties.get(event.propertyHandle);
if (pp != null && pp.m_choicesTopic != null) {
try {
publisher.close();
} catch (Exception e) {
// ignore (nothing we can do about it)
}
}
break;
}
case kSourceConnected:
{
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
// update the description too (as it may have changed)
publisher.m_descriptionPublisher.set(
CameraServerJNI.getSourceDescription(event.sourceHandle));
publisher.m_connectedPublisher.set(true);
}
break;
}
case kSourceDisconnected:
{
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
publisher.m_connectedPublisher.set(false);
}
break;
}
case kSourceVideoModesUpdated:
{
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
publisher.m_modesPublisher.set(getSourceModeValues(event.sourceHandle));
}
break;
}
case kSourceVideoModeChanged:
{
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
publisher.m_modeEntry.set(videoModeToString(event.mode));
}
break;
}
case kSourcePropertyCreated:
{
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
publisher.m_properties.put(
event.propertyHandle, new PropertyPublisher(publisher.m_table, event));
}
break;
}
case kSourcePropertyValueUpdated:
{
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
PropertyPublisher pp = publisher.m_properties.get(event.propertyHandle);
if (pp != null) {
pp.update(event);
}
}
break;
}
case kSourcePropertyChoicesUpdated:
{
SourcePublisher publisher = m_publishers.get(event.sourceHandle);
if (publisher != null) {
PropertyPublisher pp = publisher.m_properties.get(event.propertyHandle);
if (pp != null && pp.m_choicesTopic != null) {
try {
String[] choices =
CameraServerJNI.getEnumPropertyChoices(event.propertyHandle);
if (pp.m_choicesPublisher == null) {
pp.m_choicesPublisher = pp.m_choicesTopic.publish();
}
pp.m_choicesPublisher.set(choices);
} catch (VideoException ignored) {
// ignore (just don't publish choices if we can't get them)
String[] choices =
CameraServerJNI.getEnumPropertyChoices(event.propertyHandle);
if (pp.m_choicesPublisher == null) {
pp.m_choicesPublisher = pp.m_choicesTopic.publish();
}
pp.m_choicesPublisher.set(choices);
} catch (VideoException ignored) {
// ignore (just don't publish choices if we can't get them)
}
}
break;
}
case kSinkSourceChanged:
case kSinkCreated:
case kSinkDestroyed:
case kNetworkInterfacesChanged:
{
m_addresses = CameraServerJNI.getNetworkInterfaces();
updateStreamValues();
break;
}
default:
break;
}
case kSinkSourceChanged,
kSinkCreated,
kSinkDestroyed,
kNetworkInterfacesChanged -> {
m_addresses = CameraServerJNI.getNetworkInterfaces();
updateStreamValues();
}
default -> {
// NOP
}
}
}
},
@@ -352,25 +333,20 @@ public final class CameraServer {
* @param source Source index.
*/
private static String makeSourceValue(int source) {
switch (VideoSource.getKindFromInt(CameraServerJNI.getSourceKind(source))) {
case kUsb:
return "usb:" + CameraServerJNI.getUsbCameraPath(source);
case kHttp:
{
String[] urls = CameraServerJNI.getHttpCameraUrls(source);
if (urls.length > 0) {
return "ip:" + urls[0];
} else {
return "ip:";
}
return switch (VideoSource.getKindFromInt(CameraServerJNI.getSourceKind(source))) {
case kUsb -> "usb:" + CameraServerJNI.getUsbCameraPath(source);
case kHttp -> {
String[] urls = CameraServerJNI.getHttpCameraUrls(source);
if (urls.length > 0) {
yield "ip:" + urls[0];
} else {
yield "ip:";
}
case kCv:
return "cv:";
case kRaw:
return "raw:";
default:
return "unknown:";
}
}
case kCv -> "cv:";
case kRaw -> "raw:";
case kUnknown -> "unknown:";
};
}
/**
@@ -504,20 +480,17 @@ public final class CameraServer {
/** Provide string description of pixel format. */
private static String pixelFormatToString(PixelFormat pixelFormat) {
switch (pixelFormat) {
case kMJPEG:
return "MJPEG";
case kYUYV:
return "YUYV";
case kRGB565:
return "RGB565";
case kBGR:
return "BGR";
case kGray:
return "Gray";
default:
return "Unknown";
}
return switch (pixelFormat) {
case kMJPEG -> "MJPEG";
case kYUYV -> "YUYV";
case kRGB565 -> "RGB565";
case kBGR -> "BGR";
case kBGRA -> "BGRA";
case kGray -> "Gray";
case kY16 -> "Y16";
case kUYVY -> "UYVY";
case kUnknown -> "Unknown";
};
}
/**

View File

@@ -20,22 +20,12 @@ public class RawCVMatSink extends ImageSink {
int bgrValue = PixelFormat.kBGR.getValue();
private int getCVFormat(PixelFormat pixelFormat) {
int type = 0;
switch (pixelFormat) {
case kYUYV:
case kRGB565:
type = CvType.CV_8UC2;
break;
case kBGR:
type = CvType.CV_8UC3;
break;
case kGray:
case kMJPEG:
default:
type = CvType.CV_8UC1;
break;
}
return type;
return switch (pixelFormat) {
case kYUYV, kRGB565, kY16, kUYVY -> CvType.CV_8UC2;
case kBGR -> CvType.CV_8UC3;
case kBGRA -> CvType.CV_8UC4;
case kGray, kMJPEG, kUnknown -> CvType.CV_8UC1;
};
}
/**

View File

@@ -32,27 +32,12 @@ public class CvSink extends ImageSink {
}
private int getCVFormat(PixelFormat pixelFormat) {
int type = 0;
switch (pixelFormat) {
case kYUYV:
case kRGB565:
case kY16:
case kUYVY:
type = CvType.CV_8UC2;
break;
case kBGR:
type = CvType.CV_8UC3;
break;
case kBGRA:
type = CvType.CV_8UC4;
break;
case kGray:
case kMJPEG:
default:
type = CvType.CV_8UC1;
break;
}
return type;
return switch (pixelFormat) {
case kYUYV, kRGB565, kY16, kUYVY -> CvType.CV_8UC2;
case kBGR -> CvType.CV_8UC3;
case kBGRA -> CvType.CV_8UC4;
case kGray, kMJPEG, kUnknown -> CvType.CV_8UC1;
};
}
/**

View File

@@ -62,22 +62,15 @@ public class CvSource extends ImageSource {
try {
int channels = finalImage.channels();
PixelFormat format;
if (channels == 1) {
// 1 channel is assumed Graysacle
format = PixelFormat.kGray;
} else if (channels == 2) {
// 2 channels is assumed YUYV
format = PixelFormat.kYUYV;
} else if (channels == 3) {
// 3 channels is assumed BGR
format = PixelFormat.kBGR;
} else if (channels == 4) {
// 4 channels is assumed BGRA
format = PixelFormat.kBGRA;
} else {
throw new VideoException("Unable to get pixel format for " + channels + " channels");
}
PixelFormat format =
switch (channels) {
case 1 -> PixelFormat.kGray; // 1 channel is assumed Grayscale
case 2 -> PixelFormat.kYUYV; // 2 channels is assumed YUYV
case 3 -> PixelFormat.kBGR; // 3 channels is assumed BGR
case 4 -> PixelFormat.kBGRA; // 4 channels is assumed BGRA
default -> throw new VideoException(
"Unable to get pixel format for " + channels + " channels");
};
putFrame(finalImage, format, true);
} finally {

View File

@@ -40,16 +40,12 @@ public class HttpCamera extends VideoCamera {
* @return The kind
*/
public static HttpCameraKind getHttpCameraKindFromInt(int kind) {
switch (kind) {
case 1:
return HttpCameraKind.kMJPGStreamer;
case 2:
return HttpCameraKind.kCSCore;
case 3:
return HttpCameraKind.kAxis;
default:
return HttpCameraKind.kUnknown;
}
return switch (kind) {
case 1 -> HttpCameraKind.kMJPGStreamer;
case 2 -> HttpCameraKind.kCSCore;
case 3 -> HttpCameraKind.kAxis;
default -> HttpCameraKind.kUnknown;
};
}
/**

View File

@@ -75,48 +75,28 @@ public class VideoEvent {
* @return The kind
*/
public static Kind getKindFromInt(int kind) {
switch (kind) {
case 0x0001:
return Kind.kSourceCreated;
case 0x0002:
return Kind.kSourceDestroyed;
case 0x0004:
return Kind.kSourceConnected;
case 0x0008:
return Kind.kSourceDisconnected;
case 0x0010:
return Kind.kSourceVideoModesUpdated;
case 0x0020:
return Kind.kSourceVideoModeChanged;
case 0x0040:
return Kind.kSourcePropertyCreated;
case 0x0080:
return Kind.kSourcePropertyValueUpdated;
case 0x0100:
return Kind.kSourcePropertyChoicesUpdated;
case 0x0200:
return Kind.kSinkSourceChanged;
case 0x0400:
return Kind.kSinkCreated;
case 0x0800:
return Kind.kSinkDestroyed;
case 0x1000:
return Kind.kSinkEnabled;
case 0x2000:
return Kind.kSinkDisabled;
case 0x4000:
return Kind.kNetworkInterfacesChanged;
case 0x10000:
return Kind.kSinkPropertyCreated;
case 0x20000:
return Kind.kSinkPropertyValueUpdated;
case 0x40000:
return Kind.kSinkPropertyChoicesUpdated;
case 0x80000:
return Kind.kUsbCamerasChanged;
default:
return Kind.kUnknown;
}
return switch (kind) {
case 0x0001 -> Kind.kSourceCreated;
case 0x0002 -> Kind.kSourceDestroyed;
case 0x0004 -> Kind.kSourceConnected;
case 0x0008 -> Kind.kSourceDisconnected;
case 0x0010 -> Kind.kSourceVideoModesUpdated;
case 0x0020 -> Kind.kSourceVideoModeChanged;
case 0x0040 -> Kind.kSourcePropertyCreated;
case 0x0080 -> Kind.kSourcePropertyValueUpdated;
case 0x0100 -> Kind.kSourcePropertyChoicesUpdated;
case 0x0200 -> Kind.kSinkSourceChanged;
case 0x0400 -> Kind.kSinkCreated;
case 0x0800 -> Kind.kSinkDestroyed;
case 0x1000 -> Kind.kSinkEnabled;
case 0x2000 -> Kind.kSinkDisabled;
case 0x4000 -> Kind.kNetworkInterfacesChanged;
case 0x10000 -> Kind.kSinkPropertyCreated;
case 0x20000 -> Kind.kSinkPropertyValueUpdated;
case 0x40000 -> Kind.kSinkPropertyChoicesUpdated;
case 0x80000 -> Kind.kUsbCamerasChanged;
default -> Kind.kUnknown;
};
}
VideoEvent(

View File

@@ -42,18 +42,13 @@ public class VideoProperty {
* @return The kind
*/
public static Kind getKindFromInt(int kind) {
switch (kind) {
case 1:
return Kind.kBoolean;
case 2:
return Kind.kInteger;
case 4:
return Kind.kString;
case 8:
return Kind.kEnum;
default:
return Kind.kNone;
}
return switch (kind) {
case 1 -> Kind.kBoolean;
case 2 -> Kind.kInteger;
case 4 -> Kind.kString;
case 8 -> Kind.kEnum;
default -> Kind.kNone;
};
}
/**

View File

@@ -43,16 +43,12 @@ public class VideoSink implements AutoCloseable {
* @return The kind
*/
public static Kind getKindFromInt(int kind) {
switch (kind) {
case 2:
return Kind.kMjpeg;
case 4:
return Kind.kCv;
case 8:
return Kind.kRaw;
default:
return Kind.kUnknown;
}
return switch (kind) {
case 2 -> Kind.kMjpeg;
case 4 -> Kind.kCv;
case 8 -> Kind.kRaw;
default -> Kind.kUnknown;
};
}
/**

View File

@@ -79,18 +79,13 @@ public class VideoSource implements AutoCloseable {
* @return The kind
*/
public static Kind getKindFromInt(int kind) {
switch (kind) {
case 1:
return Kind.kUsb;
case 2:
return Kind.kHttp;
case 4:
return Kind.kCv;
case 8:
return Kind.kRaw;
default:
return Kind.kUnknown;
}
return switch (kind) {
case 1 -> Kind.kUsb;
case 2 -> Kind.kHttp;
case 4 -> Kind.kCv;
case 8 -> Kind.kRaw;
default -> Kind.kUnknown;
};
}
/**

View File

@@ -162,24 +162,16 @@ public class DriverStationJNI extends JNIWrapper {
* @see "HAL_GetAllianceStation"
*/
public static AllianceStationID getAllianceStation() {
switch (nativeGetAllianceStation()) {
case kUnknownAllianceStation:
return AllianceStationID.Unknown;
case kRed1AllianceStation:
return AllianceStationID.Red1;
case kRed2AllianceStation:
return AllianceStationID.Red2;
case kRed3AllianceStation:
return AllianceStationID.Red3;
case kBlue1AllianceStation:
return AllianceStationID.Blue1;
case kBlue2AllianceStation:
return AllianceStationID.Blue2;
case kBlue3AllianceStation:
return AllianceStationID.Blue3;
default:
return null;
}
return switch (nativeGetAllianceStation()) {
case kUnknownAllianceStation -> AllianceStationID.Unknown;
case kRed1AllianceStation -> AllianceStationID.Red1;
case kRed2AllianceStation -> AllianceStationID.Red2;
case kRed3AllianceStation -> AllianceStationID.Red3;
case kBlue1AllianceStation -> AllianceStationID.Blue1;
case kBlue2AllianceStation -> AllianceStationID.Blue2;
case kBlue3AllianceStation -> AllianceStationID.Blue3;
default -> null;
};
}
public static final int kMaxJoystickAxes = 12;

View File

@@ -145,19 +145,13 @@ public final class HALValue {
* @return HAL value
*/
public static HALValue fromNative(int type, long value1, double value2) {
switch (type) {
case kBoolean:
return makeBoolean(value1 != 0);
case kDouble:
return makeDouble(value2);
case kEnum:
return makeEnum((int) value1);
case kInt:
return makeInt((int) value1);
case kLong:
return makeLong(value1);
default:
return makeUnassigned();
}
return switch (type) {
case kBoolean -> makeBoolean(value1 != 0);
case kDouble -> makeDouble(value2);
case kEnum -> makeEnum((int) value1);
case kInt -> makeInt((int) value1);
case kLong -> makeLong(value1);
default -> makeUnassigned();
};
}
}

View File

@@ -69,58 +69,34 @@ public class PowerDistributionFaults {
* the hardware.
*/
public final boolean getBreakerFault(int channel) {
switch (channel) {
case 0:
return Channel0BreakerFault;
case 1:
return Channel1BreakerFault;
case 2:
return Channel2BreakerFault;
case 3:
return Channel3BreakerFault;
case 4:
return Channel4BreakerFault;
case 5:
return Channel5BreakerFault;
case 6:
return Channel6BreakerFault;
case 7:
return Channel7BreakerFault;
case 8:
return Channel8BreakerFault;
case 9:
return Channel9BreakerFault;
case 10:
return Channel10BreakerFault;
case 11:
return Channel11BreakerFault;
case 12:
return Channel12BreakerFault;
case 13:
return Channel13BreakerFault;
case 14:
return Channel14BreakerFault;
case 15:
return Channel15BreakerFault;
case 16:
return Channel16BreakerFault;
case 17:
return Channel17BreakerFault;
case 18:
return Channel18BreakerFault;
case 19:
return Channel19BreakerFault;
case 20:
return Channel20BreakerFault;
case 21:
return Channel21BreakerFault;
case 22:
return Channel22BreakerFault;
case 23:
return Channel23BreakerFault;
default:
throw new IndexOutOfBoundsException("Power distribution fault channel out of bounds!");
}
return switch (channel) {
case 0 -> Channel0BreakerFault;
case 1 -> Channel1BreakerFault;
case 2 -> Channel2BreakerFault;
case 3 -> Channel3BreakerFault;
case 4 -> Channel4BreakerFault;
case 5 -> Channel5BreakerFault;
case 6 -> Channel6BreakerFault;
case 7 -> Channel7BreakerFault;
case 8 -> Channel8BreakerFault;
case 9 -> Channel9BreakerFault;
case 10 -> Channel10BreakerFault;
case 11 -> Channel11BreakerFault;
case 12 -> Channel12BreakerFault;
case 13 -> Channel13BreakerFault;
case 14 -> Channel14BreakerFault;
case 15 -> Channel15BreakerFault;
case 16 -> Channel16BreakerFault;
case 17 -> Channel17BreakerFault;
case 18 -> Channel18BreakerFault;
case 19 -> Channel19BreakerFault;
case 20 -> Channel20BreakerFault;
case 21 -> Channel21BreakerFault;
case 22 -> Channel22BreakerFault;
case 23 -> Channel23BreakerFault;
default -> throw new IndexOutOfBoundsException(
"Power distribution fault channel out of bounds!");
};
}
/**

View File

@@ -71,58 +71,34 @@ public class PowerDistributionStickyFaults {
* the hardware.
*/
public final boolean getBreakerFault(int channel) {
switch (channel) {
case 0:
return Channel0BreakerFault;
case 1:
return Channel1BreakerFault;
case 2:
return Channel2BreakerFault;
case 3:
return Channel3BreakerFault;
case 4:
return Channel4BreakerFault;
case 5:
return Channel5BreakerFault;
case 6:
return Channel6BreakerFault;
case 7:
return Channel7BreakerFault;
case 8:
return Channel8BreakerFault;
case 9:
return Channel9BreakerFault;
case 10:
return Channel10BreakerFault;
case 11:
return Channel11BreakerFault;
case 12:
return Channel12BreakerFault;
case 13:
return Channel13BreakerFault;
case 14:
return Channel14BreakerFault;
case 15:
return Channel15BreakerFault;
case 16:
return Channel16BreakerFault;
case 17:
return Channel17BreakerFault;
case 18:
return Channel18BreakerFault;
case 19:
return Channel19BreakerFault;
case 20:
return Channel20BreakerFault;
case 21:
return Channel21BreakerFault;
case 22:
return Channel22BreakerFault;
case 23:
return Channel23BreakerFault;
default:
throw new IndexOutOfBoundsException("Power distribution fault channel out of bounds!");
}
return switch (channel) {
case 0 -> Channel0BreakerFault;
case 1 -> Channel1BreakerFault;
case 2 -> Channel2BreakerFault;
case 3 -> Channel3BreakerFault;
case 4 -> Channel4BreakerFault;
case 5 -> Channel5BreakerFault;
case 6 -> Channel6BreakerFault;
case 7 -> Channel7BreakerFault;
case 8 -> Channel8BreakerFault;
case 9 -> Channel9BreakerFault;
case 10 -> Channel10BreakerFault;
case 11 -> Channel11BreakerFault;
case 12 -> Channel12BreakerFault;
case 13 -> Channel13BreakerFault;
case 14 -> Channel14BreakerFault;
case 15 -> Channel15BreakerFault;
case 16 -> Channel16BreakerFault;
case 17 -> Channel17BreakerFault;
case 18 -> Channel18BreakerFault;
case 19 -> Channel19BreakerFault;
case 20 -> Channel20BreakerFault;
case 21 -> Channel21BreakerFault;
case 22 -> Channel22BreakerFault;
case 23 -> Channel23BreakerFault;
default -> throw new IndexOutOfBoundsException(
"Power distribution fault channel out of bounds!");
};
}
/**

View File

@@ -59,42 +59,25 @@ public class REVPHFaults {
* the hardware.
*/
public final boolean getChannelFault(int channel) {
switch (channel) {
case 0:
return Channel0Fault;
case 1:
return Channel1Fault;
case 2:
return Channel2Fault;
case 3:
return Channel3Fault;
case 4:
return Channel4Fault;
case 5:
return Channel5Fault;
case 6:
return Channel6Fault;
case 7:
return Channel7Fault;
case 8:
return Channel8Fault;
case 9:
return Channel9Fault;
case 10:
return Channel10Fault;
case 11:
return Channel11Fault;
case 12:
return Channel12Fault;
case 13:
return Channel13Fault;
case 14:
return Channel14Fault;
case 15:
return Channel15Fault;
default:
throw new IndexOutOfBoundsException("Pneumatics fault channel out of bounds!");
}
return switch (channel) {
case 0 -> Channel0Fault;
case 1 -> Channel1Fault;
case 2 -> Channel2Fault;
case 3 -> Channel3Fault;
case 4 -> Channel4Fault;
case 5 -> Channel5Fault;
case 6 -> Channel6Fault;
case 7 -> Channel7Fault;
case 8 -> Channel8Fault;
case 9 -> Channel9Fault;
case 10 -> Channel10Fault;
case 11 -> Channel11Fault;
case 12 -> Channel12Fault;
case 13 -> Channel13Fault;
case 14 -> Channel14Fault;
case 15 -> Channel15Fault;
default -> throw new IndexOutOfBoundsException("Pneumatics fault channel out of bounds!");
};
}
/**

View File

@@ -29,23 +29,19 @@ public final class CANExceptionFactory {
*/
public static void checkStatus(int status, int messageID) {
switch (status) {
case NIRioStatus.kRioStatusSuccess:
case NIRioStatus.kRioStatusSuccess -> {
// Everything is ok... don't throw.
return;
case ERR_CANSessionMux_InvalidBuffer:
case NIRioStatus.kRIOStatusBufferInvalidSize:
throw new CANInvalidBufferException();
case ERR_CANSessionMux_MessageNotFound:
case NIRioStatus.kRIOStatusOperationTimedOut:
throw new CANMessageNotFoundException();
case ERR_CANSessionMux_NotAllowed:
case NIRioStatus.kRIOStatusFeatureNotSupported:
throw new CANMessageNotAllowedException("MessageID = " + messageID);
case ERR_CANSessionMux_NotInitialized:
case NIRioStatus.kRIOStatusResourceNotInitialized:
throw new CANNotInitializedException();
default:
throw new UncleanStatusException("Fatal status code detected: " + status);
}
case ERR_CANSessionMux_InvalidBuffer,
NIRioStatus.kRIOStatusBufferInvalidSize -> throw new CANInvalidBufferException();
case ERR_CANSessionMux_MessageNotFound,
NIRioStatus.kRIOStatusOperationTimedOut -> throw new CANMessageNotFoundException();
case ERR_CANSessionMux_NotAllowed,
NIRioStatus.kRIOStatusFeatureNotSupported -> throw new CANMessageNotAllowedException(
"MessageID = " + messageID);
case ERR_CANSessionMux_NotInitialized,
NIRioStatus.kRIOStatusResourceNotInitialized -> throw new CANNotInitializedException();
default -> throw new UncleanStatusException("Fatal status code detected: " + status);
}
}

View File

@@ -179,8 +179,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public {{ t.TypeName }}Topic get{{ t.TypeName }}Topic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof {{ t.TypeName }}Topic) {
return ({{ t.TypeName }}Topic) topic;
if (topic instanceof {{ t.TypeName }}Topic t) {
return t;
}
int handle;
@@ -212,8 +212,7 @@ public final class NetworkTableInstance implements AutoCloseable {
public <T, MessageType extends ProtoMessage<?>>
ProtobufTopic<T> getProtobufTopic(String name, Protobuf<T, MessageType> proto) {
Topic topic = m_topics.get(name);
if (topic instanceof ProtobufTopic<?>
&& ((ProtobufTopic<?>) topic).getProto().equals(proto)) {
if (topic instanceof ProtobufTopic<?> t && t.getProto().equals(proto)) {
@SuppressWarnings("unchecked")
ProtobufTopic<T> wrapTopic = (ProtobufTopic<T>) topic;
return wrapTopic;
@@ -246,8 +245,7 @@ public final class NetworkTableInstance implements AutoCloseable {
public <T>
StructTopic<T> getStructTopic(String name, Struct<T> struct) {
Topic topic = m_topics.get(name);
if (topic instanceof StructTopic<?>
&& ((StructTopic<?>) topic).getStruct().equals(struct)) {
if (topic instanceof StructTopic<?> t && t.getStruct().equals(struct)) {
@SuppressWarnings("unchecked")
StructTopic<T> wrapTopic = (StructTopic<T>) topic;
return wrapTopic;
@@ -280,8 +278,7 @@ public final class NetworkTableInstance implements AutoCloseable {
public <T>
StructArrayTopic<T> getStructArrayTopic(String name, Struct<T> struct) {
Topic topic = m_topics.get(name);
if (topic instanceof StructArrayTopic<?>
&& ((StructArrayTopic<?>) topic).getStruct().equals(struct)) {
if (topic instanceof StructArrayTopic<?> t && t.getStruct().equals(struct)) {
@SuppressWarnings("unchecked")
StructArrayTopic<T> wrapTopic = (StructArrayTopic<T>) topic;
return wrapTopic;
@@ -1245,11 +1242,7 @@ public final class NetworkTableInstance implements AutoCloseable {
if (other == this) {
return true;
}
if (!(other instanceof NetworkTableInstance)) {
return false;
}
return m_handle == ((NetworkTableInstance) other).m_handle;
return other instanceof NetworkTableInstance inst && m_handle == inst.m_handle;
}
@Override

View File

@@ -157,11 +157,9 @@ public final class NetworkTableValue {
if (other == this) {
return true;
}
if (!(other instanceof NetworkTableValue)) {
return false;
}
NetworkTableValue ntOther = (NetworkTableValue) other;
return m_type == ntOther.m_type && m_value.equals(ntOther.m_value);
return other instanceof NetworkTableValue ntOther
&& m_type == ntOther.m_type
&& m_value.equals(ntOther.m_value);
}
@Override

View File

@@ -179,8 +179,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public BooleanTopic getBooleanTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof BooleanTopic) {
return (BooleanTopic) topic;
if (topic instanceof BooleanTopic t) {
return t;
}
int handle;
@@ -207,8 +207,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public IntegerTopic getIntegerTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof IntegerTopic) {
return (IntegerTopic) topic;
if (topic instanceof IntegerTopic t) {
return t;
}
int handle;
@@ -235,8 +235,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public FloatTopic getFloatTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof FloatTopic) {
return (FloatTopic) topic;
if (topic instanceof FloatTopic t) {
return t;
}
int handle;
@@ -263,8 +263,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public DoubleTopic getDoubleTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof DoubleTopic) {
return (DoubleTopic) topic;
if (topic instanceof DoubleTopic t) {
return t;
}
int handle;
@@ -291,8 +291,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public StringTopic getStringTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof StringTopic) {
return (StringTopic) topic;
if (topic instanceof StringTopic t) {
return t;
}
int handle;
@@ -319,8 +319,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public RawTopic getRawTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof RawTopic) {
return (RawTopic) topic;
if (topic instanceof RawTopic t) {
return t;
}
int handle;
@@ -347,8 +347,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public BooleanArrayTopic getBooleanArrayTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof BooleanArrayTopic) {
return (BooleanArrayTopic) topic;
if (topic instanceof BooleanArrayTopic t) {
return t;
}
int handle;
@@ -375,8 +375,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public IntegerArrayTopic getIntegerArrayTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof IntegerArrayTopic) {
return (IntegerArrayTopic) topic;
if (topic instanceof IntegerArrayTopic t) {
return t;
}
int handle;
@@ -403,8 +403,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public FloatArrayTopic getFloatArrayTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof FloatArrayTopic) {
return (FloatArrayTopic) topic;
if (topic instanceof FloatArrayTopic t) {
return t;
}
int handle;
@@ -431,8 +431,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public DoubleArrayTopic getDoubleArrayTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof DoubleArrayTopic) {
return (DoubleArrayTopic) topic;
if (topic instanceof DoubleArrayTopic t) {
return t;
}
int handle;
@@ -459,8 +459,8 @@ public final class NetworkTableInstance implements AutoCloseable {
*/
public StringArrayTopic getStringArrayTopic(String name) {
Topic topic = m_topics.get(name);
if (topic instanceof StringArrayTopic) {
return (StringArrayTopic) topic;
if (topic instanceof StringArrayTopic t) {
return t;
}
int handle;
@@ -492,8 +492,7 @@ public final class NetworkTableInstance implements AutoCloseable {
public <T, MessageType extends ProtoMessage<?>>
ProtobufTopic<T> getProtobufTopic(String name, Protobuf<T, MessageType> proto) {
Topic topic = m_topics.get(name);
if (topic instanceof ProtobufTopic<?>
&& ((ProtobufTopic<?>) topic).getProto().equals(proto)) {
if (topic instanceof ProtobufTopic<?> t && t.getProto().equals(proto)) {
@SuppressWarnings("unchecked")
ProtobufTopic<T> wrapTopic = (ProtobufTopic<T>) topic;
return wrapTopic;
@@ -526,8 +525,7 @@ public final class NetworkTableInstance implements AutoCloseable {
public <T>
StructTopic<T> getStructTopic(String name, Struct<T> struct) {
Topic topic = m_topics.get(name);
if (topic instanceof StructTopic<?>
&& ((StructTopic<?>) topic).getStruct().equals(struct)) {
if (topic instanceof StructTopic<?> t && t.getStruct().equals(struct)) {
@SuppressWarnings("unchecked")
StructTopic<T> wrapTopic = (StructTopic<T>) topic;
return wrapTopic;
@@ -560,8 +558,7 @@ public final class NetworkTableInstance implements AutoCloseable {
public <T>
StructArrayTopic<T> getStructArrayTopic(String name, Struct<T> struct) {
Topic topic = m_topics.get(name);
if (topic instanceof StructArrayTopic<?>
&& ((StructArrayTopic<?>) topic).getStruct().equals(struct)) {
if (topic instanceof StructArrayTopic<?> t && t.getStruct().equals(struct)) {
@SuppressWarnings("unchecked")
StructArrayTopic<T> wrapTopic = (StructArrayTopic<T>) topic;
return wrapTopic;
@@ -1525,11 +1522,7 @@ public final class NetworkTableInstance implements AutoCloseable {
if (other == this) {
return true;
}
if (!(other instanceof NetworkTableInstance)) {
return false;
}
return m_handle == ((NetworkTableInstance) other).m_handle;
return other instanceof NetworkTableInstance inst && m_handle == inst.m_handle;
}
@Override

View File

@@ -649,11 +649,9 @@ public final class NetworkTableValue {
if (other == this) {
return true;
}
if (!(other instanceof NetworkTableValue)) {
return false;
}
NetworkTableValue ntOther = (NetworkTableValue) other;
return m_type == ntOther.m_type && m_value.equals(ntOther.m_value);
return other instanceof NetworkTableValue ntOther
&& m_type == ntOther.m_type
&& m_value.equals(ntOther.m_value);
}
@Override

View File

@@ -608,14 +608,9 @@ public final class NetworkTable {
@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}
if (!(other instanceof NetworkTable)) {
return false;
}
NetworkTable ntOther = (NetworkTable) other;
return m_inst.equals(ntOther.m_inst) && m_path.equals(ntOther.m_path);
return other instanceof NetworkTable ntOther
&& m_inst.equals(ntOther.m_inst)
&& m_path.equals(ntOther.m_path);
}
@Override

View File

@@ -64,32 +64,20 @@ public enum NetworkTableType {
* @return The kind
*/
public static NetworkTableType getFromInt(int value) {
switch (value) {
case 0x01:
return kBoolean;
case 0x02:
return kDouble;
case 0x04:
return kString;
case 0x08:
return kRaw;
case 0x10:
return kBooleanArray;
case 0x20:
return kDoubleArray;
case 0x40:
return kStringArray;
case 0x100:
return kInteger;
case 0x200:
return kFloat;
case 0x400:
return kIntegerArray;
case 0x800:
return kFloatArray;
default:
return kUnassigned;
}
return switch (value) {
case 0x01 -> kBoolean;
case 0x02 -> kDouble;
case 0x04 -> kString;
case 0x08 -> kRaw;
case 0x10 -> kBooleanArray;
case 0x20 -> kDoubleArray;
case 0x40 -> kStringArray;
case 0x100 -> kInteger;
case 0x200 -> kFloat;
case 0x400 -> kIntegerArray;
case 0x800 -> kFloatArray;
default -> kUnassigned;
};
}
/**
@@ -99,33 +87,20 @@ public enum NetworkTableType {
* @return The kind
*/
public static NetworkTableType getFromString(String typeString) {
switch (typeString) {
case "boolean":
return kBoolean;
case "double":
return kDouble;
case "float":
return kFloat;
case "int":
return kInteger;
case "string":
case "json":
return kString;
case "boolean[]":
return kBooleanArray;
case "double[]":
return kDoubleArray;
case "float[]":
return kFloatArray;
case "int[]":
return kIntegerArray;
case "string[]":
return kStringArray;
case "":
return kUnassigned;
default:
return kRaw;
}
return switch (typeString) {
case "boolean" -> kBoolean;
case "double" -> kDouble;
case "float" -> kFloat;
case "int" -> kInteger;
case "string", "json" -> kString;
case "boolean[]" -> kBooleanArray;
case "double[]" -> kDoubleArray;
case "float[]" -> kFloatArray;
case "int[]" -> kIntegerArray;
case "string[]" -> kStringArray;
case "" -> kUnassigned;
default -> kRaw;
};
}
/**

View File

@@ -167,11 +167,9 @@ public final class ProtobufTopic<T> extends Topic {
if (other == this) {
return true;
}
if (!(other instanceof ProtobufTopic)) {
return false;
}
return super.equals(other) && m_proto == ((ProtobufTopic<?>) other).m_proto;
return other instanceof ProtobufTopic<?> topic
&& super.equals(topic)
&& m_proto == topic.m_proto;
}
@Override

View File

@@ -15,38 +15,19 @@ public class PubSubOptions {
public PubSubOptions(PubSubOption... options) {
for (PubSubOption option : options) {
switch (option.m_kind) {
case periodic:
periodic = option.m_dValue;
break;
case sendAll:
sendAll = option.m_bValue;
break;
case topicsOnly:
topicsOnly = option.m_bValue;
break;
case pollStorage:
pollStorage = option.m_iValue;
break;
case keepDuplicates:
keepDuplicates = option.m_bValue;
break;
case disableRemote:
disableRemote = option.m_bValue;
break;
case disableLocal:
disableLocal = option.m_bValue;
break;
case excludePublisher:
excludePublisher = option.m_iValue;
break;
case excludeSelf:
excludeSelf = option.m_bValue;
break;
case hidden:
hidden = option.m_bValue;
break;
default:
break;
case periodic -> periodic = option.m_dValue;
case sendAll -> sendAll = option.m_bValue;
case topicsOnly -> topicsOnly = option.m_bValue;
case pollStorage -> pollStorage = option.m_iValue;
case keepDuplicates -> keepDuplicates = option.m_bValue;
case disableRemote -> disableRemote = option.m_bValue;
case disableLocal -> disableLocal = option.m_bValue;
case excludePublisher -> excludePublisher = option.m_iValue;
case excludeSelf -> excludeSelf = option.m_bValue;
case hidden -> hidden = option.m_bValue;
default -> {
// NOP
}
}
}
}

View File

@@ -167,11 +167,9 @@ public final class StructArrayTopic<T> extends Topic {
if (other == this) {
return true;
}
if (!(other instanceof StructArrayTopic)) {
return false;
}
return super.equals(other) && m_struct == ((StructArrayTopic<?>) other).m_struct;
return other instanceof StructArrayTopic<?> topic
&& super.equals(topic)
&& m_struct == topic.m_struct;
}
@Override

View File

@@ -166,11 +166,9 @@ public final class StructTopic<T> extends Topic {
if (other == this) {
return true;
}
if (!(other instanceof StructTopic)) {
return false;
}
return super.equals(other) && m_struct == ((StructTopic<?>) other).m_struct;
return other instanceof StructTopic<?> topic
&& super.equals(topic)
&& m_struct == topic.m_struct;
}
@Override

View File

@@ -321,14 +321,7 @@ public class Topic {
@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}
if (!(other instanceof Topic)) {
return false;
}
return m_handle == ((Topic) other).m_handle;
return other instanceof Topic topic && m_handle == topic.m_handle;
}
@Override

View File

@@ -1057,16 +1057,11 @@ public class ADIS16448_IMU implements AutoCloseable, Sendable {
* @return Yaw axis angle in degrees (CCW positive).
*/
public synchronized double getAngle() {
switch (m_yaw_axis) {
case kX:
return getGyroAngleX();
case kY:
return getGyroAngleY();
case kZ:
return getGyroAngleZ();
default:
return 0.0;
}
return switch (m_yaw_axis) {
case kX -> getGyroAngleX();
case kY -> getGyroAngleY();
case kZ -> getGyroAngleZ();
};
}
/**
@@ -1075,16 +1070,11 @@ public class ADIS16448_IMU implements AutoCloseable, Sendable {
* @return Yaw axis angular rate in degrees per second (CCW positive).
*/
public synchronized double getRate() {
switch (m_yaw_axis) {
case kX:
return getGyroRateX();
case kY:
return getGyroRateY();
case kZ:
return getGyroRateZ();
default:
return 0.0;
}
return switch (m_yaw_axis) {
case kX -> getGyroRateX();
case kY -> getGyroRateY();
case kZ -> getGyroRateZ();
};
}
/**

View File

@@ -1061,30 +1061,21 @@ public class ADIS16470_IMU implements AutoCloseable, Sendable {
* @param angle A double in degrees (CCW positive)
*/
public void setGyroAngle(IMUAxis axis, double angle) {
switch (axis) {
case kYaw:
axis = m_yaw_axis;
break;
case kPitch:
axis = m_pitch_axis;
break;
case kRoll:
axis = m_roll_axis;
break;
default:
}
axis =
switch (axis) {
case kYaw -> m_yaw_axis;
case kPitch -> m_pitch_axis;
case kRoll -> m_roll_axis;
default -> axis;
};
switch (axis) {
case kX:
this.setGyroAngleX(angle);
break;
case kY:
this.setGyroAngleY(angle);
break;
case kZ:
this.setGyroAngleZ(angle);
break;
default:
case kX -> setGyroAngleX(angle);
case kY -> setGyroAngleY(angle);
case kZ -> setGyroAngleZ(angle);
default -> {
// NOP
}
}
}
@@ -1131,39 +1122,35 @@ public class ADIS16470_IMU implements AutoCloseable, Sendable {
* @return The axis angle in degrees (CCW positive).
*/
public synchronized double getAngle(IMUAxis axis) {
switch (axis) {
case kYaw:
axis = m_yaw_axis;
break;
case kPitch:
axis = m_pitch_axis;
break;
case kRoll:
axis = m_roll_axis;
break;
default:
}
axis =
switch (axis) {
case kYaw -> m_yaw_axis;
case kPitch -> m_pitch_axis;
case kRoll -> m_roll_axis;
default -> axis;
};
switch (axis) {
case kX:
return switch (axis) {
case kX -> {
if (m_simGyroAngleX != null) {
return m_simGyroAngleX.get();
yield m_simGyroAngleX.get();
}
return m_integ_angle_x;
case kY:
yield m_integ_angle_x;
}
case kY -> {
if (m_simGyroAngleY != null) {
return m_simGyroAngleY.get();
yield m_simGyroAngleY.get();
}
return m_integ_angle_y;
case kZ:
yield m_integ_angle_y;
}
case kZ -> {
if (m_simGyroAngleZ != null) {
return m_simGyroAngleZ.get();
yield m_simGyroAngleZ.get();
}
return m_integ_angle_z;
default:
}
return 0.0;
yield m_integ_angle_z;
}
default -> 0.0;
};
}
/**
@@ -1172,25 +1159,27 @@ public class ADIS16470_IMU implements AutoCloseable, Sendable {
* @return The Yaw axis angle in degrees (CCW positive).
*/
public synchronized double getAngle() {
switch (m_yaw_axis) {
case kX:
return switch (m_yaw_axis) {
case kX -> {
if (m_simGyroAngleX != null) {
return m_simGyroAngleX.get();
yield m_simGyroAngleX.get();
}
return m_integ_angle_x;
case kY:
yield m_integ_angle_x;
}
case kY -> {
if (m_simGyroAngleY != null) {
return m_simGyroAngleY.get();
yield m_simGyroAngleY.get();
}
return m_integ_angle_y;
case kZ:
yield m_integ_angle_y;
}
case kZ -> {
if (m_simGyroAngleZ != null) {
return m_simGyroAngleZ.get();
yield m_simGyroAngleZ.get();
}
return m_integ_angle_z;
default:
}
return 0.0;
yield m_integ_angle_z;
}
default -> 0.0;
};
}
/**
@@ -1200,38 +1189,35 @@ public class ADIS16470_IMU implements AutoCloseable, Sendable {
* @return Axis angular rate in degrees per second (CCW positive).
*/
public synchronized double getRate(IMUAxis axis) {
switch (axis) {
case kYaw:
axis = m_yaw_axis;
break;
case kPitch:
axis = m_pitch_axis;
break;
case kRoll:
axis = m_roll_axis;
break;
default:
}
axis =
switch (axis) {
case kYaw -> m_yaw_axis;
case kPitch -> m_pitch_axis;
case kRoll -> m_roll_axis;
default -> axis;
};
switch (axis) {
case kX:
return switch (axis) {
case kX -> {
if (m_simGyroRateX != null) {
return m_simGyroRateX.get();
yield m_simGyroRateX.get();
}
return m_gyro_rate_x;
case kY:
yield m_gyro_rate_x;
}
case kY -> {
if (m_simGyroRateY != null) {
return m_simGyroRateY.get();
yield m_simGyroRateY.get();
}
return m_gyro_rate_y;
case kZ:
yield m_gyro_rate_y;
}
case kZ -> {
if (m_simGyroRateZ != null) {
return m_simGyroRateZ.get();
yield m_simGyroRateZ.get();
}
return m_gyro_rate_z;
default:
}
return 0.0;
yield m_gyro_rate_z;
}
default -> 0.0;
};
}
/**
@@ -1240,25 +1226,27 @@ public class ADIS16470_IMU implements AutoCloseable, Sendable {
* @return Yaw axis angular rate in degrees per second (CCW positive).
*/
public synchronized double getRate() {
switch (m_yaw_axis) {
case kX:
return switch (m_yaw_axis) {
case kX -> {
if (m_simGyroRateX != null) {
return m_simGyroRateX.get();
yield m_simGyroRateX.get();
}
return m_gyro_rate_x;
case kY:
yield m_gyro_rate_x;
}
case kY -> {
if (m_simGyroRateY != null) {
return m_simGyroRateY.get();
yield m_simGyroRateY.get();
}
return m_gyro_rate_y;
case kZ:
yield m_gyro_rate_y;
}
case kZ -> {
if (m_simGyroRateZ != null) {
return m_simGyroRateZ.get();
yield m_simGyroRateZ.get();
}
return m_gyro_rate_z;
default:
}
return 0.0;
yield m_gyro_rate_z;
}
default -> 0.0;
};
}
/**

View File

@@ -182,23 +182,13 @@ public class ADXL345_I2C implements NTSendable, AutoCloseable {
* measure.
*/
public final void setRange(Range range) {
final byte value;
switch (range) {
case k2G:
value = 0;
break;
case k4G:
value = 1;
break;
case k8G:
value = 2;
break;
case k16G:
value = 3;
break;
default:
throw new IllegalArgumentException("Missing case for range type " + range);
}
final byte value =
switch (range) {
case k2G -> 0;
case k4G -> 1;
case k8G -> 2;
case k16G -> 3;
};
// Specify the data format to read
m_i2c.write(kDataFormatRegister, kDataFormat_FullRes | value);

View File

@@ -171,23 +171,13 @@ public class ADXL345_SPI implements NTSendable, AutoCloseable {
* measure.
*/
public void setRange(Range range) {
final byte value;
switch (range) {
case k2G:
value = 0;
break;
case k4G:
value = 1;
break;
case k8G:
value = 2;
break;
case k16G:
value = 3;
break;
default:
throw new IllegalArgumentException("Missing case for range type " + range);
}
final byte value =
switch (range) {
case k2G -> 0;
case k4G -> 1;
case k8G -> 2;
case k16G -> 3;
};
// Specify the data format to read
byte[] commands = new byte[] {kDataFormatRegister, (byte) (kDataFormat_FullRes | value)};

View File

@@ -193,23 +193,21 @@ public class ADXL362 implements NTSendable, AutoCloseable {
return;
}
final byte value;
switch (range) {
case k2G:
value = kFilterCtl_Range2G;
m_gsPerLSB = 0.001;
break;
case k4G:
value = kFilterCtl_Range4G;
m_gsPerLSB = 0.002;
break;
case k8G:
value = kFilterCtl_Range8G;
m_gsPerLSB = 0.004;
break;
default:
throw new IllegalArgumentException("Missing case for range type " + range);
}
final byte value =
switch (range) {
case k2G -> {
m_gsPerLSB = 0.001;
yield kFilterCtl_Range2G;
}
case k4G -> {
m_gsPerLSB = 0.002;
yield kFilterCtl_Range4G;
}
case k8G -> {
m_gsPerLSB = 0.004;
yield kFilterCtl_Range8G;
}
};
// Specify the data format to read
byte[] commands =

View File

@@ -74,24 +74,12 @@ public class AddressableLEDBuffer {
final int X = (chroma * remainder) >> 8;
switch (region) {
case 0:
setRGB(index, v, X + m, m);
break;
case 1:
setRGB(index, v - X, v, m);
break;
case 2:
setRGB(index, m, v, X + m);
break;
case 3:
setRGB(index, m, v - X, v);
break;
case 4:
setRGB(index, X + m, m, v);
break;
default:
setRGB(index, v, m, v - X);
break;
case 0 -> setRGB(index, v, X + m, m);
case 1 -> setRGB(index, v - X, v, m);
case 2 -> setRGB(index, m, v, X + m);
case 3 -> setRGB(index, m, v - X, v);
case 4 -> setRGB(index, X + m, m, v);
default -> setRGB(index, v, m, v - X);
}
}

View File

@@ -6,7 +6,6 @@ package edu.wpi.first.wpilibj;
import static edu.wpi.first.util.ErrorMessages.requireNonNullParam;
import edu.wpi.first.wpilibj.SynchronousInterrupt.WaitResult;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiConsumer;
@@ -132,25 +131,22 @@ public class AsynchronousInterrupt implements AutoCloseable {
if (!m_keepRunning.get()) {
break;
}
if (result == WaitResult.kTimeout) {
continue;
}
boolean rising = false;
boolean falling = false;
switch (result) {
case kBoth:
case kBoth -> {
rising = true;
falling = true;
break;
case kFallingEdge:
}
case kFallingEdge -> {
falling = true;
break;
case kRisingEdge:
}
case kRisingEdge -> {
rising = true;
break;
default:
break;
}
default -> {
continue;
}
}
m_callback.accept(rising, falling);

View File

@@ -58,20 +58,14 @@ public class BuiltInAccelerometer implements Sendable, AutoCloseable {
public final void setRange(Range range) {
AccelerometerJNI.setAccelerometerActive(false);
switch (range) {
case k2G:
AccelerometerJNI.setAccelerometerRange(0);
break;
case k4G:
AccelerometerJNI.setAccelerometerRange(1);
break;
case k8G:
AccelerometerJNI.setAccelerometerRange(2);
break;
default:
throw new IllegalArgumentException("Missing case for range type " + range);
}
int rangeValue =
switch (range) {
case k2G -> 0;
case k4G -> 1;
case k8G -> 2;
};
AccelerometerJNI.setAccelerometerRange(rangeValue);
AccelerometerJNI.setAccelerometerActive(true);
}

View File

@@ -31,16 +31,12 @@ public enum CompressorConfigType {
* @return type
*/
public static CompressorConfigType fromValue(int value) {
switch (value) {
case REVPHJNI.COMPRESSOR_CONFIG_TYPE_HYBRID:
return Hybrid;
case REVPHJNI.COMPRESSOR_CONFIG_TYPE_ANALOG:
return Analog;
case REVPHJNI.COMPRESSOR_CONFIG_TYPE_DIGITAL:
return Digital;
default:
return Disabled;
}
return switch (value) {
case REVPHJNI.COMPRESSOR_CONFIG_TYPE_HYBRID -> Hybrid;
case REVPHJNI.COMPRESSOR_CONFIG_TYPE_ANALOG -> Analog;
case REVPHJNI.COMPRESSOR_CONFIG_TYPE_DIGITAL -> Digital;
default -> Disabled;
};
}
/**

View File

@@ -382,21 +382,13 @@ public final class DataLogManager {
DriverStation.MatchType matchType = DriverStation.getMatchType();
if (matchType != DriverStation.MatchType.None) {
// rename per match info
char matchTypeChar;
switch (matchType) {
case Practice:
matchTypeChar = 'P';
break;
case Qualification:
matchTypeChar = 'Q';
break;
case Elimination:
matchTypeChar = 'E';
break;
default:
matchTypeChar = '_';
break;
}
char matchTypeChar =
switch (matchType) {
case Practice -> 'P';
case Qualification -> 'Q';
case Elimination -> 'E';
default -> '_';
};
m_log.setFilename(
"FRC_"
+ m_timeFormatter.format(LocalDateTime.now(m_utc))

View File

@@ -125,21 +125,12 @@ public class DoubleSolenoid implements Sendable, AutoCloseable {
* @param value The value to set (Off, Forward, Reverse)
*/
public void set(final Value value) {
int setValue;
switch (value) {
case kOff:
setValue = 0;
break;
case kForward:
setValue = m_forwardMask;
break;
case kReverse:
setValue = m_reverseMask;
break;
default:
throw new AssertionError("Illegal value: " + value);
}
int setValue =
switch (value) {
case kOff -> 0;
case kForward -> m_forwardMask;
case kReverse -> m_reverseMask;
};
m_module.setSolenoids(m_mask, setValue);
}

View File

@@ -137,34 +137,17 @@ public final class DriverStation {
private void sendMatchData() {
AllianceStationID allianceID = DriverStationJNI.getAllianceStation();
boolean isRedAlliance = false;
int stationNumber = 1;
switch (allianceID) {
case Blue1:
isRedAlliance = false;
stationNumber = 1;
break;
case Blue2:
isRedAlliance = false;
stationNumber = 2;
break;
case Blue3:
isRedAlliance = false;
stationNumber = 3;
break;
case Red1:
isRedAlliance = true;
stationNumber = 1;
break;
case Red2:
isRedAlliance = true;
stationNumber = 2;
break;
default:
isRedAlliance = true;
stationNumber = 3;
break;
}
final int stationNumber =
switch (allianceID) {
case Blue1, Red1 -> 1;
case Blue2, Red2 -> 2;
case Blue3, Red3, Unknown -> 3;
};
final boolean isRedAlliance =
switch (allianceID) {
case Blue1, Blue2, Blue3 -> false;
case Red1, Red2, Red3, Unknown -> true;
};
String currentEventName;
String currentGameSpecificMessage;
@@ -1059,16 +1042,12 @@ public final class DriverStation {
} finally {
m_cacheDataMutex.unlock();
}
switch (matchType) {
case 1:
return MatchType.Practice;
case 2:
return MatchType.Qualification;
case 3:
return MatchType.Elimination;
default:
return MatchType.None;
}
return switch (matchType) {
case 1 -> MatchType.Practice;
case 2 -> MatchType.Qualification;
case 3 -> MatchType.Elimination;
default -> MatchType.None;
};
}
/**

View File

@@ -562,16 +562,11 @@ public class Encoder implements CounterBase, Sendable, AutoCloseable {
* @return decoding scale factor
*/
public double getDecodingScaleFactor() {
switch (m_encodingType) {
case k1X:
return 1.0;
case k2X:
return 0.5;
case k4X:
return 0.25;
default:
return 0.0;
}
return switch (m_encodingType) {
case k1X -> 1.0;
case k2X -> 0.5;
case k4X -> 0.25;
};
}
@Override

View File

@@ -457,17 +457,12 @@ public class GenericHID {
value = MathUtil.clamp(value, 0, 1);
int rumbleValue = (int) (value * 65535);
switch (type) {
case kLeftRumble:
this.m_leftRumble = rumbleValue;
break;
case kRightRumble:
this.m_rightRumble = rumbleValue;
break;
case kBothRumble:
default:
case kLeftRumble -> this.m_leftRumble = rumbleValue;
case kRightRumble -> this.m_rightRumble = rumbleValue;
default -> {
this.m_leftRumble = rumbleValue;
this.m_rightRumble = rumbleValue;
break;
}
}
DriverStationJNI.setJoystickOutputs(

View File

@@ -323,59 +323,77 @@ public abstract class IterativeRobotBase extends RobotBase {
// If mode changed, call mode exit and entry functions
if (m_lastMode != mode) {
// Call last mode's exit function
if (m_lastMode == Mode.kDisabled) {
disabledExit();
} else if (m_lastMode == Mode.kAutonomous) {
autonomousExit();
} else if (m_lastMode == Mode.kTeleop) {
teleopExit();
} else if (m_lastMode == Mode.kTest) {
if (m_lwEnabledInTest) {
LiveWindow.setEnabled(false);
Shuffleboard.disableActuatorWidgets();
switch (m_lastMode) {
case kDisabled -> disabledExit();
case kAutonomous -> autonomousExit();
case kTeleop -> teleopExit();
case kTest -> {
if (m_lwEnabledInTest) {
LiveWindow.setEnabled(false);
Shuffleboard.disableActuatorWidgets();
}
testExit();
}
default -> {
// NOP
}
testExit();
}
// Call current mode's entry function
if (mode == Mode.kDisabled) {
disabledInit();
m_watchdog.addEpoch("disabledInit()");
} else if (mode == Mode.kAutonomous) {
autonomousInit();
m_watchdog.addEpoch("autonomousInit()");
} else if (mode == Mode.kTeleop) {
teleopInit();
m_watchdog.addEpoch("teleopInit()");
} else if (mode == Mode.kTest) {
if (m_lwEnabledInTest) {
LiveWindow.setEnabled(true);
Shuffleboard.enableActuatorWidgets();
switch (mode) {
case kDisabled -> {
disabledInit();
m_watchdog.addEpoch("disabledInit()");
}
case kAutonomous -> {
autonomousInit();
m_watchdog.addEpoch("autonomousInit()");
}
case kTeleop -> {
teleopInit();
m_watchdog.addEpoch("teleopInit()");
}
case kTest -> {
if (m_lwEnabledInTest) {
LiveWindow.setEnabled(true);
Shuffleboard.enableActuatorWidgets();
}
testInit();
m_watchdog.addEpoch("testInit()");
}
default -> {
// NOP
}
testInit();
m_watchdog.addEpoch("testInit()");
}
m_lastMode = mode;
}
// Call the appropriate function depending upon the current robot mode
if (mode == Mode.kDisabled) {
DriverStationJNI.observeUserProgramDisabled();
disabledPeriodic();
m_watchdog.addEpoch("disabledPeriodic()");
} else if (mode == Mode.kAutonomous) {
DriverStationJNI.observeUserProgramAutonomous();
autonomousPeriodic();
m_watchdog.addEpoch("autonomousPeriodic()");
} else if (mode == Mode.kTeleop) {
DriverStationJNI.observeUserProgramTeleop();
teleopPeriodic();
m_watchdog.addEpoch("teleopPeriodic()");
} else {
DriverStationJNI.observeUserProgramTest();
testPeriodic();
m_watchdog.addEpoch("testPeriodic()");
switch (mode) {
case kDisabled -> {
DriverStationJNI.observeUserProgramDisabled();
disabledPeriodic();
m_watchdog.addEpoch("disabledPeriodic()");
}
case kAutonomous -> {
DriverStationJNI.observeUserProgramAutonomous();
autonomousPeriodic();
m_watchdog.addEpoch("autonomousPeriodic()");
}
case kTeleop -> {
DriverStationJNI.observeUserProgramTeleop();
teleopPeriodic();
m_watchdog.addEpoch("teleopPeriodic()");
}
case kTest -> {
DriverStationJNI.observeUserProgramTest();
testPeriodic();
m_watchdog.addEpoch("testPeriodic()");
}
default -> {
// NOP
}
}
robotPeriodic();

View File

@@ -211,22 +211,14 @@ public class PWM implements Sendable, AutoCloseable {
* @param mult The period multiplier to apply to this channel
*/
public void setPeriodMultiplier(PeriodMultiplier mult) {
switch (mult) {
case k4X:
// Squelch 3 out of 4 outputs
PWMJNI.setPWMPeriodScale(m_handle, 3);
break;
case k2X:
// Squelch 1 out of 2 outputs
PWMJNI.setPWMPeriodScale(m_handle, 1);
break;
case k1X:
// Don't squelch any outputs
PWMJNI.setPWMPeriodScale(m_handle, 0);
break;
default:
// Cannot hit this, limited by PeriodMultiplier enum
}
int scale =
switch (mult) {
case k4X -> 3; // Squelch 3 out of 4 outputs
case k2X -> 1; // Squelch 1 out of 2 outputs
case k1X -> 0; // Don't squelch any outputs
};
PWMJNI.setPWMPeriodScale(m_handle, scale);
}
/** Latches PWM to zero. */

View File

@@ -14,12 +14,10 @@ public interface PneumaticsBase extends AutoCloseable {
* @return module
*/
static PneumaticsBase getForType(int module, PneumaticsModuleType type) {
if (type == PneumaticsModuleType.CTREPCM) {
return new PneumaticsControlModule(module);
} else if (type == PneumaticsModuleType.REVPH) {
return new PneumaticHub(module);
}
throw new IllegalArgumentException("Unknown module type");
return switch (type) {
case CTREPCM -> new PneumaticsControlModule(module);
case REVPH -> new PneumaticHub(module);
};
}
/**
@@ -29,12 +27,10 @@ public interface PneumaticsBase extends AutoCloseable {
* @return module default
*/
static int getDefaultForType(PneumaticsModuleType type) {
if (type == PneumaticsModuleType.CTREPCM) {
return SensorUtil.getDefaultCTREPCMModule();
} else if (type == PneumaticsModuleType.REVPH) {
return SensorUtil.getDefaultREVPHModule();
}
throw new IllegalArgumentException("Unknown module type");
return switch (type) {
case CTREPCM -> SensorUtil.getDefaultCTREPCMModule();
case REVPH -> SensorUtil.getDefaultREVPHModule();
};
}
/**

View File

@@ -182,23 +182,23 @@ public class Relay extends MotorSafety implements Sendable, AutoCloseable {
*/
public void set(Value value) {
switch (value) {
case kOff:
case kOff -> {
if (m_direction == Direction.kBoth || m_direction == Direction.kForward) {
RelayJNI.setRelay(m_forwardHandle, false);
}
if (m_direction == Direction.kBoth || m_direction == Direction.kReverse) {
RelayJNI.setRelay(m_reverseHandle, false);
}
break;
case kOn:
}
case kOn -> {
if (m_direction == Direction.kBoth || m_direction == Direction.kForward) {
RelayJNI.setRelay(m_forwardHandle, true);
}
if (m_direction == Direction.kBoth || m_direction == Direction.kReverse) {
RelayJNI.setRelay(m_reverseHandle, true);
}
break;
case kForward:
}
case kForward -> {
if (m_direction == Direction.kReverse) {
throw new InvalidValueException(
"A relay configured for reverse cannot be set to " + "forward");
@@ -209,8 +209,8 @@ public class Relay extends MotorSafety implements Sendable, AutoCloseable {
if (m_direction == Direction.kBoth) {
RelayJNI.setRelay(m_reverseHandle, false);
}
break;
case kReverse:
}
case kReverse -> {
if (m_direction == Direction.kForward) {
throw new InvalidValueException(
"A relay configured for forward cannot be set to " + "reverse");
@@ -221,9 +221,10 @@ public class Relay extends MotorSafety implements Sendable, AutoCloseable {
if (m_direction == Direction.kBoth || m_direction == Direction.kReverse) {
RelayJNI.setRelay(m_reverseHandle, true);
}
break;
default:
}
default -> {
// Cannot hit this, limited by Value enum
}
}
}

View File

@@ -91,43 +91,28 @@ public abstract class RobotBase implements AutoCloseable {
@Override
public void reportUsage(MathUsageId id, int count) {
switch (id) {
case kKinematics_DifferentialDrive:
HAL.report(
tResourceType.kResourceType_Kinematics,
tInstances.kKinematics_DifferentialDrive);
break;
case kKinematics_MecanumDrive:
HAL.report(
tResourceType.kResourceType_Kinematics, tInstances.kKinematics_MecanumDrive);
break;
case kKinematics_SwerveDrive:
HAL.report(
tResourceType.kResourceType_Kinematics, tInstances.kKinematics_SwerveDrive);
break;
case kTrajectory_TrapezoidProfile:
HAL.report(tResourceType.kResourceType_TrapezoidProfile, count);
break;
case kFilter_Linear:
HAL.report(tResourceType.kResourceType_LinearFilter, count);
break;
case kOdometry_DifferentialDrive:
HAL.report(
tResourceType.kResourceType_Odometry, tInstances.kOdometry_DifferentialDrive);
break;
case kOdometry_SwerveDrive:
HAL.report(tResourceType.kResourceType_Odometry, tInstances.kOdometry_SwerveDrive);
break;
case kOdometry_MecanumDrive:
HAL.report(tResourceType.kResourceType_Odometry, tInstances.kOdometry_MecanumDrive);
break;
case kController_PIDController2:
HAL.report(tResourceType.kResourceType_PIDController2, count);
break;
case kController_ProfiledPIDController:
HAL.report(tResourceType.kResourceType_ProfiledPIDController, count);
break;
default:
break;
case kKinematics_DifferentialDrive -> HAL.report(
tResourceType.kResourceType_Kinematics, tInstances.kKinematics_DifferentialDrive);
case kKinematics_MecanumDrive -> HAL.report(
tResourceType.kResourceType_Kinematics, tInstances.kKinematics_MecanumDrive);
case kKinematics_SwerveDrive -> HAL.report(
tResourceType.kResourceType_Kinematics, tInstances.kKinematics_SwerveDrive);
case kTrajectory_TrapezoidProfile -> HAL.report(
tResourceType.kResourceType_TrapezoidProfile, count);
case kFilter_Linear -> HAL.report(tResourceType.kResourceType_LinearFilter, count);
case kOdometry_DifferentialDrive -> HAL.report(
tResourceType.kResourceType_Odometry, tInstances.kOdometry_DifferentialDrive);
case kOdometry_SwerveDrive -> HAL.report(
tResourceType.kResourceType_Odometry, tInstances.kOdometry_SwerveDrive);
case kOdometry_MecanumDrive -> HAL.report(
tResourceType.kResourceType_Odometry, tInstances.kOdometry_MecanumDrive);
case kController_PIDController2 -> HAL.report(
tResourceType.kResourceType_PIDController2, count);
case kController_ProfiledPIDController -> HAL.report(
tResourceType.kResourceType_ProfiledPIDController, count);
default -> {
// NOP
}
}
}

View File

@@ -345,18 +345,13 @@ public final class RobotController {
* @return state
*/
public static RadioLEDState fromValue(int value) {
switch (value) {
case LEDJNI.RADIO_LED_STATE_OFF:
return RadioLEDState.kOff;
case LEDJNI.RADIO_LED_STATE_GREEN:
return RadioLEDState.kGreen;
case LEDJNI.RADIO_LED_STATE_RED:
return RadioLEDState.kRed;
case LEDJNI.RADIO_LED_STATE_ORANGE:
return RadioLEDState.kOrange;
default:
return RadioLEDState.kOff;
}
return switch (value) {
case LEDJNI.RADIO_LED_STATE_OFF -> RadioLEDState.kOff;
case LEDJNI.RADIO_LED_STATE_GREEN -> RadioLEDState.kGreen;
case LEDJNI.RADIO_LED_STATE_RED -> RadioLEDState.kRed;
case LEDJNI.RADIO_LED_STATE_ORANGE -> RadioLEDState.kOrange;
default -> RadioLEDState.kOff;
};
}
}

View File

@@ -29,11 +29,10 @@ public enum RuntimeType {
* @return Matching runtime type
*/
public static RuntimeType getValue(int type) {
if (type == HALUtil.RUNTIME_ROBORIO) {
return RuntimeType.kRoboRIO;
} else if (type == HALUtil.RUNTIME_ROBORIO2) {
return RuntimeType.kRoboRIO2;
}
return RuntimeType.kSimulation;
return switch (type) {
case HALUtil.RUNTIME_ROBORIO -> RuntimeType.kRoboRIO;
case HALUtil.RUNTIME_ROBORIO2 -> RuntimeType.kRoboRIO2;
default -> RuntimeType.kSimulation;
};
}
}

View File

@@ -50,10 +50,7 @@ public class TimedRobot extends IterativeRobotBase {
@Override
public boolean equals(Object rhs) {
if (rhs instanceof Callback) {
return Double.compare(expirationTime, ((Callback) rhs).expirationTime) == 0;
}
return false;
return rhs instanceof Callback callback && expirationTime == callback.expirationTime;
}
@Override

View File

@@ -62,10 +62,8 @@ public class Watchdog implements Closeable, Comparable<Watchdog> {
@Override
public boolean equals(Object obj) {
if (obj instanceof Watchdog) {
return Double.compare(m_expirationTimeSeconds, ((Watchdog) obj).m_expirationTimeSeconds) == 0;
}
return false;
return obj instanceof Watchdog watchdog
&& Double.compare(m_expirationTimeSeconds, watchdog.m_expirationTimeSeconds) == 0;
}
@Override

View File

@@ -16,7 +16,8 @@ import java.util.function.LongSupplier;
import java.util.function.Supplier;
/** Common interface for objects that can contain shuffleboard components. */
public interface ShuffleboardContainer extends ShuffleboardValue {
public sealed interface ShuffleboardContainer extends ShuffleboardValue
permits ShuffleboardLayout, ShuffleboardTab {
/**
* Gets the components that are direct children of this container.
*

View File

@@ -103,11 +103,11 @@ final class ShuffleboardInstance implements ShuffleboardRoot {
*/
private void apply(ShuffleboardContainer container, Consumer<ComplexWidget> func) {
for (ShuffleboardComponent<?> component : container.getComponents()) {
if (component instanceof ComplexWidget) {
func.accept((ComplexWidget) component);
if (component instanceof ComplexWidget widget) {
func.accept(widget);
}
if (component instanceof ShuffleboardContainer) {
apply((ShuffleboardContainer) component, func);
if (component instanceof ShuffleboardContainer nestedContainer) {
apply(nestedContainer, func);
}
}
}

View File

@@ -16,7 +16,7 @@ import java.util.function.LongSupplier;
import java.util.function.Supplier;
/** A layout in a Shuffleboard tab. Layouts can contain widgets and other layouts. */
public class ShuffleboardLayout extends ShuffleboardComponent<ShuffleboardLayout>
public final class ShuffleboardLayout extends ShuffleboardComponent<ShuffleboardLayout>
implements ShuffleboardContainer {
private final ContainerHelper m_helper = new ContainerHelper(this);

View File

@@ -59,8 +59,8 @@ public final class SimpleWidget extends ShuffleboardWidget<SimpleWidget> impleme
private void forceGenerate() {
ShuffleboardContainer parent = getParent();
while (parent instanceof ShuffleboardLayout) {
parent = ((ShuffleboardLayout) parent).getParent();
while (parent instanceof ShuffleboardLayout layout) {
parent = layout.getParent();
}
ShuffleboardTab tab = (ShuffleboardTab) parent;
tab.getRoot().update();

View File

@@ -93,21 +93,16 @@ public class CallbackStore implements AutoCloseable {
@Override
public void close() {
switch (m_cancelType) {
case kAlreadyCancelled:
case kAlreadyCancelled -> {
// Already cancelled so do nothing so that close() is idempotent.
return;
case kNormalCancel:
m_cancelCallback.cancel(m_index, m_uid);
break;
case kChannelCancel:
m_cancelCallbackChannel.cancel(m_index, m_channel, m_uid);
break;
case kNoIndexCancel:
m_cancelCallbackNoIndex.cancel(m_uid);
break;
default:
}
case kNormalCancel -> m_cancelCallback.cancel(m_index, m_uid);
case kChannelCancel -> m_cancelCallbackChannel.cancel(m_index, m_channel, m_uid);
case kNoIndexCancel -> m_cancelCallbackNoIndex.cancel(m_uid);
default -> {
assert false;
break;
}
}
m_cancelType = kAlreadyCancelled;
}

View File

@@ -228,24 +228,16 @@ public final class DriverStationSim {
* @return the alliance station color and number
*/
public static AllianceStationID getAllianceStationId() {
switch (DriverStationDataJNI.getAllianceStationId()) {
case DriverStationJNI.kUnknownAllianceStation:
return AllianceStationID.Unknown;
case DriverStationJNI.kRed1AllianceStation:
return AllianceStationID.Red1;
case DriverStationJNI.kRed2AllianceStation:
return AllianceStationID.Red2;
case DriverStationJNI.kRed3AllianceStation:
return AllianceStationID.Red3;
case DriverStationJNI.kBlue1AllianceStation:
return AllianceStationID.Blue1;
case DriverStationJNI.kBlue2AllianceStation:
return AllianceStationID.Blue2;
case DriverStationJNI.kBlue3AllianceStation:
return AllianceStationID.Blue3;
default:
return AllianceStationID.Unknown;
}
return switch (DriverStationDataJNI.getAllianceStationId()) {
case DriverStationJNI.kUnknownAllianceStation -> AllianceStationID.Unknown;
case DriverStationJNI.kRed1AllianceStation -> AllianceStationID.Red1;
case DriverStationJNI.kRed2AllianceStation -> AllianceStationID.Red2;
case DriverStationJNI.kRed3AllianceStation -> AllianceStationID.Red3;
case DriverStationJNI.kBlue1AllianceStation -> AllianceStationID.Blue1;
case DriverStationJNI.kBlue2AllianceStation -> AllianceStationID.Blue2;
case DriverStationJNI.kBlue3AllianceStation -> AllianceStationID.Blue3;
default -> AllianceStationID.Unknown;
};
}
/**
@@ -254,32 +246,16 @@ public final class DriverStationSim {
* @param allianceStationId the new alliance station
*/
public static void setAllianceStationId(AllianceStationID allianceStationId) {
int allianceStation;
switch (allianceStationId) {
case Unknown:
allianceStation = DriverStationJNI.kUnknownAllianceStation;
break;
case Red1:
allianceStation = DriverStationJNI.kRed1AllianceStation;
break;
case Red2:
allianceStation = DriverStationJNI.kRed2AllianceStation;
break;
case Red3:
allianceStation = DriverStationJNI.kRed3AllianceStation;
break;
case Blue1:
allianceStation = DriverStationJNI.kBlue1AllianceStation;
break;
case Blue2:
allianceStation = DriverStationJNI.kBlue2AllianceStation;
break;
case Blue3:
allianceStation = DriverStationJNI.kBlue3AllianceStation;
break;
default:
return;
}
int allianceStation =
switch (allianceStationId) {
case Unknown -> DriverStationJNI.kUnknownAllianceStation;
case Red1 -> DriverStationJNI.kRed1AllianceStation;
case Red2 -> DriverStationJNI.kRed2AllianceStation;
case Red3 -> DriverStationJNI.kRed3AllianceStation;
case Blue1 -> DriverStationJNI.kBlue1AllianceStation;
case Blue2 -> DriverStationJNI.kBlue2AllianceStation;
case Blue3 -> DriverStationJNI.kBlue3AllianceStation;
};
DriverStationDataJNI.setAllianceStationId(allianceStation);
}
@@ -507,23 +483,13 @@ public final class DriverStationSim {
* @param type the match type
*/
public static void setMatchType(DriverStation.MatchType type) {
int matchType;
switch (type) {
case Practice:
matchType = 1;
break;
case Qualification:
matchType = 2;
break;
case Elimination:
matchType = 3;
break;
case None:
matchType = 0;
break;
default:
return;
}
int matchType =
switch (type) {
case Practice -> 1;
case Qualification -> 2;
case Elimination -> 3;
case None -> 0;
};
DriverStationDataJNI.setMatchType(matchType);
}

View File

@@ -21,14 +21,10 @@ public abstract class PneumaticsBaseSim {
* @return the module object.
*/
public static PneumaticsBaseSim getForType(int module, PneumaticsModuleType type) {
switch (type) {
case CTREPCM:
return new CTREPCMSim(module);
case REVPH:
return new REVPHSim(module);
default:
throw new IllegalArgumentException("Unknown module type");
}
return switch (type) {
case CTREPCM -> new CTREPCMSim(module);
case REVPH -> new REVPHSim(module);
};
}
/**

View File

@@ -126,20 +126,14 @@ public class Color {
// Goes from 0 to chroma as hue increases
final int X = (chroma * remainder) >> 8;
switch (region) {
case 0:
return new Color(v, X + m, m);
case 1:
return new Color(v - X, v, m);
case 2:
return new Color(m, v, X + m);
case 3:
return new Color(m, v - X, v);
case 4:
return new Color(X + m, m, v);
default:
return new Color(v, m, v - X);
}
return switch (region) {
case 0 -> new Color(v, X + m, m);
case 1 -> new Color(v - X, v, m);
case 2 -> new Color(m, v, X + m);
case 3 -> new Color(m, v - X, v);
case 4 -> new Color(X + m, m, v);
default -> new Color(v, m, v - X);
};
}
@Override

View File

@@ -103,33 +103,19 @@ class AddressableLEDBufferTest {
buffer.forEach(
(index, r, g, b) -> {
switch (index) {
case 0:
{
assertAll(
() -> assertEquals(1, r, "red at index 0"),
() -> assertEquals(2, g, "green at index 0"),
() -> assertEquals(3, b, "blue at index 0"));
}
break;
case 1:
{
assertAll(
() -> assertEquals(4, r, "red at index 1"),
() -> assertEquals(5, g, "green at index 1"),
() -> assertEquals(6, b, "blue at index 1"));
}
break;
case 2:
{
assertAll(
() -> assertEquals(7, r, "red at index 2"),
() -> assertEquals(8, g, "green at index 2"),
() -> assertEquals(9, b, "blue at index 2"));
}
break;
default:
fail("Unexpected index " + index);
break;
case 0 -> assertAll(
() -> assertEquals(1, r, "red at index 0"),
() -> assertEquals(2, g, "green at index 0"),
() -> assertEquals(3, b, "blue at index 0"));
case 1 -> assertAll(
() -> assertEquals(4, r, "red at index 1"),
() -> assertEquals(5, g, "green at index 1"),
() -> assertEquals(6, b, "blue at index 1"));
case 2 -> assertAll(
() -> assertEquals(7, r, "red at index 2"),
() -> assertEquals(8, g, "green at index 2"),
() -> assertEquals(9, b, "blue at index 2"));
default -> fail("Unexpected index " + index);
}
});
}

View File

@@ -93,18 +93,10 @@ class ADIS16448SimTest {
sim.setGyroAngleZ(4.13);
switch (yawAxis) {
case kX:
assertEquals(imu.getAngle(), imu.getGyroAngleX());
break;
case kY:
assertEquals(imu.getAngle(), imu.getGyroAngleY());
break;
case kZ:
assertEquals(imu.getAngle(), imu.getGyroAngleZ());
break;
default:
fail("invalid YawAxis!");
break;
case kX -> assertEquals(imu.getAngle(), imu.getGyroAngleX());
case kY -> assertEquals(imu.getAngle(), imu.getGyroAngleY());
case kZ -> assertEquals(imu.getAngle(), imu.getGyroAngleZ());
default -> fail("invalid YawAxis!");
}
}
}
@@ -122,18 +114,10 @@ class ADIS16448SimTest {
sim.setGyroRateZ(20.71);
switch (yawAxis) {
case kX:
assertEquals(imu.getRate(), imu.getGyroRateX());
break;
case kY:
assertEquals(imu.getRate(), imu.getGyroRateY());
break;
case kZ:
assertEquals(imu.getRate(), imu.getGyroRateZ());
break;
default:
fail("invalid YawAxis!");
break;
case kX -> assertEquals(imu.getRate(), imu.getGyroRateX());
case kY -> assertEquals(imu.getRate(), imu.getGyroRateY());
case kZ -> assertEquals(imu.getRate(), imu.getGyroRateZ());
default -> fail("invalid YawAxis!");
}
}
}

View File

@@ -156,8 +156,8 @@ public abstract class MotorEncoderFixture<T extends MotorController> implements
public void teardown() {
if (!m_tornDown) {
if (m_motor != null) {
if (m_motor instanceof PWM) {
((PWM) m_motor).close();
if (m_motor instanceof PWM motor) {
motor.close();
}
m_motor = null;
}

View File

@@ -106,7 +106,7 @@ public abstract class AbstractComsSetup {
protected void failed(Throwable throwable, Description description, String status) {
TestBench.out().println();
// Instance of is the best way I know to retrieve this data.
if (throwable instanceof MultipleFailureException) {
if (throwable instanceof MultipleFailureException mfe) {
/*
* MultipleFailureExceptions hold multiple exceptions in one exception.
* In order to properly display these stack traces we have to cast the
@@ -114,8 +114,8 @@ public abstract class AbstractComsSetup {
* it.
*/
int exceptionCount = 1; // Running exception count
int failureCount = ((MultipleFailureException) throwable).getFailures().size();
for (Throwable singleThrown : ((MultipleFailureException) throwable).getFailures()) {
int failureCount = mfe.getFailures().size();
for (Throwable singleThrown : mfe.getFailures()) {
getClassLogger()
.logp(
Level.SEVERE,

View File

@@ -730,15 +730,9 @@ public class Matrix<R extends Num, C extends Num> {
if (this == other) {
return true;
}
if (!(other instanceof Matrix)) {
return false;
}
Matrix<?, ?> matrix = (Matrix<?, ?>) other;
if (MatrixFeatures_DDRM.hasUncountable(matrix.m_storage.getDDRM())) {
return false;
}
return MatrixFeatures_DDRM.isEquals(this.m_storage.getDDRM(), matrix.m_storage.getDDRM());
return other instanceof Matrix<?, ?> matrix
&& !MatrixFeatures_DDRM.hasUncountable(matrix.m_storage.getDDRM())
&& MatrixFeatures_DDRM.isEquals(this.m_storage.getDDRM(), matrix.m_storage.getDDRM());
}
@Override

View File

@@ -74,11 +74,9 @@ public class Pair<A, B> {
if (obj == this) {
return true;
}
if (obj instanceof Pair) {
return Objects.equals(m_first, ((Pair) obj).getFirst())
&& Objects.equals(m_second, ((Pair) obj).getSecond());
}
return false;
return obj instanceof Pair<?, ?> other
&& Objects.equals(m_first, other.getFirst())
&& Objects.equals(m_second, other.getSecond());
}
@Override

View File

@@ -328,11 +328,8 @@ public class PoseEstimator<T> {
if (this == obj) {
return true;
}
if (!(obj instanceof PoseEstimator.InterpolationRecord)) {
return false;
}
var record = (PoseEstimator<?>.InterpolationRecord) obj;
return Objects.equals(gyroAngle, record.gyroAngle)
return obj instanceof PoseEstimator<?>.InterpolationRecord record
&& Objects.equals(gyroAngle, record.gyroAngle)
&& Objects.equals(wheelPositions, record.wheelPositions)
&& Objects.equals(poseMeters, record.poseMeters);
}

View File

@@ -40,17 +40,11 @@ public class Debouncer {
resetTimer();
switch (m_debounceType) {
case kBoth: // fall-through
case kRising:
m_baseline = false;
break;
case kFalling:
m_baseline = true;
break;
default:
throw new IllegalArgumentException("Invalid debounce type!");
}
m_baseline =
switch (m_debounceType) {
case kBoth, kRising -> false;
case kFalling -> true;
};
}
/**

View File

@@ -308,11 +308,9 @@ public class Pose2d implements Interpolatable<Pose2d>, ProtobufSerializable, Str
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Pose2d) {
return ((Pose2d) obj).m_translation.equals(m_translation)
&& ((Pose2d) obj).m_rotation.equals(m_rotation);
}
return false;
return obj instanceof Pose2d pose
&& m_translation.equals(pose.m_translation)
&& m_rotation.equals(pose.m_rotation);
}
@Override

View File

@@ -303,11 +303,9 @@ public class Pose3d implements Interpolatable<Pose3d>, ProtobufSerializable, Str
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Pose3d) {
return ((Pose3d) obj).m_translation.equals(m_translation)
&& ((Pose3d) obj).m_rotation.equals(m_rotation);
}
return false;
return obj instanceof Pose3d pose
&& m_translation.equals(pose.m_translation)
&& m_rotation.equals(pose.m_rotation);
}
@Override

View File

@@ -140,13 +140,9 @@ public class Quaternion implements ProtobufSerializable, StructSerializable {
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Quaternion) {
var other = (Quaternion) obj;
return Math.abs(dot(other) - norm() * other.norm()) < 1e-9
&& Math.abs(norm() - other.norm()) < 1e-9;
}
return false;
return obj instanceof Quaternion other
&& Math.abs(dot(other) - norm() * other.norm()) < 1e-9
&& Math.abs(norm() - other.norm()) < 1e-9;
}
@Override

View File

@@ -316,11 +316,8 @@ public class Rotation2d
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Rotation2d) {
var other = (Rotation2d) obj;
return Math.hypot(m_cos - other.m_cos, m_sin - other.m_sin) < 1E-9;
}
return false;
return obj instanceof Rotation2d other
&& Math.hypot(m_cos - other.m_cos, m_sin - other.m_sin) < 1E-9;
}
@Override

View File

@@ -422,11 +422,8 @@ public class Rotation3d
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Rotation3d) {
var other = (Rotation3d) obj;
return Math.abs(Math.abs(m_q.dot(other.m_q)) - m_q.norm() * other.m_q.norm()) < 1e-9;
}
return false;
return obj instanceof Rotation3d other
&& Math.abs(Math.abs(m_q.dot(other.m_q)) - m_q.norm() * other.m_q.norm()) < 1e-9;
}
@Override

View File

@@ -179,11 +179,9 @@ public class Transform2d implements ProtobufSerializable, StructSerializable {
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Transform2d) {
return ((Transform2d) obj).m_translation.equals(m_translation)
&& ((Transform2d) obj).m_rotation.equals(m_rotation);
}
return false;
return obj instanceof Transform2d other
&& other.m_translation.equals(m_translation)
&& other.m_rotation.equals(m_rotation);
}
@Override

View File

@@ -173,11 +173,9 @@ public class Transform3d implements ProtobufSerializable, StructSerializable {
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Transform3d) {
return ((Transform3d) obj).m_translation.equals(m_translation)
&& ((Transform3d) obj).m_rotation.equals(m_rotation);
}
return false;
return obj instanceof Transform3d other
&& other.m_translation.equals(m_translation)
&& other.m_rotation.equals(m_rotation);
}
@Override

View File

@@ -278,11 +278,9 @@ public class Translation2d
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Translation2d) {
return Math.abs(((Translation2d) obj).m_x - m_x) < 1E-9
&& Math.abs(((Translation2d) obj).m_y - m_y) < 1E-9;
}
return false;
return obj instanceof Translation2d other
&& Math.abs(other.m_x - m_x) < 1E-9
&& Math.abs(other.m_y - m_y) < 1E-9;
}
@Override

View File

@@ -261,12 +261,10 @@ public class Translation3d
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Translation3d) {
return Math.abs(((Translation3d) obj).m_x - m_x) < 1E-9
&& Math.abs(((Translation3d) obj).m_y - m_y) < 1E-9
&& Math.abs(((Translation3d) obj).m_z - m_z) < 1E-9;
}
return false;
return obj instanceof Translation3d other
&& Math.abs(other.m_x - m_x) < 1E-9
&& Math.abs(other.m_y - m_y) < 1E-9
&& Math.abs(other.m_z - m_z) < 1E-9;
}
@Override

View File

@@ -55,12 +55,10 @@ public class Twist2d implements ProtobufSerializable, StructSerializable {
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Twist2d) {
return Math.abs(((Twist2d) obj).dx - dx) < 1E-9
&& Math.abs(((Twist2d) obj).dy - dy) < 1E-9
&& Math.abs(((Twist2d) obj).dtheta - dtheta) < 1E-9;
}
return false;
return obj instanceof Twist2d other
&& Math.abs(other.dx - dx) < 1E-9
&& Math.abs(other.dy - dy) < 1E-9
&& Math.abs(other.dtheta - dtheta) < 1E-9;
}
@Override

View File

@@ -72,15 +72,13 @@ public class Twist3d implements ProtobufSerializable, StructSerializable {
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Twist3d) {
return Math.abs(((Twist3d) obj).dx - dx) < 1E-9
&& Math.abs(((Twist3d) obj).dy - dy) < 1E-9
&& Math.abs(((Twist3d) obj).dz - dz) < 1E-9
&& Math.abs(((Twist3d) obj).rx - rx) < 1E-9
&& Math.abs(((Twist3d) obj).ry - ry) < 1E-9
&& Math.abs(((Twist3d) obj).rz - rz) < 1E-9;
}
return false;
return obj instanceof Twist3d other
&& Math.abs(other.dx - dx) < 1E-9
&& Math.abs(other.dy - dy) < 1E-9
&& Math.abs(other.dz - dz) < 1E-9
&& Math.abs(other.rx - rx) < 1E-9
&& Math.abs(other.ry - ry) < 1E-9
&& Math.abs(other.rz - rz) < 1E-9;
}
@Override

View File

@@ -394,14 +394,8 @@ public class ChassisSpeeds implements ProtobufSerializable, StructSerializable {
if (o == this) {
return true;
}
if (!(o instanceof ChassisSpeeds)) {
return false;
}
ChassisSpeeds c = (ChassisSpeeds) o;
return vxMetersPerSecond == c.vxMetersPerSecond
return o instanceof ChassisSpeeds c
&& vxMetersPerSecond == c.vxMetersPerSecond
&& vyMetersPerSecond == c.vyMetersPerSecond
&& omegaRadiansPerSecond == c.omegaRadiansPerSecond;
}

View File

@@ -53,12 +53,9 @@ public class DifferentialDriveWheelPositions
@Override
public boolean equals(Object obj) {
if (obj instanceof DifferentialDriveWheelPositions) {
DifferentialDriveWheelPositions other = (DifferentialDriveWheelPositions) obj;
return Math.abs(other.leftMeters - leftMeters) < 1E-9
&& Math.abs(other.rightMeters - rightMeters) < 1E-9;
}
return false;
return obj instanceof DifferentialDriveWheelPositions other
&& Math.abs(other.leftMeters - leftMeters) < 1E-9
&& Math.abs(other.rightMeters - rightMeters) < 1E-9;
}
@Override

View File

@@ -79,14 +79,11 @@ public class MecanumDriveWheelPositions
@Override
public boolean equals(Object obj) {
if (obj instanceof MecanumDriveWheelPositions) {
MecanumDriveWheelPositions other = (MecanumDriveWheelPositions) obj;
return Math.abs(other.frontLeftMeters - frontLeftMeters) < 1E-9
&& Math.abs(other.frontRightMeters - frontRightMeters) < 1E-9
&& Math.abs(other.rearLeftMeters - rearLeftMeters) < 1E-9
&& Math.abs(other.rearRightMeters - rearRightMeters) < 1E-9;
}
return false;
return obj instanceof MecanumDriveWheelPositions other
&& Math.abs(other.frontLeftMeters - frontLeftMeters) < 1E-9
&& Math.abs(other.frontRightMeters - frontRightMeters) < 1E-9
&& Math.abs(other.rearLeftMeters - rearLeftMeters) < 1E-9
&& Math.abs(other.rearRightMeters - rearRightMeters) < 1E-9;
}
@Override

View File

@@ -61,11 +61,9 @@ public class SwerveModulePosition
@Override
public boolean equals(Object obj) {
if (obj instanceof SwerveModulePosition) {
SwerveModulePosition other = (SwerveModulePosition) obj;
return Math.abs(other.distanceMeters - distanceMeters) < 1E-9 && angle.equals(other.angle);
}
return false;
return obj instanceof SwerveModulePosition other
&& Math.abs(other.distanceMeters - distanceMeters) < 1E-9
&& angle.equals(other.angle);
}
@Override

View File

@@ -57,12 +57,9 @@ public class SwerveModuleState
@Override
public boolean equals(Object obj) {
if (obj instanceof SwerveModuleState) {
SwerveModuleState other = (SwerveModuleState) obj;
return Math.abs(other.speedMetersPerSecond - speedMetersPerSecond) < 1E-9
&& angle.equals(other.angle);
}
return false;
return obj instanceof SwerveModuleState other
&& Math.abs(other.speedMetersPerSecond - speedMetersPerSecond) < 1E-9
&& angle.equals(other.angle);
}
@Override

View File

@@ -151,12 +151,9 @@ public class ExponentialProfile {
@Override
public boolean equals(Object other) {
if (other instanceof State) {
State rhs = (State) other;
return this.position == rhs.position && this.velocity == rhs.velocity;
} else {
return false;
}
return other instanceof State rhs
&& this.position == rhs.position
&& this.velocity == rhs.velocity;
}
@Override

View File

@@ -383,14 +383,8 @@ public class Trajectory implements ProtobufSerializable {
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof State)) {
return false;
}
State state = (State) obj;
return Double.compare(state.timeSeconds, timeSeconds) == 0
return obj instanceof State state
&& Double.compare(state.timeSeconds, timeSeconds) == 0
&& Double.compare(state.velocityMetersPerSecond, velocityMetersPerSecond) == 0
&& Double.compare(state.accelerationMetersPerSecondSq, accelerationMetersPerSecondSq) == 0
&& Double.compare(state.curvatureRadPerMeter, curvatureRadPerMeter) == 0
@@ -421,6 +415,6 @@ public class Trajectory implements ProtobufSerializable {
@Override
public boolean equals(Object obj) {
return obj instanceof Trajectory && m_states.equals(((Trajectory) obj).getStates());
return obj instanceof Trajectory other && m_states.equals(other.getStates());
}
}

View File

@@ -120,12 +120,9 @@ public class TrapezoidProfile {
@Override
public boolean equals(Object other) {
if (other instanceof State) {
State rhs = (State) other;
return this.position == rhs.position && this.velocity == rhs.velocity;
} else {
return false;
}
return other instanceof State rhs
&& this.position == rhs.position
&& this.velocity == rhs.velocity;
}
@Override

View File

@@ -83,14 +83,9 @@ public class ImmutableMeasure<U extends Unit<U>> implements Measure<U> {
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Measure)) {
return false;
}
Measure<?> that = (Measure<?>) o;
return Objects.equals(m_unit, that.unit()) && m_baseUnitMagnitude == that.baseUnitMagnitude();
return o instanceof Measure<?> that
&& Objects.equals(m_unit, that.unit())
&& m_baseUnitMagnitude == that.baseUnitMagnitude();
}
@Override

View File

@@ -85,36 +85,29 @@ public interface Measure<U extends Unit<U>> extends Comparable<Measure<U>> {
* @param other the unit to multiply by
* @return the multiplicative unit
*/
@SuppressWarnings("unchecked")
default <U2 extends Unit<U2>> Measure<?> times(Measure<U2> other) {
if (other.unit() instanceof Dimensionless) {
// scalar multiplication
return times(other.baseUnitMagnitude());
}
if (unit() instanceof Per
&& other.unit().getBaseUnit().equals(((Per<?, ?>) unit()).denominator().getBaseUnit())) {
if (unit() instanceof Per<?, ?> per
&& other.unit().getBaseUnit().equals(per.denominator().getBaseUnit())) {
// denominator of the Per cancels out, return with just the units of the numerator
Unit<?> numerator = ((Per<?, ?>) unit()).numerator();
Unit<?> numerator = per.numerator();
return numerator.ofBaseUnits(baseUnitMagnitude() * other.baseUnitMagnitude());
} else if (unit() instanceof Velocity && other.unit().getBaseUnit().equals(Seconds)) {
} else if (unit() instanceof Velocity<?> v && other.unit().getBaseUnit().equals(Seconds)) {
// Multiplying a velocity by a time, return the scalar unit (eg Distance)
Unit<?> numerator = ((Velocity<?>) unit()).getUnit();
Unit<?> numerator = v.getUnit();
return numerator.ofBaseUnits(baseUnitMagnitude() * other.baseUnitMagnitude());
} else if (other.unit() instanceof Per
&& unit().getBaseUnit().equals(((Per<?, ?>) other.unit()).denominator().getBaseUnit())) {
Unit<?> numerator = ((Per<?, ?>) other.unit()).numerator();
} else if (other.unit() instanceof Per<?, ?> per
&& unit().getBaseUnit().equals(per.denominator().getBaseUnit())) {
Unit<?> numerator = per.numerator();
return numerator.ofBaseUnits(baseUnitMagnitude() * other.baseUnitMagnitude());
} else if (unit() instanceof Per
&& other.unit() instanceof Per
&& ((Per<?, ?>) unit())
.denominator()
.getBaseUnit()
.equals(((Per<?, U>) other.unit()).numerator().getBaseUnit())
&& ((Per<?, ?>) unit())
.numerator()
.getBaseUnit()
.equals(((Per<?, ?>) other.unit()).denominator().getBaseUnit())) {
} else if (unit() instanceof Per<?, ?> per
&& other.unit() instanceof Per<?, ?> otherPer
&& per.denominator().getBaseUnit().equals(otherPer.numerator().getBaseUnit())
&& per.numerator().getBaseUnit().equals(otherPer.denominator().getBaseUnit())) {
// multiplying eg meters per second * milliseconds per foot
// return a scalar
return Units.Value.of(baseUnitMagnitude() * other.baseUnitMagnitude());

View File

@@ -286,14 +286,9 @@ public final class MutableMeasure<U extends Unit<U>> implements Measure<U> {
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Measure)) {
return false;
}
Measure<?> that = (Measure<?>) o;
return Objects.equals(m_unit, that.unit()) && this.isEquivalent(that);
return o instanceof Measure<?> that
&& Objects.equals(m_unit, that.unit())
&& this.isEquivalent(that);
}
@Override

View File

@@ -289,11 +289,10 @@ public class Unit<U extends Unit<U>> {
if (this == o) {
return true;
}
if (!(o instanceof Unit)) {
return false;
}
Unit<?> that = (Unit<?>) o;
return m_name.equals(that.m_name) && m_symbol.equals(that.m_symbol) && this.equivalent(that);
return o instanceof Unit<?> that
&& m_name.equals(that.m_name)
&& m_symbol.equals(that.m_symbol)
&& this.equivalent(that);
}
@Override

View File

@@ -579,23 +579,14 @@ public final class DynamicStruct {
"arrIndex (" + arrIndex + ") is larger than array size (" + field.m_arraySize + ")");
}
long val;
switch (field.m_size) {
case 1:
val = m_data.get(field.m_offset + arrIndex);
break;
case 2:
val = m_data.getShort(field.m_offset + arrIndex * 2);
break;
case 4:
val = m_data.getInt(field.m_offset + arrIndex * 4);
break;
case 8:
val = m_data.getLong(field.m_offset + arrIndex * 8);
break;
default:
throw new IllegalStateException("invalid field size");
}
long val =
switch (field.m_size) {
case 1 -> m_data.get(field.m_offset + arrIndex);
case 2 -> m_data.getShort(field.m_offset + arrIndex * 2);
case 4 -> m_data.getInt(field.m_offset + arrIndex * 4);
case 8 -> m_data.getLong(field.m_offset + arrIndex * 8);
default -> throw new IllegalStateException("invalid field size");
};
if (field.isUint() || field.getType() == StructFieldType.kBool) {
// for unsigned fields, we can simply logical shift and mask
@@ -623,60 +614,42 @@ public final class DynamicStruct {
// common case is no bit shift and no masking
if (!field.isBitField()) {
switch (field.m_size) {
case 1:
m_data.put(field.m_offset + arrIndex, (byte) value);
break;
case 2:
m_data.putShort(field.m_offset + arrIndex * 2, (short) value);
break;
case 4:
m_data.putInt(field.m_offset + arrIndex * 4, (int) value);
break;
case 8:
m_data.putLong(field.m_offset + arrIndex * 8, value);
break;
default:
throw new IllegalStateException("invalid field size");
case 1 -> m_data.put(field.m_offset + arrIndex, (byte) value);
case 2 -> m_data.putShort(field.m_offset + arrIndex * 2, (short) value);
case 4 -> m_data.putInt(field.m_offset + arrIndex * 4, (int) value);
case 8 -> m_data.putLong(field.m_offset + arrIndex * 8, value);
default -> throw new IllegalStateException("invalid field size");
}
return;
}
// handle bit shifting and masking into current value
switch (field.m_size) {
case 1:
{
byte val = m_data.get(field.m_offset + arrIndex);
val &= (byte) ~(field.getBitMask() << field.m_bitShift);
val |= (byte) ((value & field.getBitMask()) << field.m_bitShift);
m_data.put(field.m_offset + arrIndex, val);
break;
}
case 2:
{
short val = m_data.getShort(field.m_offset + arrIndex * 2);
val &= (short) ~(field.getBitMask() << field.m_bitShift);
val |= (short) ((value & field.getBitMask()) << field.m_bitShift);
m_data.putShort(field.m_offset + arrIndex * 2, val);
break;
}
case 4:
{
int val = m_data.getInt(field.m_offset + arrIndex * 4);
val &= (int) ~(field.getBitMask() << field.m_bitShift);
val |= (int) ((value & field.getBitMask()) << field.m_bitShift);
m_data.putInt(field.m_offset + arrIndex * 4, val);
break;
}
case 8:
{
long val = m_data.getLong(field.m_offset + arrIndex * 8);
val &= ~(field.getBitMask() << field.m_bitShift);
val |= (value & field.getBitMask()) << field.m_bitShift;
m_data.putLong(field.m_offset + arrIndex * 8, val);
break;
}
default:
throw new IllegalStateException("invalid field size");
case 1 -> {
byte val = m_data.get(field.m_offset + arrIndex);
val &= (byte) ~(field.getBitMask() << field.m_bitShift);
val |= (byte) ((value & field.getBitMask()) << field.m_bitShift);
m_data.put(field.m_offset + arrIndex, val);
}
case 2 -> {
short val = m_data.getShort(field.m_offset + arrIndex * 2);
val &= (short) ~(field.getBitMask() << field.m_bitShift);
val |= (short) ((value & field.getBitMask()) << field.m_bitShift);
m_data.putShort(field.m_offset + arrIndex * 2, val);
}
case 4 -> {
int val = m_data.getInt(field.m_offset + arrIndex * 4);
val &= (int) ~(field.getBitMask() << field.m_bitShift);
val |= (int) ((value & field.getBitMask()) << field.m_bitShift);
m_data.putInt(field.m_offset + arrIndex * 4, val);
}
case 8 -> {
long val = m_data.getLong(field.m_offset + arrIndex * 8);
val &= ~(field.getBitMask() << field.m_bitShift);
val |= (value & field.getBitMask()) << field.m_bitShift;
m_data.putLong(field.m_offset + arrIndex * 8, val);
}
default -> throw new IllegalStateException("invalid field size");
}
}

View File

@@ -27,43 +27,24 @@ public class Lexer {
} while (m_current == ' ' || m_current == '\t' || m_current == '\n' || m_current == '\r');
m_tokenStart = m_pos - 1;
switch (m_current) {
case '[':
return TokenKind.kLeftBracket;
case ']':
return TokenKind.kRightBracket;
case '{':
return TokenKind.kLeftBrace;
case '}':
return TokenKind.kRightBrace;
case ':':
return TokenKind.kColon;
case ';':
return TokenKind.kSemicolon;
case ',':
return TokenKind.kComma;
case '=':
return TokenKind.kEquals;
case '-':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return scanInteger();
case '\0':
return TokenKind.kEndOfInput;
default:
return switch (m_current) {
case '[' -> TokenKind.kLeftBracket;
case ']' -> TokenKind.kRightBracket;
case '{' -> TokenKind.kLeftBrace;
case '}' -> TokenKind.kRightBrace;
case ':' -> TokenKind.kColon;
case ';' -> TokenKind.kSemicolon;
case ',' -> TokenKind.kComma;
case '=' -> TokenKind.kEquals;
case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> scanInteger();
case '\0' -> TokenKind.kEndOfInput;
default -> {
if (Character.isLetter(m_current) || m_current == '_') {
return scanIdentifier();
yield scanIdentifier();
}
return TokenKind.kUnknown;
}
yield TokenKind.kUnknown;
}
};
}
/**

View File

@@ -124,20 +124,17 @@ public final class PrintLog {
continue;
}
if ("double".equals(entry.type)) {
System.out.println(" " + record.getDouble());
} else if ("int64".equals(entry.type)) {
System.out.println(" " + record.getInteger());
} else if ("string".equals(entry.type) || "json".equals(entry.type)) {
System.out.println(" '" + record.getString() + "'");
} else if ("boolean".equals(entry.type)) {
System.out.println(" " + record.getBoolean());
} else if ("double[]".equals(entry.type)) {
System.out.println(" " + List.of(record.getDoubleArray()));
} else if ("int64[]".equals(entry.type)) {
System.out.println(" " + List.of(record.getIntegerArray()));
} else if ("string[]".equals(entry.type)) {
System.out.println(" " + List.of(record.getStringArray()));
switch (entry.type) {
case "double" -> System.out.println(" " + record.getDouble());
case "int64" -> System.out.println(" " + record.getInteger());
case "string", "json" -> System.out.println(" '" + record.getString() + "'");
case "boolean" -> System.out.println(" " + record.getBoolean());
case "double[]" -> System.out.println(" " + List.of(record.getDoubleArray()));
case "int64[]" -> System.out.println(" " + List.of(record.getIntegerArray()));
case "string[]" -> System.out.println(" " + List.of(record.getStringArray()));
default -> {
// NOP
}
}
} catch (InputMismatchException ex) {
System.out.println(" invalid");