[wpiunits] Add resistance units (#7168)

This commit is contained in:
Nicholas Armstrong
2024-10-23 10:20:17 -04:00
committed by GitHub
parent a3b12b3bd9
commit ac907f755a
32 changed files with 849 additions and 5 deletions

View File

@@ -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(

View File

@@ -277,6 +277,17 @@ public interface Acceleration<D extends Unit> extends Measure<AccelerationUnit<D
}
@Override
default Mult<AccelerationUnit<D>, ResistanceUnit> times(Resistance multiplier) {
return (Mult<AccelerationUnit<D>, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<AccelerationUnit<D>, ResistanceUnit> divide(Resistance divisor) {
return (Per<AccelerationUnit<D>, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<AccelerationUnit<D>, TemperatureUnit> times(Temperature multiplier) {
return (Mult<AccelerationUnit<D>, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Angle extends Measure<AngleUnit> {
}
@Override
default Mult<AngleUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<AngleUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<AngleUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<AngleUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<AngleUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<AngleUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface AngularAcceleration extends Measure<AngularAccelerationUnit> {
}
@Override
default Mult<AngularAccelerationUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<AngularAccelerationUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<AngularAccelerationUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<AngularAccelerationUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<AngularAccelerationUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<AngularAccelerationUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface AngularMomentum extends Measure<AngularMomentumUnit> {
}
@Override
default Mult<AngularMomentumUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<AngularMomentumUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<AngularMomentumUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<AngularMomentumUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<AngularMomentumUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<AngularMomentumUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface AngularVelocity extends Measure<AngularVelocityUnit> {
}
@Override
default Mult<AngularVelocityUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<AngularVelocityUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<AngularVelocityUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<AngularVelocityUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<AngularVelocityUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<AngularVelocityUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Current extends Measure<CurrentUnit> {
}
@Override
default Voltage times(Resistance multiplier) {
return Volts.of(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
}
@Override
default Per<CurrentUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<CurrentUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<CurrentUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<CurrentUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Dimensionless extends Measure<DimensionlessUnit> {
}
@Override
default Resistance times(Resistance multiplier) {
return Ohms.of(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
}
@Override
default Per<DimensionlessUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<DimensionlessUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Temperature times(Temperature multiplier) {
return Kelvin.of(baseUnitMagnitude() * multiplier.baseUnitMagnitude());

View File

@@ -277,6 +277,17 @@ public interface Distance extends Measure<DistanceUnit> {
}
@Override
default Mult<DistanceUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<DistanceUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<DistanceUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<DistanceUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<DistanceUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<DistanceUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Energy extends Measure<EnergyUnit> {
}
@Override
default Mult<EnergyUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<EnergyUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<EnergyUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<EnergyUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<EnergyUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<EnergyUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Force extends Measure<ForceUnit> {
}
@Override
default Mult<ForceUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<ForceUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ForceUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<ForceUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ForceUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<ForceUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Frequency extends Measure<FrequencyUnit> {
}
@Override
default Mult<FrequencyUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<FrequencyUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<FrequencyUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<FrequencyUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<FrequencyUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<FrequencyUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -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);
}
}

View File

@@ -277,6 +277,17 @@ public interface LinearAcceleration extends Measure<LinearAccelerationUnit> {
}
@Override
default Mult<LinearAccelerationUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<LinearAccelerationUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<LinearAccelerationUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<LinearAccelerationUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<LinearAccelerationUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<LinearAccelerationUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface LinearMomentum extends Measure<LinearMomentumUnit> {
}
@Override
default Mult<LinearMomentumUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<LinearMomentumUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<LinearMomentumUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<LinearMomentumUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<LinearMomentumUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<LinearMomentumUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface LinearVelocity extends Measure<LinearVelocityUnit> {
}
@Override
default Mult<LinearVelocityUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<LinearVelocityUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<LinearVelocityUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<LinearVelocityUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<LinearVelocityUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<LinearVelocityUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Mass extends Measure<MassUnit> {
}
@Override
default Mult<MassUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<MassUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<MassUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<MassUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<MassUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<MassUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface MomentOfInertia extends Measure<MomentOfInertiaUnit> {
}
@Override
default Mult<MomentOfInertiaUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<MomentOfInertiaUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<MomentOfInertiaUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<MomentOfInertiaUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<MomentOfInertiaUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<MomentOfInertiaUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Mult<A extends Unit, B extends Unit> extends Measure<MultUnit<A
}
@Override
default Mult<MultUnit<A, B>, ResistanceUnit> times(Resistance multiplier) {
return (Mult<MultUnit<A, B>, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<MultUnit<A, B>, ResistanceUnit> divide(Resistance divisor) {
return (Per<MultUnit<A, B>, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<MultUnit<A, B>, TemperatureUnit> times(Temperature multiplier) {
return (Mult<MultUnit<A, B>, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -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<ResistanceUnit, Resistance, MutResistance>
implements Resistance {
public MutResistance(double magnitude, double baseUnitMagnitude, ResistanceUnit unit) {
super(magnitude, baseUnitMagnitude, unit);
}
@Override
public Resistance copy() {
return new ImmutableResistance(magnitude(), baseUnitMagnitude(), unit());
}
}

View File

@@ -277,6 +277,17 @@ public interface Per<Dividend extends Unit, Divisor extends Unit> extends Measur
}
@Override
default Mult<PerUnit<Dividend, Divisor>, ResistanceUnit> times(Resistance multiplier) {
return (Mult<PerUnit<Dividend, Divisor>, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<PerUnit<Dividend, Divisor>, ResistanceUnit> divide(Resistance divisor) {
return (Per<PerUnit<Dividend, Divisor>, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<PerUnit<Dividend, Divisor>, TemperatureUnit> times(Temperature multiplier) {
return (Mult<PerUnit<Dividend, Divisor>, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Power extends Measure<PowerUnit> {
}
@Override
default Mult<PowerUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<PowerUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<PowerUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<PowerUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<PowerUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<PowerUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -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<ResistanceUnit> {
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<? extends ResistanceUnit> other) {
return (Resistance) unit().ofBaseUnits(baseUnitMagnitude() + other.baseUnitMagnitude());
}
@Override
default Resistance minus(Measure<? extends ResistanceUnit> 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<ResistanceUnit> per(TimeUnit period) {
return divide(period.of(1));
}
@Override
default Mult<ResistanceUnit, AccelerationUnit<?>> times(Acceleration<?> multiplier) {
return (Mult<ResistanceUnit, AccelerationUnit<?>>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, AccelerationUnit<?>> divide(Acceleration<?> divisor) {
return (Per<ResistanceUnit, AccelerationUnit<?>>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, AngleUnit> times(Angle multiplier) {
return (Mult<ResistanceUnit, AngleUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, AngleUnit> divide(Angle divisor) {
return (Per<ResistanceUnit, AngleUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, AngularAccelerationUnit> times(AngularAcceleration multiplier) {
return (Mult<ResistanceUnit, AngularAccelerationUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, AngularAccelerationUnit> divide(AngularAcceleration divisor) {
return (Per<ResistanceUnit, AngularAccelerationUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, AngularMomentumUnit> times(AngularMomentum multiplier) {
return (Mult<ResistanceUnit, AngularMomentumUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, AngularMomentumUnit> divide(AngularMomentum divisor) {
return (Per<ResistanceUnit, AngularMomentumUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, AngularVelocityUnit> times(AngularVelocity multiplier) {
return (Mult<ResistanceUnit, AngularVelocityUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, AngularVelocityUnit> divide(AngularVelocity divisor) {
return (Per<ResistanceUnit, AngularVelocityUnit>) Measure.super.divide(divisor);
}
@Override
default Voltage times(Current multiplier) {
return Volts.of(baseUnitMagnitude() * multiplier.baseUnitMagnitude());
}
@Override
default Per<ResistanceUnit, CurrentUnit> divide(Current divisor) {
return (Per<ResistanceUnit, CurrentUnit>) 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<ResistanceUnit, DistanceUnit> times(Distance multiplier) {
return (Mult<ResistanceUnit, DistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, DistanceUnit> divide(Distance divisor) {
return (Per<ResistanceUnit, DistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, EnergyUnit> times(Energy multiplier) {
return (Mult<ResistanceUnit, EnergyUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, EnergyUnit> divide(Energy divisor) {
return (Per<ResistanceUnit, EnergyUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, ForceUnit> times(Force multiplier) {
return (Mult<ResistanceUnit, ForceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, ForceUnit> divide(Force divisor) {
return (Per<ResistanceUnit, ForceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, FrequencyUnit> times(Frequency multiplier) {
return (Mult<ResistanceUnit, FrequencyUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, FrequencyUnit> divide(Frequency divisor) {
return (Per<ResistanceUnit, FrequencyUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, LinearAccelerationUnit> times(LinearAcceleration multiplier) {
return (Mult<ResistanceUnit, LinearAccelerationUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, LinearAccelerationUnit> divide(LinearAcceleration divisor) {
return (Per<ResistanceUnit, LinearAccelerationUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, LinearMomentumUnit> times(LinearMomentum multiplier) {
return (Mult<ResistanceUnit, LinearMomentumUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, LinearMomentumUnit> divide(LinearMomentum divisor) {
return (Per<ResistanceUnit, LinearMomentumUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, LinearVelocityUnit> times(LinearVelocity multiplier) {
return (Mult<ResistanceUnit, LinearVelocityUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, LinearVelocityUnit> divide(LinearVelocity divisor) {
return (Per<ResistanceUnit, LinearVelocityUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, MassUnit> times(Mass multiplier) {
return (Mult<ResistanceUnit, MassUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, MassUnit> divide(Mass divisor) {
return (Per<ResistanceUnit, MassUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, MomentOfInertiaUnit> times(MomentOfInertia multiplier) {
return (Mult<ResistanceUnit, MomentOfInertiaUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, MomentOfInertiaUnit> divide(MomentOfInertia divisor) {
return (Per<ResistanceUnit, MomentOfInertiaUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, MultUnit<?, ?>> times(Mult<?, ?> multiplier) {
return (Mult<ResistanceUnit, MultUnit<?, ?>>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, MultUnit<?, ?>> divide(Mult<?, ?> divisor) {
return (Per<ResistanceUnit, MultUnit<?, ?>>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, PerUnit<?, ?>> times(Per<?, ?> multiplier) {
return (Mult<ResistanceUnit, PerUnit<?, ?>>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, PerUnit<?, ?>> divide(Per<?, ?> divisor) {
return (Per<ResistanceUnit, PerUnit<?, ?>>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, PowerUnit> times(Power multiplier) {
return (Mult<ResistanceUnit, PowerUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, PowerUnit> divide(Power divisor) {
return (Per<ResistanceUnit, PowerUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<ResistanceUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Dimensionless divide(Resistance divisor) {
return Value.of(baseUnitMagnitude() / divisor.baseUnitMagnitude());
}
@Override
default Mult<ResistanceUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<ResistanceUnit, TemperatureUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, TemperatureUnit> divide(Temperature divisor) {
return (Per<ResistanceUnit, TemperatureUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, TimeUnit> times(Time multiplier) {
return (Mult<ResistanceUnit, TimeUnit>) Measure.super.times(multiplier);
}
@Override
default Velocity<ResistanceUnit> divide(Time divisor) {
return VelocityUnit.combine(unit(), divisor.unit()).ofBaseUnits(baseUnitMagnitude() / divisor.baseUnitMagnitude());
}
@Override
default Mult<ResistanceUnit, TorqueUnit> times(Torque multiplier) {
return (Mult<ResistanceUnit, TorqueUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, TorqueUnit> divide(Torque divisor) {
return (Per<ResistanceUnit, TorqueUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, VelocityUnit<?>> times(Velocity<?> multiplier) {
return (Mult<ResistanceUnit, VelocityUnit<?>>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, VelocityUnit<?>> divide(Velocity<?> divisor) {
return (Per<ResistanceUnit, VelocityUnit<?>>) Measure.super.divide(divisor);
}
@Override
default Mult<ResistanceUnit, VoltageUnit> times(Voltage multiplier) {
return (Mult<ResistanceUnit, VoltageUnit>) Measure.super.times(multiplier);
}
@Override
default Per<ResistanceUnit, VoltageUnit> divide(Voltage divisor) {
return (Per<ResistanceUnit, VoltageUnit>) Measure.super.divide(divisor);
}
}

View File

@@ -277,6 +277,17 @@ public interface Temperature extends Measure<TemperatureUnit> {
}
@Override
default Mult<TemperatureUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<TemperatureUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<TemperatureUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<TemperatureUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<TemperatureUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<TemperatureUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Time extends Measure<TimeUnit> {
}
@Override
default Mult<TimeUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<TimeUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<TimeUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<TimeUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<TimeUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<TimeUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Torque extends Measure<TorqueUnit> {
}
@Override
default Mult<TorqueUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<TorqueUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<TorqueUnit, ResistanceUnit> divide(Resistance divisor) {
return (Per<TorqueUnit, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<TorqueUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<TorqueUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -277,6 +277,17 @@ public interface Velocity<D extends Unit> extends Measure<VelocityUnit<D>> {
}
@Override
default Mult<VelocityUnit<D>, ResistanceUnit> times(Resistance multiplier) {
return (Mult<VelocityUnit<D>, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Per<VelocityUnit<D>, ResistanceUnit> divide(Resistance divisor) {
return (Per<VelocityUnit<D>, ResistanceUnit>) Measure.super.divide(divisor);
}
@Override
default Mult<VelocityUnit<D>, TemperatureUnit> times(Temperature multiplier) {
return (Mult<VelocityUnit<D>, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -130,8 +130,8 @@ public interface Voltage extends Measure<VoltageUnit> {
}
@Override
default Per<VoltageUnit, CurrentUnit> divide(Current divisor) {
return (Per<VoltageUnit, CurrentUnit>) 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<VoltageUnit> {
}
@Override
default Mult<VoltageUnit, ResistanceUnit> times(Resistance multiplier) {
return (Mult<VoltageUnit, ResistanceUnit>) Measure.super.times(multiplier);
}
@Override
default Current divide(Resistance divisor) {
return Amps.of(baseUnitMagnitude() / divisor.baseUnitMagnitude());
}
@Override
default Mult<VoltageUnit, TemperatureUnit> times(Temperature multiplier) {
return (Mult<VoltageUnit, TemperatureUnit>) Measure.super.times(multiplier);

View File

@@ -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<U extends Unit> extends Comparable<Measure<U>> {
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<U extends Unit> extends Comparable<Measure<U>> {
.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<U extends Unit> extends Comparable<Measure<U>> {
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<U extends Unit> extends Comparable<Measure<U>> {
.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.

View File

@@ -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.
*
* <p>This is the base type for units of resistance dimension. It is also used to specify the
* dimension for {@link Measure}: <code>Measure&lt;ResistanceUnit&gt;</code>.
*
* <p>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<VoltageUnit, CurrentUnit> {
private static final CombinatoryUnitCache<VoltageUnit, CurrentUnit, ResistanceUnit> 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 <U> the type of the other unit
* @return the ratio unit
*/
public <U extends Unit> PerUnit<ResistanceUnit, U> 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));
}
}

View File

@@ -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;

View File

@@ -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.
*