From bf156f544ee3a6020a6e9c20405263d24411c412 Mon Sep 17 00:00:00 2001 From: Sriman Achanta <68172138+srimanachanta@users.noreply.github.com> Date: Sat, 6 Jan 2024 09:43:29 -0500 Subject: [PATCH] Update HTTP based settings when new fullsettings are emited (#1122) Previously, if someone were changing network or camera settings while the backend sent an update request, the frontend wouldn't update the UI until the HTTP request was sent, likely leading to an error or confusion, now, values will be reset whenever new settings are sent. It also checks that settings were changed before allowing the user to click the save button. --- .../components/cameras/CameraSettingsCard.vue | 132 +++++++++++------- .../components/settings/NetworkingCard.vue | 22 ++- .../stores/settings/CameraSettingsStore.ts | 12 +- photon-client/src/types/SettingTypes.ts | 41 +++--- .../photonvision/server/RequestHandler.java | 1 - 5 files changed, 119 insertions(+), 89 deletions(-) diff --git a/photon-client/src/components/cameras/CameraSettingsCard.vue b/photon-client/src/components/cameras/CameraSettingsCard.vue index 4e9ef78ac..ce4da1188 100644 --- a/photon-client/src/components/cameras/CameraSettingsCard.vue +++ b/photon-client/src/components/cameras/CameraSettingsCard.vue @@ -4,21 +4,78 @@ import PvNumberInput from "@/components/common/pv-number-input.vue"; import { useCameraSettingsStore } from "@/stores/settings/CameraSettingsStore"; import { useStateStore } from "@/stores/StateStore"; import { computed, ref, watchEffect } from "vue"; +import { type CameraSettingsChangeRequest, ValidQuirks } from "@/types/SettingTypes"; -const currentFov = ref(); +const tempSettingsStruct = ref({ + fov: useCameraSettingsStore().currentCameraSettings.fov.value, + quirksToChange: Object.assign({}, useCameraSettingsStore().currentCameraSettings.cameraQuirks.quirks) +}); + +const arducamSelectWrapper = computed({ + get: () => { + if (tempSettingsStruct.value.quirksToChange.ArduOV9281) return 1; + else if (tempSettingsStruct.value.quirksToChange.ArduOV2311) return 2; + else return 0; + }, + set: (v) => { + switch (v) { + case 1: + tempSettingsStruct.value.quirksToChange.ArduOV9281 = true; + tempSettingsStruct.value.quirksToChange.ArduOV2311 = false; + break; + case 2: + tempSettingsStruct.value.quirksToChange.ArduOV9281 = false; + tempSettingsStruct.value.quirksToChange.ArduOV2311 = true; + break; + default: + tempSettingsStruct.value.quirksToChange.ArduOV9281 = false; + tempSettingsStruct.value.quirksToChange.ArduOV2311 = false; + break; + } + } +}); + +const currentCameraIsArducam = computed( + () => useCameraSettingsStore().currentCameraSettings.cameraQuirks.quirks.ArduCamCamera +); + +const settingsHaveChanged = (): boolean => { + const a = tempSettingsStruct.value; + const b = useCameraSettingsStore().currentCameraSettings; + + for (const q in ValidQuirks) { + if (a.quirksToChange[q] != b.cameraQuirks.quirks[q]) return true; + } + + return a.fov != b.fov.value; +}; + +const resetTempSettingsStruct = () => { + tempSettingsStruct.value.fov = useCameraSettingsStore().currentCameraSettings.fov.value; + tempSettingsStruct.value.quirksToChange = Object.assign( + {}, + useCameraSettingsStore().currentCameraSettings.cameraQuirks.quirks + ); +}; const saveCameraSettings = () => { useCameraSettingsStore() - .updateCameraSettings({ fov: currentFov.value, quirksToChange: quirksToChange.value }, false) + .updateCameraSettings(tempSettingsStruct.value) .then((response) => { - useCameraSettingsStore().currentCameraSettings.fov.value = currentFov.value; useStateStore().showSnackbarMessage({ color: "success", message: response.data.text || response.data }); + + // Update the local settings cause the backend checked their validity. Assign is to deref value + useCameraSettingsStore().currentCameraSettings.fov.value = tempSettingsStruct.value.fov; + useCameraSettingsStore().currentCameraSettings.cameraQuirks.quirks = Object.assign( + {}, + tempSettingsStruct.value.quirksToChange + ); }) .catch((error) => { - currentFov.value = useCameraSettingsStore().currentCameraSettings.fov.value; + resetTempSettingsStruct(); if (error.response) { useStateStore().showSnackbarMessage({ color: "error", @@ -39,45 +96,9 @@ const saveCameraSettings = () => { }; watchEffect(() => { - currentFov.value = useCameraSettingsStore().currentCameraSettings.fov.value; + // Reset temp settings on remote camera settings change + resetTempSettingsStruct(); }); - -const quirksToChange = ref({ - ArduOV9281: false, - ArduOV2311: false -}); - -let arducams = ["N/A", "OV9281", "OV2311"]; - -const arducamModel = computed({ - get() { - const quirks = useCameraSettingsStore().currentCameraSettings.cameraQuirks.quirks; - - if (quirks.ArduOV9281) { - return 1; - } else if (quirks.ArduOV2311) { - return 2; - } - return 0; - }, - set(value) { - if (value === 1) { - quirksToChange.value.ArduOV9281 = true; - quirksToChange.value.ArduOV2311 = false; - } else if (value === 2) { - quirksToChange.value.ArduOV9281 = false; - quirksToChange.value.ArduOV2311 = true; - } else { - quirksToChange.value.ArduOV9281 = false; - quirksToChange.value.ArduOV2311 = false; - } - } -}); - -const isArducam = () => { - const settings = useCameraSettingsStore().currentCameraSettings; - return settings.cameraQuirks.quirks.ArduCamCamera; -};