From ac907f755af67f3ac4ad7294cdb915600b0f1e6b Mon Sep 17 00:00:00 2001 From: Nicholas Armstrong Date: Wed, 23 Oct 2024 10:20:17 -0400 Subject: [PATCH] [wpiunits] Add resistance units (#7168) --- wpiunits/generate_units.py | 27 +- .../wpi/first/units/measure/Acceleration.java | 11 + .../edu/wpi/first/units/measure/Angle.java | 11 + .../units/measure/AngularAcceleration.java | 11 + .../first/units/measure/AngularMomentum.java | 11 + .../first/units/measure/AngularVelocity.java | 11 + .../edu/wpi/first/units/measure/Current.java | 11 + .../first/units/measure/Dimensionless.java | 11 + .../edu/wpi/first/units/measure/Distance.java | 11 + .../edu/wpi/first/units/measure/Energy.java | 11 + .../edu/wpi/first/units/measure/Force.java | 11 + .../wpi/first/units/measure/Frequency.java | 11 + .../units/measure/ImmutableResistance.java | 28 ++ .../units/measure/LinearAcceleration.java | 11 + .../first/units/measure/LinearMomentum.java | 11 + .../first/units/measure/LinearVelocity.java | 11 + .../edu/wpi/first/units/measure/Mass.java | 11 + .../first/units/measure/MomentOfInertia.java | 11 + .../edu/wpi/first/units/measure/Mult.java | 11 + .../first/units/measure/MutResistance.java | 25 ++ .../java/edu/wpi/first/units/measure/Per.java | 11 + .../edu/wpi/first/units/measure/Power.java | 11 + .../wpi/first/units/measure/Resistance.java | 345 ++++++++++++++++++ .../wpi/first/units/measure/Temperature.java | 11 + .../edu/wpi/first/units/measure/Time.java | 11 + .../edu/wpi/first/units/measure/Torque.java | 11 + .../edu/wpi/first/units/measure/Velocity.java | 11 + .../edu/wpi/first/units/measure/Voltage.java | 15 +- .../java/edu/wpi/first/units/Measure.java | 28 ++ .../edu/wpi/first/units/ResistanceUnit.java | 104 ++++++ .../main/java/edu/wpi/first/units/Units.java | 19 + .../java/edu/wpi/first/units/VoltageUnit.java | 10 + 32 files changed, 849 insertions(+), 5 deletions(-) create mode 100644 wpiunits/src/generated/main/java/edu/wpi/first/units/measure/ImmutableResistance.java create mode 100644 wpiunits/src/generated/main/java/edu/wpi/first/units/measure/MutResistance.java create mode 100644 wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Resistance.java create mode 100644 wpiunits/src/main/java/edu/wpi/first/units/ResistanceUnit.java diff --git a/wpiunits/generate_units.py b/wpiunits/generate_units.py index 2c4bc0856e..b5c5d8739e 100755 --- a/wpiunits/generate_units.py +++ b/wpiunits/generate_units.py @@ -51,6 +51,7 @@ MATH_OPERATION_UNITS = [ "Mult", "Per", "Power", + "Resistance", "Temperature", "Time", "Torque", @@ -91,7 +92,11 @@ UNIT_CONFIGURATIONS = { """ ), }, - "Current": {"base_unit": "Amps", "multiply": {"Voltage": "Power"}, "divide": {}}, + "Current": { + "base_unit": "Amps", + "multiply": {"Voltage": "Power", "Resistance": "Voltage"}, + "divide": {}, + }, "Dimensionless": { "base_unit": "Value", "multiply": { @@ -111,6 +116,7 @@ UNIT_CONFIGURATIONS = { "Mass": "Mass", "MomentOfInertia": "MomentOfInertia", "Power": "Power", + "Resistance": "Resistance", "Temperature": "Temperature", "Time": "Time", "Torque": "Torque", @@ -225,6 +231,13 @@ UNIT_CONFIGURATIONS = { }, "divide": {"Voltage": "Current", "Current": "Voltage", "Energy": "Frequency"}, }, + "Resistance": { + "base_unit": "Ohms", + "multiply": { + "Current": "Voltage", + }, + "divide": {}, + }, "Temperature": {"base_unit": "Kelvin", "multiply": {}, "divide": {}}, "Time": { "base_unit": "Seconds", @@ -272,7 +285,16 @@ UNIT_CONFIGURATIONS = { }, "divide": {}, }, - "Voltage": {"base_unit": "Volts", "multiply": {"Current": "Power"}, "divide": {}}, + "Voltage": { + "base_unit": "Volts", + "multiply": { + "Current": "Power", + }, + "divide": { + "Resistance": "Current", + "Current": "Resistance", + }, + }, } @@ -331,7 +353,6 @@ def indent(multiline_string, indentation): def main(): - dirname, _ = os.path.split(os.path.abspath(__file__)) env = Environment( diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Acceleration.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Acceleration.java index f4ceb28243..9b512b028b 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Acceleration.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Acceleration.java @@ -277,6 +277,17 @@ public interface Acceleration extends Measure, ResistanceUnit> times(Resistance multiplier) { + return (Mult, ResistanceUnit>) Measure.super.times(multiplier); + } + + @Override + default Per, ResistanceUnit> divide(Resistance divisor) { + return (Per, ResistanceUnit>) Measure.super.divide(divisor); + } + + @Override default Mult, TemperatureUnit> times(Temperature multiplier) { return (Mult, TemperatureUnit>) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Angle.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Angle.java index c182d48f3c..ab576da86b 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Angle.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Angle.java @@ -277,6 +277,17 @@ public interface Angle extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularAcceleration.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularAcceleration.java index 44ff1c395b..6ca0f01dc9 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularAcceleration.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularAcceleration.java @@ -277,6 +277,17 @@ public interface AngularAcceleration extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularMomentum.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularMomentum.java index 631ac45caf..6a3ec3a9d1 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularMomentum.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularMomentum.java @@ -277,6 +277,17 @@ public interface AngularMomentum extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularVelocity.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularVelocity.java index 5c017c5c8f..c10c4c4089 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularVelocity.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/AngularVelocity.java @@ -277,6 +277,17 @@ public interface AngularVelocity extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Current.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Current.java index e7af53dfda..b810c54536 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Current.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Current.java @@ -277,6 +277,17 @@ public interface Current extends Measure { } + @Override + default Voltage times(Resistance multiplier) { + return Volts.of(baseUnitMagnitude() * multiplier.baseUnitMagnitude()); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Dimensionless.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Dimensionless.java index 942f55d415..ed9e5fbff2 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Dimensionless.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Dimensionless.java @@ -277,6 +277,17 @@ public interface Dimensionless extends Measure { } + @Override + default Resistance times(Resistance multiplier) { + return Ohms.of(baseUnitMagnitude() * multiplier.baseUnitMagnitude()); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Temperature times(Temperature multiplier) { return Kelvin.of(baseUnitMagnitude() * multiplier.baseUnitMagnitude()); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Distance.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Distance.java index f87106362e..10d4fcfcdc 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Distance.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Distance.java @@ -277,6 +277,17 @@ public interface Distance extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Energy.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Energy.java index d20f8f1962..c5c881ac15 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Energy.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Energy.java @@ -277,6 +277,17 @@ public interface Energy extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Force.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Force.java index 2f69f808b8..8be6ce514d 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Force.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Force.java @@ -277,6 +277,17 @@ public interface Force extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Frequency.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Frequency.java index ebce2a9a31..e7d2f8b6c5 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Frequency.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Frequency.java @@ -277,6 +277,17 @@ public interface Frequency extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/ImmutableResistance.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/ImmutableResistance.java new file mode 100644 index 0000000000..34b780e7d3 --- /dev/null +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/ImmutableResistance.java @@ -0,0 +1,28 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +// THIS FILE WAS AUTO-GENERATED BY ./wpiunits/generate_units.py. DO NOT MODIFY + +package edu.wpi.first.units.measure; + +import static edu.wpi.first.units.Units.*; +import edu.wpi.first.units.*; + +@SuppressWarnings({"unchecked", "cast", "checkstyle", "PMD"}) +public record ImmutableResistance(double magnitude, double baseUnitMagnitude, ResistanceUnit unit) implements Resistance { + @Override + public Resistance copy() { + return this; + } + + @Override + public String toString() { + return toShortString(); + } + + @Override + public boolean equals(Object o) { + return o instanceof Measure m && isEquivalent(m); + } +} diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearAcceleration.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearAcceleration.java index f595bcc33f..f26715af80 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearAcceleration.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearAcceleration.java @@ -277,6 +277,17 @@ public interface LinearAcceleration extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearMomentum.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearMomentum.java index 92177a9598..038dad4a0b 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearMomentum.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearMomentum.java @@ -277,6 +277,17 @@ public interface LinearMomentum extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearVelocity.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearVelocity.java index 4f3d1c389d..26376dfb17 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearVelocity.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/LinearVelocity.java @@ -277,6 +277,17 @@ public interface LinearVelocity extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Mass.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Mass.java index 6046be68d4..9ce34abf0a 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Mass.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Mass.java @@ -277,6 +277,17 @@ public interface Mass extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/MomentOfInertia.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/MomentOfInertia.java index c56c6ba001..f8c9e83889 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/MomentOfInertia.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/MomentOfInertia.java @@ -277,6 +277,17 @@ public interface MomentOfInertia extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Mult.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Mult.java index 9ea6033054..92c4a17967 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Mult.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Mult.java @@ -277,6 +277,17 @@ public interface Mult extends Measure, ResistanceUnit> times(Resistance multiplier) { + return (Mult, ResistanceUnit>) Measure.super.times(multiplier); + } + + @Override + default Per, ResistanceUnit> divide(Resistance divisor) { + return (Per, ResistanceUnit>) Measure.super.divide(divisor); + } + + @Override default Mult, TemperatureUnit> times(Temperature multiplier) { return (Mult, TemperatureUnit>) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/MutResistance.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/MutResistance.java new file mode 100644 index 0000000000..6acee59f56 --- /dev/null +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/MutResistance.java @@ -0,0 +1,25 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +// THIS FILE WAS AUTO-GENERATED BY ./wpiunits/generate_units.py. DO NOT MODIFY + +package edu.wpi.first.units.measure; + +import static edu.wpi.first.units.Units.*; +import edu.wpi.first.units.*; +import edu.wpi.first.units.mutable.MutableMeasureBase; + +@SuppressWarnings({"unchecked", "cast", "checkstyle", "PMD"}) +public final class MutResistance + extends MutableMeasureBase + implements Resistance { + public MutResistance(double magnitude, double baseUnitMagnitude, ResistanceUnit unit) { + super(magnitude, baseUnitMagnitude, unit); + } + + @Override + public Resistance copy() { + return new ImmutableResistance(magnitude(), baseUnitMagnitude(), unit()); + } +} diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Per.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Per.java index b467e977a0..74610e4010 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Per.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Per.java @@ -277,6 +277,17 @@ public interface Per extends Measur } + @Override + default Mult, ResistanceUnit> times(Resistance multiplier) { + return (Mult, ResistanceUnit>) Measure.super.times(multiplier); + } + + @Override + default Per, ResistanceUnit> divide(Resistance divisor) { + return (Per, ResistanceUnit>) Measure.super.divide(divisor); + } + + @Override default Mult, TemperatureUnit> times(Temperature multiplier) { return (Mult, TemperatureUnit>) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Power.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Power.java index 054bfa785d..d704ccf02d 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Power.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Power.java @@ -277,6 +277,17 @@ public interface Power extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Resistance.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Resistance.java new file mode 100644 index 0000000000..3148f14221 --- /dev/null +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Resistance.java @@ -0,0 +1,345 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +// THIS FILE WAS AUTO-GENERATED BY ./wpiunits/generate_units.py. DO NOT MODIFY + +package edu.wpi.first.units.measure; + +import static edu.wpi.first.units.Units.*; +import edu.wpi.first.units.*; + +@SuppressWarnings({"unchecked", "cast", "checkstyle", "PMD"}) +public interface Resistance extends Measure { + static Resistance ofRelativeUnits(double magnitude, ResistanceUnit unit) { + return new ImmutableResistance(magnitude, unit.toBaseUnits(magnitude), unit); + } + + static Resistance ofBaseUnits(double baseUnitMagnitude, ResistanceUnit unit) { + return new ImmutableResistance(unit.fromBaseUnits(baseUnitMagnitude), baseUnitMagnitude, unit); + } + + @Override + Resistance copy(); + + @Override + default MutResistance mutableCopy() { + return new MutResistance(magnitude(), baseUnitMagnitude(), unit()); + } + + @Override + ResistanceUnit unit(); + + @Override + default ResistanceUnit baseUnit() { return (ResistanceUnit) unit().getBaseUnit(); } + + @Override + default double in(ResistanceUnit unit) { + return unit.fromBaseUnits(baseUnitMagnitude()); + } + + @Override + default Resistance unaryMinus() { + return (Resistance) unit().ofBaseUnits(0 - baseUnitMagnitude()); + } + + @Override + default Resistance plus(Measure other) { + return (Resistance) unit().ofBaseUnits(baseUnitMagnitude() + other.baseUnitMagnitude()); + } + + @Override + default Resistance minus(Measure other) { + return (Resistance) unit().ofBaseUnits(baseUnitMagnitude() - other.baseUnitMagnitude()); + } + + @Override + default Resistance times(double multiplier) { + return (Resistance) unit().ofBaseUnits(baseUnitMagnitude() * multiplier); + } + + @Override + default Resistance divide(double divisor) { + return (Resistance) unit().ofBaseUnits(baseUnitMagnitude() / divisor); + } + + @Override + default Velocity per(TimeUnit period) { + return divide(period.of(1)); + } + + + @Override + default Mult> times(Acceleration multiplier) { + return (Mult>) Measure.super.times(multiplier); + } + + @Override + default Per> divide(Acceleration divisor) { + return (Per>) Measure.super.divide(divisor); + } + + + @Override + default Mult times(Angle multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Angle divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(AngularAcceleration multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(AngularAcceleration divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(AngularMomentum multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(AngularMomentum divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(AngularVelocity multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(AngularVelocity divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Voltage times(Current multiplier) { + return Volts.of(baseUnitMagnitude() * multiplier.baseUnitMagnitude()); + } + + @Override + default Per divide(Current divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override + default Resistance divide(Dimensionless divisor) { + return (Resistance) Ohms.of(baseUnitMagnitude() / divisor.baseUnitMagnitude()); + } + + @Override + default Resistance times(Dimensionless multiplier) { + return (Resistance) Ohms.of(baseUnitMagnitude() * multiplier.baseUnitMagnitude()); + } + + + @Override + default Mult times(Distance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Distance divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(Energy multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Energy divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(Force multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Force divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(Frequency multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Frequency divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(LinearAcceleration multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(LinearAcceleration divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(LinearMomentum multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(LinearMomentum divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(LinearVelocity multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(LinearVelocity divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(Mass multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Mass divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(MomentOfInertia multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(MomentOfInertia divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult> times(Mult multiplier) { + return (Mult>) Measure.super.times(multiplier); + } + + @Override + default Per> divide(Mult divisor) { + return (Per>) Measure.super.divide(divisor); + } + + + @Override + default Mult> times(Per multiplier) { + return (Mult>) Measure.super.times(multiplier); + } + + @Override + default Per> divide(Per divisor) { + return (Per>) Measure.super.divide(divisor); + } + + + @Override + default Mult times(Power multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Power divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Dimensionless divide(Resistance divisor) { + return Value.of(baseUnitMagnitude() / divisor.baseUnitMagnitude()); + } + + + @Override + default Mult times(Temperature multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Temperature divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult times(Time multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Velocity divide(Time divisor) { + return VelocityUnit.combine(unit(), divisor.unit()).ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude()); + } + + + @Override + default Mult times(Torque multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Torque divisor) { + return (Per) Measure.super.divide(divisor); + } + + + @Override + default Mult> times(Velocity multiplier) { + return (Mult>) Measure.super.times(multiplier); + } + + @Override + default Per> divide(Velocity divisor) { + return (Per>) Measure.super.divide(divisor); + } + + + @Override + default Mult times(Voltage multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Voltage divisor) { + return (Per) Measure.super.divide(divisor); + } + +} diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Temperature.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Temperature.java index c9396f7922..fcfd2ce296 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Temperature.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Temperature.java @@ -277,6 +277,17 @@ public interface Temperature extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Time.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Time.java index aa4945c2a8..7cbc885566 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Time.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Time.java @@ -277,6 +277,17 @@ public interface Time extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Torque.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Torque.java index ff1ccee526..f626d23197 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Torque.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Torque.java @@ -277,6 +277,17 @@ public interface Torque extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Per divide(Resistance divisor) { + return (Per) Measure.super.divide(divisor); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Velocity.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Velocity.java index e69991d111..5e78e37c89 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Velocity.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Velocity.java @@ -277,6 +277,17 @@ public interface Velocity extends Measure> { } + @Override + default Mult, ResistanceUnit> times(Resistance multiplier) { + return (Mult, ResistanceUnit>) Measure.super.times(multiplier); + } + + @Override + default Per, ResistanceUnit> divide(Resistance divisor) { + return (Per, ResistanceUnit>) Measure.super.divide(divisor); + } + + @Override default Mult, TemperatureUnit> times(Temperature multiplier) { return (Mult, TemperatureUnit>) Measure.super.times(multiplier); diff --git a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Voltage.java b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Voltage.java index 403bb7080a..f23f6e057f 100644 --- a/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Voltage.java +++ b/wpiunits/src/generated/main/java/edu/wpi/first/units/measure/Voltage.java @@ -130,8 +130,8 @@ public interface Voltage extends Measure { } @Override - default Per divide(Current divisor) { - return (Per) Measure.super.divide(divisor); + default Resistance divide(Current divisor) { + return Ohms.of(baseUnitMagnitude() / divisor.baseUnitMagnitude()); } @Override @@ -277,6 +277,17 @@ public interface Voltage extends Measure { } + @Override + default Mult times(Resistance multiplier) { + return (Mult) Measure.super.times(multiplier); + } + + @Override + default Current divide(Resistance divisor) { + return Amps.of(baseUnitMagnitude() / divisor.baseUnitMagnitude()); + } + + @Override default Mult times(Temperature multiplier) { return (Mult) Measure.super.times(multiplier); diff --git a/wpiunits/src/main/java/edu/wpi/first/units/Measure.java b/wpiunits/src/main/java/edu/wpi/first/units/Measure.java index 86c8de9a88..6ba7cad72d 100644 --- a/wpiunits/src/main/java/edu/wpi/first/units/Measure.java +++ b/wpiunits/src/main/java/edu/wpi/first/units/Measure.java @@ -25,6 +25,7 @@ import edu.wpi.first.units.measure.MomentOfInertia; import edu.wpi.first.units.measure.Mult; import edu.wpi.first.units.measure.Per; import edu.wpi.first.units.measure.Power; +import edu.wpi.first.units.measure.Resistance; import edu.wpi.first.units.measure.Temperature; import edu.wpi.first.units.measure.Time; import edu.wpi.first.units.measure.Torque; @@ -246,6 +247,8 @@ public interface Measure extends Comparable> { return times(velocity); } else if (multiplier instanceof Voltage voltage) { return times(voltage); + } else if (multiplier instanceof Resistance resistance) { + return times(resistance); } else { // Dimensional analysis fallthrough or a generic input measure type // Do a basic unit multiplication @@ -530,6 +533,18 @@ public interface Measure extends Comparable> { .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude()); } + /** + * Multiplies this measure by a resistance and returns the resulting measure in the most + * appropriate unit. + * + * @param multiplier the measurement to multiply by. + * @return the multiplication result + */ + default Measure times(Resistance multiplier) { + return MultUnit.combine(unit(), multiplier.unit()) + .ofBaseUnits(baseUnitMagnitude() * multiplier.baseUnitMagnitude()); + } + /** * Multiplies this measure by a conversion factor, returning the converted measurement. Unlike * {@link #times(Per)}, this allows for basic unit cancellation to return measurements of a known @@ -687,6 +702,8 @@ public interface Measure extends Comparable> { return divide(velocity); } else if (divisor instanceof Voltage voltage) { return divide(voltage); + } else if (divisor instanceof Resistance resistance) { + return divide(resistance); } else { // Dimensional analysis fallthrough or a generic input measure type // Do a basic unit multiplication @@ -957,6 +974,17 @@ public interface Measure extends Comparable> { .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude()); } + /** + * Divides this measure by a resistance and returns the result in the most appropriate unit. + * + * @param divisor the measurement to divide by. + * @return the division result + */ + default Measure divide(Resistance divisor) { + return PerUnit.combine(unit(), divisor.unit()) + .ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude()); + } + /** * Divides this measure by a ratio in terms of this measurement's unit to another unit, returning * a measurement in terms of the other unit. diff --git a/wpiunits/src/main/java/edu/wpi/first/units/ResistanceUnit.java b/wpiunits/src/main/java/edu/wpi/first/units/ResistanceUnit.java new file mode 100644 index 0000000000..0fba48f38c --- /dev/null +++ b/wpiunits/src/main/java/edu/wpi/first/units/ResistanceUnit.java @@ -0,0 +1,104 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +package edu.wpi.first.units; + +import edu.wpi.first.units.measure.ImmutableResistance; +import edu.wpi.first.units.measure.MutResistance; +import edu.wpi.first.units.measure.Resistance; + +/** + * Unit of resistance dimension. + * + *

This is the base type for units of resistance dimension. It is also used to specify the + * dimension for {@link Measure}: Measure<ResistanceUnit>. + * + *

Actual units (such as {@link Units#Ohms} and {@link Units#KiloOhms}) can be found in the + * {@link Units} class. + */ +public final class ResistanceUnit extends PerUnit { + private static final CombinatoryUnitCache cache = + new CombinatoryUnitCache<>(ResistanceUnit::new); + + ResistanceUnit(VoltageUnit numerator, CurrentUnit denominator) { + super( + numerator.isBaseUnit() && denominator.isBaseUnit() + ? null + : combine(numerator.getBaseUnit(), denominator.getBaseUnit()), + numerator, + denominator); + } + + ResistanceUnit( + ResistanceUnit baseUnit, + UnaryFunction toBaseConverter, + UnaryFunction fromBaseConverter, + String name, + String symbol) { + super(baseUnit, toBaseConverter, fromBaseConverter, name, symbol); + } + + /** + * Combines an voltage and a current unit to form a unit of resistance. + * + * @param voltage the unit of voltage + * @param current the unit of current + * @return the combined unit of resistance + */ + public static ResistanceUnit combine(VoltageUnit voltage, CurrentUnit current) { + return cache.combine(voltage, current); + } + + @Override + public ResistanceUnit getBaseUnit() { + return (ResistanceUnit) super.getBaseUnit(); + } + + @Override + public Resistance of(double magnitude) { + return new ImmutableResistance(magnitude, toBaseUnits(magnitude), this); + } + + @Override + public Resistance ofBaseUnits(double baseUnitMagnitude) { + return new ImmutableResistance(fromBaseUnits(baseUnitMagnitude), baseUnitMagnitude, this); + } + + @Override + public Resistance zero() { + return (Resistance) super.zero(); + } + + @Override + public Resistance one() { + return (Resistance) super.one(); + } + + @Override + public MutResistance mutable(double initialMagnitude) { + return new MutResistance(initialMagnitude, toBaseUnits(initialMagnitude), this); + } + + /** + * Creates a ratio unit between this unit and an arbitrary other unit. + * + * @param other the other unit + * @param the type of the other unit + * @return the ratio unit + */ + public PerUnit per(U other) { + return PerUnit.combine(this, other); + } + + /** + * Converts a measurement value in terms of another power unit to this unit. + * + * @param magnitude the magnitude of the measurement in terms of the other power unit + * @param otherUnit the other power unit + * @return the value of the measurement in terms of this unit + */ + public double convertFrom(double magnitude, ResistanceUnit otherUnit) { + return fromBaseUnits(otherUnit.toBaseUnits(magnitude)); + } +} diff --git a/wpiunits/src/main/java/edu/wpi/first/units/Units.java b/wpiunits/src/main/java/edu/wpi/first/units/Units.java index cc2042c823..d75eebc303 100644 --- a/wpiunits/src/main/java/edu/wpi/first/units/Units.java +++ b/wpiunits/src/main/java/edu/wpi/first/units/Units.java @@ -412,6 +412,25 @@ public final class Units { */ public static final CurrentUnit Milliamp = Milliamps; // alias + // ResistanceUnit + /** The base unit of resistance. Equivalent to one {@link #Volt} per {@link #Amp}. */ + public static final ResistanceUnit Ohms = derive(Volts.per(Amp)).named("Ohm").symbol("Ω").make(); + + /** The base unit of resistance. Equivalent to one {@link #Volt} per {@link #Amp}. */ + public static final ResistanceUnit Ohm = Ohms; // alias + + /** A unit equal to 1,000 {@link #Ohms}. */ + public static final ResistanceUnit KiloOhms = Kilo(Ohms); + + /** A unit equal to 1,000 {@link #Ohms}. */ + public static final ResistanceUnit KiloOhm = KiloOhms; // alias + + /** A unit equal to 1/1000 of a {@link #Ohm}. */ + public static final ResistanceUnit MilliOhms = Milli(Ohms); + + /** A unit equal to 1/1000 of a {@link #Ohm}. */ + public static final ResistanceUnit MilliOhm = MilliOhms; // alias + // EnergyUnit /** The base unit of energy. */ public static final EnergyUnit Joules = BaseUnits.EnergyUnit; diff --git a/wpiunits/src/main/java/edu/wpi/first/units/VoltageUnit.java b/wpiunits/src/main/java/edu/wpi/first/units/VoltageUnit.java index 07774031b0..7506935170 100644 --- a/wpiunits/src/main/java/edu/wpi/first/units/VoltageUnit.java +++ b/wpiunits/src/main/java/edu/wpi/first/units/VoltageUnit.java @@ -81,6 +81,16 @@ public final class VoltageUnit extends Unit { return VelocityUnit.combine(this, period); } + /** + * Combines this unit of voltage with a unit of current to form a unit of resistance. + * + * @param currentUnit the unit of current + * @return the combined resistance unit + */ + public ResistanceUnit per(CurrentUnit currentUnit) { + return ResistanceUnit.combine(this, currentUnit); + } + /** * Creates a generic ratio unit of this voltage to a different unit type. *