mirror of
https://github.com/PhotonVision/photonvision
synced 2026-07-03 03:01:40 +00:00
Merge branch 'dev' of https://github.com/chameleon-vision/Chameleon-Vision into dev
This commit is contained in:
@@ -251,7 +251,12 @@
|
|||||||
if (!this.anotherCamera) {
|
if (!this.anotherCamera) {
|
||||||
this.pipelineDuplicate.camera = -1
|
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();
|
this.closeDuplicateDialog();
|
||||||
},
|
},
|
||||||
openDuplicateDialog() {
|
openDuplicateDialog() {
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.chameleonvision.Exceptions;
|
||||||
|
|
||||||
|
public class DuplicatedKeyException extends Exception{
|
||||||
|
public DuplicatedKeyException(String message){
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -101,6 +101,10 @@ public class USBCaptureProperties extends CaptureProperties {
|
|||||||
return videoModes;
|
return videoModes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public VideoMode getVideoMode(int index){
|
||||||
|
return videoModes.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
public VideoMode getCurrentVideoMode() { return staticProperties.mode; }
|
public VideoMode getCurrentVideoMode() { return staticProperties.mode; }
|
||||||
|
|
||||||
public int getCurrentVideoModeIndex(){
|
public int getCurrentVideoModeIndex(){
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.chameleonvision.vision.pipeline;
|
package com.chameleonvision.vision.pipeline;
|
||||||
|
|
||||||
|
import com.chameleonvision.Exceptions.DuplicatedKeyException;
|
||||||
import com.chameleonvision.config.CameraConfig;
|
import com.chameleonvision.config.CameraConfig;
|
||||||
import com.chameleonvision.config.ConfigManager;
|
import com.chameleonvision.config.ConfigManager;
|
||||||
import com.chameleonvision.vision.VisionManager;
|
import com.chameleonvision.vision.VisionManager;
|
||||||
@@ -188,14 +189,18 @@ public class PipelineManager {
|
|||||||
return pipelines.get(index);
|
return pipelines.get(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void duplicatePipeline(CVPipelineSettings pipeline) {
|
public void duplicatePipeline(CVPipelineSettings pipeline) throws DuplicatedKeyException {
|
||||||
duplicatePipeline(pipeline, parentProcess);
|
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.index = destinationProcess.pipelineManager.pipelines.size();
|
||||||
pipeline.nickname += "(Copy)";
|
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) {
|
public void renameCurrentPipeline(String newName) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.chameleonvision.web;
|
package com.chameleonvision.web;
|
||||||
|
|
||||||
|
import com.chameleonvision.Exceptions.DuplicatedKeyException;
|
||||||
import com.chameleonvision.config.ConfigManager;
|
import com.chameleonvision.config.ConfigManager;
|
||||||
import com.chameleonvision.network.NetworkIPMode;
|
import com.chameleonvision.network.NetworkIPMode;
|
||||||
import com.chameleonvision.vision.VisionManager;
|
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.CVPipelineSettings;
|
||||||
import com.chameleonvision.vision.pipeline.PipelineManager;
|
import com.chameleonvision.vision.pipeline.PipelineManager;
|
||||||
import com.chameleonvision.vision.pipeline.impl.Calibrate3dPipeline;
|
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.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.JsonMappingException;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import edu.wpi.cscore.VideoMode;
|
import edu.wpi.cscore.VideoMode;
|
||||||
import edu.wpi.first.wpilibj.geometry.Rotation2d;
|
import edu.wpi.first.wpilibj.geometry.Rotation2d;
|
||||||
@@ -47,41 +51,44 @@ public class RequestHandler {
|
|||||||
|
|
||||||
public static void onDuplicatePipeline(Context ctx) {
|
public static void onDuplicatePipeline(Context ctx) {
|
||||||
ObjectMapper objectMapper = kObjectMapper;
|
ObjectMapper objectMapper = kObjectMapper;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Map newPipelineData = objectMapper.readValue(ctx.body(), Map.class);
|
Map data = objectMapper.readValue(ctx.body(), Map.class);
|
||||||
|
|
||||||
int newCam = -1;
|
int cameraIndex = (Integer) data.getOrDefault("camera", -1);
|
||||||
try {
|
|
||||||
newCam = (Integer) newPipelineData.get("camera");
|
|
||||||
} catch (Exception e) {
|
|
||||||
// ignored
|
|
||||||
}
|
|
||||||
|
|
||||||
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 (cameraIndex == -1) { // same camera
|
||||||
if (VisionManager.getCurrentCameraPipelineNicknames().contains(pipeline.nickname)) {
|
|
||||||
ctx.status(400); // BAD REQUEST
|
VisionManager.getCurrentUIVisionProcess().pipelineManager.duplicatePipeline(newPipeline);
|
||||||
} else {
|
|
||||||
VisionManager.getCurrentUIVisionProcess().pipelineManager.addPipeline(pipeline);
|
} 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);
|
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 {
|
} else {
|
||||||
cam.pipelineManager.addPipeline(pipeline);
|
ctx.status(500);
|
||||||
ctx.status(200);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (JsonProcessingException | DuplicatedKeyException ex) {
|
||||||
} catch (JsonProcessingException e) {
|
|
||||||
ctx.status(500);
|
ctx.status(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void onCameraSettings(Context ctx) {
|
public static void onCameraSettings(Context ctx) {
|
||||||
ObjectMapper objectMapper = kObjectMapper;
|
ObjectMapper objectMapper = kObjectMapper;
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ public class Server {
|
|||||||
});
|
});
|
||||||
app.post("/api/settings/general", RequestHandler::onGeneralSettings);
|
app.post("/api/settings/general", RequestHandler::onGeneralSettings);
|
||||||
app.post("/api/settings/camera", RequestHandler::onCameraSettings);
|
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/startCalibration", RequestHandler::onCalibrationStart);
|
||||||
app.post("/api/settings/snapshot", RequestHandler::onSnapshot);
|
app.post("/api/settings/snapshot", RequestHandler::onSnapshot);
|
||||||
app.post("/api/settings/endCalibration", RequestHandler::onCalibrationEnding);
|
app.post("/api/settings/endCalibration", RequestHandler::onCalibrationEnding);
|
||||||
|
|||||||
@@ -83,30 +83,6 @@ public class SocketHandler {
|
|||||||
VisionManager.saveCurrentCameraPipelines();
|
VisionManager.saveCurrentCameraPipelines();
|
||||||
break;
|
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": {
|
case "addNewPipeline": {
|
||||||
// HashMap<String, Object> data = (HashMap<String, Object>) entry.getValue();
|
// HashMap<String, Object> data = (HashMap<String, Object>) entry.getValue();
|
||||||
String pipeName = (String) entry.getValue();
|
String pipeName = (String) entry.getValue();
|
||||||
|
|||||||
Reference in New Issue
Block a user