From a97ee3b4b34a11f2766f31ac4444ab7cb6ae00ed Mon Sep 17 00:00:00 2001 From: realSaddy Date: Sat, 21 Jan 2023 18:27:19 -0600 Subject: [PATCH 1/3] Start of integrating autofocus --- .../src/main/java/org/photonvision/raspi/LibCameraJNI.java | 3 +++ .../org/photonvision/vision/pipeline/CVPipelineSettings.java | 1 + .../photonvision/vision/processes/VisionSourceSettables.java | 2 ++ .../photonvision/vision/processes/VisionModuleManagerTest.java | 3 +++ 4 files changed, 9 insertions(+) diff --git a/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNI.java b/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNI.java index 4ebc2c8735..9045f98618 100644 --- a/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNI.java +++ b/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNI.java @@ -140,6 +140,9 @@ public static native boolean setThresholds( // Exposure time, in microseconds public static native boolean setExposure(int exposureUs); + + // Set whether or not to use autofocus + public static native boolean setAutoFocus(boolean doAutoFocus); // Set brighness on [-1, 1] public static native boolean setBrightness(double brightness); diff --git a/photon-core/src/main/java/org/photonvision/vision/pipeline/CVPipelineSettings.java b/photon-core/src/main/java/org/photonvision/vision/pipeline/CVPipelineSettings.java index 077b4254a1..dcb76ba443 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipeline/CVPipelineSettings.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipeline/CVPipelineSettings.java @@ -42,6 +42,7 @@ public class CVPipelineSettings implements Cloneable { public boolean cameraAutoExposure = false; // manual exposure only used if cameraAutoExposure if false public double cameraExposure = 20; + public boolean cameraAutoFocus = false; public int cameraBrightness = 50; // Currently only used by a few cameras (notably the zero-copy Pi Camera driver) with the Gain // quirk diff --git a/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceSettables.java b/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceSettables.java index bbabf6ba96..4f60ba60c8 100644 --- a/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceSettables.java +++ b/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceSettables.java @@ -45,6 +45,8 @@ public CameraConfiguration getConfiguration() { public abstract void setExposure(double exposure); public abstract void setAutoExposure(boolean cameraAutoExposure); + + public abstract void setAutoFocus(boolean cameraAutoFocus); public abstract void setBrightness(int brightness); diff --git a/photon-core/src/test/java/org/photonvision/vision/processes/VisionModuleManagerTest.java b/photon-core/src/test/java/org/photonvision/vision/processes/VisionModuleManagerTest.java index b6cdc59851..d7a529a4ef 100644 --- a/photon-core/src/test/java/org/photonvision/vision/processes/VisionModuleManagerTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/processes/VisionModuleManagerTest.java @@ -97,6 +97,9 @@ public HashMap getAllVideoModes() { @Override public void setAutoExposure(boolean cameraAutoExposure) {} + + @Override + public void setAutoFocus(boolean cameraAutoFocus) {} } private static class TestDataConsumer implements CVPipelineResultConsumer { From 8c70a72aa1cd42021c14145084f388acdff70680 Mon Sep 17 00:00:00 2001 From: realSaddy Date: Mon, 23 Jan 2023 17:25:03 -0600 Subject: [PATCH 2/3] Autofocus status and autofocus init --- photon-client/src/views/CamerasView.vue | 21 +++++++++++++ .../org/photonvision/raspi/LibCameraJNI.java | 5 ++- .../vision/camera/LibcameraGpuSettables.java | 10 ++++++ .../vision/processes/VisionModule.java | 8 +++++ .../processes/VisionSourceSettables.java | 6 ++-- photon-server/lib/libphotonlibcamera.so | Bin 145784 -> 141664 bytes .../photonvision/server/RequestHandler.java | 29 ++++++++++++++++++ .../java/org/photonvision/server/Server.java | 2 ++ 8 files changed, 78 insertions(+), 3 deletions(-) diff --git a/photon-client/src/views/CamerasView.vue b/photon-client/src/views/CamerasView.vue index 4ade293daa..ca7c2ea907 100644 --- a/photon-client/src/views/CamerasView.vue +++ b/photon-client/src/views/CamerasView.vue @@ -299,6 +299,19 @@ Download Target + + + + mdi-camera-iris + + Focus Camera + + { + if (response.status != 200 || response + } + ) + }, sendCameraSettings() { this.axios.post("http://" + this.$address + "/api/settings/camera", { "settings": this.cameraSettings, diff --git a/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNI.java b/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNI.java index 9045f98618..256fa8376c 100644 --- a/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNI.java +++ b/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNI.java @@ -141,8 +141,11 @@ public static native boolean setThresholds( // Exposure time, in microseconds public static native boolean setExposure(int exposureUs); + // Return int of autofocus status from libcamera AfState + public static native int getAutofocusStatus(); + // Set whether or not to use autofocus - public static native boolean setAutoFocus(boolean doAutoFocus); + public static native boolean setAutofocus(boolean doAutoFocus); // Set brighness on [-1, 1] public static native boolean setBrightness(double brightness); diff --git a/photon-core/src/main/java/org/photonvision/vision/camera/LibcameraGpuSettables.java b/photon-core/src/main/java/org/photonvision/vision/camera/LibcameraGpuSettables.java index f3b32d44c2..61cf659f49 100644 --- a/photon-core/src/main/java/org/photonvision/vision/camera/LibcameraGpuSettables.java +++ b/photon-core/src/main/java/org/photonvision/vision/camera/LibcameraGpuSettables.java @@ -187,6 +187,16 @@ public void setAwbGain(int red, int blue) { } } + @Override + public int getAutofocusStatus() { + return LibCameraJNI.getAutofocusStatus(); + } + + @Override + public void autofocus() { + LibCameraJNI.setAutofocus(true); + } + @Override public FPSRatedVideoMode getCurrentVideoMode() { return currentVideoMode; diff --git a/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java b/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java index 82dd668126..1612fc57eb 100644 --- a/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java +++ b/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java @@ -478,6 +478,14 @@ public void setCameraNickname(String newName) { saveAndBroadcastAll(); } + public int getAutofocusStatus() { + return visionSource.getSettables().getAutofocusStatus(); + } + + public void autofocus() { + visionSource.getSettables().autofocus(); + } + public PhotonConfiguration.UICameraConfiguration toUICameraConfig() { var ret = new PhotonConfiguration.UICameraConfiguration(); diff --git a/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceSettables.java b/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceSettables.java index 4f60ba60c8..ff0acca0ff 100644 --- a/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceSettables.java +++ b/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceSettables.java @@ -46,8 +46,6 @@ public CameraConfiguration getConfiguration() { public abstract void setAutoExposure(boolean cameraAutoExposure); - public abstract void setAutoFocus(boolean cameraAutoFocus); - public abstract void setBrightness(int brightness); public abstract void setGain(int gain); @@ -59,6 +57,10 @@ public void setBlueGain(int blue) {} public abstract VideoMode getCurrentVideoMode(); + public void autofocus(){} + + public int getAutofocusStatus(){return -1;} + public void setVideoModeInternal(int index) { setVideoMode(getAllVideoModes().get(index)); } diff --git a/photon-server/lib/libphotonlibcamera.so b/photon-server/lib/libphotonlibcamera.so index f11ed7338aa36b6de39128cbd96cbdc37587015e..13bcbc05b5bcdf387d4ff496be19585b0672ec03 100644 GIT binary patch delta 43782 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 Date: Fri, 27 Jan 2023 17:41:02 -0600 Subject: [PATCH 3/3] Add UI flow for starting focus routine; add needed server responses. Working with non-af cam --- photon-client/package-lock.json | 19 +-- photon-client/src/views/CamerasView.vue | 129 ++++++++++++++++-- .../photonvision/server/RequestHandler.java | 4 +- .../java/org/photonvision/server/Server.java | 4 +- 4 files changed, 127 insertions(+), 29 deletions(-) diff --git a/photon-client/package-lock.json b/photon-client/package-lock.json index 1f579daa8e..cad4fa4db4 100644 --- a/photon-client/package-lock.json +++ b/photon-client/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "photon-client", "version": "3.0.0", "dependencies": { "@femessage/log-viewer": "^1.4.2", @@ -2682,7 +2683,6 @@ "thread-loader": "^2.1.3", "url-loader": "^2.2.0", "vue-loader": "^15.9.2", - "vue-loader-v16": "npm:vue-loader@^16.0.0-beta.3", "vue-style-loader": "^4.1.2", "webpack": "^4.0.0", "webpack-bundle-analyzer": "^3.8.0", @@ -3116,7 +3116,6 @@ "merge-source-map": "^1.1.0", "postcss": "^7.0.14", "postcss-selector-parser": "^6.0.2", - "prettier": "^1.18.2", "source-map": "~0.6.1", "vue-template-es2015-compiler": "^1.9.0" }, @@ -4703,7 +4702,6 @@ "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -9167,9 +9165,6 @@ "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.6" - }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -9181,11 +9176,7 @@ "@babel/runtime": "^7.14.0", "atob": "^2.1.2", "btoa": "^1.2.1", - "canvg": "^3.0.6", - "core-js": "^3.6.0", - "dompurify": "^2.2.0", - "fflate": "^0.4.8", - "html2canvas": "^1.0.0-rc.5" + "fflate": "^0.4.8" }, "optionalDependencies": { "canvg": "^3.0.6", @@ -14200,10 +14191,8 @@ "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^3.4.0", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" + "neo-async": "^2.5.0" }, "optionalDependencies": { "chokidar": "^3.4.0", @@ -14312,7 +14301,6 @@ "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", - "fsevents": "^1.2.7", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", @@ -14553,7 +14541,6 @@ "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", - "fsevents": "^1.2.7", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", diff --git a/photon-client/src/views/CamerasView.vue b/photon-client/src/views/CamerasView.vue index ca7c2ea907..2cabc81339 100644 --- a/photon-client/src/views/CamerasView.vue +++ b/photon-client/src/views/CamerasView.vue @@ -343,7 +343,7 @@ style="border-radius: 5px;" /> @@ -400,6 +400,77 @@ + + + @@ -440,9 +511,13 @@ export default { }, data() { return { - snack: false, + calibrationSnack: false, + focusSnack: false, calibrationInProgress: false, calibrationFailed: false, + focusInProgress: false, + focusFailed: false, + focusQueryInterval: null, filteredVideomodeIndex: 0, settingsValid: true, unfilteredStreamDivisors: [1, 2, 4], @@ -668,9 +743,15 @@ export default { }, closeDialog() { - this.snack = false; + this.calibrationSnack = false; + this.focusSnack = false; + + this.focusInProgress = false; + this.focusFailed = false; this.calibrationInProgress = false; this.calibrationFailed = false; + + clearInterval(this.focusQueryInterval); }, getCalibrationCoeffs(resolution) { const calList = this.$store.getters.calibrationList; @@ -776,12 +857,42 @@ export default { }, focusCamera() { - this.axios.post("http://" + this.$address + "/api/doesCameraSupportsAutofocus", { - "index": this.$store.state.currentCameraIndex + this.focusSnack = true; + this.focusFailed = false; + this.focusInProgress = true; + + this.axios.post("http://" + this.$address + "/api/autofocusCamera", { + "index": this.$store.state.currentCameraIndex + }).then(()=> { + // check every 500ms + this.focusQueryInterval = setInterval(()=>this.checkFocusStatus(), 500) + } + ).catch(res=>{ + this.focusFailed = true; + clearInterval(this.focusQueryInterval); + console.error(res) + }) + }, + checkFocusStatus() { + console.log("Checking focus status..."); + this.axios.post("http://" + this.$address + "/api/getAutofocusStatus", { + "index": this.$store.state.currentCameraIndex }).then(response => { - if (response.status != 200 || response - } - ) + if(response == null || response.data == null || response.data == -1 || response.data == 0 || response.data == 3) { + this.focusFailed = true; + clearInterval(this.focusQueryInterval); + console.error(response) + } else if (response.data == 2) { + this.focusFailed = false; + clearInterval(this.focusQueryInterval); + this.focusInProgress = false; + } + } + ).catch(res=>{ + this.focusFailed = true; + clearInterval(this.focusQueryInterval); + console.error(res) + }) }, sendCameraSettings() { this.axios.post("http://" + this.$address + "/api/settings/camera", { @@ -821,7 +932,7 @@ export default { sendCalibrationFinish() { console.log("finishing calibration for index " + this.$store.getters.currentCameraIndex); - this.snack = true; + this.calibrationSnack = true; this.calibrationInProgress = true; this.axios.post("http://" + this.$address + "/api/settings/endCalibration", this.$store.getters.currentCameraIndex) diff --git a/photon-server/src/main/java/org/photonvision/server/RequestHandler.java b/photon-server/src/main/java/org/photonvision/server/RequestHandler.java index d8983aed87..ba31e530d9 100644 --- a/photon-server/src/main/java/org/photonvision/server/RequestHandler.java +++ b/photon-server/src/main/java/org/photonvision/server/RequestHandler.java @@ -320,7 +320,7 @@ public static void importCalibrationFromCalibdb(Context ctx) { public static void autofocusCamera(Context ctx) { try { var data = kObjectMapper.readValue(ctx.body(), HashMap.class); - int idx = Integer.parseInt(String.valueOf(data.get("cameraIndex"))); + int idx = Integer.parseInt(String.valueOf(data.get("index"))); VisionModuleManager.getInstance().getModule(idx).autofocus(); ctx.status(200); return; @@ -334,7 +334,7 @@ public static void autofocusCamera(Context ctx) { public static void getAutofocusStatus(Context ctx) { try { var data = kObjectMapper.readValue(ctx.body(), HashMap.class); - int idx = Integer.parseInt(String.valueOf(data.get("cameraIndex"))); + int idx = Integer.parseInt(String.valueOf(data.get("index"))); int status = VisionModuleManager.getInstance().getModule(idx).getAutofocusStatus(); ctx.result(String.valueOf(status)); ctx.status(200); diff --git a/photon-server/src/main/java/org/photonvision/server/Server.java b/photon-server/src/main/java/org/photonvision/server/Server.java index b61c6f8b36..7434f067c9 100644 --- a/photon-server/src/main/java/org/photonvision/server/Server.java +++ b/photon-server/src/main/java/org/photonvision/server/Server.java @@ -92,8 +92,8 @@ public static void main(int port) { app.post("api/restartProgram", RequestHandler::restartProgram); app.post("api/vision/pnpModel", RequestHandler::uploadPnpModel); app.post("api/sendMetrics", RequestHandler::sendMetrics); - app.get("/api/getAutofocusStatus", RequestHandler::getAutofocusStatus); - app.get("/api/autofocusCamera", RequestHandler::autofocusCamera); + app.post("/api/getAutofocusStatus", RequestHandler::getAutofocusStatus); + app.post("/api/autofocusCamera", RequestHandler::autofocusCamera); app.post("api/setCameraNickname", RequestHandler::setCameraNickname); app.post("api/calibration/import", RequestHandler::importCalibrationFromCalibdb);