From 6fcc0e6ac052eaec727cc26f482963cb9ed8b3b1 Mon Sep 17 00:00:00 2001 From: Quentin Roussel Date: Thu, 4 May 2023 13:45:21 +0200 Subject: [PATCH] =?UTF-8?q?Impl=C3=A9mentation=20basique=20notes=20avec=20?= =?UTF-8?q?les=20doigts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/backend_reconnaissance/hand_detector.py | 2 +- code/backend_reconnaissance/manager.py | 44 +++++++++++++++++-- code/interface_borne/assets/js/camera_page.js | 1 - code/interface_borne/assets/js/grade_page.js | 23 ++++++++++ code/interface_borne/assets/js/network.js | 19 +++++--- .../assets/js/state_manager.js | 18 ++++++-- code/interface_borne/index.html | 9 ++++ 7 files changed, 101 insertions(+), 15 deletions(-) create mode 100644 code/interface_borne/assets/js/grade_page.js diff --git a/code/backend_reconnaissance/hand_detector.py b/code/backend_reconnaissance/hand_detector.py index deecd52..6c63398 100644 --- a/code/backend_reconnaissance/hand_detector.py +++ b/code/backend_reconnaissance/hand_detector.py @@ -118,7 +118,7 @@ class HandDetector(): class FingerCountDetector(): def __init__(self): - self.BUFFER_LENGTH = 20 + self.BUFFER_LENGTH = 40 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.buffer = [] diff --git a/code/backend_reconnaissance/manager.py b/code/backend_reconnaissance/manager.py index d87469c..73905f0 100644 --- a/code/backend_reconnaissance/manager.py +++ b/code/backend_reconnaissance/manager.py @@ -51,6 +51,7 @@ class Manager(): if(res != False): self.state = 1 self.timeLastChange = time.time() + print("Change to 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 @@ -63,7 +64,26 @@ class Manager(): res = self.handDetector.loop() if(res != False): 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.timeLastChange = time.time() if(finalDecision != False): @@ -75,25 +95,41 @@ class Manager(): self.isLastHandPacketEmpty = True def grade(self): + #Premier passage dans la boucle if(self.currentCriteria == None): 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 grade = self.fingerCountDetector.loop() if(grade != None): self.avis["notes_autres"][self.criteria_list[self.currentCriteria]] = grade + self.server.sendMessage({ + "type":"criteria_grade", + "grade":grade + }) + time.sleep(3) self.currentCriteria+=1 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() else: + print("Change to state 3") self.state = 3 self.server.sendMessage({"type": "state", "state": 3}) def audio(self): - time.sleep(3) self.server.sendMessage({"type":"recording_started"}) with sr.Microphone() as source: audio = self.recongizer.listen(source) diff --git a/code/interface_borne/assets/js/camera_page.js b/code/interface_borne/assets/js/camera_page.js index 9009833..9a3313d 100644 --- a/code/interface_borne/assets/js/camera_page.js +++ b/code/interface_borne/assets/js/camera_page.js @@ -109,7 +109,6 @@ class CameraPage { height = height * this.videoHeight * 2; x = x * this.videoWidth - width / 2; y = y * this.videoHeight - height / 2; - console.log(width, height); if (effect.type == "thumbs_down") { this._drawThumbsDown(x, y, width, height); } diff --git a/code/interface_borne/assets/js/grade_page.js b/code/interface_borne/assets/js/grade_page.js new file mode 100644 index 0000000..1293779 --- /dev/null +++ b/code/interface_borne/assets/js/grade_page.js @@ -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 = ""; + } +} diff --git a/code/interface_borne/assets/js/network.js b/code/interface_borne/assets/js/network.js index 7f92900..95decfd 100644 --- a/code/interface_borne/assets/js/network.js +++ b/code/interface_borne/assets/js/network.js @@ -1,5 +1,5 @@ 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.addEventListener("open", (event) => { this.socket.send("connected"); @@ -10,16 +10,25 @@ class WebsocketClient { let msg = JSON.parse(event.data); if (msg.type == "effects") { onNewEffects(msg.effects); - }else if(msg.type == "state") { + } + else if(msg.type == "state") { onNewState(msg.state); - }else if(msg.type == "new_grade") { + } + else if(msg.type == "new_grade") { onNewGrade(msg.word); - }else if(msg.type == "reset") { + } + else if(msg.type == "reset") { onReset(); } else if(msg.type == "recording_done") { onRecordingDone(); } + else if(msg.type == "new_criteria") { + onNewCriteria(msg.criteria) + } + else if(msg.type == "criteria_grade") { + onNewCriteriaGrade(msg.grade); + } }; } -} \ No newline at end of file +} diff --git a/code/interface_borne/assets/js/state_manager.js b/code/interface_borne/assets/js/state_manager.js index c25f0b4..846e1f1 100644 --- a/code/interface_borne/assets/js/state_manager.js +++ b/code/interface_borne/assets/js/state_manager.js @@ -1,8 +1,9 @@ const STATE = { sleeping: 0, video: 1, - audio: 2, - thankYou: 3, + grade: 2, + audio: 3, + thankYou: 4, }; class StateManager { @@ -12,6 +13,7 @@ class StateManager { this._sleepingPage = new SleepingPage(); this._audioPage = new AudioPage(); this._thankYouPage = new ThankYouPage(); + this._gradePage = new GradePage(); this.wsClient = new WebsocketClient( (effects) => { @@ -22,22 +24,30 @@ class StateManager { (grade) => this._audioPage.setGrade(grade), () => this.reset(), () => this._audioPage.onRecordingDone(), + (crit) => this._gradePage.onNewCriteria(crit), + (grade) => this._gradePage.onNewGrade(grade), ); this._sleepingPage.enabled = true; this._cameraPage.enabled = false; + this._gradePage.enabled = false; this._audioPage.enabled = false; this._thankYouPage.enabled = false; } setState(newState) { + console.log("state change") console.log({current:this._state,new:newState}) if(this._state == STATE.sleeping && newState == STATE.video) { this._cameraPage.enabled = true; this._sleepingPage.enabled = false; 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._gradePage.enabled = true; + this._state = newState; + }else if(this._state == STATE.grade && newState == STATE.audio) { + this._gradePage.enabled = false; this._audioPage.enabled = true; this._state = newState; }else if(this._state == STATE.audio && newState == STATE.thankYou) { @@ -61,4 +71,4 @@ class StateManager { this._sleepingPage.enabled = true; } -} \ No newline at end of file +} diff --git a/code/interface_borne/index.html b/code/interface_borne/index.html index 184132c..e3b3af7 100644 --- a/code/interface_borne/index.html +++ b/code/interface_borne/index.html @@ -30,6 +30,14 @@ +
+
+
+

Qu'avez vous pensé de

+
+

Votre note : /10

+
+
@@ -51,6 +59,7 @@ +