mirror of
https://github.com/PhotonVision/photonvision
synced 2026-06-22 01:11:40 +00:00
Merge branch 'dev' of https://github.com/chameleon-vision/Chameleon-Vision into dev
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
public VideoMode getVideoMode(int index){
|
||||
return videoModes.get(index);
|
||||
}
|
||||
|
||||
public VideoMode getCurrentVideoMode() { return staticProperties.mode; }
|
||||
|
||||
public int getCurrentVideoModeIndex(){
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<String, Object> data = (HashMap<String, Object>) entry.getValue();
|
||||
String pipeName = (String) entry.getValue();
|
||||
|
||||
Reference in New Issue
Block a user