Fix dimmable LED off-state, topic names, PWM flicker, brightness update outside kDefault, indefinite blinking, and blinking reliability (#2337)

This commit is contained in:
Alan Everett
2026-02-03 00:11:34 -05:00
committed by GitHub
parent f4b30da6b3
commit 284e818e74
4 changed files with 20 additions and 15 deletions

View File

@@ -10,7 +10,7 @@ concurrency:
cancel-in-progress: true
env:
IMAGE_VERSION: v2026.1.1
IMAGE_VERSION: v2026.1.2
jobs:

View File

@@ -3,6 +3,6 @@
"supportURL" : "https://limelightvision.io",
"ledPins" : [ 13, 18 ],
"ledsCanDim" : true,
"ledPWMFrequency" : 30000,
"ledPWMFrequency" : 1000,
"vendorFOV" : 75.76079874010732
}

View File

@@ -43,6 +43,7 @@ public class VisionLED implements AutoCloseable {
private VisionLEDMode currentLedMode = VisionLEDMode.kDefault;
private BooleanSupplier pipelineModeSupplier;
private boolean currentOutputState = false;
private float mappedBrightness = 0.0f;
@@ -85,10 +86,15 @@ public class VisionLED implements AutoCloseable {
public void setBrightness(int percentage) {
mappedBrightness =
(float) (MathUtils.map(percentage, 0.0, 100.0, brightnessMin, brightnessMax) / 100.0);
setInternal(currentLedMode, false);
if (currentOutputState) {
for (PwmLed led : dimmableVisionLEDs) {
led.setValue(mappedBrightness);
}
}
}
public void blink(int pulseLengthMillis, int blinkCount) {
TimedTaskManager.getInstance().cancelTask(blinkTaskID);
blinkImpl(pulseLengthMillis, blinkCount);
int blinkDuration = pulseLengthMillis * blinkCount * 2;
TimedTaskManager.getInstance()
@@ -96,19 +102,13 @@ public class VisionLED implements AutoCloseable {
}
private void blinkImpl(int pulseLengthMillis, int blinkCount) {
TimedTaskManager.getInstance().cancelTask(blinkTaskID);
AtomicInteger blinks = new AtomicInteger();
TimedTaskManager.getInstance()
.addTask(
blinkTaskID,
() -> {
for (LED led : visionLEDs) {
led.toggle();
}
for (PwmLed led : dimmableVisionLEDs) {
led.setValue(mappedBrightness - led.getValue());
}
if (blinks.incrementAndGet() >= blinkCount * 2) {
setStateImpl(!currentOutputState);
if (blinkCount >= 0 && blinks.incrementAndGet() >= blinkCount * 2) {
TimedTaskManager.getInstance().cancelTask(blinkTaskID);
}
},
@@ -116,12 +116,16 @@ public class VisionLED implements AutoCloseable {
}
private void setStateImpl(boolean state) {
TimedTaskManager.getInstance().cancelTask(blinkTaskID);
currentOutputState = state;
for (LED led : visionLEDs) {
led.setOn(state);
}
for (PwmLed led : dimmableVisionLEDs) {
led.setValue(mappedBrightness);
if (state) {
led.setValue(mappedBrightness);
} else {
led.off();
}
}
}
@@ -162,6 +166,7 @@ public class VisionLED implements AutoCloseable {
var lastLedMode = currentLedMode;
if (fromNT || currentLedMode == VisionLEDMode.kDefault) {
TimedTaskManager.getInstance().cancelTask(blinkTaskID);
switch (newLedMode) {
case kDefault -> setStateImpl(pipelineModeSupplier.getAsBoolean());
case kOff -> setStateImpl(false);

View File

@@ -142,8 +142,8 @@ PhotonCamera::PhotonCamera(nt::NetworkTableInstance instance,
rootTable->GetIntegerTopic("pipelineIndexRequest").Publish()),
pipelineIndexSub(
rootTable->GetIntegerTopic("pipelineIndexState").Subscribe(0)),
ledModePub(mainTable->GetIntegerTopic("ledMode").Publish()),
ledModeSub(mainTable->GetIntegerTopic("ledMode").Subscribe(0)),
ledModePub(mainTable->GetIntegerTopic("ledModeRequest").Publish()),
ledModeSub(mainTable->GetIntegerTopic("ledModeState").Subscribe(0)),
versionEntry(mainTable->GetStringTopic("version").Subscribe("")),
cameraIntrinsicsSubscriber(
rootTable->GetDoubleArrayTopic("cameraIntrinsics").Subscribe({})),