Commit 3e93ea27 authored by Kylian ou Nathan's avatar Kylian ou Nathan
Browse files

Update

parent 111e98de
node_modules/
capture/
yarn.lock
\ No newline at end of file
const express = require('express')
const app = express()
const fs = require("fs");
const http = require('http');
const FormData = require('form-data');
const axios = require('axios');
const readline = require('readline');
const raspivid = require('raspivid');
/**
* TODO : DEBUG a replacer par une interface gpio
*/
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var STREAMING = []
var CAMERA = require('raspberry-pi-camera-native')
/**
* ? FN GET qui renvoit le stream vidéo en MJPEG
*/
app.get('/stream', function(req, res) {
const cameraOptions = {
width: 720,
height: 480,
fps: 16,
encoding: 'JPEG',
quality: 7
};
CAMERA.start(cameraOptions);
STREAMING.push(true)
res.writeHead(200, {
'Cache-Control': 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0',
Pragma: 'no-cache',
Connection: 'close',
'Content-Type': 'multipart/x-mixed-replace; boundary=--myboundary'
});
console.log("\nNouvelle connection au flux vidéo : " + req.hostname)
let isReady = true;
let frameHandler = (frameData) => {
try {
if (!isReady) {
return;
}
isReady = false;
res.write('--myboundary\nContent-Type: image/jpg\nContent-length: ${frameData.length}\n\n');
res.write(frameData, function() {
isReady = true;
});
} catch (ex) {}
}
let frameEmitter = CAMERA.on('frame', frameHandler);
req.on('close', () => {
frameEmitter.removeListener('frame', frameHandler);
console.log('\nConnection terminée : ' + req.hostname);
STREAMING.pop()
});
});
var httpServer = http.createServer(app);
httpServer.listen(8080);
/**
* ? Méthode permettant de filmer pendant 1 minutes
*/
function record() {
if (STREAMING.length > 0) {
try {
CAMERA.stop()
} catch (err) {}
STREAMING = []
}
console.log("DEBUT ENREGISTREMENT")
var file = fs.createWriteStream(`${__dirname}/capture/${new Date().getTime()}.h264`);
var video = raspivid({
width: 1280,
height: 720,
framerate: 30,
timeout: 5 * 1000,
'codec': 'MJPEG'
});
video.pipe(file);
video.on("end", r => {
console.log("FIN ENREGISTREMENT")
})
}
/**
* ? Méthode permettant d'avertir le serveur de l'intrusion
*/
function intrusion() {
var formData = new FormData()
formData.append("type", "intrusion")
axios.post("http://lockhome.nrocher.fr/api", formData).then(res => {
console.log(res.data)
}).catch(err => {
console.error(err)
})
}
/**
* TODO : DEBUG : Doit être réplacé par un évenement d'un port GPIO (module de détection de mouvement)
*/
rl.on("line", input => {
switch (input) {
case "intrusion":
record()
intrusion()
break;
}
});
\ No newline at end of file
{
"dependencies": {
"axios": "^0.19.0",
"express": "^4.17.1",
"form-data": "^3.0.0",
"pi-camera": "^1.3.0",
"raspberry-pi-camera-native": "^0.0.0",
"raspivid": "^1.0.0",
"split-frames": "^2.4.2"
}
}
const express = require('express')
const app = express()
const fs = require("fs");
const http = require('http');
const FormData = require('form-data');
const axios = require('axios');
const readline = require('readline');
const raspivid = require('raspivid');
/**
* TODO : DEBUG a replacer par une interface gpio
*/
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var STREAMING = []
const SplitFrames = require('split-frames')
const JPEG_START = Buffer.from('\xff\xd8', 'binary')
const JPEG_END = Buffer.from('\xff\xd9', 'binary')
/**
* ? FN GET qui renvoit le stream vidéo en MJPEG
*/
app.get('/stream', function(req, res) {
const cameraOptions = {
width: 720,
height: 480,
fps: 16,
encoding: 'JPEG',
quality: 7
};
var video = raspivid({
width: 1280,
height: 720,
framerate: 16,
codec: 'MJPEG'
});
video.pipe(new SplitFrames({
startWith: JPEG_START,
endWith: JPEG_END
}));
video.on("end", r => {})
video.on('data', function(frame) {
...
})
req.on('close', () => {
console.log('\nConnection terminée : ' + req.hostname);
STREAMING.pop()
});
});
var httpServer = http.createServer(app);
httpServer.listen(8080);
/**
* ? Méthode permettant de filmer pendant 1 minutes
*/
function record() {
if (STREAMING.length > 0) {
try {
CAMERA.stop()
} catch (err) {}
STREAMING = []
}
console.log("DEBUT ENREGISTREMENT")
var file = fs.createWriteStream(`${__dirname}/capture/${new Date().getTime()}.h264`);
var video = raspivid({
width: 1280,
height: 720,
framerate: 30,
timeout: 5 * 1000,
'codec': 'MJPEG'
});
video.pipe(file);
video.on("end", r => {
console.log("FIN ENREGISTREMENT")
})
}
/**
* ? Méthode permettant d'avertir le serveur de l'intrusion
*/
function intrusion() {
var formData = new FormData()
formData.append("type", "intrusion")
axios.post("http://lockhome.nrocher.fr/api", formData).then(res => {
console.log(res.data)
}).catch(err => {
console.error(err)
})
}
/**
* TODO : DEBUG : Doit être réplacé par un évenement d'un port GPIO (module de détection de mouvement)
*/
rl.on("line", input => {
switch (input) {
case "intrusion":
record()
intrusion()
break;
}
});
\ No newline at end of file
......@@ -8,7 +8,7 @@ class API extends CI_Controller{
}
public function init() {
public function init($capteur = "", $type = "") {
echo "POST :<br>";
var_dump($_POST);
}
......
......@@ -27,7 +27,7 @@ class Profil extends CI_Controller{
$this->load->view('profil/list', $data);
}
public function edit($id = "new"){
public function edit($idProfil = "new"){
//VERIFICATION QUE L'UTILISATEUR EST CONNECTE
if(!$this->session->has_userdata("email")){
......@@ -49,9 +49,47 @@ class Profil extends CI_Controller{
$nom = $this->input->post('nom');
$debut = $this->input->post('debut');
$fin = $this->input->post('fin');
$capteur = array();
$this->ProfilModele->edit($id, $nom, $debut, $fin, $capteur);
// VERIFIER LES INPUTS qui commencent par capteur_
$enabledCapteurs = array();
foreach($_POST as $input_name => $input_value){
if(strpos($input_name ,"capteur_") !== FALSE) {
$idCapteur = substr($input_name, 8);
array_push($enabledCapteurs, $idCapteur);
}
}
$disabledCapteurs = array();
$disabledCapteurs = $this->ProfilModele->getDisabledCapteur($enabledCapteurs);
//update the data base for enabled capteur state
foreach($enabledCapteurs as $idEnabledCapteur)
{
//if the capteur is in the table EtatState we delete this
if($this->ProfilModele->capteurStateInDB($idProfil, $idEnabledCapteur))
{
$this->ProfilModele->deleteCapteurStateDB($idProfil, $idEnabledCapteur);
}
}
//update the data base for disabled capteur state
foreach($disabledCapteurs as $idDisabledCapteur)
{
//if the capteur isn't in the table EtatState we add this
if(!$this->ProfilModele->capteurStateInDB($idProfil, $idDisabledCapteur))
{
$this->ProfilModele->addCapteurStateDB($idProfil, $idDisabledCapteur);
}
}
$this->ProfilModele->edit($idProfil, $nom, $debut, $fin);
redirect("/profil", "refresh");
......@@ -69,9 +107,9 @@ class Profil extends CI_Controller{
} else {
//REQUETE HTTP GET OU AUTRE
if($id !== "new") {
if($idProfil !== "new") {
$profil = $this->ProfilModele->get($id);
$profil = $this->ProfilModele->get($idProfil);
if($profil !== false) {
$data["id"] = $profil->id;
......@@ -79,6 +117,7 @@ class Profil extends CI_Controller{
$data["debut"] = $profil->debut;
$data["fin"] = $profil->fin;
$data["new"] = false;
$data["state"] = $this->ProfilModele->getCapteurState($idProfil);
} else {
redirect("/profil", "refresh");
}
......
......@@ -25,7 +25,6 @@ class CapteurModele extends CI_Model
public function get($id)
{
$sql = "SELECT * from Capteur WHERE id = ?";
$query = $this->db->query($sql, array($id));
if ($query->num_rows() == 0) {
......@@ -65,4 +64,30 @@ class CapteurModele extends CI_Model
}
}
public function updateCapteurState($idProfil, $capteurStates)
{
foreach($capteurStates as $key => $value)
{
$sql = "SELECT * FROM EtatCapteur WHERE idProfil='".$idProfil."' and idCapteur='".$capteurStates['idCapteur']."'";
$query = $this->db->query($sql)->result()[0];
var_dump($query);
if($query == true)
{
$this->db->update();
}
}
}
public function getCapteurState($idProfil)
{
$sql = "SELECT idCapteur FROM EtatCapteur WHERE idProfil='".$idProfil."'";
$query = $this->db->query($sql)->result();
var_dump($query);
}
}
......@@ -37,13 +37,12 @@ class ProfilModele extends CI_Model
}
// METHODE PERMETTANT DE CREER OU MODIFIER UN PROFIL
public function edit($id, $nom, $debut, $fin, $sensor)
public function edit($id, $nom, $debut, $fin)
{
$data = array();
$data["nom"] = $nom;
$data["debut"] = $debut;
$data["fin"] = $fin;
$data["sensor"] = json_encode($sensor);
if ($id == "new") {
$this->db->insert('Profil', $data);
......@@ -68,4 +67,63 @@ class ProfilModele extends CI_Model
return false;
}
}
public function getCapteurState($idProfil) {
$sql = "SELECT idCapteur FROM EtatCapteur WHERE idProfil=?";
$query = $this->db->query($sql, array($idProfil));
return array_column($query->result_array(), "idCapteur");
}
//Return true if the capteur is in the table "EtatCapteur" and false if he isn't
public function capteurStateInDB($idProfil, $idCapteur)
{
$sql = "SELECT * FROM EtatCapteur WHERE idProfil=? and idCapteur=?";
$query = $this->db->query($sql, array($idProfil, $idCapteur));
$res = array_column($query->result_array(), "idCapteur");
return count($res) === 1;
}
public function deleteCapteurStateDB($idProfil, $idCapteur)
{
//if the table contains this profil
if($this->capteurStateInDB($idProfil, $idCapteur))
{
$this->db->delete('EtatCapteur', array("idProfil" => $idProfil, "idCapteur" => $idCapteur));
}
}
public function addCapteurStateDB($idProfil, $idCapteur)
{
//if the table do NOT contains this profil
if(!$this->capteurStateInDB($idProfil, $idCapteur))
{
$this->db->insert('EtatCapteur', array("idProfil" => $idProfil, "idCapteur" => $idCapteur));
}
}
public function getDisabledCapteur($enabledCapteurs)
{
$sql = "SELECT id FROM Capteur";
$query = $this->db->query($sql);
$allCapteurs = array_column($query->result_array(), "id");
$disabledCapteurs = array();
foreach($allCapteurs as $key)
{
if(!in_array($key, $enabledCapteurs))
{
array_push($disabledCapteurs, $key);
}
}
return $disabledCapteurs;
}
}
......@@ -54,22 +54,22 @@
<h6 class="big">Etat des capteurs pour ce profil :</h6>
<section class="tab_layout">
<?php
if($capteurs){
// TODO : Check si le capteur est activé ou désactivé
foreach($capteurs as $capteur){ ?>
<label for="capteur_<?= $capteur->id ?>" class="l_r profil_capteur">
<div class="left"><?= $capteur->nom; ?></div>
<div class="right">
<input id="capteur_<?= $capteur->id ?>" name="capteur_<?= $capteur->id ?>" checked="checked" type="checkbox">
<?php /* \/ ICI LE NOM DE L'INPUT COMMENCE PAR capteur_${ID_CAPTEUR} */ ?>
<input id="capteur_<?= $capteur->id ?>" name="capteur_<?= $capteur->id ?>" <?= in_array($capteur->id, $state) ? "" : "checked" ?> value="1" type="checkbox">
<?php /* DONC LORS DE LENVOIT DE DONNEE Controlleur/Profil.php ligne 30 */ ?>
<div class="switch"></div>
</div>
</label>
<?php }
} else echo "Aucun capteur disponible.";
?>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment