diff --git a/chameleon-client/src/views/Camera.vue b/chameleon-client/src/views/Camera.vue index 6c95f1dc5..df4329369 100644 --- a/chameleon-client/src/views/Camera.vue +++ b/chameleon-client/src/views/Camera.vue @@ -251,7 +251,12 @@ if (!this.anotherCamera) { this.pipelineDuplicate.camera = -1 } - this.handleInput("duplicatePipeline", this.pipelineDuplicate); + // this.handleInput("duplicatePipeline", this.pipelineDuplicate); + this.axios.post("http://" + this.$address + "/api/vision/duplicate", this.pipelineDuplicate).then( + function (response) { + + } + ); this.closeDuplicateDialog(); }, openDuplicateDialog() { diff --git a/chameleon-server/src/main/java/com/chameleonvision/Exceptions/DuplicatedKeyException.java b/chameleon-server/src/main/java/com/chameleonvision/Exceptions/DuplicatedKeyException.java new file mode 100644 index 000000000..dc54ae95a --- /dev/null +++ b/chameleon-server/src/main/java/com/chameleonvision/Exceptions/DuplicatedKeyException.java @@ -0,0 +1,7 @@ +package com.chameleonvision.Exceptions; + +public class DuplicatedKeyException extends Exception{ + public DuplicatedKeyException(String message){ + super(message); + } +} diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCaptureProperties.java b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCaptureProperties.java index 4b3d32cb8..2abbef913 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCaptureProperties.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCaptureProperties.java @@ -101,6 +101,10 @@ public class USBCaptureProperties extends CaptureProperties { return videoModes; } + public VideoMode getVideoMode(int index){ + return videoModes.get(index); + } + public VideoMode getCurrentVideoMode() { return staticProperties.mode; } public int getCurrentVideoModeIndex(){ diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java index 27a1a8e53..11f6acafb 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java @@ -1,5 +1,6 @@ package com.chameleonvision.vision.pipeline; +import com.chameleonvision.Exceptions.DuplicatedKeyException; import com.chameleonvision.config.CameraConfig; import com.chameleonvision.config.ConfigManager; import com.chameleonvision.vision.VisionManager; @@ -188,14 +189,18 @@ public class PipelineManager { return pipelines.get(index); } - public void duplicatePipeline(CVPipelineSettings pipeline) { + public void duplicatePipeline(CVPipelineSettings pipeline) throws DuplicatedKeyException { duplicatePipeline(pipeline, parentProcess); } - public void duplicatePipeline(CVPipelineSettings pipeline, VisionProcess destinationProcess) { + public void duplicatePipeline(CVPipelineSettings pipeline, VisionProcess destinationProcess) throws DuplicatedKeyException { pipeline.index = destinationProcess.pipelineManager.pipelines.size(); pipeline.nickname += "(Copy)"; - destinationProcess.pipelineManager.addPipeline(pipeline); + if (destinationProcess.pipelineManager.pipelines.stream().anyMatch(c -> c.settings.nickname.equals(pipeline.nickname))){ + throw new DuplicatedKeyException("key Already exists"); + } else{ + destinationProcess.pipelineManager.addPipeline(pipeline); + } } public void renameCurrentPipeline(String newName) { diff --git a/chameleon-server/src/main/java/com/chameleonvision/web/RequestHandler.java b/chameleon-server/src/main/java/com/chameleonvision/web/RequestHandler.java index 7b52cc403..d7c2a102c 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/web/RequestHandler.java +++ b/chameleon-server/src/main/java/com/chameleonvision/web/RequestHandler.java @@ -1,5 +1,6 @@ package com.chameleonvision.web; +import com.chameleonvision.Exceptions.DuplicatedKeyException; import com.chameleonvision.config.ConfigManager; import com.chameleonvision.network.NetworkIPMode; import com.chameleonvision.vision.VisionManager; @@ -8,7 +9,10 @@ import com.chameleonvision.vision.camera.USBCameraCapture; import com.chameleonvision.vision.pipeline.CVPipelineSettings; import com.chameleonvision.vision.pipeline.PipelineManager; import com.chameleonvision.vision.pipeline.impl.Calibrate3dPipeline; +import com.chameleonvision.vision.pipeline.impl.StandardCVPipeline; +import com.chameleonvision.vision.pipeline.impl.StandardCVPipelineSettings; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import edu.wpi.cscore.VideoMode; import edu.wpi.first.wpilibj.geometry.Rotation2d; @@ -47,41 +51,44 @@ public class RequestHandler { public static void onDuplicatePipeline(Context ctx) { ObjectMapper objectMapper = kObjectMapper; - try { - Map newPipelineData = objectMapper.readValue(ctx.body(), Map.class); + Map data = objectMapper.readValue(ctx.body(), Map.class); - int newCam = -1; - try { - newCam = (Integer) newPipelineData.get("camera"); - } catch (Exception e) { - // ignored - } + int cameraIndex = (Integer) data.getOrDefault("camera", -1); - var pipeline = (CVPipelineSettings) newPipelineData.get("pipeline"); + var pipelineIndex = (Integer) data.get("pipeline"); + StandardCVPipelineSettings origPipeline = (StandardCVPipelineSettings) VisionManager.getCurrentUIVisionProcess().pipelineManager.getPipeline(pipelineIndex).settings; + String tmp = objectMapper.writeValueAsString(origPipeline); + StandardCVPipelineSettings newPipeline = objectMapper.readValue(tmp, StandardCVPipelineSettings.class); - if (newCam == -1) { - if (VisionManager.getCurrentCameraPipelineNicknames().contains(pipeline.nickname)) { - ctx.status(400); // BAD REQUEST - } else { - VisionManager.getCurrentUIVisionProcess().pipelineManager.addPipeline(pipeline); + if (cameraIndex == -1) { // same camera + + VisionManager.getCurrentUIVisionProcess().pipelineManager.duplicatePipeline(newPipeline); + + } else { // another camera + var cam = VisionManager.getVisionProcessByIndex(cameraIndex); + if (cam != null) { + if (cam.getCamera().getProperties().videoModes.size() < newPipeline.videoModeIndex) { + newPipeline.videoModeIndex = cam.getCamera().getProperties().videoModes.size() - 1; + } + if (newPipeline.is3D){ + var calibration = cam.getCamera().getCalibration(cam.getCamera().getProperties().getVideoMode(newPipeline.videoModeIndex)); + if (calibration == null){ + newPipeline.is3D = false; + } + } + VisionManager.getCurrentUIVisionProcess().pipelineManager.duplicatePipeline(newPipeline, cam); ctx.status(200); - } - } else { - var cam = VisionManager.getVisionProcessByIndex(newCam); - if (cam != null && cam.pipelineManager.pipelines.stream().anyMatch(c -> c.settings.nickname.equals(pipeline.nickname))) { - ctx.status(400); // BAD REQUEST } else { - cam.pipelineManager.addPipeline(pipeline); - ctx.status(200); + ctx.status(500); } } - - } catch (JsonProcessingException e) { + } catch (JsonProcessingException | DuplicatedKeyException ex) { ctx.status(500); } } + public static void onCameraSettings(Context ctx) { ObjectMapper objectMapper = kObjectMapper; try { diff --git a/chameleon-server/src/main/java/com/chameleonvision/web/Server.java b/chameleon-server/src/main/java/com/chameleonvision/web/Server.java index aa8cf6464..a9617edbb 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/web/Server.java +++ b/chameleon-server/src/main/java/com/chameleonvision/web/Server.java @@ -30,6 +30,7 @@ public class Server { }); app.post("/api/settings/general", RequestHandler::onGeneralSettings); app.post("/api/settings/camera", RequestHandler::onCameraSettings); + app.post("/api/vision/duplicate", RequestHandler::onDuplicatePipeline); app.post("/api/settings/startCalibration", RequestHandler::onCalibrationStart); app.post("/api/settings/snapshot", RequestHandler::onSnapshot); app.post("/api/settings/endCalibration", RequestHandler::onCalibrationEnding); diff --git a/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java b/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java index 920315d76..d8b7b5302 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java +++ b/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java @@ -83,30 +83,6 @@ public class SocketHandler { VisionManager.saveCurrentCameraPipelines(); break; } - case "duplicatePipeline": { - HashMap pipelineVals = (HashMap) entry.getValue(); - int pipelineIndex = (int) pipelineVals.get("pipeline"); - int cameraIndex = (int) pipelineVals.get("camera"); - ObjectMapper mapper = new ObjectMapper(); - CVPipelineSettings origPipeline = currentProcess.pipelineManager.getPipeline(pipelineIndex).settings; - String val = mapper.writeValueAsString(origPipeline); - CVPipelineSettings newPipeline = mapper.readValue(val, origPipeline.getClass()); - - if (cameraIndex != -1) { - VisionProcess newProcess = VisionManager.getVisionProcessByIndex(cameraIndex); - if (newProcess != null) { - currentProcess.pipelineManager.duplicatePipeline(newPipeline, newProcess); - } else { - System.err.println("Failed to get destination camera for pipeline duplication!"); - } - } else { - currentProcess.pipelineManager.duplicatePipeline(newPipeline); - } - - VisionManager.saveCurrentCameraPipelines(); - sendFullSettings(); - break; - } case "addNewPipeline": { // HashMap data = (HashMap) entry.getValue(); String pipeName = (String) entry.getValue();