Don't interact with Libcamera cameras until connected (#2447)

This commit is contained in:
Alan Everett
2026-05-04 07:24:05 -04:00
committed by GitHub
parent 94acd9d631
commit adfa39b6f4
4 changed files with 23 additions and 24 deletions

View File

@@ -35,9 +35,19 @@ public abstract class FrameProvider implements Supplier<Frame>, Releasable {
cameraPropertiesCached = true; cameraPropertiesCached = true;
} }
public abstract boolean isConnected(); /** Internal provider for if the camera is currently connected. */
protected abstract boolean checkCameraConnected();
public abstract boolean checkCameraConnected(); /** Checks if the camera is currently connected. Also handles connection events. */
public boolean isConnected() {
boolean connected = this.checkCameraConnected();
if (!cameraPropertiesCached && connected) {
onCameraConnected();
}
return connected;
}
/** /**
* Returns if the camera has connected at some point. This is not if it is currently connected. * Returns if the camera has connected at some point. This is not if it is currently connected.

View File

@@ -37,11 +37,6 @@ public class LibcameraGpuFrameProvider extends FrameProvider {
public LibcameraGpuFrameProvider(LibcameraGpuSettables visionSettables) { public LibcameraGpuFrameProvider(LibcameraGpuSettables visionSettables) {
this.settables = visionSettables; this.settables = visionSettables;
var vidMode = settables.getCurrentVideoMode();
settables.setVideoMode(vidMode);
this.cameraPropertiesCached =
true; // Camera properties are not able to be changed so they are always cached
} }
@Override @Override
@@ -160,9 +155,13 @@ public class LibcameraGpuFrameProvider extends FrameProvider {
return false; return false;
} }
// To our knowledge the camera is always connected (after boot) with csi cameras
@Override @Override
public boolean isConnected() { protected void onCameraConnected() {
return checkCameraConnected(); logger.info("Camera connected! running callback");
super.onCameraConnected();
var vidMode = settables.getCurrentVideoMode();
settables.setVideoMode(vidMode);
} }
} }

View File

@@ -57,18 +57,6 @@ public class USBFrameProvider extends CpuImageProcessor {
this.connectedCallback = connectedCallback; this.connectedCallback = connectedCallback;
} }
@Override
public boolean checkCameraConnected() {
boolean connected = camera.isConnected();
if (!cameraPropertiesCached && connected) {
logger.info("Camera connected! running callback");
onCameraConnected();
}
return connected;
}
final double CSCORE_DEFAULT_FRAME_TIMEOUT = 1.0 / 4.0; final double CSCORE_DEFAULT_FRAME_TIMEOUT = 1.0 / 4.0;
@Override @Override
@@ -145,13 +133,15 @@ public class USBFrameProvider extends CpuImageProcessor {
@Override @Override
public void onCameraConnected() { public void onCameraConnected() {
logger.info("Camera connected! running callback");
super.onCameraConnected(); super.onCameraConnected();
this.connectedCallback.run(); this.connectedCallback.run();
} }
@Override @Override
public boolean isConnected() { public boolean checkCameraConnected() {
return camera.isConnected(); return camera.isConnected();
} }

View File

@@ -132,7 +132,7 @@ public class VisionRunner {
private void update() { private void update() {
// wait for the camera to connect // wait for the camera to connect
while (!frameSupplier.checkCameraConnected() && !Thread.interrupted()) { while (!frameSupplier.isConnected() && !Thread.interrupted()) {
// yield // yield
pipelineResultConsumer.accept(new CVPipelineResult(0l, 0, 0, null, new Frame())); pipelineResultConsumer.accept(new CVPipelineResult(0l, 0, 0, null, new Frame()));
try { try {