diff --git a/arduino/act1/act1.ino b/arduino/act1/act1.ino index d72520e31ad13bcff04f254336df11ca2b495aee..f02e2a6b3a1e80555c444df91297e6e795a4bd26 100644 --- a/arduino/act1/act1.ino +++ b/arduino/act1/act1.ino @@ -17,6 +17,7 @@ String currentCommand = ""; unsigned long prevTime = 0; +boolean unloading[4] = {false, false, false, false}; WebUSB WebUSBSerial(1 /* https:// */, "pole-jeune.pages.clubelek.fr/atelier_igb_apollo/activity_1/"); #define Serial WebUSBSerial @@ -24,10 +25,20 @@ WebUSB WebUSBSerial(1 /* https:// */, "pole-jeune.pages.clubelek.fr/atelier_igb_ void loadProp(String tank) { if (tank == "RP1") { digitalWrite(IN1_1, LOW); - digitalWrite(IN2_1, HIGH); + digitalWrite(IN2_1, HIGH); + unloading[2] = false; } else if (tank == "LH2") { digitalWrite(IN3_1, HIGH); - digitalWrite(IN4_1, LOW); + digitalWrite(IN4_1, LOW); + unloading[0] = false; + } else if (tank == "LOX1") { + digitalWrite(IN1_2, LOW); + digitalWrite(IN2_2, HIGH); + unloading[3] = false; + } else if (tank == "LOX2") { + digitalWrite(IN3_2, HIGH); + digitalWrite(IN4_2, LOW); + unloading[1] = false; } } @@ -35,9 +46,19 @@ void unloadProp(String tank) { if (tank == "RP1") { digitalWrite(IN1_1, HIGH); digitalWrite(IN2_1, LOW); + unloading[2] = true; } else if (tank == "LH2") { digitalWrite(IN3_1, LOW); digitalWrite(IN4_1, HIGH); + unloading[0] = true; + } else if (tank == "LOX1") { + digitalWrite(IN1_2, HIGH); + digitalWrite(IN2_2, LOW); + unloading[3] = true; + } else if (tank == "LOX2") { + digitalWrite(IN3_2, LOW); + digitalWrite(IN4_2, HIGH); + unloading[1] = true; } } @@ -45,9 +66,19 @@ void stopLoading(String tank) { if (tank == "RP1") { digitalWrite(IN1_1, LOW); digitalWrite(IN2_1, LOW); + unloading[2] = false; } else if (tank == "LH2") { digitalWrite(IN3_1, LOW); digitalWrite(IN4_1, LOW); + unloading[0] = false; + } else if (tank == "LOX1") { + digitalWrite(IN1_2, LOW); + digitalWrite(IN2_2, LOW); + unloading[3] = false; + } else if (tank == "LOX2") { + digitalWrite(IN3_2, LOW); + digitalWrite(IN4_2, LOW); + unloading[1] = false; } } @@ -100,15 +131,23 @@ void setup() { loadProp("LH2"); loadProp("RP1"); + loadProp("LOX1"); + loadProp("LOX2"); delay(3000); stopLoading("LH2"); stopLoading("RP1"); + stopLoading("LOX1"); + stopLoading("LOX2"); delay(1000); unloadProp("LH2"); unloadProp("RP1"); - delay(3000); + unloadProp("LOX1"); + unloadProp("LOX2"); + delay(6000); stopLoading("LH2"); stopLoading("RP1"); + stopLoading("LOX1"); + stopLoading("LOX2"); Serial.flush(); } @@ -117,25 +156,31 @@ void loop() { if (millis() - prevTime >= 1000) { - Serial.print("REEDS_{LH2 :"); + Serial.print("REEDS_{\"LH2\":"); Serial.print(digitalRead(REED_LH2)); - Serial.print(", LOX2 :"); + Serial.print(",\"LOX2\":"); Serial.print(digitalRead(REED_LOX2)); - Serial.print(", RP1 :"); + Serial.print(",\"RP1\":"); Serial.print(digitalRead(REED_RP1)); - Serial.print(", LOX1 :"); + Serial.print(",\"LOX1\":"); Serial.print(digitalRead(REED_LOX1)); Serial.println("}"); prevTime = millis(); } - if (digitalRead(REED_LH2)) { + if (digitalRead(REED_LH2) && !unloading[0]) { stopLoading("LH2"); } - if (digitalRead(REED_RP1)) { + if (digitalRead(REED_RP1) && !unloading[2]) { stopLoading("RP1"); } - + /*if (digitalRead(REED_LOX1) && !unloading[3]) { + stopLoading("LOX1"); + }*/ + if (digitalRead(REED_LOX2) && !unloading[1]) { + stopLoading("LOX2"); + } + if (Serial) { while (Serial.available() > 0) { char c = '0'; @@ -149,5 +194,4 @@ void loop() { } Serial.flush(); } -} - +} \ No newline at end of file diff --git a/doc/Atelier 1.docx b/doc/Atelier 1.docx new file mode 100644 index 0000000000000000000000000000000000000000..493b605ef624a4fa5ee4c9edd36b9db3ceecad4e Binary files /dev/null and b/doc/Atelier 1.docx differ diff --git a/doc/Atelier 1.pdf b/doc/Atelier 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..51f85fbab5f7fc799e8409e11b715f4a7b92b6b1 Binary files /dev/null and b/doc/Atelier 1.pdf differ diff --git a/public/activity_1/index.html b/public/activity_1/index.html index 206a8042d20c5df1758ce5ee3bc5cb05e4dbae02..34fc9d53404c7ce1d7a44c9e4dfe68edb5244a81 100644 --- a/public/activity_1/index.html +++ b/public/activity_1/index.html @@ -24,6 +24,18 @@ <body> + <div id="intro_modal" class="modal"> + <div class="modal-content"> + <span class="close">×</span> + <h1 style="text-align: center;">Bienvenue dans la mission 1 !</h2> + <p>La fusée est sur le pas de tir ! Les astronautes se préparent à embarquer. L’heure du décollage approche ! C’est le début de la fin de la grande aventure Apollo 11 ! </p> + <p>Avant que les astronautes n’embarquent dans la fusée, il faut y charger le carburant. Et ce n’est pas une mince affaire ! Il s’agit de l’une des fusées les plus puissantes de tous les temps : la Saturne V ! Elle fait 110m de haut !</p> + <p>La fusée utilise plusieurs carburants et a 3 étages (avec chacun leurs réservoirs et leurs moteurs). Ici on ne va s’occuper que des étages 1 et 2. L’étage 1 contient du RP1, un dérivé du kérozène, et de l’oxygène liquide (à -250°C). L’étage 2 fonctionne lui à l’hydrogène liquide (aussi appelé LH2) et à l’oxygène liquide. </p> + <p>Il vous faudra donc charger le carburant dans chaque étage, ce à la bonne température tout en veillant à ce qu’il n’y ait pas de fuite ! Bien sur, il ne faudra également pas déborder !</p> + + <p style="text-align: center;"><strong >Bon courage !</strong></p> </p> + </div> + </div> <header id="header"></header> <section class="mainSection"> @@ -33,7 +45,39 @@ </div> <div id="toolsArea"> - <div id="animationArea"></div> + <div id="animationArea"> + <div id ="desc_1" class="consignes"> + <p style="text-align: center;"><strong>Partie 1 : Charger le RP1 dans l'étage 1</strong></p> + <p>Vous disposez dans chaque réservoir d'un capteur qui permet de savoir quand il est plein. Vous pouvez ordonner à la maquette de charger le réservoir, via des pompes. </p> + <p>Dans cette partie, on ne considère aucun risque de fuite ni de refroidissement nécessaire (ce qui est faux dans le cas réel). </p> + <p>Votre première mission ? Charger le RP1 dans la fusée sans faire déborder le réservoir ni le sous remplir !</p> + <button onclick="displayConsignes('desc_2')">Passer à la partie suivante</button> + </div> + <div id ="desc_2" class="consignes"> + <p style="text-align: center;"><strong>Partie 2 : Charger le LH2 dans l'étage 2</strong></p> + <p>Vous devez cette fois charger l'hydrogène liquide dans le 2e étage. Mais attention, il faut qu'il soit à température assez basse. Soit -250°C ! Sinon les réservoirs et les conduits pourraient exploser sous l'effet de la pression !</p> + <p>Pour cela, vous pouvez lire la température des circuits de LOX et LH2 et choisir de les refroidir. Tout en chargeant le carburant de manière similaire à la partie 1.</p> + <button onclick="displayConsignes('desc_1')">Revenir à la partie précédente</button> + <button onclick="displayConsignes('desc_3')">Passer à la partie suivante</button> + </div> + <div id ="desc_3" class="consignes"> + <p style="text-align: center;"><strong>Partie 3 : Défis ! Chargez les deux réservoirs de LOX en même temps !</strong></p> + <p>Vous devez cette fois charger l'oxygène liquide dans le 1er et le 2e étage. Mais attention, il faut qu'il soit à température assez basse. Soit -250°C ! Sinon les réservoirs et les conduits pourraient exploser sous l'effet de la pression !</p> + <p>Pour cela, vous pouvez lire la température des circuits de LOX et LH2 et choisir de les refroidir. Tout en chargeant le carburant de manière similaire à la partie 1 et 2. Il faudra cependant faire attention à bien charger les deux réservoirs au maximum et le faire en même temps.</p> + <p>Vous devrez également vérifier à tout moment la présence de fuite sur les conduits. S'il y a une fuite, vous devrez d'abord mettre en pause le décompte de lancement puis envoyer une équipe pour réparer la fuite.</p> + <p style="text-align: center;"><strong>Bon courage !</strong></p> + <button onclick="displayConsignes('desc_2')">Revenir à la partie précédente</button> + <button onclick="displayConsignes('desc_4')">Passer à la partie suivante</button> + </div> + <div id ="desc_4" class="consignes"> + <p style="text-align: center;"><strong>Partie 4 : Faire monter les astronautes !</strong></p> + <p>Bravo ! Vous avez réussi le plus dur ! </p> + <p>Tout est prêt. Vérifiez si les systèmes électroniques fonctionnent bien tous et si c'est le cas, vous pouvez faire monter les astronautes !</p> + <p> </p> + <p>Le code de cette mission vous serra donné par l'encadrant :)</p> + <button onclick="displayConsignes('desc_3')">Revenir à la partie précédente</button> + </div> + </div> <a class="button" id="connectButton">Connecter à la maquette</a> <a class="button" id="runButton">Lancer le programme !</a> </div> diff --git a/public/activity_1/main-script.js b/public/activity_1/main-script.js index b99cf1423fb68b50dcafa5a215836a4c984f9a15..299c166b68869089e0d91d184d6c237e27445691 100644 --- a/public/activity_1/main-script.js +++ b/public/activity_1/main-script.js @@ -1,11 +1,47 @@ /* Insérer ici les fonctions spécifiques à cette activité. Elles peuvent marcher avec les fonctions et variables déjà définies dans 'activity_functions.js' du dossier 'res'.*/ + +/* GESTION DES POPUP*/ + +// Gets the modal (intiated as the intro_modal at first) +var modal = document.getElementById("intro_modal"); +// Get the <span> element that closes the modal +var span = document.getElementsByClassName("close")[0]; + +// Displays the modal when DOM is Loaded +document.addEventListener('DOMContentLoaded', event => { + modal.style.display = "block"; +}); +// When the user clicks on <span> (x), close the modal +span.onclick = function() { + modal.style.display = "none"; +} +// When the user clicks anywhere outside of the modal, close it +window.onclick = function(event) { + if (event.target == modal) { + modal.style.display = "none"; + } +} + +function displayConsignes(id) { + var x = document.getElementsByClassName("consignes"); + var i; + for (i = 0; i < x.length; i++) { + x[i].style.display = "none"; + } + var consignesDiv = document.getElementById(id); + consignesDiv.style.display = 'block'; +} + +displayConsignes("desc_1"); + var reedsStatus = {LH2 : false, LOX2 : false, RP1 : false, LOX1 : false} var catchedFull = {LH2 : false, LOX2 : false, RP1 : false, LOX1 : false} var catchTime = {LH2 : -1, LOX2 : -1, RP1 : -1, LOX1 : -1} var stopTimeouts = {} var circuitTemp = 5; +var leakFixed = false; var checkReedsInterval = setInterval(function() { if (receivedMsg.startsWith('REEDS')) { @@ -20,7 +56,7 @@ var checkReedsInterval = setInterval(function() { } for (var key of Object.keys(catchedFull)) { if (catchTime[key] != -1 && !catchedFull[key]) { - if (Date.now() - catchTime[key] > 3000) { + if (Date.now() - catchTime[key] > 5000) { catchedFull[key] = true alert("Aïe Aïe Aïe ! Débordement non maitrisé !") } @@ -29,14 +65,22 @@ var checkReedsInterval = setInterval(function() { }, 250); function init_var() { - catchedFull = {LH2 : false, LOX2 : false, RP1 : false, LOX1 : false} - catchTime = {LH2 : -1, LOX2 : -1, RP1 : -1, LOX1 : -1} reedsStatus = {LH2 : false, LOX2 : false, RP1 : false, LOX1 : false} stopTimeouts = {} circuitTemp = 5 + leakFixed = false; +} + +function fixLeak() { + leakFixed = true } +function isLeakFixed() { + return leakFixed +} + function getCircuitTemperature() { + circuitTemp++ return circuitTemp } diff --git a/public/activity_3/main-script.js b/public/activity_3/main-script.js index 2be91f846d43086ffeea575d565d0737b2737675..368fc983ef907d934a41c51a5ad66eb03bccc29b 100644 --- a/public/activity_3/main-script.js +++ b/public/activity_3/main-script.js @@ -179,7 +179,7 @@ function stepSimulation(prevTime) { }) } else { - alert("Bravo ! Vous avez aluni à la bonne vitesse !") + alert("Bravo ! Vous avez aluni à la bonne vitesse ! Le code de cette mission est 1969") } } else { simu_timeouts.push(setTimeout(function() {stepSimulation(t)}, 40)) diff --git a/public/res/activity_functions.js b/public/res/activity_functions.js index e1c02b69db1fe6db6b0ff13f18fe6415d0d0c53d..8013c40520a755e5f3eaa5532f140b008fbe0cfb 100644 --- a/public/res/activity_functions.js +++ b/public/res/activity_functions.js @@ -91,6 +91,18 @@ function initApi(interpreter, scope) { interpreter.setProperty(scope, 'coolCircuit', interpreter.createNativeFunction(wrapper)); + var wrapper = function(text) { + return fixLeak(); + }; + interpreter.setProperty(scope, 'fixLeak', + interpreter.createNativeFunction(wrapper)); + + var wrapper = function(text) { + return isLeakFixed(); + }; + interpreter.setProperty(scope, 'isLeakFixed', + interpreter.createNativeFunction(wrapper)); + var wrapper = function(text) { return isTankFull(arguments.length ? text : ''); }; diff --git a/public/res/blocks/arduino_blocks_gen.js b/public/res/blocks/arduino_blocks_gen.js index 05490e6a1cdb43d01a58fa3ec6cacb9417dd9e7f..dce1eea15be74695fc66942be0e644eef1cb64ac 100644 --- a/public/res/blocks/arduino_blocks_gen.js +++ b/public/res/blocks/arduino_blocks_gen.js @@ -60,9 +60,11 @@ Blockly.JavaScript['is_tank_full'] = function(block) { return [code, Blockly.JavaScript.ORDER_NONE]; }; + + Blockly.JavaScript['is_leak_detected'] = function(block) { // TODO: Assemble JavaScript into code variable. - var code = 'true'; + var code = '!isLeakFixed()'; // TODO: Change ORDER_NONE to the correct strength. return [code, Blockly.JavaScript.ORDER_NONE]; }; @@ -76,7 +78,7 @@ Blockly.JavaScript['is_computer_ok'] = function(block) { Blockly.JavaScript['fix_leak'] = function(block) { // TODO: Assemble JavaScript into code variable. - var code = 'alert("Les techniciens ont réussi à fixer la fuite, la mission peut reprendre !");\n'; + var code = 'fixLeak(); \n alert("Les techniciens ont réussi à fixer la fuite, la mission peut reprendre !");\n'; return code; };