Ajout de la vérification de l'occupation de la caméra et réinitialisation des statuts des projets lors du redémarrage du backend. Mise à jour des paramètres de la caméra et modification du statut des vidéos.
This commit is contained in:
@@ -11,9 +11,7 @@ const serverError = require('../utils/serverError');
|
|||||||
|
|
||||||
var defaultCaptureInterval = 5; // minutes
|
var defaultCaptureInterval = 5; // minutes
|
||||||
var defaultMaintenance = 0;
|
var defaultMaintenance = 0;
|
||||||
|
var defaultActive = 0; // 0 = pas de capture, 1 = capture en cours
|
||||||
var captureInterval = defaultCaptureInterval; // intervalle de capture en minutes
|
|
||||||
var maintenance = defaultMaintenance; // 0 = pas de maintenance, 1 = maintenance
|
|
||||||
|
|
||||||
function initCamera() {
|
function initCamera() {
|
||||||
const query = 'SELECT * FROM public.camera WHERE id = $1';
|
const query = 'SELECT * FROM public.camera WHERE id = $1';
|
||||||
@@ -27,10 +25,10 @@ function initCamera() {
|
|||||||
|
|
||||||
if (result.rows.length === 0) {
|
if (result.rows.length === 0) {
|
||||||
const insertQuery = `
|
const insertQuery = `
|
||||||
INSERT INTO public.camera (id, interval, maintenance)
|
INSERT INTO public.camera (id, interval, maintenance, active)
|
||||||
VALUES ($1, $2, $3)
|
VALUES ($1, $2, $3, $4)
|
||||||
`;
|
`;
|
||||||
const insertValues = [1, defaultCaptureInterval, defaultMaintenance];
|
const insertValues = [1, defaultCaptureInterval, defaultMaintenance, defaultActive];
|
||||||
|
|
||||||
db.query(insertQuery, insertValues, (err) => {
|
db.query(insertQuery, insertValues, (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -45,31 +43,31 @@ function initCamera() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCamera() {
|
async function getCamera() {
|
||||||
// retourner l'état de la caméra
|
// retourner l'état de la caméra
|
||||||
const query = 'SELECT * FROM public.camera WHERE id = $1';
|
const query = 'SELECT * FROM public.camera WHERE id = $1';
|
||||||
const values = [1];
|
const values = [1];
|
||||||
db.query(query, values, (err, result) => {
|
|
||||||
if (err) {
|
try {
|
||||||
console.error('Erreur lors de la récupération de l\'entrée caméra:', err);
|
const result = await db.query(query, values);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.rows.length === 0) {
|
if (result.rows.length === 0) {
|
||||||
console.log('Aucune entrée caméra trouvée.');
|
console.log('Aucune entrée caméra trouvée.');
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const camera = result.rows[0];
|
const camera = result.rows[0];
|
||||||
captureInterval = camera.interval;
|
|
||||||
maintenance = camera.maintenance;
|
|
||||||
|
|
||||||
console.log('Caméra récupérée avec succès:', camera);
|
console.log('Caméra récupérée avec succès:', camera);
|
||||||
});
|
|
||||||
return {
|
return {
|
||||||
captureInterval: captureInterval,
|
captureInterval: camera.interval,
|
||||||
maintenance: maintenance
|
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() {
|
function printCameraStatus() {
|
||||||
@@ -77,11 +75,115 @@ function printCameraStatus() {
|
|||||||
console.log('Statut de la caméra:');
|
console.log('Statut de la caméra:');
|
||||||
console.log('Intervalle de capture:', camera.captureInterval, 'minutes');
|
console.log('Intervalle de capture:', camera.captureInterval, 'minutes');
|
||||||
console.log('Maintenance:', camera.maintenance === 1 ? 'En cours' : 'Aucune');
|
console.log('Maintenance:', camera.maintenance === 1 ? 'En cours' : 'Aucune');
|
||||||
|
console.log('Statut de la capture:', camera.active === 1 ? 'En cours' : 'Arrêté');
|
||||||
console.log('-----------------------------------');
|
console.log('-----------------------------------');
|
||||||
}
|
}
|
||||||
|
|
||||||
function isCameraOccupied() {
|
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();
|
initCamera();
|
||||||
@@ -128,72 +230,64 @@ router.get('/camera/status', async (req, res) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
router.post('/procedure/start/', async (req, res) => {
|
router.post('/procedure/start/', async (req, res) => {
|
||||||
const { projectId, interval } = req.body;
|
const { projectId, interval, maintenance } = req.body;
|
||||||
try {
|
try {
|
||||||
const result = startProcedure(projectId, interval);
|
const result = startProcedure(projectId, interval, maintenance);
|
||||||
res.status(200).json(result);
|
res.status(200).json(result);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
serverError.sendError('Erreur lors du démarrage de la procédure de capture:', res, err, 500);
|
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()) {
|
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() {
|
function stopProcedure() {
|
||||||
oldProjectID = captureProjectID;
|
var project = getCurrentProject();
|
||||||
oldInterval = captureInterval;
|
if (project) {
|
||||||
console.log('Ancien Projet : ' + oldProjectID + ', Ancien Intervalle : ' + oldInterval);
|
resetProjectStatus(); // réinitialiser le statut du projet en cours
|
||||||
|
deactivateCamera(); // désactiver la caméra
|
||||||
// Application du reset
|
changeProjectStatus(project.id, 2); // changer le statut du projet en cours à 2 (terminé)
|
||||||
captureProjectID = -1;
|
console.log('Procédure de capture arrêtée avec succès.');
|
||||||
captureInterval = 0;
|
return { message: 'Capture procedure stopped successfully' };
|
||||||
console.log('Nouveau Projet : ' + captureProjectID + ', Nouvel Intervalle : ' + captureInterval);
|
} else {
|
||||||
|
return { error: 'No project is currently being captured' };
|
||||||
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.' };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ const PROJECTS_DIR = path.join('.');
|
|||||||
|
|
||||||
async function createVideoProject(projectId, measurementIds, name, resolution, duration) {
|
async function createVideoProject(projectId, measurementIds, name, resolution, duration) {
|
||||||
// insérer une nouvelle vidéo dans la base de données
|
// 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 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 values = [projectId, measurementIds, name, resolution, duration, status];
|
||||||
const res = await db.query(query, values);
|
const res = await db.query(query, values);
|
||||||
|
|||||||
Reference in New Issue
Block a user