Files
PhotonVision/Main/src/main/java/com/chameleonvision/vision/VisionManager.java

187 lines
7.8 KiB
Java
Raw Normal View History

package com.chameleonvision.vision;
import com.chameleonvision.config.CameraJsonConfig;
import com.chameleonvision.config.ConfigManager;
import com.chameleonvision.config.FullCameraConfiguration;
import com.chameleonvision.util.Helpers;
import com.chameleonvision.util.Platform;
import com.chameleonvision.vision.camera.CameraCapture;
import com.chameleonvision.vision.camera.USBCameraCapture;
2019-11-26 23:03:07 -05:00
import com.chameleonvision.vision.pipeline.CVPipeline;
import com.chameleonvision.vision.pipeline.CVPipelineSettings;
import edu.wpi.cscore.UsbCamera;
import edu.wpi.cscore.UsbCameraInfo;
import org.opencv.videoio.VideoCapture;
import java.io.IOException;
import java.util.*;
2019-11-23 04:05:37 -05:00
import java.util.stream.Collectors;
public class VisionManager {
2019-11-23 18:29:16 +02:00
private VisionManager() {
}
2019-11-24 20:46:25 -08:00
private static final LinkedHashMap<String, UsbCameraInfo> usbCameraInfosByCameraName = new LinkedHashMap<>();
private static final LinkedList<FullCameraConfiguration> loadedCameraConfigs = new LinkedList<>();
2019-11-24 20:46:25 -08:00
private static final LinkedList<VisionProcessManageable> visionProcesses = new LinkedList<>();
private static class VisionProcessManageable {
public final int index;
public final String name;
public final VisionProcess visionProcess;
public VisionProcessManageable(int index, String name, VisionProcess visionProcess) {
this.index = index;
this.name = name;
this.visionProcess = visionProcess;
}
}
2019-11-23 04:05:37 -05:00
private static VisionProcess currentUIVisionProcess;
public static boolean initializeSources() {
int suffix = 0;
for (UsbCameraInfo info : UsbCamera.enumerateUsbCameras()) {
VideoCapture cap = new VideoCapture(info.dev);
if (cap.isOpened()) {
cap.release();
String name = info.name;
2019-11-24 20:46:25 -08:00
while (usbCameraInfosByCameraName.containsKey(name)) {
suffix++;
name = String.format("%s (%d)", name, suffix);
}
2019-11-24 20:46:25 -08:00
usbCameraInfosByCameraName.put(name, info);
}
}
2019-11-24 20:46:25 -08:00
if (usbCameraInfosByCameraName.isEmpty()) {
return false;
}
// load the config
List<CameraJsonConfig> preliminaryConfigs = new ArrayList<>();
2019-11-24 20:46:25 -08:00
usbCameraInfosByCameraName.values().forEach((cameraInfo) -> {
String truePath;
if (Platform.CurrentPlatform.isWindows()) {
truePath = cameraInfo.path;
} else {
truePath = Arrays.stream(cameraInfo.otherPaths).filter(x -> x.contains("/dev/v4l/by-path")).findFirst().orElse(cameraInfo.path);
}
preliminaryConfigs.add(new CameraJsonConfig(truePath, cameraInfo.name));
});
loadedCameraConfigs.addAll(ConfigManager.initializeCameras(preliminaryConfigs));
2019-11-23 04:05:37 -05:00
// TODO: (HIGH) Load pipelines from json
// UsbCameraInfosByCameraName.forEach((cameraName, cameraInfo) -> {
// Path cameraConfigFolder = Paths.get(CamConfigPath.toString(), String.format("%s\\", cameraName));
// Path cameraConfigPath = Paths.get(cameraConfigFolder.toString(), String.format("%s.json", cameraName));
// Path cameraPipelinesPath = Paths.get(cameraConfigFolder.toString(), "pipelines.json");
// Path cameraDrivermodePath = Paths.get(cameraConfigFolder.toString(), "drivermode.json");
return true;
2019-11-11 17:26:32 +02:00
}
public static boolean initializeProcesses() {
2019-11-24 20:46:25 -08:00
for (int i = 0; i < loadedCameraConfigs.size(); i++) {
FullCameraConfiguration config = loadedCameraConfigs.get(i);
CameraJsonConfig cameraJsonConfig = config.cameraConfig;
CameraCapture camera = new USBCameraCapture(cameraJsonConfig);
VisionProcess process = new VisionProcess(camera, cameraJsonConfig.name, config.pipelines);
process.setDriverModeSettings(config.drivermode);
visionProcesses.add(new VisionProcessManageable(i, cameraJsonConfig.name, process));
2019-11-23 04:05:37 -05:00
}
currentUIVisionProcess = getVisionProcessByIndex(0);
2019-11-27 23:53:41 +02:00
ConfigManager.settings.currentCamera = visionProcesses.get(0).name;
return true;
}
public static void startProcesses() {
2019-11-24 20:46:25 -08:00
visionProcesses.forEach((vpm) -> {
vpm.visionProcess.start();
});
}
2019-11-22 14:34:21 -08:00
2019-11-23 04:05:37 -05:00
public static VisionProcess getCurrentUIVisionProcess() {
return currentUIVisionProcess;
}
public static void setCurrentProcessByIndex(int processIndex) {
2019-11-24 20:46:25 -08:00
if (processIndex > visionProcesses.size() - 1) {
2019-11-23 04:05:37 -05:00
return;
}
2019-11-27 23:53:41 +02:00
currentUIVisionProcess = getVisionProcessByIndex(processIndex);
ConfigManager.settings.currentCamera = visionProcesses.get(processIndex).name;
2019-11-23 04:05:37 -05:00
}
public static VisionProcess getVisionProcessByIndex(int processIndex) {
2019-11-24 20:46:25 -08:00
if (processIndex > visionProcesses.size() - 1) {
2019-11-23 04:05:37 -05:00
return null;
}
2019-11-24 20:46:25 -08:00
VisionProcessManageable vpm = visionProcesses.stream().filter(manageable -> manageable.index == processIndex).findFirst().orElse(null);
return vpm != null ? vpm.visionProcess : null;
2019-11-23 04:05:37 -05:00
}
public static List<String> getAllCameraNicknames() {
2019-11-24 20:46:25 -08:00
return visionProcesses.stream().map(vpm -> vpm.visionProcess.getCamera()
.getProperties().getNickname()).collect(Collectors.toList());
}
public static List<String> getCurrentCameraPipelineNicknames() {
return currentUIVisionProcess.getPipelines().stream().map(cvPipeline -> cvPipeline.settings.nickname).collect(Collectors.toList());
2019-11-22 14:34:21 -08:00
}
2019-11-23 18:29:16 +02:00
2019-11-26 23:03:07 -05:00
public static void saveAllCameras() {
2019-11-24 20:46:25 -08:00
visionProcesses.forEach((vpm) -> {
VisionProcess process = vpm.visionProcess;
String cameraName = process.getCamera().getProperties().name;
List<CVPipelineSettings> pipelines = process.getPipelines().stream().map(cvPipeline -> cvPipeline.settings).collect(Collectors.toList());
CVPipelineSettings driverMode = process.getDriverModeSettings();
CameraJsonConfig config = CameraJsonConfig.fromUSBCameraProcess((USBCameraCapture) process.getCamera());
ConfigManager.saveCameraPipelines(cameraName, pipelines);
ConfigManager.saveCameraDriverMode(cameraName, driverMode);
ConfigManager.saveCameraConfig(cameraName, config);
2019-11-23 18:29:16 +02:00
});
}
2019-11-26 23:03:07 -05:00
private static String getCurrentCameraName() {
return currentUIVisionProcess.getCamera().getProperties().name;
}
public static void saveCurrentCameraSettings() {
CameraJsonConfig config = CameraJsonConfig.fromUSBCameraProcess((USBCameraCapture) currentUIVisionProcess.getCamera());
ConfigManager.saveCameraConfig(getCurrentCameraName(), config);
}
public static void saveCurrentCameraPipelines() {
List<CVPipelineSettings> pipelineSettings = currentUIVisionProcess.getPipelines().stream().map(pipeline -> pipeline.settings).collect(Collectors.toList());
ConfigManager.saveCameraPipelines(getCurrentCameraName(), pipelineSettings);
}
public static void saveCurrentCameraDriverMode() {
CVPipelineSettings driverModeSettings = currentUIVisionProcess.getDriverModeSettings();
ConfigManager.saveCameraDriverMode(getCurrentCameraName(), driverModeSettings);
}
public static List<String> getCameraResolutionList(CameraCapture capture) {
return capture.getProperties().getVideoModes().stream().map(Helpers::VideoModeToString).collect(Collectors.toList());
}
public static List<String> getCurrentCameraResolutionList() {
return getCameraResolutionList(currentUIVisionProcess.getCamera());
}
public static int getCurrentUIVisionProcessIndex() {
2019-11-24 20:46:25 -08:00
VisionProcessManageable vpm = visionProcesses.stream().filter(v -> v.visionProcess == currentUIVisionProcess).findFirst().orElse(null);
return vpm != null ? vpm.index : -1;
}
}