diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 96c0a2ad3..3acc279ae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true env: - IMAGE_VERSION: v2026.1.1 + IMAGE_VERSION: v2026.1.2 jobs: diff --git a/docs/source/docs/advanced-installation/sw_install/files/Limelight2+/hardwareConfig.json b/docs/source/docs/advanced-installation/sw_install/files/Limelight2+/hardwareConfig.json index 86dbc3b85..64aa195ad 100644 --- a/docs/source/docs/advanced-installation/sw_install/files/Limelight2+/hardwareConfig.json +++ b/docs/source/docs/advanced-installation/sw_install/files/Limelight2+/hardwareConfig.json @@ -3,6 +3,6 @@ "supportURL" : "https://limelightvision.io", "ledPins" : [ 13, 18 ], "ledsCanDim" : true, - "ledPWMFrequency" : 30000, + "ledPWMFrequency" : 1000, "vendorFOV" : 75.76079874010732 } diff --git a/photon-core/src/main/java/org/photonvision/common/hardware/VisionLED.java b/photon-core/src/main/java/org/photonvision/common/hardware/VisionLED.java index 776f3b7a9..bc4b3b6c1 100644 --- a/photon-core/src/main/java/org/photonvision/common/hardware/VisionLED.java +++ b/photon-core/src/main/java/org/photonvision/common/hardware/VisionLED.java @@ -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); diff --git a/photon-lib/src/main/native/cpp/photon/PhotonCamera.cpp b/photon-lib/src/main/native/cpp/photon/PhotonCamera.cpp index 8d963244b..adf87b8ee 100644 --- a/photon-lib/src/main/native/cpp/photon/PhotonCamera.cpp +++ b/photon-lib/src/main/native/cpp/photon/PhotonCamera.cpp @@ -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({})),