From d9a584842aefa9e709104231ca62fe9ae9989b86 Mon Sep 17 00:00:00 2001 From: harsshks Date: Thu, 29 Jan 2026 01:11:16 +0530 Subject: [PATCH 1/4] feat(calibration): fullscreen mode and camera preview fix - Enter fullscreen during training and validation - Exit fullscreen on completion or route leave - Fix camera preview being clipped by stepper container - Allow natural scrolling during calibration Fixes #100 --- .gitignore | 3 + src/App.vue | 21 ++ src/main.js | 19 +- src/store/calibration.js | 125 ++++---- src/views/CameraConfiguration.vue | 398 ++++++++++++++++++++++++++ src/views/DoubleCalibrationRecord.vue | 371 +++++++++++++++++++++++- vue.config.js | 13 +- 7 files changed, 864 insertions(+), 86 deletions(-) diff --git a/.gitignore b/.gitignore index 499bd980..61ced855 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ pnpm-debug.log* *.njsproj *.sln *.sw? + +# Firebase config (local only) +src/firebase.js diff --git a/src/App.vue b/src/App.vue index 23c43a10..fff870f6 100644 --- a/src/App.vue +++ b/src/App.vue @@ -12,3 +12,24 @@ export default { name: 'App', }; + + diff --git a/src/main.js b/src/main.js index 910184c9..50619057 100644 --- a/src/main.js +++ b/src/main.js @@ -2,25 +2,16 @@ import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' -import vuetify from './plugins/vuetify'; +import vuetify from './plugins/vuetify' import './services/axios' +<<<<<<< HEAD import firebase from 'firebase/app' import 'firebase/firestore' +======= -Vue.config.productionTip = false - -const firebaseConfig = { - apiKey: process.env.VUE_APP_FIREBASE_API_KEY, - authDomain: process.env.VUE_APP_FIREBASE_AUTH_DOMAIN, - projectId: process.env.VUE_APP_FIREBASE_PROJECT_ID, - storageBucket: process.env.VUE_APP_FIREBASE_STORAGE_BUCKET, - messagingSenderId: process.env.VUE_APP_FIREBASE_MESSAGING_SENDER_ID, - appId: process.env.VUE_APP_FIREBASE_APP_ID, - measurementId: process.env.VUE_APP_FIREBASE_MEASUREMENT_ID, -}; +>>>>>>> 2b1bb29 (feat(calibration): fullscreen mode and camera preview fix) -// Initialize Firebase -firebase.initializeApp(firebaseConfig); +Vue.config.productionTip = false new Vue({ router, diff --git a/src/store/calibration.js b/src/store/calibration.js index beb8026a..c64b3663 100644 --- a/src/store/calibration.js +++ b/src/store/calibration.js @@ -1,7 +1,13 @@ +<<<<<<< HEAD import axios from 'axios'; import firebase from 'firebase/app'; import 'firebase/firestore'; import router from '@/router'; +======= +import axios from "axios"; +import firebase from "@/firebase"; +import router from "@/router"; +>>>>>>> 2b1bb29 (feat(calibration): fullscreen mode and camera preview fix) export default { state: { calibName: "", @@ -180,20 +186,18 @@ export default { return positions; }, - async saveCalib(context) { - const state = context.state; - const db = firebase.firestore(); - const calibrationData = { ...state }; - delete calibrationData.calibrations; - try { - const calibrationsCollection = db.collection("calibrations"); - await calibrationsCollection.add(calibrationData); - console.log("Data successfully saved to calibrations collection!"); - context.dispatch("getAllCalibs"); - } catch (error) { - console.error("Error saving data to calibrations collection:", error); - } - }, + async saveCalib({ state, dispatch }) { + try { + const data = { ...state }; + delete data.calibrations; + + await firebase.firestore().collection("calibrations").add(data); + dispatch("getAllCalibs"); + } catch (e) { + console.error("Save failed:", e); + } + }, + async finishCalibration({ state, dispatch }) { console.log("[Calibration] finishCalibration started"); @@ -250,48 +254,63 @@ export default { commit("setMsPerCapture", calibData.msPerCapture); router.push("/postCalibration"); }, - async getAllCalibs({ commit }) { - try { - const db = firebase.firestore(); - const calibrationsCollection = await db - .collection("calibrations") - .get(); + async getAllCalibs({ commit }) { + try { + const snapshot = await firebase + .firestore() + .collection("calibrations") + .get(); - const calibrations = []; - calibrationsCollection.forEach((doc) => { - var averageAccuracy = 0; - var averagePrecision = 0; - var data = doc.data(); - data.pattern.forEach((element) => { - averageAccuracy += Number(element.accuracy); - averagePrecision += Number(element.precision); - }); - data.averageAccuracy = averageAccuracy / data.pattern.length; - data.averagePrecision = averagePrecision / data.pattern.length; - calibrations.push({ - id: doc.id, - model: doc.data().models, - ...data, - }); - }); + const calibrations = []; - commit("setCalibrations", calibrations); - } catch (error) { - console.error("Error getting calibrations:", error); - throw error; - } - }, - async deleteCalib({ dispatch }, calib) { - try { - const db = firebase.firestore(); - const calibrationsCollection = db.collection("calibrations"); - await calibrationsCollection.doc(calib.id).delete(); - dispatch("getAllCalibs"); - } catch (error) { - console.error("Error deleting calibration:", error); - return { success: false, message: "Failed to delete calibration" }; + snapshot.forEach((doc) => { + const data = doc.data(); + + let averageAccuracy = 0; + let averagePrecision = 0; + + if (data.runtime?.usedPattern?.length) { + const total = data.runtime.usedPattern.length; + + averageAccuracy = + data.runtime.usedPattern.reduce( + (sum, p) => sum + Number(p.accuracy || 0), + 0 + ) / total; + + averagePrecision = + data.runtime.usedPattern.reduce( + (sum, p) => sum + Number(p.precision || 0), + 0 + ) / total; } - }, + + calibrations.push({ + id: doc.id, + ...data, + averageAccuracy: Number(averageAccuracy.toFixed(2)), + averagePrecision: Number(averagePrecision.toFixed(2)), + }); + }); + + commit("setCalibrations", calibrations); + } catch (err) { + console.error("Error getting calibrations:", err); + } + }, + async deleteCalib({ dispatch }, calib) { + try { + await firebase + .firestore() + .collection("calibrations") + .doc(calib.id) + .delete(); + + dispatch("getAllCalibs"); + } catch (e) { + console.error("Delete failed:", e); + } + }, async sendData(context, data) { let formData = new FormData(); diff --git a/src/views/CameraConfiguration.vue b/src/views/CameraConfiguration.vue index bd395dbe..ff9abd9a 100644 --- a/src/views/CameraConfiguration.vue +++ b/src/views/CameraConfiguration.vue @@ -1,4 +1,5 @@ diff --git a/src/views/DoubleCalibrationRecord.vue b/src/views/DoubleCalibrationRecord.vue index db8641dc..ace7dbfb 100644 --- a/src/views/DoubleCalibrationRecord.vue +++ b/src/views/DoubleCalibrationRecord.vue @@ -1,6 +1,5 @@