diff --git a/activity_1/index.html b/activity_1/index.html index 136a565837113cfe14a97c665ee2cd228a6a5733..206a8042d20c5df1758ce5ee3bc5cb05e4dbae02 100644 --- a/activity_1/index.html +++ b/activity_1/index.html @@ -35,16 +35,18 @@ <div id="toolsArea"> <div id="animationArea"></div> <a class="button" id="connectButton">Connecter à la maquette</a> - <a onclick="runCode()" class="button" id="runButton">Lancer le programme !</a> + <a class="button" id="runButton">Lancer le programme !</a> </div> + </section> <footer id="footer"></footer> </body> <!-- Script d'intanciation lancé au chargement, doit toujours être à la fin--> - <script src="arduino_blocks_def.js"></script> - <script src="arduino_blocks_gen.js"></script> + <script src="../res/blocks/arduino_blocks_def.js"></script> + <script src="../res/blocks/arduino_blocks_gen.js"></script> + <script src="../res/activity_functions.js"></script> <script src="main-script.js"></script> </html> diff --git a/activity_1/main-script.js b/activity_1/main-script.js index 91be7ad2e25a62cef5bbec4a5b0bc43b3d46fcd5..909fa9e89ebfbe8e57cc549973308c3ca9e9814e 100644 --- a/activity_1/main-script.js +++ b/activity_1/main-script.js @@ -1,143 +1,3 @@ -var blocklyDiv = document.getElementById('blocklyDiv'); -var blocklyArea = document.getElementById('blocklyArea'); -var connectButton = document.getElementById('connectButton'); - -var receivedMsg = ""; - -var port; -let textEncoder = new TextEncoder(); - -//Chargement de la toolbox -var xml = null; -var request = new XMLHttpRequest(); -request.open('GET', 'toolbox.xml', false); -request.send(); -if (request.readyState == 4 && request.status == 200) { - xml = request.responseXML; -} -var toolbox = new XMLSerializer().serializeToString(xml.documentElement); - -//Instancie l'espace de travail blockly -var workspace = Blockly.inject(blocklyDiv, - {toolbox: toolbox}); - -/* Adapte la taille du conteneur de l'espace du travail à l'environnement -Ca a l'air dégueulasse pour faire du responsive mais c'est le truc de la doc -officielle de google xD*/ -var onresize = function(e) { - // Compute the absolute coordinates and dimensions of blocklyArea. - var element = blocklyArea; - var x = 0; - var y = 0; - do { - x += element.offsetLeft; - y += element.offsetTop; - element = element.offsetParent; - } while (element); - // Position blocklyDiv over blocklyArea. - blocklyDiv.style.left = x + 'px'; - blocklyDiv.style.top = y + 'px'; - blocklyDiv.style.width = blocklyArea.offsetWidth + 'px'; - blocklyDiv.style.height = blocklyArea.offsetHeight + 'px'; - Blockly.svgResize(workspace); - }; - window.addEventListener('resize', onresize, false); - onresize(); - Blockly.svgResize(workspace); - -//Instanciation de la liaison série à la fin du chargement de la page -document.addEventListener('DOMContentLoaded', event => { - function connect() { - console.log('Connecting to ' + port.device_.productName + '...'); - port.connect().then(() => { - console.log(port); - console.log('Connected.'); - connectButton.textContent = 'Se déconnecter'; - port.onReceive = data => { - let textDecoder = new TextDecoder(); - receivedMsg = textDecoder.decode(data); - //console.log("Reçu :" + receivedMsg); - } - port.onReceiveError = error => { - console.log('Receive error: ' + error); - }; - }, error => { - console.log('Connection error: ' + error); - }); - }; - - connectButton.addEventListener('click', function() { - if (port) { - port.disconnect(); - connectButton.textContent = 'Connecter à la maquette'; - port = null; - } else { - serial.requestPort().then(selectedPort => { - port = selectedPort; - connect(); - }).catch(error => { - console.log('Connection error: ' + error); - }); - } - }); - - serial.getPorts().then(ports => { - if (ports.length == 0) { - console.log('No devices found.'); - } else { - port = ports[0]; - connect(); - } - }); -}); - - -//Envoie ce string à l'Arduino -function sendString(str) { - if (port !== undefined) { - port.send(textEncoder.encode(str)).catch(error => { - console.console.log('Send error: ' + error); - }); - } -} - -//Attend jusqu'à ce que le message "UNLOCK;" soit reçu de l'arduino -function waitForUnlockFromArduino() { - if (receivedMsg != "UNLOCK;") { - setTimeout(waitForUnlockFromArduino, 10); - return; - } -} - -//Lance le code tel que rentré par le joueur -function runCode() { - var code = Blockly.JavaScript.workspaceToCode(workspace); //On récupère un code javascript - var myInterpreter = new Interpreter(code, initApi); //Intanciation d'une VM avec fonctions réécrites - myInterpreter.run(); //On lance le code de l'utilisateur dans la VM - //Il est possible de lancer le code de façon séquencielle -} - - -//Interprétation des commandes par l'utiliseur (redéfinition des fonctions avec IO) -function initApi(interpreter, scope) { - // Add an API function for the alert() block. - var wrapper = function(text) { - return alert(arguments.length ? text : ''); - }; - interpreter.setProperty(scope, 'alert', - interpreter.createNativeFunction(wrapper)); - - // Add an API function for the sendString() block. - wrapper = function(text) { - return sendString(arguments.length ? text : ''); - }; - interpreter.setProperty(scope, 'sendString', - interpreter.createNativeFunction(wrapper)); - - // Add an API function for the waitForUnlockFromArduino() block. - wrapper = function() { - return waitForUnlockFromArduino(); - }; - interpreter.setProperty(scope, 'waitForUnlockFromArduino', - interpreter.createNativeFunction(wrapper)); -} +/* 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'.*/ diff --git a/activity_2/arduino_blocks_def.js b/activity_2/arduino_blocks_def.js deleted file mode 100644 index 07da611f6f60f41051c15192e36c23e0e5c4bb16..0000000000000000000000000000000000000000 --- a/activity_2/arduino_blocks_def.js +++ /dev/null @@ -1,41 +0,0 @@ -Blockly.Blocks['sendtoarduino'] = { - init: function() { - this.appendValueInput("MESSAGE") - .setCheck("String") - .appendField("Envoyer à l'arduino :"); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(330); - this.setTooltip("envoi d'un string à l'Arduino de la maquette"); - this.setHelpUrl(""); - } -}; - -Blockly.Blocks['turn_led'] = { - init: function() { - this.appendDummyInput() - .appendField("Mettre la LED en l'état") - .appendField(new Blockly.FieldDropdown([["allumée","on"], ["éteinte","off"]]), "val"); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(345); - this.setTooltip("Change l'état d'une LED"); - this.setHelpUrl(""); - } -}; - -Blockly.Blocks['arduino_wait'] = { - init: function() { - this.appendValueInput("time") - .setCheck("Number") - .appendField("Attendre"); - this.appendDummyInput() - .appendField("secondes"); - this.setInputsInline(true); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(330); - this.setTooltip(""); - this.setHelpUrl(""); - } -}; diff --git a/activity_2/arduino_blocks_gen.js b/activity_2/arduino_blocks_gen.js deleted file mode 100644 index 45a5cd607237fea18c537c7aea5c90b65123a869..0000000000000000000000000000000000000000 --- a/activity_2/arduino_blocks_gen.js +++ /dev/null @@ -1,20 +0,0 @@ -Blockly.JavaScript['sendtoarduino'] = function(block) { - var value_message = Blockly.JavaScript.valueToCode(block, 'MESSAGE', Blockly.JavaScript.ORDER_ATOMIC); - // TODO: Assemble JavaScript into code variable. - var code = 'sendString("'+ value_message + ';"); \n'; - return code; -}; - -Blockly.JavaScript['turn_led'] = function(block) { - var dropdown_val = block.getFieldValue('val'); - // TODO: Assemble JavaScript into code variable. - var code = 'sendString("LED_'+ dropdown_val + ';");\n'; - return code; -}; - -Blockly.JavaScript['arduino_wait'] = function(block) { - var value_time = Blockly.JavaScript.valueToCode(block, 'time', Blockly.JavaScript.ORDER_ATOMIC); - let time_ms = Math.round(value_time*1000); - var code = 'sendString("DELAY_'+time_ms+';");\n waitForUnlockFromArduino();\n'; - return code; -}; diff --git a/activity_2/index.html b/activity_2/index.html index 136a565837113cfe14a97c665ee2cd228a6a5733..206a8042d20c5df1758ce5ee3bc5cb05e4dbae02 100644 --- a/activity_2/index.html +++ b/activity_2/index.html @@ -35,16 +35,18 @@ <div id="toolsArea"> <div id="animationArea"></div> <a class="button" id="connectButton">Connecter à la maquette</a> - <a onclick="runCode()" class="button" id="runButton">Lancer le programme !</a> + <a class="button" id="runButton">Lancer le programme !</a> </div> + </section> <footer id="footer"></footer> </body> <!-- Script d'intanciation lancé au chargement, doit toujours être à la fin--> - <script src="arduino_blocks_def.js"></script> - <script src="arduino_blocks_gen.js"></script> + <script src="../res/blocks/arduino_blocks_def.js"></script> + <script src="../res/blocks/arduino_blocks_gen.js"></script> + <script src="../res/activity_functions.js"></script> <script src="main-script.js"></script> </html> diff --git a/activity_2/main-script.js b/activity_2/main-script.js index c49b0ae1c04f3d940195bee3c2a2996017289bd8..909fa9e89ebfbe8e57cc549973308c3ca9e9814e 100644 --- a/activity_2/main-script.js +++ b/activity_2/main-script.js @@ -1,144 +1,3 @@ -var blocklyDiv = document.getElementById('blocklyDiv'); -var blocklyArea = document.getElementById('blocklyArea'); -var connectButton = document.getElementById('connectButton'); - -var receivedMsg = ""; -var prevRecievedMsg = ""; - -var port; -let textEncoder = new TextEncoder(); - -//Chargement de la toolbox -var xml = null; -var request = new XMLHttpRequest(); -request.open('GET', 'toolbox.xml', false); -request.send(); -if (request.readyState == 4 && request.status == 200) { - xml = request.responseXML; -} -var toolbox = new XMLSerializer().serializeToString(xml.documentElement); - -//Instancie l'espace de travail blockly -var workspace = Blockly.inject(blocklyDiv, - {toolbox: toolbox}); - -/* Adapte la taille du conteneur de l'espace du travail à l'environnement -Ca a l'air dégueulasse pour faire du responsive mais c'est le truc de la doc -officielle de google xD*/ -var onresize = function(e) { - // Compute the absolute coordinates and dimensions of blocklyArea. - var element = blocklyArea; - var x = 0; - var y = 0; - do { - x += element.offsetLeft; - y += element.offsetTop; - element = element.offsetParent; - } while (element); - // Position blocklyDiv over blocklyArea. - blocklyDiv.style.left = x + 'px'; - blocklyDiv.style.top = y + 'px'; - blocklyDiv.style.width = blocklyArea.offsetWidth + 'px'; - blocklyDiv.style.height = blocklyArea.offsetHeight + 'px'; - Blockly.svgResize(workspace); - }; - window.addEventListener('resize', onresize, false); - onresize(); - Blockly.svgResize(workspace); - -//Instanciation de la liaison série à la fin du chargement de la page -document.addEventListener('DOMContentLoaded', event => { - function connect() { - console.log('Connecting to ' + port.device_.productName + '...'); - port.connect().then(() => { - console.log(port); - console.log('Connected.'); - connectButton.textContent = 'Se déconnecter'; - port.onReceive = data => { - let textDecoder = new TextDecoder(); - receivedMsg = textDecoder.decode(data); - //console.log("Reçu :" + receivedMsg); - } - port.onReceiveError = error => { - console.log('Receive error: ' + error); - }; - }, error => { - console.log('Connection error: ' + error); - }); - }; - - connectButton.addEventListener('click', function() { - if (port) { - port.disconnect(); - connectButton.textContent = 'Connecter à la maquette'; - port = null; - } else { - serial.requestPort().then(selectedPort => { - port = selectedPort; - connect(); - }).catch(error => { - console.log('Connection error: ' + error); - }); - } - }); - - serial.getPorts().then(ports => { - if (ports.length == 0) { - console.log('No devices found.'); - } else { - port = ports[0]; - connect(); - } - }); -}); - - -//Envoie ce string à l'Arduino -function sendString(str) { - if (port !== undefined) { - port.send(textEncoder.encode(str)).catch(error => { - console.console.log('Send error: ' + error); - }); - } -} - -//Attend jusqu'à ce que le message "UNLOCK;" soit reçu de l'arduino -function waitForUnlockFromArduino() { - if (receivedMsg != "UNLOCK;") { - setTimeout(waitForUnlockFromArduino, 10); - return; - } -} - -//Lance le code tel que rentré par le joueur -function runCode() { - var code = Blockly.JavaScript.workspaceToCode(workspace); //On récupère un code javascript - var myInterpreter = new Interpreter(code, initApi); //Intanciation d'une VM avec fonctions réécrites - myInterpreter.run(); //On lance le code de l'utilisateur dans la VM - //Il est possible de lancer le code de façon séquencielle -} - - -//Interprétation des commandes par l'utiliseur (redéfinition des fonctions avec IO) -function initApi(interpreter, scope) { - // Add an API function for the alert() block. - var wrapper = function(text) { - return alert(arguments.length ? text : ''); - }; - interpreter.setProperty(scope, 'alert', - interpreter.createNativeFunction(wrapper)); - - // Add an API function for the sendString() block. - wrapper = function(text) { - return sendString(arguments.length ? text : ''); - }; - interpreter.setProperty(scope, 'sendString', - interpreter.createNativeFunction(wrapper)); - - // Add an API function for the waitForUnlockFromArduino() block. - wrapper = function() { - return waitForUnlockFromArduino(); - }; - interpreter.setProperty(scope, 'waitForUnlockFromArduino', - interpreter.createNativeFunction(wrapper)); -} +/* 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'.*/ diff --git a/activity_3/arduino_blocks_def.js b/activity_3/arduino_blocks_def.js deleted file mode 100644 index 07da611f6f60f41051c15192e36c23e0e5c4bb16..0000000000000000000000000000000000000000 --- a/activity_3/arduino_blocks_def.js +++ /dev/null @@ -1,41 +0,0 @@ -Blockly.Blocks['sendtoarduino'] = { - init: function() { - this.appendValueInput("MESSAGE") - .setCheck("String") - .appendField("Envoyer à l'arduino :"); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(330); - this.setTooltip("envoi d'un string à l'Arduino de la maquette"); - this.setHelpUrl(""); - } -}; - -Blockly.Blocks['turn_led'] = { - init: function() { - this.appendDummyInput() - .appendField("Mettre la LED en l'état") - .appendField(new Blockly.FieldDropdown([["allumée","on"], ["éteinte","off"]]), "val"); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(345); - this.setTooltip("Change l'état d'une LED"); - this.setHelpUrl(""); - } -}; - -Blockly.Blocks['arduino_wait'] = { - init: function() { - this.appendValueInput("time") - .setCheck("Number") - .appendField("Attendre"); - this.appendDummyInput() - .appendField("secondes"); - this.setInputsInline(true); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(330); - this.setTooltip(""); - this.setHelpUrl(""); - } -}; diff --git a/activity_3/arduino_blocks_gen.js b/activity_3/arduino_blocks_gen.js deleted file mode 100644 index 45a5cd607237fea18c537c7aea5c90b65123a869..0000000000000000000000000000000000000000 --- a/activity_3/arduino_blocks_gen.js +++ /dev/null @@ -1,20 +0,0 @@ -Blockly.JavaScript['sendtoarduino'] = function(block) { - var value_message = Blockly.JavaScript.valueToCode(block, 'MESSAGE', Blockly.JavaScript.ORDER_ATOMIC); - // TODO: Assemble JavaScript into code variable. - var code = 'sendString("'+ value_message + ';"); \n'; - return code; -}; - -Blockly.JavaScript['turn_led'] = function(block) { - var dropdown_val = block.getFieldValue('val'); - // TODO: Assemble JavaScript into code variable. - var code = 'sendString("LED_'+ dropdown_val + ';");\n'; - return code; -}; - -Blockly.JavaScript['arduino_wait'] = function(block) { - var value_time = Blockly.JavaScript.valueToCode(block, 'time', Blockly.JavaScript.ORDER_ATOMIC); - let time_ms = Math.round(value_time*1000); - var code = 'sendString("DELAY_'+time_ms+';");\n waitForUnlockFromArduino();\n'; - return code; -}; diff --git a/activity_3/index.html b/activity_3/index.html index 136a565837113cfe14a97c665ee2cd228a6a5733..206a8042d20c5df1758ce5ee3bc5cb05e4dbae02 100644 --- a/activity_3/index.html +++ b/activity_3/index.html @@ -35,16 +35,18 @@ <div id="toolsArea"> <div id="animationArea"></div> <a class="button" id="connectButton">Connecter à la maquette</a> - <a onclick="runCode()" class="button" id="runButton">Lancer le programme !</a> + <a class="button" id="runButton">Lancer le programme !</a> </div> + </section> <footer id="footer"></footer> </body> <!-- Script d'intanciation lancé au chargement, doit toujours être à la fin--> - <script src="arduino_blocks_def.js"></script> - <script src="arduino_blocks_gen.js"></script> + <script src="../res/blocks/arduino_blocks_def.js"></script> + <script src="../res/blocks/arduino_blocks_gen.js"></script> + <script src="../res/activity_functions.js"></script> <script src="main-script.js"></script> </html> diff --git a/activity_3/main-script.js b/activity_3/main-script.js index c49b0ae1c04f3d940195bee3c2a2996017289bd8..909fa9e89ebfbe8e57cc549973308c3ca9e9814e 100644 --- a/activity_3/main-script.js +++ b/activity_3/main-script.js @@ -1,144 +1,3 @@ -var blocklyDiv = document.getElementById('blocklyDiv'); -var blocklyArea = document.getElementById('blocklyArea'); -var connectButton = document.getElementById('connectButton'); - -var receivedMsg = ""; -var prevRecievedMsg = ""; - -var port; -let textEncoder = new TextEncoder(); - -//Chargement de la toolbox -var xml = null; -var request = new XMLHttpRequest(); -request.open('GET', 'toolbox.xml', false); -request.send(); -if (request.readyState == 4 && request.status == 200) { - xml = request.responseXML; -} -var toolbox = new XMLSerializer().serializeToString(xml.documentElement); - -//Instancie l'espace de travail blockly -var workspace = Blockly.inject(blocklyDiv, - {toolbox: toolbox}); - -/* Adapte la taille du conteneur de l'espace du travail à l'environnement -Ca a l'air dégueulasse pour faire du responsive mais c'est le truc de la doc -officielle de google xD*/ -var onresize = function(e) { - // Compute the absolute coordinates and dimensions of blocklyArea. - var element = blocklyArea; - var x = 0; - var y = 0; - do { - x += element.offsetLeft; - y += element.offsetTop; - element = element.offsetParent; - } while (element); - // Position blocklyDiv over blocklyArea. - blocklyDiv.style.left = x + 'px'; - blocklyDiv.style.top = y + 'px'; - blocklyDiv.style.width = blocklyArea.offsetWidth + 'px'; - blocklyDiv.style.height = blocklyArea.offsetHeight + 'px'; - Blockly.svgResize(workspace); - }; - window.addEventListener('resize', onresize, false); - onresize(); - Blockly.svgResize(workspace); - -//Instanciation de la liaison série à la fin du chargement de la page -document.addEventListener('DOMContentLoaded', event => { - function connect() { - console.log('Connecting to ' + port.device_.productName + '...'); - port.connect().then(() => { - console.log(port); - console.log('Connected.'); - connectButton.textContent = 'Se déconnecter'; - port.onReceive = data => { - let textDecoder = new TextDecoder(); - receivedMsg = textDecoder.decode(data); - //console.log("Reçu :" + receivedMsg); - } - port.onReceiveError = error => { - console.log('Receive error: ' + error); - }; - }, error => { - console.log('Connection error: ' + error); - }); - }; - - connectButton.addEventListener('click', function() { - if (port) { - port.disconnect(); - connectButton.textContent = 'Connecter à la maquette'; - port = null; - } else { - serial.requestPort().then(selectedPort => { - port = selectedPort; - connect(); - }).catch(error => { - console.log('Connection error: ' + error); - }); - } - }); - - serial.getPorts().then(ports => { - if (ports.length == 0) { - console.log('No devices found.'); - } else { - port = ports[0]; - connect(); - } - }); -}); - - -//Envoie ce string à l'Arduino -function sendString(str) { - if (port !== undefined) { - port.send(textEncoder.encode(str)).catch(error => { - console.console.log('Send error: ' + error); - }); - } -} - -//Attend jusqu'à ce que le message "UNLOCK;" soit reçu de l'arduino -function waitForUnlockFromArduino() { - if (receivedMsg != "UNLOCK;") { - setTimeout(waitForUnlockFromArduino, 10); - return; - } -} - -//Lance le code tel que rentré par le joueur -function runCode() { - var code = Blockly.JavaScript.workspaceToCode(workspace); //On récupère un code javascript - var myInterpreter = new Interpreter(code, initApi); //Intanciation d'une VM avec fonctions réécrites - myInterpreter.run(); //On lance le code de l'utilisateur dans la VM - //Il est possible de lancer le code de façon séquencielle -} - - -//Interprétation des commandes par l'utiliseur (redéfinition des fonctions avec IO) -function initApi(interpreter, scope) { - // Add an API function for the alert() block. - var wrapper = function(text) { - return alert(arguments.length ? text : ''); - }; - interpreter.setProperty(scope, 'alert', - interpreter.createNativeFunction(wrapper)); - - // Add an API function for the sendString() block. - wrapper = function(text) { - return sendString(arguments.length ? text : ''); - }; - interpreter.setProperty(scope, 'sendString', - interpreter.createNativeFunction(wrapper)); - - // Add an API function for the waitForUnlockFromArduino() block. - wrapper = function() { - return waitForUnlockFromArduino(); - }; - interpreter.setProperty(scope, 'waitForUnlockFromArduino', - interpreter.createNativeFunction(wrapper)); -} +/* 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'.*/ diff --git a/activity_4/arduino_blocks_def.js b/activity_4/arduino_blocks_def.js deleted file mode 100644 index 07da611f6f60f41051c15192e36c23e0e5c4bb16..0000000000000000000000000000000000000000 --- a/activity_4/arduino_blocks_def.js +++ /dev/null @@ -1,41 +0,0 @@ -Blockly.Blocks['sendtoarduino'] = { - init: function() { - this.appendValueInput("MESSAGE") - .setCheck("String") - .appendField("Envoyer à l'arduino :"); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(330); - this.setTooltip("envoi d'un string à l'Arduino de la maquette"); - this.setHelpUrl(""); - } -}; - -Blockly.Blocks['turn_led'] = { - init: function() { - this.appendDummyInput() - .appendField("Mettre la LED en l'état") - .appendField(new Blockly.FieldDropdown([["allumée","on"], ["éteinte","off"]]), "val"); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(345); - this.setTooltip("Change l'état d'une LED"); - this.setHelpUrl(""); - } -}; - -Blockly.Blocks['arduino_wait'] = { - init: function() { - this.appendValueInput("time") - .setCheck("Number") - .appendField("Attendre"); - this.appendDummyInput() - .appendField("secondes"); - this.setInputsInline(true); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(330); - this.setTooltip(""); - this.setHelpUrl(""); - } -}; diff --git a/activity_4/arduino_blocks_gen.js b/activity_4/arduino_blocks_gen.js deleted file mode 100644 index 45a5cd607237fea18c537c7aea5c90b65123a869..0000000000000000000000000000000000000000 --- a/activity_4/arduino_blocks_gen.js +++ /dev/null @@ -1,20 +0,0 @@ -Blockly.JavaScript['sendtoarduino'] = function(block) { - var value_message = Blockly.JavaScript.valueToCode(block, 'MESSAGE', Blockly.JavaScript.ORDER_ATOMIC); - // TODO: Assemble JavaScript into code variable. - var code = 'sendString("'+ value_message + ';"); \n'; - return code; -}; - -Blockly.JavaScript['turn_led'] = function(block) { - var dropdown_val = block.getFieldValue('val'); - // TODO: Assemble JavaScript into code variable. - var code = 'sendString("LED_'+ dropdown_val + ';");\n'; - return code; -}; - -Blockly.JavaScript['arduino_wait'] = function(block) { - var value_time = Blockly.JavaScript.valueToCode(block, 'time', Blockly.JavaScript.ORDER_ATOMIC); - let time_ms = Math.round(value_time*1000); - var code = 'sendString("DELAY_'+time_ms+';");\n waitForUnlockFromArduino();\n'; - return code; -}; diff --git a/activity_4/index.html b/activity_4/index.html index 136a565837113cfe14a97c665ee2cd228a6a5733..206a8042d20c5df1758ce5ee3bc5cb05e4dbae02 100644 --- a/activity_4/index.html +++ b/activity_4/index.html @@ -35,16 +35,18 @@ <div id="toolsArea"> <div id="animationArea"></div> <a class="button" id="connectButton">Connecter à la maquette</a> - <a onclick="runCode()" class="button" id="runButton">Lancer le programme !</a> + <a class="button" id="runButton">Lancer le programme !</a> </div> + </section> <footer id="footer"></footer> </body> <!-- Script d'intanciation lancé au chargement, doit toujours être à la fin--> - <script src="arduino_blocks_def.js"></script> - <script src="arduino_blocks_gen.js"></script> + <script src="../res/blocks/arduino_blocks_def.js"></script> + <script src="../res/blocks/arduino_blocks_gen.js"></script> + <script src="../res/activity_functions.js"></script> <script src="main-script.js"></script> </html> diff --git a/activity_4/main-script.js b/activity_4/main-script.js index c49b0ae1c04f3d940195bee3c2a2996017289bd8..909fa9e89ebfbe8e57cc549973308c3ca9e9814e 100644 --- a/activity_4/main-script.js +++ b/activity_4/main-script.js @@ -1,144 +1,3 @@ -var blocklyDiv = document.getElementById('blocklyDiv'); -var blocklyArea = document.getElementById('blocklyArea'); -var connectButton = document.getElementById('connectButton'); - -var receivedMsg = ""; -var prevRecievedMsg = ""; - -var port; -let textEncoder = new TextEncoder(); - -//Chargement de la toolbox -var xml = null; -var request = new XMLHttpRequest(); -request.open('GET', 'toolbox.xml', false); -request.send(); -if (request.readyState == 4 && request.status == 200) { - xml = request.responseXML; -} -var toolbox = new XMLSerializer().serializeToString(xml.documentElement); - -//Instancie l'espace de travail blockly -var workspace = Blockly.inject(blocklyDiv, - {toolbox: toolbox}); - -/* Adapte la taille du conteneur de l'espace du travail à l'environnement -Ca a l'air dégueulasse pour faire du responsive mais c'est le truc de la doc -officielle de google xD*/ -var onresize = function(e) { - // Compute the absolute coordinates and dimensions of blocklyArea. - var element = blocklyArea; - var x = 0; - var y = 0; - do { - x += element.offsetLeft; - y += element.offsetTop; - element = element.offsetParent; - } while (element); - // Position blocklyDiv over blocklyArea. - blocklyDiv.style.left = x + 'px'; - blocklyDiv.style.top = y + 'px'; - blocklyDiv.style.width = blocklyArea.offsetWidth + 'px'; - blocklyDiv.style.height = blocklyArea.offsetHeight + 'px'; - Blockly.svgResize(workspace); - }; - window.addEventListener('resize', onresize, false); - onresize(); - Blockly.svgResize(workspace); - -//Instanciation de la liaison série à la fin du chargement de la page -document.addEventListener('DOMContentLoaded', event => { - function connect() { - console.log('Connecting to ' + port.device_.productName + '...'); - port.connect().then(() => { - console.log(port); - console.log('Connected.'); - connectButton.textContent = 'Se déconnecter'; - port.onReceive = data => { - let textDecoder = new TextDecoder(); - receivedMsg = textDecoder.decode(data); - //console.log("Reçu :" + receivedMsg); - } - port.onReceiveError = error => { - console.log('Receive error: ' + error); - }; - }, error => { - console.log('Connection error: ' + error); - }); - }; - - connectButton.addEventListener('click', function() { - if (port) { - port.disconnect(); - connectButton.textContent = 'Connecter à la maquette'; - port = null; - } else { - serial.requestPort().then(selectedPort => { - port = selectedPort; - connect(); - }).catch(error => { - console.log('Connection error: ' + error); - }); - } - }); - - serial.getPorts().then(ports => { - if (ports.length == 0) { - console.log('No devices found.'); - } else { - port = ports[0]; - connect(); - } - }); -}); - - -//Envoie ce string à l'Arduino -function sendString(str) { - if (port !== undefined) { - port.send(textEncoder.encode(str)).catch(error => { - console.console.log('Send error: ' + error); - }); - } -} - -//Attend jusqu'à ce que le message "UNLOCK;" soit reçu de l'arduino -function waitForUnlockFromArduino() { - if (receivedMsg != "UNLOCK;") { - setTimeout(waitForUnlockFromArduino, 10); - return; - } -} - -//Lance le code tel que rentré par le joueur -function runCode() { - var code = Blockly.JavaScript.workspaceToCode(workspace); //On récupère un code javascript - var myInterpreter = new Interpreter(code, initApi); //Intanciation d'une VM avec fonctions réécrites - myInterpreter.run(); //On lance le code de l'utilisateur dans la VM - //Il est possible de lancer le code de façon séquencielle -} - - -//Interprétation des commandes par l'utiliseur (redéfinition des fonctions avec IO) -function initApi(interpreter, scope) { - // Add an API function for the alert() block. - var wrapper = function(text) { - return alert(arguments.length ? text : ''); - }; - interpreter.setProperty(scope, 'alert', - interpreter.createNativeFunction(wrapper)); - - // Add an API function for the sendString() block. - wrapper = function(text) { - return sendString(arguments.length ? text : ''); - }; - interpreter.setProperty(scope, 'sendString', - interpreter.createNativeFunction(wrapper)); - - // Add an API function for the waitForUnlockFromArduino() block. - wrapper = function() { - return waitForUnlockFromArduino(); - }; - interpreter.setProperty(scope, 'waitForUnlockFromArduino', - interpreter.createNativeFunction(wrapper)); -} +/* 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'.*/ diff --git a/res/activity_functions.js b/res/activity_functions.js new file mode 100644 index 0000000000000000000000000000000000000000..7194c35b7fe55a014200959746057693f53332df --- /dev/null +++ b/res/activity_functions.js @@ -0,0 +1,195 @@ +var blocklyDiv = document.getElementById('blocklyDiv'); +var blocklyArea = document.getElementById('blocklyArea'); +var connectButton = document.getElementById('connectButton'); +var runButton = document.getElementById('runButton'); + +var receivedMsg = ""; + +var port; +let textEncoder = new TextEncoder(); + + +//Lance le code tel que rentré par le joueur +function runCode() { + var code = Blockly.JavaScript.workspaceToCode(workspace); //On récupère un code javascript + var myInterpreter = new Interpreter(code, initApi); //Intanciation d'une VM avec fonctions réécrites + myInterpreter.run(); //On lance le code de l'utilisateur dans la VM + //Il est possible de lancer le code de façon séquencielle +} + + + +/************************************ + FONCTIONS DE COMMUNICATION ARDUINO + ************************************/ + +//Envoie ce string à l'Arduino +function sendString(str) { + if (port !== undefined) { + port.send(textEncoder.encode(str)).catch(error => { + console.log('Send error: ' + error); + }); + } +} + +//Attend jusqu'à ce que le message "UNLOCK;" soit reçu de l'arduino +function waitForUnlockFromArduino() { + if (receivedMsg != "UNLOCK;") { + setTimeout(waitForUnlockFromArduino, 10); + return; + } +} + +//Attend un message de l'Arduino et retourne ses arguments éventuels +//Les arguments sont séparés par '_' +function waitForMessageFromArduino(message) { + var args = receivedMsg.split('_'); + if (args[0] != message) { + setTimeout(waitForUnlockFromArduino, 10); + return; + } + return args.slice(1); +} + + + +/******************************************************* +IMPLEMENTATION DES FONCTIONS DANS L'INTERPRETEUR JS +********************************************************/ + +//Interprétation des commandes par l'utiliseur (redéfinition des fonctions avec IO) +function initApi(interpreter, scope) { + // Add an API function for the alert() block. + var wrapper = function(text) { + return alert(arguments.length ? text : ''); + }; + interpreter.setProperty(scope, 'alert', + interpreter.createNativeFunction(wrapper)); + + // Add an API function for the sendString() block. + wrapper = function(text) { + return sendString(arguments.length ? text : ''); + }; + interpreter.setProperty(scope, 'sendString', + interpreter.createNativeFunction(wrapper)); + + // Add an API function for the waitForUnlockFromArduino() block. + wrapper = function() { + return waitForUnlockFromArduino(); + }; + interpreter.setProperty(scope, 'waitForUnlockFromArduino', + interpreter.createNativeFunction(wrapper)); + + // Add an API function for the waitForMessageFromArduino() block. + wrapper = function(text) { + return waitForUnlockFromArduino(arguments.length ? text : ''); + }; + interpreter.setProperty(scope, 'waitForMessageFromArduino', + interpreter.createNativeFunction(wrapper)); +} + + + +/*************************************************** + GESTION DES CONNEXIONS ET INITIALISATION SERIAL +***************************************************/ + +//Instanciation de la liaison série à la fin du chargement de la page +document.addEventListener('DOMContentLoaded', event => { + function connect() { + console.log('Connecting to ' + port.device_.productName + '...'); + port.connect().then(() => { + console.log(port); + console.log('Connected.'); + connectButton.textContent = 'Se déconnecter'; + connectButton.style.background = 'linear-gradient(to bottom, #B52812 5%, #99220F 100%)'; + connectButton.style.border = '3px solid #801C0D'; + runButton.style.background = 'linear-gradient(to bottom, #77B55B 5%, #568241 100%)'; + runButton.style.border = '3px solid #476B36'; + runButton.addEventListener('click', runCode); + port.onReceive = data => { + let textDecoder = new TextDecoder(); + receivedMsg = textDecoder.decode(data); + //console.log("Reçu :" + receivedMsg); + } + port.onReceiveError = error => { + console.log('Receive error: ' + error); + }; + }, error => { + console.log('Connection error: ' + error); + }); + }; + + connectButton.addEventListener('click', function() { + if (port) { + port.disconnect(); + connectButton.textContent = 'Connecter à la maquette'; + connectButton.style.background = 'linear-gradient(to bottom, #77B55B 5%, #568241 100%)'; + connectButton.style.border = '3px solid #476B36'; + runButton.style.background = 'linear-gradient(to bottom, #737375 5%, #5D5C5E 100%)'; + runButton.style.border = '3px solid #353436'; + runButton.removeEventListener('click', runCode); + port = null; + } else { + serial.requestPort().then(selectedPort => { + port = selectedPort; + connect(); + }).catch(error => { + console.log('Connection error: ' + error); + }); + } + }); + + serial.getPorts().then(ports => { + if (ports.length == 0) { + console.log('No devices found.'); + } else { + port = ports[0]; + connect(); + } + }); +}); + + + +/*********************************************** +INITIALISATION DU MODULE BLOCKLY AVEC SA TOOLBOX +************************************************/ + +//Chargement de la toolbox +var xml = null; +var request = new XMLHttpRequest(); +request.open('GET', 'toolbox.xml', false); +request.send(); +if (request.readyState == 4 && request.status == 200) { + xml = request.responseXML; +} +var toolbox = new XMLSerializer().serializeToString(xml.documentElement); + +//Instancie l'espace de travail blockly +var workspace = Blockly.inject(blocklyDiv, + {toolbox: toolbox}); + +/* Adapte la taille du conteneur de l'espace du travail à l'environnement +Ca a l'air dégueulasse pour faire du responsive mais c'est le truc de la doc +officielle de google xD*/ +var onresize = function(e) { + // Compute the absolute coordinates and dimensions of blocklyArea. + var element = blocklyArea; + var x = 0; + var y = 0; + do { + x += element.offsetLeft; + y += element.offsetTop; + element = element.offsetParent; + } while (element); + // Position blocklyDiv over blocklyArea. + blocklyDiv.style.left = x + 'px'; + blocklyDiv.style.top = y + 'px'; + blocklyDiv.style.width = blocklyArea.offsetWidth + 'px'; + blocklyDiv.style.height = blocklyArea.offsetHeight + 'px'; + Blockly.svgResize(workspace); +}; +window.addEventListener('resize', onresize, false); +onresize(); +Blockly.svgResize(workspace); diff --git a/activity_1/arduino_blocks_def.js b/res/blocks/arduino_blocks_def.js similarity index 100% rename from activity_1/arduino_blocks_def.js rename to res/blocks/arduino_blocks_def.js diff --git a/activity_1/arduino_blocks_gen.js b/res/blocks/arduino_blocks_gen.js similarity index 100% rename from activity_1/arduino_blocks_gen.js rename to res/blocks/arduino_blocks_gen.js diff --git a/res/style.css b/res/style.css index da689c2fe5ee72b777c7984c9b44a8e86579b844..c97f011ad12d13a10fc20be72f5aea615bfd7494 100644 --- a/res/style.css +++ b/res/style.css @@ -90,7 +90,6 @@ margin: 50px; background-color: var(--main-bg-color-light); transition: color 1s, background-color 1s; } - li.activitySelector:hover a{ background-color: var(--main-bg-color-dark); color: white; @@ -113,7 +112,6 @@ max-height: 210px; max-width: 280px; align-self: center; } - li.activitySelector:hover a img { display: none; } @@ -125,7 +123,6 @@ text-align: justify; color: var(--main-bg-color-light); transition: color 1s; } - li.activitySelector:hover a p { display: inline-block; color: white; @@ -150,16 +147,10 @@ text-decoration:none; #runButton { order: 3; - background:linear-gradient(to bottom, #77b55a 5%, #72b352 100%); - background-color:#77b55a; - border:3px solid #4b8f29; + background:linear-gradient(to bottom, #737375 5%, #5D5C5E 100%); + border:3px solid #353436; color:#ffffff; - text-shadow:0px 1px 0px #5b8a3c; -} - -#runButton:hover { - background:linear-gradient(to bottom, #72b352 5%, #77b55a 100%); - background-color:#72b352; + text-shadow:0px 1px 0px #2E362B; } #runButton:active { position:relative; @@ -168,17 +159,11 @@ text-decoration:none; #connectButton { order: 1; - background:linear-gradient(to bottom, #77b55a 5%, #72b352 100%); - background-color:#77b55a; - border:3px solid #4b8f29; + background:linear-gradient(to bottom, #77B55B 5%, #568241 100%); + border:3px solid #476B36; color:#ffffff; - text-shadow:0px 1px 0px #5b8a3c; - -} + text-shadow:0px 1px 0px #2E362B; -#connectButton:hover { - background:linear-gradient(to bottom, #72b352 5%, #77b55a 100%); - background-color:#72b352; } #connectButton:active { position:relative;