mirror of
https://git.roussel.pro/telecom-paris/pact.git
synced 2026-02-09 02:20:17 +01:00
Implémentation basique notes avec les doigts
This commit is contained in:
@@ -118,7 +118,7 @@ class HandDetector():
|
|||||||
|
|
||||||
class FingerCountDetector():
|
class FingerCountDetector():
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.BUFFER_LENGTH = 20
|
self.BUFFER_LENGTH = 40
|
||||||
self.DETECTION_THRESHOLD = 1/2
|
self.DETECTION_THRESHOLD = 1/2
|
||||||
self.hands = mp_hands.Hands(static_image_mode=False, max_num_hands=2, min_detection_confidence=0.5, min_tracking_confidence=0.5)
|
self.hands = mp_hands.Hands(static_image_mode=False, max_num_hands=2, min_detection_confidence=0.5, min_tracking_confidence=0.5)
|
||||||
self.buffer = []
|
self.buffer = []
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ class Manager():
|
|||||||
if(res != False):
|
if(res != False):
|
||||||
self.state = 1
|
self.state = 1
|
||||||
self.timeLastChange = time.time()
|
self.timeLastChange = time.time()
|
||||||
|
print("Change to state 1")
|
||||||
self.server.sendMessage({"type": "state", "state": 1})
|
self.server.sendMessage({"type": "state", "state": 1})
|
||||||
|
|
||||||
#Envoie la position de la main a l'écran et passe a l'étape suivante si une main est detectée pendant assez longtemps
|
#Envoie la position de la main a l'écran et passe a l'étape suivante si une main est detectée pendant assez longtemps
|
||||||
@@ -63,7 +64,26 @@ class Manager():
|
|||||||
res = self.handDetector.loop()
|
res = self.handDetector.loop()
|
||||||
if(res != False):
|
if(res != False):
|
||||||
state, coords, size, finalDecision, progress = res
|
state, coords, size, finalDecision, progress = res
|
||||||
self.server.sendMessage({"type": "effects", "effects": [{"type": "loading", "x":coords[0], "y": coords[1], "width": size, "height": size, "progress": progress},{"type": state, "x":coords[0], "y": coords[1], "width": size, "height": size}]})
|
self.server.sendMessage({
|
||||||
|
"type": "effects",
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"type": "loading",
|
||||||
|
"x":coords[0],
|
||||||
|
"y": coords[1],
|
||||||
|
"width": size,
|
||||||
|
"height": size,
|
||||||
|
"progress": progress
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": state,
|
||||||
|
"x":coords[0],
|
||||||
|
"y": coords[1],
|
||||||
|
"width": size,
|
||||||
|
"height": size
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
self.isLastHandPacketEmpty = False
|
self.isLastHandPacketEmpty = False
|
||||||
self.timeLastChange = time.time()
|
self.timeLastChange = time.time()
|
||||||
if(finalDecision != False):
|
if(finalDecision != False):
|
||||||
@@ -75,25 +95,41 @@ class Manager():
|
|||||||
self.isLastHandPacketEmpty = True
|
self.isLastHandPacketEmpty = True
|
||||||
|
|
||||||
def grade(self):
|
def grade(self):
|
||||||
|
#Premier passage dans la boucle
|
||||||
if(self.currentCriteria == None):
|
if(self.currentCriteria == None):
|
||||||
self.currentCriteria = 0
|
self.currentCriteria = 0
|
||||||
self.server.sendMessage({"type":"new_criteria","criteria":self.criteria_list[self.currentCriteria]})
|
self.server.sendMessage({
|
||||||
|
"type": "state",
|
||||||
|
"state": 2
|
||||||
|
})
|
||||||
|
self.server.sendMessage({
|
||||||
|
"type":"new_criteria",
|
||||||
|
"criteria":self.criteria_list[self.currentCriteria]
|
||||||
|
})
|
||||||
return
|
return
|
||||||
|
|
||||||
grade = self.fingerCountDetector.loop()
|
grade = self.fingerCountDetector.loop()
|
||||||
if(grade != None):
|
if(grade != None):
|
||||||
self.avis["notes_autres"][self.criteria_list[self.currentCriteria]] = grade
|
self.avis["notes_autres"][self.criteria_list[self.currentCriteria]] = grade
|
||||||
|
self.server.sendMessage({
|
||||||
|
"type":"criteria_grade",
|
||||||
|
"grade":grade
|
||||||
|
})
|
||||||
|
time.sleep(3)
|
||||||
self.currentCriteria+=1
|
self.currentCriteria+=1
|
||||||
if(self.currentCriteria < len(self.criteria_list)):
|
if(self.currentCriteria < len(self.criteria_list)):
|
||||||
self.server.sendMessage({"type":"new_criteria","criteria":self.criteria_list[self.currentCriteria]})
|
self.server.sendMessage({
|
||||||
|
"type":"new_criteria",
|
||||||
|
"criteria":self.criteria_list[self.currentCriteria]
|
||||||
|
})
|
||||||
self.fingerCountDetector.reset()
|
self.fingerCountDetector.reset()
|
||||||
else:
|
else:
|
||||||
|
print("Change to state 3")
|
||||||
self.state = 3
|
self.state = 3
|
||||||
self.server.sendMessage({"type": "state", "state": 3})
|
self.server.sendMessage({"type": "state", "state": 3})
|
||||||
|
|
||||||
|
|
||||||
def audio(self):
|
def audio(self):
|
||||||
time.sleep(3)
|
|
||||||
self.server.sendMessage({"type":"recording_started"})
|
self.server.sendMessage({"type":"recording_started"})
|
||||||
with sr.Microphone() as source:
|
with sr.Microphone() as source:
|
||||||
audio = self.recongizer.listen(source)
|
audio = self.recongizer.listen(source)
|
||||||
|
|||||||
@@ -109,7 +109,6 @@ class CameraPage {
|
|||||||
height = height * this.videoHeight * 2;
|
height = height * this.videoHeight * 2;
|
||||||
x = x * this.videoWidth - width / 2;
|
x = x * this.videoWidth - width / 2;
|
||||||
y = y * this.videoHeight - height / 2;
|
y = y * this.videoHeight - height / 2;
|
||||||
console.log(width, height);
|
|
||||||
if (effect.type == "thumbs_down") {
|
if (effect.type == "thumbs_down") {
|
||||||
this._drawThumbsDown(x, y, width, height);
|
this._drawThumbsDown(x, y, width, height);
|
||||||
}
|
}
|
||||||
|
|||||||
23
code/interface_borne/assets/js/grade_page.js
Normal file
23
code/interface_borne/assets/js/grade_page.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
class GradePage {
|
||||||
|
constructor() {
|
||||||
|
this.isEnabled = false;
|
||||||
|
this.DOMElement = document.getElementById("grade");
|
||||||
|
}
|
||||||
|
|
||||||
|
set enabled(isEnabled) {
|
||||||
|
this.isEnabled = isEnabled;
|
||||||
|
this.DOMElement.style.display = isEnabled ? "block" : "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
onNewCriteria(criteriaName) {
|
||||||
|
document.getElementById("criteria").innerHTML = criteriaName;
|
||||||
|
document.getElementById("criteria-grade").innerHTML = "";
|
||||||
|
}
|
||||||
|
onNewGrade(grade) {
|
||||||
|
document.getElementById("criteria-grade").innerHTML = grade;
|
||||||
|
}
|
||||||
|
reset() {
|
||||||
|
document.getElementById("criteria-grade").innerHTML = "";
|
||||||
|
document.getElementById("criteria").innerHTML = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
class WebsocketClient {
|
class WebsocketClient {
|
||||||
constructor(onNewEffects, onNewState, onNewGrade, onReset, onRecordingDone) {
|
constructor(onNewEffects, onNewState, onNewGrade, onReset, onRecordingDone, onNewCriteria, onNewCriteriaGrade) {
|
||||||
this.socket = new WebSocket("ws://localhost:5000");
|
this.socket = new WebSocket("ws://localhost:5000");
|
||||||
this.socket.addEventListener("open", (event) => {
|
this.socket.addEventListener("open", (event) => {
|
||||||
this.socket.send("connected");
|
this.socket.send("connected");
|
||||||
@@ -10,16 +10,25 @@ class WebsocketClient {
|
|||||||
let msg = JSON.parse(event.data);
|
let msg = JSON.parse(event.data);
|
||||||
if (msg.type == "effects") {
|
if (msg.type == "effects") {
|
||||||
onNewEffects(msg.effects);
|
onNewEffects(msg.effects);
|
||||||
}else if(msg.type == "state") {
|
}
|
||||||
|
else if(msg.type == "state") {
|
||||||
onNewState(msg.state);
|
onNewState(msg.state);
|
||||||
}else if(msg.type == "new_grade") {
|
}
|
||||||
|
else if(msg.type == "new_grade") {
|
||||||
onNewGrade(msg.word);
|
onNewGrade(msg.word);
|
||||||
}else if(msg.type == "reset") {
|
}
|
||||||
|
else if(msg.type == "reset") {
|
||||||
onReset();
|
onReset();
|
||||||
}
|
}
|
||||||
else if(msg.type == "recording_done") {
|
else if(msg.type == "recording_done") {
|
||||||
onRecordingDone();
|
onRecordingDone();
|
||||||
}
|
}
|
||||||
|
else if(msg.type == "new_criteria") {
|
||||||
|
onNewCriteria(msg.criteria)
|
||||||
|
}
|
||||||
|
else if(msg.type == "criteria_grade") {
|
||||||
|
onNewCriteriaGrade(msg.grade);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
const STATE = {
|
const STATE = {
|
||||||
sleeping: 0,
|
sleeping: 0,
|
||||||
video: 1,
|
video: 1,
|
||||||
audio: 2,
|
grade: 2,
|
||||||
thankYou: 3,
|
audio: 3,
|
||||||
|
thankYou: 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
class StateManager {
|
class StateManager {
|
||||||
@@ -12,6 +13,7 @@ class StateManager {
|
|||||||
this._sleepingPage = new SleepingPage();
|
this._sleepingPage = new SleepingPage();
|
||||||
this._audioPage = new AudioPage();
|
this._audioPage = new AudioPage();
|
||||||
this._thankYouPage = new ThankYouPage();
|
this._thankYouPage = new ThankYouPage();
|
||||||
|
this._gradePage = new GradePage();
|
||||||
|
|
||||||
this.wsClient = new WebsocketClient(
|
this.wsClient = new WebsocketClient(
|
||||||
(effects) => {
|
(effects) => {
|
||||||
@@ -22,22 +24,30 @@ class StateManager {
|
|||||||
(grade) => this._audioPage.setGrade(grade),
|
(grade) => this._audioPage.setGrade(grade),
|
||||||
() => this.reset(),
|
() => this.reset(),
|
||||||
() => this._audioPage.onRecordingDone(),
|
() => this._audioPage.onRecordingDone(),
|
||||||
|
(crit) => this._gradePage.onNewCriteria(crit),
|
||||||
|
(grade) => this._gradePage.onNewGrade(grade),
|
||||||
);
|
);
|
||||||
|
|
||||||
this._sleepingPage.enabled = true;
|
this._sleepingPage.enabled = true;
|
||||||
this._cameraPage.enabled = false;
|
this._cameraPage.enabled = false;
|
||||||
|
this._gradePage.enabled = false;
|
||||||
this._audioPage.enabled = false;
|
this._audioPage.enabled = false;
|
||||||
this._thankYouPage.enabled = false;
|
this._thankYouPage.enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
setState(newState) {
|
setState(newState) {
|
||||||
|
console.log("state change")
|
||||||
console.log({current:this._state,new:newState})
|
console.log({current:this._state,new:newState})
|
||||||
if(this._state == STATE.sleeping && newState == STATE.video) {
|
if(this._state == STATE.sleeping && newState == STATE.video) {
|
||||||
this._cameraPage.enabled = true;
|
this._cameraPage.enabled = true;
|
||||||
this._sleepingPage.enabled = false;
|
this._sleepingPage.enabled = false;
|
||||||
this._state = newState;
|
this._state = newState;
|
||||||
}else if(this._state == STATE.video && newState == STATE.audio) {
|
}else if(this._state == STATE.video && newState == STATE.grade) {
|
||||||
this._cameraPage.enabled = false;
|
this._cameraPage.enabled = false;
|
||||||
|
this._gradePage.enabled = true;
|
||||||
|
this._state = newState;
|
||||||
|
}else if(this._state == STATE.grade && newState == STATE.audio) {
|
||||||
|
this._gradePage.enabled = false;
|
||||||
this._audioPage.enabled = true;
|
this._audioPage.enabled = true;
|
||||||
this._state = newState;
|
this._state = newState;
|
||||||
}else if(this._state == STATE.audio && newState == STATE.thankYou) {
|
}else if(this._state == STATE.audio && newState == STATE.thankYou) {
|
||||||
|
|||||||
@@ -30,6 +30,14 @@
|
|||||||
<canvas id="overlay-canvas"></canvas>
|
<canvas id="overlay-canvas"></canvas>
|
||||||
<video id="camera-video"></video>
|
<video id="camera-video"></video>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="grade">
|
||||||
|
<div class="instructions">
|
||||||
|
<div class="title">
|
||||||
|
<h1>Qu'avez vous pensé de <span id="criteria"></span></h1>
|
||||||
|
</div>
|
||||||
|
<p>Votre note : <span id="criteria-grade"></span>/10</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div id="audio">
|
<div id="audio">
|
||||||
<div class="instructions">
|
<div class="instructions">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
@@ -51,6 +59,7 @@
|
|||||||
<script src="assets/js/camera_page.js"></script>
|
<script src="assets/js/camera_page.js"></script>
|
||||||
<script src="assets/js/network.js"></script>
|
<script src="assets/js/network.js"></script>
|
||||||
<script src="assets/js/thank_you_page.js"></script>
|
<script src="assets/js/thank_you_page.js"></script>
|
||||||
|
<script src="assets/js/grade_page.js"></script>
|
||||||
<script src="assets/js/audio_page.js"></script>
|
<script src="assets/js/audio_page.js"></script>
|
||||||
<script src="assets/js/sleeping_page.js"></script>
|
<script src="assets/js/sleeping_page.js"></script>
|
||||||
<script src="assets/js/state_manager.js"></script>
|
<script src="assets/js/state_manager.js"></script>
|
||||||
|
|||||||
Reference in New Issue
Block a user