From 87186809c9efac9ff7dce250e77f4cc04f92edbe Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 17 Aug 2020 13:25:28 -0700 Subject: [PATCH] Buffer setting save (#51) This makes it so that settings are written to disk 1 second after settings have stopped being changed. This means that while dragging sliders in the UI, settings won't be written repeatedly. This reduces wear on system storage and improves performance, as saving is expensive. --- .../src/main/java/org/photonvision/Main.java | 4 +-- .../common/configuration/ConfigManager.java | 27 ++++++++++++++++--- .../photonvision/common/logging/Logger.java | 2 +- .../photonvision/server/RequestHandler.java | 2 +- .../vision/processes/VisionModule.java | 6 ----- .../common/configuration/ConfigTest.java | 2 +- 6 files changed, 28 insertions(+), 15 deletions(-) diff --git a/photon-server/src/main/java/org/photonvision/Main.java b/photon-server/src/main/java/org/photonvision/Main.java index e8d17244d..7448e78c4 100644 --- a/photon-server/src/main/java/org/photonvision/Main.java +++ b/photon-server/src/main/java/org/photonvision/Main.java @@ -46,8 +46,7 @@ public class Main { public static final int DEFAULT_WEBPORT = 5800; private static final Logger logger = new Logger(Main.class, LogGroup.General); - private static final boolean isRelease = - !PhotonVersion.isRelease; // Hack!!!! Until PhotonVersion script fixed + private static final boolean isRelease = PhotonVersion.isRelease; private static boolean isTestMode; private static boolean printDebugLogs; @@ -146,6 +145,7 @@ public class Main { logger.error("Failed to parse command-line options!", e); } + System.out.println("Running in " + (isRelease ? "release" : "development") + " mode!"); var logLevel = (isRelease || printDebugLogs) ? LogLevel.INFO : LogLevel.DEBUG; Logger.setLevel(LogGroup.Camera, logLevel); Logger.setLevel(LogGroup.WebServer, logLevel); diff --git a/photon-server/src/main/java/org/photonvision/common/configuration/ConfigManager.java b/photon-server/src/main/java/org/photonvision/common/configuration/ConfigManager.java index 76c090498..d700efef4 100644 --- a/photon-server/src/main/java/org/photonvision/common/configuration/ConfigManager.java +++ b/photon-server/src/main/java/org/photonvision/common/configuration/ConfigManager.java @@ -28,6 +28,7 @@ import java.util.*; import java.util.stream.Collectors; import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.Logger; +import org.photonvision.common.util.TimedTaskManager; import org.photonvision.common.util.file.FileUtils; import org.photonvision.common.util.file.JacksonUtils; import org.photonvision.vision.pipeline.CVPipelineSettings; @@ -46,6 +47,8 @@ public class ConfigManager { final File configDirectoryFile; + private long saveRequestTimestamp = -1; + public static ConfigManager getInstance() { if (INSTANCE == null) { INSTANCE = new ConfigManager(getRootFolder()); @@ -83,6 +86,8 @@ public class ConfigManager { new File(Path.of(configDirectoryFile.toString(), "networkSettings.json").toUri()); this.camerasFolder = new File(Path.of(configDirectoryFile.toString(), "cameras").toUri()); + TimedTaskManager.getInstance().addTask("ConfigManager", this::checkSaveAndWrite, 1000); + load(); } @@ -155,7 +160,7 @@ public class ConfigManager { this.config = new PhotonConfiguration(hardwareConfig, networkConfig, cameraConfigurations); } - public void save() { + public void saveToDisk() { logger.info("Saving settings..."); try { @@ -305,12 +310,12 @@ public class ConfigManager { .map(it -> it.getSettables().getConfiguration()) .collect(Collectors.toList()); getConfig().addCameraConfigs(list); - save(); + requestSave(); } public void saveModule(CameraConfiguration config, String uniqueName) { getConfig().addCameraConfig(uniqueName, config); - save(); + requestSave(); } public File getSettingsFolderAsZip() { @@ -325,7 +330,7 @@ public class ConfigManager { public void setNetworkSettings(NetworkConfig networkConfig) { getConfig().setNetworkConfig(networkConfig); - save(); + requestSave(); } public Path getLogPath() { @@ -336,4 +341,18 @@ public class ConfigManager { if (!logFile.getParentFile().exists()) logFile.getParentFile().mkdirs(); return logFile.toPath(); } + + public void requestSave() { + logger.debug("Requesting save..."); + saveRequestTimestamp = System.currentTimeMillis(); + } + + private void checkSaveAndWrite() { + // Only save if 1 second has past since the request was made + if (saveRequestTimestamp > 0 && (System.currentTimeMillis() - saveRequestTimestamp) > 1000L) { + saveRequestTimestamp = -1; + logger.debug("Saving to disk..."); + saveToDisk(); + } + } } diff --git a/photon-server/src/main/java/org/photonvision/common/logging/Logger.java b/photon-server/src/main/java/org/photonvision/common/logging/Logger.java index e5eee1aae..373007301 100644 --- a/photon-server/src/main/java/org/photonvision/common/logging/Logger.java +++ b/photon-server/src/main/java/org/photonvision/common/logging/Logger.java @@ -257,7 +257,7 @@ public class Logger { } catch (IOException ignored) { } }, - 30000L); + 3000L); } catch (FileNotFoundException e) { out = null; System.err.println("Unable to log to file " + logFilePath.toString()); diff --git a/photon-server/src/main/java/org/photonvision/server/RequestHandler.java b/photon-server/src/main/java/org/photonvision/server/RequestHandler.java index af83461eb..5fb055c6e 100644 --- a/photon-server/src/main/java/org/photonvision/server/RequestHandler.java +++ b/photon-server/src/main/java/org/photonvision/server/RequestHandler.java @@ -75,7 +75,7 @@ public class RequestHandler { var networkConfig = NetworkConfig.fromHashMap(networking); ConfigManager.getInstance().setNetworkSettings(networkConfig); - ConfigManager.getInstance().save(); + ConfigManager.getInstance().requestSave(); NetworkManager.getInstance().reinitialize(); NetworkTablesManager.setClientMode(null); // TODO diff --git a/photon-server/src/main/java/org/photonvision/vision/processes/VisionModule.java b/photon-server/src/main/java/org/photonvision/vision/processes/VisionModule.java index e35484ca5..cda06b640 100644 --- a/photon-server/src/main/java/org/photonvision/vision/processes/VisionModule.java +++ b/photon-server/src/main/java/org/photonvision/vision/processes/VisionModule.java @@ -318,12 +318,6 @@ public class VisionModule { config.driveModeSettings = pipelineManager.driverModePipeline.getSettings(); config.currentPipelineIndex = Math.max(pipelineManager.getCurrentPipelineIndex(), -1); - logger.info( - "Saving state with " - + config.calibrations.size() - + " calibrated resolutions and index " - + config.currentPipelineIndex); - return config; } diff --git a/photon-server/src/test/java/org/photonvision/common/configuration/ConfigTest.java b/photon-server/src/test/java/org/photonvision/common/configuration/ConfigTest.java index 2e135fdb1..e16f12946 100644 --- a/photon-server/src/test/java/org/photonvision/common/configuration/ConfigTest.java +++ b/photon-server/src/test/java/org/photonvision/common/configuration/ConfigTest.java @@ -70,7 +70,7 @@ public class ConfigTest { Logger.setLevel(LogGroup.General, LogLevel.TRACE); configMgr.getConfig().addCameraConfig(cameraConfig); - configMgr.save(); + configMgr.saveToDisk(); var camConfDir = new File(