mirror of
https://github.com/PhotonVision/photonvision
synced 2026-06-21 01:01:41 +00:00
Camera configuration rewrite, begin on CameraStreamer threading fix
This commit is contained in:
@@ -1,37 +1,167 @@
|
||||
package com.chameleonvision.config;
|
||||
|
||||
import com.chameleonvision.vision.camera.USBCameraCapture;
|
||||
import com.chameleonvision.vision.camera.USBCameraProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.chameleonvision.util.JacksonHelper;
|
||||
import com.chameleonvision.vision.pipeline.CVPipelineSettings;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class CameraConfig {
|
||||
public final double fov;
|
||||
public final String path;
|
||||
public final String name;
|
||||
public final String nickname;
|
||||
|
||||
@JsonCreator
|
||||
public CameraConfig(
|
||||
@JsonProperty("fov") double fov,
|
||||
@JsonProperty("path") String path,
|
||||
@JsonProperty("name") String name,
|
||||
@JsonProperty("nickname") String nickname) {
|
||||
this.fov = fov;
|
||||
this.path = path;
|
||||
this.name = name;
|
||||
this.nickname = nickname;
|
||||
private static final Path camerasConfigFolderPath = Paths.get(ConfigManager.SettingsPath.toString(), "cameras");
|
||||
|
||||
private final String cameraConfigName;
|
||||
private final CameraJsonConfig preliminaryConfig;
|
||||
|
||||
CameraConfig(CameraJsonConfig config) {
|
||||
preliminaryConfig = config;
|
||||
cameraConfigName = preliminaryConfig.name.replace(' ', '_');
|
||||
}
|
||||
|
||||
public CameraConfig(String path, String name) {
|
||||
this.fov = USBCameraProperties.DEFAULT_FOV;
|
||||
this.path = path;
|
||||
this.name = name;
|
||||
this.nickname = name;
|
||||
public CameraJsonConfig load() {
|
||||
checkFolder();
|
||||
checkConfig();
|
||||
checkPipelines();
|
||||
checkDriverMode();
|
||||
|
||||
// todo: add pipelines and drivermode loads
|
||||
return loadConfig();
|
||||
}
|
||||
|
||||
public static CameraConfig fromUSBCameraProcess(USBCameraCapture process) {
|
||||
USBCameraProperties camProps = process.getProperties();
|
||||
return new CameraConfig(camProps.FOV, camProps.name, camProps.path, camProps.getNickname());
|
||||
private CameraJsonConfig loadConfig() {
|
||||
CameraJsonConfig config = preliminaryConfig;
|
||||
try {
|
||||
config = JacksonHelper.deserializer(getConfigPath(), CameraJsonConfig.class);
|
||||
} catch (IOException e) {
|
||||
System.err.printf("Failed to load camera config: %s - using default.\n", getConfigPath().toString());
|
||||
}
|
||||
return config;
|
||||
}
|
||||
|
||||
List<CVPipelineSettings> loadPipelines() {
|
||||
List<CVPipelineSettings> pipelines = new ArrayList<>();
|
||||
try {
|
||||
var pipelineArray = JacksonHelper.deserializer(getPipelinesPath(), CVPipelineSettings[].class);
|
||||
if (pipelineArray != null) {
|
||||
pipelines = Arrays.asList(pipelineArray);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to load camera pipelines: " + getPipelinesPath().toString());
|
||||
}
|
||||
return pipelines;
|
||||
}
|
||||
|
||||
CVPipelineSettings loadDriverMode() {
|
||||
CVPipelineSettings driverMode = new CVPipelineSettings();
|
||||
driverMode.nickname = "DRIVERMODE";
|
||||
try {
|
||||
driverMode = JacksonHelper.deserializer(getDriverModePath(), CVPipelineSettings.class);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to load camera drivermode: " + getDriverModePath().toString());
|
||||
}
|
||||
return driverMode;
|
||||
}
|
||||
|
||||
void saveConfig(CameraJsonConfig config) {
|
||||
try {
|
||||
JacksonHelper.serializer(getConfigPath(), config);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to save camera config file: " + getConfigPath().toString());
|
||||
}
|
||||
}
|
||||
|
||||
void savePipelines(List<CVPipelineSettings> pipelines) {
|
||||
try {
|
||||
JacksonHelper.serializer(getPipelinesPath(), pipelines);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to save camera pipelines file: " + getConfigPath().toString());
|
||||
}
|
||||
}
|
||||
|
||||
void saveDriverMode(CVPipelineSettings driverMode) {
|
||||
try {
|
||||
JacksonHelper.serializer(getDriverModePath(), driverMode);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to save camera drivermode file: " + getDriverModePath().toString());
|
||||
}
|
||||
}
|
||||
|
||||
private void checkFolder() {
|
||||
if (!folderExists()) {
|
||||
try {
|
||||
Files.createDirectory(getFolderPath());
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to create camera config folder: " + getFolderPath().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void checkConfig() {
|
||||
if (!configExists()) {
|
||||
try {
|
||||
JacksonHelper.serializer(getConfigPath(), preliminaryConfig);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to create camera config file: " + getConfigPath().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void checkPipelines() {
|
||||
if (!pipelinesExists()) {
|
||||
try {
|
||||
Files.createFile(getPipelinesPath());
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to create camera pipelines file: " + getPipelinesPath().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void checkDriverMode() {
|
||||
if (!driverModeExists()) {
|
||||
try {
|
||||
CVPipelineSettings newDriverModeSettings = new CVPipelineSettings();
|
||||
newDriverModeSettings.nickname = "DRIVERMODE";
|
||||
JacksonHelper.serializer(getDriverModePath(), newDriverModeSettings);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to create camera drivermode file: " + getDriverModePath().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Path getFolderPath() {
|
||||
return Paths.get(camerasConfigFolderPath.toString(), cameraConfigName);
|
||||
}
|
||||
|
||||
private Path getConfigPath() {
|
||||
return Paths.get(getFolderPath().toString(), "camera.json");
|
||||
}
|
||||
|
||||
private Path getPipelinesPath() {
|
||||
return Paths.get(getFolderPath().toString(), "pipelines.json");
|
||||
}
|
||||
|
||||
private Path getDriverModePath() {
|
||||
return Paths.get(getFolderPath().toString(), "drivermode.json");
|
||||
}
|
||||
|
||||
private boolean folderExists() {
|
||||
return Files.exists(getFolderPath());
|
||||
}
|
||||
|
||||
private boolean configExists() {
|
||||
return folderExists() && Files.exists(getConfigPath());
|
||||
}
|
||||
|
||||
private boolean pipelinesExists() {
|
||||
return folderExists() && Files.exists(getPipelinesPath());
|
||||
}
|
||||
|
||||
private boolean driverModeExists() {
|
||||
return folderExists() && Files.exists(getDriverModePath());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.chameleonvision.config;
|
||||
|
||||
import com.chameleonvision.vision.camera.USBCameraCapture;
|
||||
import com.chameleonvision.vision.camera.USBCameraProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class CameraJsonConfig {
|
||||
public final double fov;
|
||||
public final String path;
|
||||
public final String name;
|
||||
public final String nickname;
|
||||
|
||||
@JsonCreator
|
||||
public CameraJsonConfig(
|
||||
@JsonProperty("fov") double fov,
|
||||
@JsonProperty("path") String path,
|
||||
@JsonProperty("name") String name,
|
||||
@JsonProperty("nickname") String nickname) {
|
||||
this.fov = fov;
|
||||
this.path = path;
|
||||
this.name = name;
|
||||
this.nickname = nickname;
|
||||
}
|
||||
|
||||
public CameraJsonConfig(String path, String name) {
|
||||
this.fov = USBCameraProperties.DEFAULT_FOV;
|
||||
this.path = path;
|
||||
this.name = name;
|
||||
this.nickname = name;
|
||||
}
|
||||
|
||||
public static CameraJsonConfig fromUSBCameraProcess(USBCameraCapture process) {
|
||||
USBCameraProperties camProps = process.getProperties();
|
||||
return new CameraJsonConfig(camProps.FOV, camProps.name, camProps.path, camProps.getNickname());
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.chameleonvision.config;
|
||||
|
||||
import com.chameleonvision.util.ProgramDirectoryUtilities;
|
||||
import com.chameleonvision.util.FileHelper;
|
||||
import com.chameleonvision.util.JacksonHelper;
|
||||
import com.chameleonvision.vision.pipeline.CVPipelineSettings;
|
||||
|
||||
import java.io.File;
|
||||
@@ -10,15 +10,17 @@ import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
|
||||
public class ConfigManager {
|
||||
private ConfigManager() {}
|
||||
|
||||
private static final Path SettingsPath = Paths.get(ProgramDirectoryUtilities.getProgramDirectory(), "settings");
|
||||
private static final Path cameraConfigPath = Paths.get(SettingsPath.toString(), "cameras");
|
||||
static final Path SettingsPath = Paths.get(ProgramDirectoryUtilities.getProgramDirectory(), "settings");
|
||||
private static final Path settingsFilePath = Paths.get(SettingsPath.toString(), "settings.json");
|
||||
|
||||
private static final LinkedHashMap<String, CameraConfig> cameraConfigs = new LinkedHashMap<>();
|
||||
|
||||
public static GeneralSettings settings = new GeneralSettings();
|
||||
|
||||
private static boolean settingsFolderExists() { return Files.exists(SettingsPath); }
|
||||
@@ -38,13 +40,13 @@ public class ConfigManager {
|
||||
boolean settingsFileEmpty = settingsFileExists() && new File(settingsFilePath.toString()).length() == 0;
|
||||
if (settingsFileEmpty || !settingsFileExists()) {
|
||||
try {
|
||||
FileHelper.Serializer(settingsFilePath, settings);
|
||||
JacksonHelper.serializer(settingsFilePath, settings);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
settings = FileHelper.DeSerializer(settingsFilePath, GeneralSettings.class);
|
||||
settings = JacksonHelper.deserializer(settingsFilePath, GeneralSettings.class);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to load settings.json, using defaults.");
|
||||
}
|
||||
@@ -52,13 +54,14 @@ public class ConfigManager {
|
||||
}
|
||||
|
||||
public static void initializeSettings() {
|
||||
System.out.println("Settings folder: " + SettingsPath.toString());
|
||||
checkSettingsFolder();
|
||||
checkSettingsFile();
|
||||
}
|
||||
|
||||
private static void saveSettingsFile() {
|
||||
try {
|
||||
FileHelper.Serializer(settingsFilePath, settings);
|
||||
JacksonHelper.serializer(settingsFilePath, settings);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to save settings.json!");
|
||||
}
|
||||
@@ -69,97 +72,36 @@ public class ConfigManager {
|
||||
saveSettingsFile();
|
||||
}
|
||||
|
||||
private static Path getCameraSpecificFolderPath(String cameraName) {
|
||||
return Paths.get(cameraConfigPath.toString(), cameraName);
|
||||
}
|
||||
|
||||
private static Path getCameraSpecificConfigPath(String cameraName) {
|
||||
return Paths.get(getCameraSpecificFolderPath(cameraName).toString(), "camera.json");
|
||||
}
|
||||
|
||||
private static Path getCameraSpecificPipelinesPath(String cameraName) {
|
||||
return Paths.get(getCameraSpecificFolderPath(cameraName).toString(), "pipelines.json");
|
||||
}
|
||||
|
||||
private static Path getCameraSpecificDriverModePath(String cameraName) {
|
||||
return Paths.get(getCameraSpecificFolderPath(cameraName).toString(), "drivermode.json");
|
||||
}
|
||||
|
||||
private static boolean cameraFolderExists(String cameraName) {
|
||||
return Files.exists(getCameraSpecificFolderPath(cameraName));
|
||||
}
|
||||
|
||||
private static boolean cameraConfigExists(String cameraName) {
|
||||
return cameraFolderExists(cameraName) && Files.exists(getCameraSpecificConfigPath(cameraName));
|
||||
}
|
||||
|
||||
private static boolean cameraPipelinesExists(String cameraName) {
|
||||
return cameraFolderExists(cameraName) && Files.exists(getCameraSpecificPipelinesPath(cameraName));
|
||||
}
|
||||
|
||||
private static boolean cameraDriverModeExists(String cameraName) {
|
||||
return cameraFolderExists(cameraName) && Files.exists(getCameraSpecificDriverModePath(cameraName));
|
||||
}
|
||||
|
||||
// TODO: (HIGH) cleanup!
|
||||
public static List<CameraConfig> initializeCameraConfig(List<CameraConfig> preliminaryConfigs) {
|
||||
var configList = new ArrayList<CameraConfig>();
|
||||
public static List<FullCameraConfiguration> initializeCameras(List<CameraJsonConfig> preliminaryConfigs) {
|
||||
List<FullCameraConfiguration> configList = new ArrayList<>();
|
||||
|
||||
checkSettingsFolder();
|
||||
|
||||
// loop over all the camera names and try to create settings folders for it
|
||||
preliminaryConfigs.forEach((preliminaryConfig) -> {
|
||||
String cameraName = preliminaryConfig.name;
|
||||
for (CameraJsonConfig preliminaryConfig : preliminaryConfigs) {
|
||||
CameraConfig cameraConfiguration = new CameraConfig(preliminaryConfig);
|
||||
cameraConfigs.put(preliminaryConfig.name, cameraConfiguration);
|
||||
|
||||
final Path cameraConfigFolderPath = getCameraSpecificFolderPath(cameraName);
|
||||
final Path cameraConfigPath = getCameraSpecificConfigPath(cameraName);
|
||||
CameraJsonConfig camJsonConfig = cameraConfiguration.load();
|
||||
List<CVPipelineSettings> pipelines = cameraConfiguration.loadPipelines();
|
||||
CVPipelineSettings driverMode = cameraConfiguration.loadDriverMode();
|
||||
|
||||
// check if the config folder exists, and if not, create it
|
||||
if (!cameraFolderExists(cameraName)) {
|
||||
try {
|
||||
Files.createDirectory(cameraConfigFolderPath);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to create camera config folder!");
|
||||
}
|
||||
} else {
|
||||
CameraConfig config = preliminaryConfig;
|
||||
|
||||
// check if the config exists, and if not, create it
|
||||
if(!cameraConfigExists(cameraName)) {
|
||||
try {
|
||||
FileHelper.Serializer(cameraConfigPath, preliminaryConfig);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
config = FileHelper.DeSerializer(cameraConfigPath, CameraConfig.class);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
configList.add(config);
|
||||
}
|
||||
});
|
||||
configList.add(new FullCameraConfiguration(camJsonConfig, pipelines, driverMode));
|
||||
}
|
||||
|
||||
return configList;
|
||||
}
|
||||
public static void saveCameraPipelines(String cameraName, List<CVPipelineSettings> pipelines) throws IOException {
|
||||
Path cameraFolder = Paths.get(cameraConfigPath.toString(), cameraName);
|
||||
Path filePath = Paths.get(cameraFolder.toString(), cameraName,"pipelines.json");
|
||||
FileHelper.CheckPath(cameraFolder);
|
||||
FileHelper.Serializer(filePath, pipelines);
|
||||
|
||||
public static void saveCameraConfig(String cameraName, CameraJsonConfig config) {
|
||||
cameraConfigs.get(cameraName).saveConfig(config);
|
||||
}
|
||||
public static void saveCameraDriverMode(String cameraName, CVPipelineSettings driverMode) throws IOException {
|
||||
Path cameraFolder = Paths.get(cameraConfigPath.toString(), cameraName);
|
||||
Path filePath = Paths.get(cameraFolder.toString(), cameraName,"driverMode.json");
|
||||
FileHelper.CheckPath(cameraFolder);
|
||||
FileHelper.Serializer(filePath, driverMode);
|
||||
|
||||
public static void saveCameraPipelines(String cameraName, List<CVPipelineSettings> pipelines) {
|
||||
cameraConfigs.get(cameraName).savePipelines(pipelines);
|
||||
}
|
||||
public static void saveCameraConfig(String cameraName, CameraConfig config) throws IOException {
|
||||
Path cameraFolder = Paths.get(cameraConfigPath.toString(), cameraName);
|
||||
Path filePath = Paths.get(cameraFolder.toString(), cameraName,"driverMode.json");
|
||||
FileHelper.CheckPath(cameraFolder);
|
||||
FileHelper.Serializer(filePath, config);
|
||||
|
||||
public static void saveCameraDriverMode(String cameraName, CVPipelineSettings driverMode) {
|
||||
cameraConfigs.get(cameraName).saveDriverMode(driverMode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.chameleonvision.config;
|
||||
|
||||
import com.chameleonvision.vision.pipeline.CVPipelineSettings;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class FullCameraConfiguration {
|
||||
public final CameraJsonConfig cameraConfig;
|
||||
public final List<CVPipelineSettings> pipelines;
|
||||
public final CVPipelineSettings drivermode;
|
||||
|
||||
|
||||
public FullCameraConfiguration(CameraJsonConfig cameraConfig, List<CVPipelineSettings> pipelines, CVPipelineSettings drivermode) {
|
||||
this.cameraConfig = cameraConfig;
|
||||
this.pipelines = pipelines;
|
||||
this.drivermode = drivermode;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user