From aa9a21c638858572f2a574d0d1d197d3d867a5cd Mon Sep 17 00:00:00 2001 From: Kerboul Date: Wed, 2 Apr 2025 10:28:59 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20la=20v=C3=A9rification=20de=20l'oc?= =?UTF-8?q?cupation=20de=20la=20cam=C3=A9ra=20et=20r=C3=A9initialisation?= =?UTF-8?q?=20des=20statuts=20des=20projets=20lors=20du=20red=C3=A9marrage?= =?UTF-8?q?=20du=20backend.=20Mise=20=C3=A0=20jour=20des=20param=C3=A8tres?= =?UTF-8?q?=20de=20la=20cam=C3=A9ra=20et=20modification=20du=20statut=20de?= =?UTF-8?q?s=20vid=C3=A9os.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/cameraRoutes.js | 246 ++++++++++++++++++++++++++------------ src/video/videoManager.js | 2 +- 2 files changed, 171 insertions(+), 77 deletions(-) diff --git a/routes/cameraRoutes.js b/routes/cameraRoutes.js index b275599..4faf03e 100644 --- a/routes/cameraRoutes.js +++ b/routes/cameraRoutes.js @@ -11,9 +11,7 @@ const serverError = require('../utils/serverError'); var defaultCaptureInterval = 5; // minutes var defaultMaintenance = 0; - -var captureInterval = defaultCaptureInterval; // intervalle de capture en minutes -var maintenance = defaultMaintenance; // 0 = pas de maintenance, 1 = maintenance +var defaultActive = 0; // 0 = pas de capture, 1 = capture en cours function initCamera() { const query = 'SELECT * FROM public.camera WHERE id = $1'; @@ -27,10 +25,10 @@ function initCamera() { if (result.rows.length === 0) { const insertQuery = ` - INSERT INTO public.camera (id, interval, maintenance) - VALUES ($1, $2, $3) + INSERT INTO public.camera (id, interval, maintenance, active) + VALUES ($1, $2, $3, $4) `; - const insertValues = [1, defaultCaptureInterval, defaultMaintenance]; + const insertValues = [1, defaultCaptureInterval, defaultMaintenance, defaultActive]; db.query(insertQuery, insertValues, (err) => { if (err) { @@ -45,31 +43,31 @@ function initCamera() { }); } -function getCamera() { +async function getCamera() { // retourner l'état de la caméra const query = 'SELECT * FROM public.camera WHERE id = $1'; const values = [1]; - db.query(query, values, (err, result) => { - if (err) { - console.error('Erreur lors de la récupération de l\'entrée caméra:', err); - return; - } + + try { + const result = await db.query(query, values); if (result.rows.length === 0) { console.log('Aucune entrée caméra trouvée.'); - return; + return null; } const camera = result.rows[0]; - captureInterval = camera.interval; - maintenance = camera.maintenance; - console.log('Caméra récupérée avec succès:', camera); - }); - return { - captureInterval: captureInterval, - maintenance: maintenance - }; + + return { + captureInterval: camera.interval, + maintenance: camera.maintenance, + active: camera.active, + }; + } catch (err) { + console.error('Erreur lors de la récupération de l\'entrée caméra:', err); + throw err; + } } function printCameraStatus() { @@ -77,11 +75,115 @@ function printCameraStatus() { console.log('Statut de la caméra:'); console.log('Intervalle de capture:', camera.captureInterval, 'minutes'); console.log('Maintenance:', camera.maintenance === 1 ? 'En cours' : 'Aucune'); + console.log('Statut de la capture:', camera.active === 1 ? 'En cours' : 'Arrêté'); console.log('-----------------------------------'); } function isCameraOccupied() { - return getCamera().captureStatus === 1; + try { + const query = 'SELECT id FROM public.projects WHERE status = $1 LIMIT 1'; + const values = [1]; + + return new Promise((resolve, reject) => { + db.query(query, values, (err, result) => { + if (err) { + console.error('Erreur lors de la vérification de l\'occupation de la caméra:', err); + reject(err); + } else { + const isOccupied = result.rows.length > 0 ? result.rows[0].id : null; + resolve(isOccupied); + } + }); + }); + + } catch (err) { + console.error('Erreur inattendue lors de la vérification de l\'occupation de la caméra:', err); + } +} + +function getCurrentProject() { + // retourner le projet en cours (status 1) + try { + const query = 'SELECT * FROM public.projects WHERE status = $1 LIMIT 1'; + const values = [1]; + + return new Promise((resolve, reject) => { + db.query(query, values, (err, result) => { + if (err) { + console.error('Erreur lors de la récupération du projet en cours:', err); + reject(err); + } else if (result.rows.length === 0) { + console.log('Aucun projet en cours trouvé.'); + resolve(null); + } else { + const currentProject = result.rows[0]; + console.log('Projet en cours récupéré avec succès:', currentProject); + resolve(currentProject); + } + }); + }); + } catch (err) { + console.error('Erreur inattendue lors de la récupération du projet en cours:', err); + } +} + +function resetProjectStatus() { + // repasser tous les projets en status 1 à 0 (stopped) + const query = 'UPDATE public.projects SET status = $1 WHERE status = $2'; + const values = [0, 1]; + + db.query(query, values, (err) => { + if (err) { + console.error('Erreur lors de la réinitialisation du statut des projets:', err); + } else { + console.log('Statut des projets réinitialisé avec succès.'); + } + }); +} + +function activateCamera() { + // activer la caméra (status 1) + const query = 'UPDATE public.camera SET active = $1 WHERE id = $2'; + const values = [1, 1]; + + db.query(query, values, (err) => { + if (err) { + console.error('Erreur lors de l\'activation de la caméra:', err); + } else { + console.log('Caméra activée avec succès.'); + } + }); +} + +function deactivateCamera() { + // désactiver la caméra (status 0) + const query = 'UPDATE public.camera SET active = $1 WHERE id = $2'; + const values = [0, 1]; + + db.query(query, values, (err) => { + if (err) { + console.error('Erreur lors de la désactivation de la caméra:', err); + } else { + console.log('Caméra désactivée avec succès.'); + } + }); +} + +function changeProjectStatus(projectId, status) { + try { + const query = 'UPDATE public.projects SET status = $1 WHERE id = $2'; + const values = [status, projectId]; + + db.query(query, values, (err) => { + if (err) { + console.error('Erreur lors de la modification du statut du projet:', err); + } else { + console.log(`Statut du projet ID ${projectId} modifié avec succès à ${status}.`); + } + }); + } catch (err) { + console.error('Une erreur inattendue s\'est produite lors de la modification du statut du projet:', err); + } } initCamera(); @@ -128,72 +230,64 @@ router.get('/camera/status', async (req, res) => { ); router.post('/procedure/start/', async (req, res) => { - const { projectId, interval } = req.body; + const { projectId, interval, maintenance } = req.body; try { - const result = startProcedure(projectId, interval); + const result = startProcedure(projectId, interval, maintenance); res.status(200).json(result); } catch (err) { serverError.sendError('Erreur lors du démarrage de la procédure de capture:', res, err, 500); } }); -function startProcedure(projectId, interval) { +function setCameraSettings(interval, maintenance) { + try { + const query = ` + UPDATE public.camera + SET interval = $1, maintenance = $2 + WHERE id = $3 + `; + const values = [interval, maintenance, 1]; + + db.query(query, values, (err) => { + if (err) { + console.error('Erreur lors de la mise à jour des paramètres de la caméra:', err); + } else { + console.log('Paramètres de la caméra mis à jour avec succès.'); + captureInterval = interval; + maintenance = maintenance; + } + }); + } catch (err) { + console.error('Une erreur inattendue s\'est produite lors de la mise à jour des paramètres de la caméra:', err); + } +} + +function startProcedure(projectId, interval, maintenance) { + if (isNaN(projectId) || isNaN(interval) || isNaN(maintenance)) { + return { error: 'Invalid parameters' }; + } if (isCameraOccupied()) { - return { message: 'Caméra Occupée : Le projet ID ' + captureProjectID + ' est déjà en cours de capture.' }; + return { error: 'Camera is occupied by another project' }; + } else { + activateCamera(); + setCameraSettings(interval, maintenance); + changeProjectStatus(projectId, 1); // changer le statut du projet en cours à 1 (en cours) + console.log('Procédure de capture démarrée avec succès.'); + return { message: 'Capture procedure started successfully' }; } - console.log('Démarrage de la procédure de capture'); - exists = db.query('SELECT * FROM public.projects WHERE id = $1', [projectId]); - if (!exists) { - return { message: 'Le projet ID ' + projectId + ' n\'existe pas.' }; - } - if (interval < minInterval) { - return { message: 'L\'intervalle de capture doit être supérieur ou égal à ' + minInterval + ' minutes.' }; - } - // if (interval > maxInterval) { - // return { message: 'L\'intervalle de capture doit être inférieur ou égal à ' + maxInterval + ' minutes.' }; - // } - - // Application des valeurs - captureProjectID = projectId; - captureInterval = interval; - - //via la DB changer le status du projet - const query = 'UPDATE public.projects SET status = $2 WHERE id = $1 RETURNING *'; - const values = [projectId, 1]; - db.query(query, values, (err, res) => { - if (err) { - console.error('Erreur lors de la mise à jour du statut (activation) du projet:', err); - return { message: 'Erreur lors de la mise à jour du statut (activation) du projet.' }; - } - }); - - console.log('Procédure de capture démarrée avec succès, projet ID: ' + projectId + ', interval: ' + interval + ' minutes.'); - return { message: 'Procédure de capture démarrée avec succès, projet ID: ' + projectId + ', interval: ' + interval + ' minutes.' }; } function stopProcedure() { - oldProjectID = captureProjectID; - oldInterval = captureInterval; - console.log('Ancien Projet : ' + oldProjectID + ', Ancien Intervalle : ' + oldInterval); - - // Application du reset - captureProjectID = -1; - captureInterval = 0; - console.log('Nouveau Projet : ' + captureProjectID + ', Nouvel Intervalle : ' + captureInterval); - - console.log('Arrêt de la procédure de capture'); - - //via la DB changer le status du projet - const query = 'UPDATE public.projects SET status = $2 WHERE id = $1 RETURNING *'; - const values = [oldProjectID, 0]; - db.query(query, values, (err, res) => { - if (err) { - console.error('Erreur lors de la mise à jour du statut (désactivation) du projet:', err); - return { message: 'Erreur lors de la mise à jour du statut (désactivation) du projet.' }; - } - }); - - return { message: 'Procédure de capture arrêtée avec succès, projet ID: ' + oldProjectID + ', interval: ' + oldInterval + ' minutes.' }; + var project = getCurrentProject(); + if (project) { + resetProjectStatus(); // réinitialiser le statut du projet en cours + deactivateCamera(); // désactiver la caméra + changeProjectStatus(project.id, 2); // changer le statut du projet en cours à 2 (terminé) + console.log('Procédure de capture arrêtée avec succès.'); + return { message: 'Capture procedure stopped successfully' }; + } else { + return { error: 'No project is currently being captured' }; + } } diff --git a/src/video/videoManager.js b/src/video/videoManager.js index cd94672..2c38794 100644 --- a/src/video/videoManager.js +++ b/src/video/videoManager.js @@ -16,7 +16,7 @@ const PROJECTS_DIR = path.join('.'); async function createVideoProject(projectId, measurementIds, name, resolution, duration) { // insérer une nouvelle vidéo dans la base de données - const status = 0; // 0 = en attente, 1 = en cours, 2 = terminé, 3 = annulé (depreciated) + const status = 0; // 0 = brouillon, 1 = en cours, 2 = terminé const query = 'INSERT INTO public.videos (project_id, measurement_ids, name, resolution, duration, status) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id'; const values = [projectId, measurementIds, name, resolution, duration, status]; const res = await db.query(query, values);