From 63745cf676f00b3e1908c65b9557ed3705a8c4cf Mon Sep 17 00:00:00 2001 From: s0hum Date: Tue, 12 May 2026 19:10:53 -0700 Subject: [PATCH 1/3] added setPosition function to NextServo class and created RGBHeadlight class extending NextServo (documentation for RGBHeadlight might be cooked) --- .../dev/nextftc/hardware/servos/NextServo.kt | 6 +- .../nextftc/hardware/servos/RGBHeadlight.kt | 77 +++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt diff --git a/hardware/src/main/kotlin/dev/nextftc/hardware/servos/NextServo.kt b/hardware/src/main/kotlin/dev/nextftc/hardware/servos/NextServo.kt index 5622ce9..4416047 100644 --- a/hardware/src/main/kotlin/dev/nextftc/hardware/servos/NextServo.kt +++ b/hardware/src/main/kotlin/dev/nextftc/hardware/servos/NextServo.kt @@ -29,7 +29,7 @@ import dev.nextftc.hardware.RobotController * @param cacheTolerance Tolerance used by the [Caching] delegate for * position updates; defaults to 0.01. */ -class NextServo(initializer: () -> ServoImplEx, val cacheTolerance: Double = 0.01) { +open class NextServo(initializer: () -> ServoImplEx, val cacheTolerance: Double = 0.01) { @JvmOverloads constructor(name: String, cacheTolerance: Double = 0.01) : this( { RobotController.hardwareMap[name] as ServoImplEx }, cacheTolerance, @@ -71,6 +71,10 @@ class NextServo(initializer: () -> ServoImplEx, val cacheTolerance: Double = 0.0 pwmRange = PwmControl.PwmRange(lower, upper) } + fun setPosition(position: Double) { + servo.position = position + } + fun enable() { servo.setPwmEnable() } diff --git a/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt b/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt new file mode 100644 index 0000000..eb4256e --- /dev/null +++ b/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2026 NextFTC Team + * + * Use of this source code is governed by an BSD-3-clause + * license that can be found in the LICENSE.md file at the root of this repository or at + * https://opensource.org/license/bsd-3-clause. + */ + +package dev.nextftc.hardware.servos + +/** + * Wrapper for the goBILDA PWM RGB Headlight Module. + * + * The module behaves like a servo, + * different PWM positions correspond to different colors/patterns. + * + * Example: + * val headlight = RGBHeadlight("headlights") + * + * headlight.setColor(Color.RED) + * + * headlight.setBrightness(0.8) + * + * @param initializer A function returning the backing [NextServo]. + * @param cacheTolerance Tolerance used by the [Caching] delegate for + * position updates; defaults to 0.01. + */ +class RGBHeadlight(name: String, cacheTolerance: Double = 0.01) : NextServo(name, cacheTolerance) { + + /** + * Available colors/patterns for the headlights + * + * Values are servo positions. + */ + enum class Color(val position: Double) { + OFF(0.0), + + RED(0.279), + ORANGE(0.333), + YELLOW(0.388), + GREEN(0.500), + BLUE(0.611), + VIOLET(0.722), + WHITE(1.0), + RAINBOW(0.833) + } + + //Sets the headlight color/pattern. + fun setColor(color: Color) { + setPosition(color.position) + } + + fun setColor(pwm : Double) { + setPosition(pwm) + } + + //turns headlights off + fun off() { + setColor(Color.OFF) + } + + /** + * Sets brightness by scaling the PWM range. + * + * brightness: + * 0.0 = dimmest + * 1.0 = brightest + */ + fun setBrightness(brightness: Double) { + val clipped = brightness.coerceIn(0.0, 1.0) + + val lower = 500.0 + val upper = 2500.0 * clipped + + setPwmRange(lower, upper) + } +} \ No newline at end of file From 57de97caa0c18ddddaf05d2bed2c3b7ca0ccae69 Mon Sep 17 00:00:00 2001 From: s0hum Date: Wed, 13 May 2026 18:35:07 -0700 Subject: [PATCH 2/3] added all the gobilda preset values for RGB, made setColor function round values to the nearest hundredth --- .../kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt b/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt index eb4256e..494c24a 100644 --- a/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt +++ b/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt @@ -8,6 +8,8 @@ package dev.nextftc.hardware.servos +import kotlin.math.round + /** * Wrapper for the goBILDA PWM RGB Headlight Module. * @@ -38,20 +40,22 @@ class RGBHeadlight(name: String, cacheTolerance: Double = 0.01) : NextServo(name RED(0.279), ORANGE(0.333), YELLOW(0.388), + SAGE(0.444), GREEN(0.500), + AZURE(0.555), BLUE(0.611), + INDIGO(0.666), VIOLET(0.722), WHITE(1.0), - RAINBOW(0.833) } //Sets the headlight color/pattern. fun setColor(color: Color) { - setPosition(color.position) + setPosition(round(color.position * 100) / 100) } fun setColor(pwm : Double) { - setPosition(pwm) + setPosition(round(pwm * 100) / 100) } //turns headlights off From 9cd37435b919e1b0b06482a1ad458003ae79c440 Mon Sep 17 00:00:00 2001 From: Zach Harel Date: Thu, 21 May 2026 12:38:56 -0400 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Zach Harel --- .../main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt b/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt index 494c24a..3f50050 100644 --- a/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt +++ b/hardware/src/main/kotlin/dev/nextftc/hardware/servos/RGBHeadlight.kt @@ -51,11 +51,11 @@ class RGBHeadlight(name: String, cacheTolerance: Double = 0.01) : NextServo(name //Sets the headlight color/pattern. fun setColor(color: Color) { - setPosition(round(color.position * 100) / 100) + position = round(color.position * 100) / 100 } fun setColor(pwm : Double) { - setPosition(round(pwm * 100) / 100) + position = round(pwm * 100) / 100 } //turns headlights off