Skip to content

Commit e05dd90

Browse files
committed
2 parents ae8294e + 9639dee commit e05dd90

51 files changed

Lines changed: 1286 additions & 1065 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

build.gradle

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2+
13
plugins {
24
id "idea"
35
id 'maven-publish'
4-
id "org.jetbrains.kotlin.jvm" version "1.6.0"
5-
id "edu.wpi.first.GradleRIO" version "2025.3.2"
6-
id "com.diffplug.spotless" version "6.3.0"
6+
id "org.jetbrains.kotlin.jvm" version "2.3.0"
7+
id "edu.wpi.first.GradleRIO" version "2026.2.1"
8+
id "com.diffplug.spotless" version "6.25.0"
79
id "com.peterabeles.gversion" version "1.10"
8-
id "org.jetbrains.kotlinx.kover" version "0.4.2"
10+
id "org.jetbrains.kotlinx.kover" version "0.8.3"
911
}
1012

1113
sourceCompatibility = JavaVersion.VERSION_17
@@ -20,7 +22,6 @@ java {
2022
// do not change main class (does not run without it being Main
2123
repositories {
2224
mavenCentral()
23-
jcenter()
2425
maven { url "https://jitpack.io" }
2526
}
2627
// Defining my dependencies. In this case, WPILib (+ friends)
@@ -48,6 +49,7 @@ dependencies {
4849

4950
test {
5051
useJUnitPlatform()
52+
systemProperty 'junit.jupiter.extensions.autodetection.enabled', 'true'
5153
}
5254

5355
publishing {
@@ -84,12 +86,17 @@ spotless {
8486
exclude "**/BuildConstants.kt", "**/build/**"
8587
}
8688
ktfmt()
87-
ktlint().userData(['max_line_length': '120', 'insert_final_newline': 'true', 'indent_size': '2', 'continuation_indent_size': '2'])
8889
}
8990
}
9091

9192
wrapper {
92-
gradleVersion = '7.3.3'
93+
gradleVersion = '8.6.0'
94+
}
95+
96+
jar {
97+
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
98+
from sourceSets.main.allSource
99+
duplicatesStrategy = DuplicatesStrategy.INCLUDE
93100
}
94101

95102
wpi.java.configureExecutableTasks(jar)
@@ -100,9 +107,8 @@ tasks.withType(JavaCompile) {
100107
}
101108

102109
compileKotlin {
103-
kotlinOptions {
104-
freeCompilerArgs = ["-XXLanguage:+InlineClasses"]
105-
jvmTarget="17"
110+
compilerOptions {
111+
jvmTarget.set(JvmTarget.JVM_17)
106112
}
107113
}
108114

src/main/kotlin/org/team4099/lib/Extensions.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package org.team4099.lib
22

3-
import org.team4099.lib.units.UnitKey
4-
import org.team4099.lib.units.Value
53
import kotlin.math.abs
64
import kotlin.math.max
75
import kotlin.math.min
6+
import org.team4099.lib.units.UnitKey
7+
import org.team4099.lib.units.Value
88

99
/**
1010
* Determines if another value is near this Double.
@@ -22,7 +22,7 @@ inline fun Double.around(around: Double, tolerance: Double): Boolean {
2222
*
2323
* @param deadband The range in which the value will be forced to zero.
2424
* @return This value adjusted to smoothly increase from zero if outside the deadband, zero if
25-
* inside the deadband.
25+
* inside the deadband.
2626
*/
2727
inline fun Double.smoothDeadband(deadband: Double): Double {
2828
return if (abs(this) < deadband) {
@@ -60,7 +60,7 @@ inline fun Int.limit(lowerBound: Int, upperBound: Int): Int {
6060
* @param a The first value to interpolate between.
6161
* @param b The second value to interpolate between.
6262
* @param x The scalar that determines where the returned value falls between [a] and [b]. Limited
63-
* to between 0 and 1 inclusive.
63+
* to between 0 and 1 inclusive.
6464
* @return A value between [a] and [b] determined by [x].
6565
*/
6666
inline fun interpolate(a: Double, b: Double, x: Double): Double {
@@ -73,7 +73,7 @@ inline fun interpolate(a: Double, b: Double, x: Double): Double {
7373
* @param a The first value to interpolate between.
7474
* @param b The second value to interpolate between.
7575
* @param x The scalar that determines where the returned value falls between [a] and [b]. Limited
76-
* to between 0 and 1 inclusive.
76+
* to between 0 and 1 inclusive.
7777
* @return A value between [a] and [b] determined by [x].
7878
*/
7979
inline fun <T : UnitKey> interpolate(a: Value<T>, b: Value<T>, x: Double): Value<T> {

src/main/kotlin/org/team4099/lib/apriltag/AprilTag.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.team4099.lib.apriltag
22

3-
import org.team4099.lib.geometry.Pose3d
43
import edu.wpi.first.apriltag.AprilTag as AprilTagWPI
4+
import org.team4099.lib.geometry.Pose3d
55

66
class AprilTag(val id: Int, val pose: Pose3d) {
77
constructor(apriltagWpilib: AprilTagWPI) : this(apriltagWpilib.ID, Pose3d(apriltagWpilib.pose)) {}

src/main/kotlin/org/team4099/lib/apriltag/AprilTagFieldLayout.kt

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@ import org.team4099.lib.units.base.meters
1010
import org.team4099.lib.units.derived.radians
1111

1212
class AprilTagFieldLayout(
13-
val aprilTags: List<AprilTag>,
14-
val fieldLength: Length,
15-
val fieldWidth: Length
13+
val aprilTags: List<AprilTag>,
14+
val fieldLength: Length,
15+
val fieldWidth: Length,
1616
) {
1717

1818
init {
1919
setOrigin(OriginPosition.kBlueAllianceWallRightSide)
2020
}
2121

2222
val apriltagFieldLayoutWPILIB =
23-
AprilTagFieldLayout(
24-
aprilTags.map { it.apriltagWpilib }, fieldLength.inMeters, fieldWidth.inMeters
25-
)
23+
AprilTagFieldLayout(
24+
aprilTags.map { it.apriltagWpilib },
25+
fieldLength.inMeters,
26+
fieldWidth.inMeters,
27+
)
2628

2729
var origin = Pose3d()
2830

@@ -35,20 +37,20 @@ class AprilTagFieldLayout(
3537

3638
fun setOrigin(newOrigin: OriginPosition) {
3739
origin =
38-
when (newOrigin) {
39-
OriginPosition.kBlueAllianceWallRightSide -> Pose3d()
40-
OriginPosition.kRedAllianceWallRightSide ->
41-
Pose3d(
42-
Translation3d(fieldLength, fieldWidth, 0.meters),
43-
Rotation3d(0.radians, 0.radians, Math.PI.radians)
44-
)
45-
}
40+
when (newOrigin) {
41+
OriginPosition.kBlueAllianceWallRightSide -> Pose3d()
42+
OriginPosition.kRedAllianceWallRightSide ->
43+
Pose3d(
44+
Translation3d(fieldLength, fieldWidth, 0.meters),
45+
Rotation3d(0.radians, 0.radians, Math.PI.radians),
46+
)
47+
}
4648
}
4749

4850
data class FieldDimensions(val fieldWidth: Length, val fieldLength: Length)
4951

5052
enum class OriginPosition {
5153
kBlueAllianceWallRightSide,
52-
kRedAllianceWallRightSide
54+
kRedAllianceWallRightSide,
5355
}
5456
}
Lines changed: 73 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.team4099.lib.controller
22

3+
import edu.wpi.first.math.controller.ArmFeedforward as WPIArmFeedforward
34
import org.team4099.lib.units.AngularAcceleration
45
import org.team4099.lib.units.AngularVelocity
56
import org.team4099.lib.units.derived.AccelerationFeedforward
@@ -20,97 +21,109 @@ import org.team4099.lib.units.derived.volts
2021
import org.team4099.lib.units.inRadiansPerSecond
2122
import org.team4099.lib.units.inRadiansPerSecondPerSecond
2223
import org.team4099.lib.units.perSecond
23-
import edu.wpi.first.math.controller.ArmFeedforward as WPIArmFeedforward
2424

2525
class ArmFeedforward(
26-
kS: StaticFeedforward<Volt>,
27-
kG: AngularGravityFeedforward,
28-
kV: VelocityFeedforward<Radian, Volt>,
29-
kA: AccelerationFeedforward<Radian, Volt>
26+
kS: StaticFeedforward<Volt>,
27+
kG: AngularGravityFeedforward,
28+
kV: VelocityFeedforward<Radian, Volt>,
29+
kA: AccelerationFeedforward<Radian, Volt>,
3030
) {
3131
private val feedforward =
32-
WPIArmFeedforward(
33-
kS.inVolts,
34-
kG.inVolts,
35-
kV.inVoltsPerRadianPerSecond,
36-
kA.inVoltsPerRadianPerSecondPerSecond
37-
)
32+
WPIArmFeedforward(
33+
kS.inVolts,
34+
kG.inVolts,
35+
kV.inVoltsPerRadianPerSecond,
36+
kA.inVoltsPerRadianPerSecondPerSecond,
37+
)
3838

3939
constructor(
40-
kS: StaticFeedforward<Volt>,
41-
kG: AngularGravityFeedforward,
42-
kV: VelocityFeedforward<Radian, Volt>
40+
kS: StaticFeedforward<Volt>,
41+
kG: AngularGravityFeedforward,
42+
kV: VelocityFeedforward<Radian, Volt>,
4343
) : this(kS, kG, kV, 0.volts.perRadianPerSecondPerSecond)
4444

4545
@Deprecated(
46-
message =
47-
"Marked for removal since 2025. Use calculute(position: Angle, velocity: AngularVelocity) instead.",
48-
level = DeprecationLevel.ERROR
46+
message =
47+
"Marked for removal since 2025. Use calculute(position: Angle, velocity: AngularVelocity) instead.",
48+
level = DeprecationLevel.ERROR,
4949
)
5050
fun calculate(
51-
position: Angle,
52-
velocity: AngularVelocity,
53-
acceleration: AngularAcceleration
51+
position: Angle,
52+
velocity: AngularVelocity,
53+
acceleration: AngularAcceleration
5454
): ElectricalPotential {
55-
return feedforward.calculate(
56-
position.inRadians,
57-
velocity.inRadiansPerSecond,
58-
acceleration.inRadiansPerSecondPerSecond
59-
)
60-
.volts
55+
return feedforward
56+
.calculate(
57+
position.inRadians,
58+
velocity.inRadiansPerSecond,
59+
acceleration.inRadiansPerSecondPerSecond,
60+
)
61+
.volts
6162
}
6263

6364
fun calculate(position: Angle, velocity: AngularVelocity): ElectricalPotential {
6465
return feedforward.calculate(position.inRadians, velocity.inRadiansPerSecond).volts
6566
}
6667

6768
fun maxAchievableVelocity(
68-
maxVoltage: ElectricalPotential,
69-
angle: Angle,
70-
acceleration: AngularAcceleration
69+
maxVoltage: ElectricalPotential,
70+
angle: Angle,
71+
acceleration: AngularAcceleration,
7172
): AngularVelocity {
72-
return feedforward.maxAchievableVelocity(
73-
maxVoltage.inVolts, angle.inRadians, acceleration.inRadiansPerSecondPerSecond
74-
)
75-
.radians
76-
.perSecond
73+
return feedforward
74+
.maxAchievableVelocity(
75+
maxVoltage.inVolts,
76+
angle.inRadians,
77+
acceleration.inRadiansPerSecondPerSecond,
78+
)
79+
.radians
80+
.perSecond
7781
}
7882

7983
fun minAchievableVelocity(
80-
maxVoltage: ElectricalPotential,
81-
angle: Angle,
82-
acceleration: AngularAcceleration
84+
maxVoltage: ElectricalPotential,
85+
angle: Angle,
86+
acceleration: AngularAcceleration,
8387
): AngularVelocity {
84-
return feedforward.minAchievableVelocity(
85-
maxVoltage.inVolts, angle.inRadians, acceleration.inRadiansPerSecondPerSecond
86-
)
87-
.radians
88-
.perSecond
88+
return feedforward
89+
.minAchievableVelocity(
90+
maxVoltage.inVolts,
91+
angle.inRadians,
92+
acceleration.inRadiansPerSecondPerSecond,
93+
)
94+
.radians
95+
.perSecond
8996
}
9097

9198
fun maxAchievableAcceleration(
92-
maxVoltage: ElectricalPotential,
93-
angle: Angle,
94-
velocity: AngularVelocity
99+
maxVoltage: ElectricalPotential,
100+
angle: Angle,
101+
velocity: AngularVelocity,
95102
): AngularAcceleration {
96-
return feedforward.maxAchievableVelocity(
97-
maxVoltage.inVolts, angle.inRadians, velocity.inRadiansPerSecond
98-
)
99-
.radians
100-
.perSecond
101-
.perSecond
103+
return feedforward
104+
.maxAchievableVelocity(
105+
maxVoltage.inVolts,
106+
angle.inRadians,
107+
velocity.inRadiansPerSecond,
108+
)
109+
.radians
110+
.perSecond
111+
.perSecond
102112
}
103113

104114
fun minAchievableAcceleration(
105-
maxVoltage: ElectricalPotential,
106-
angle: Angle,
107-
velocity: AngularVelocity
115+
maxVoltage: ElectricalPotential,
116+
angle: Angle,
117+
velocity: AngularVelocity,
108118
): AngularAcceleration {
109-
return feedforward.minAchievableAcceleration(
110-
maxVoltage.inVolts, angle.inRadians, velocity.inRadiansPerSecond
111-
)
112-
.radians
113-
.perSecond
114-
.perSecond
119+
return feedforward
120+
.minAchievableAcceleration(
121+
maxVoltage.inVolts,
122+
angle.inRadians,
123+
velocity.inRadiansPerSecond,
124+
)
125+
.radians
126+
.perSecond
127+
.perSecond
115128
}
116129
}

0 commit comments

Comments
 (0)