diff --git a/src/components/Blockly/blocks/logic.js b/src/components/Blockly/blocks/logic.js index 5d25ed9..1c59e2b 100644 --- a/src/components/Blockly/blocks/logic.js +++ b/src/components/Blockly/blocks/logic.js @@ -1,648 +1,666 @@ -import Blockly from 'blockly/core'; -import { getColour } from '../helpers/colour'; -import * as Types from '../helpers/types'; -import { getCompatibleTypes } from '../helpers/types'; +import Blockly from "blockly/core"; +import { getColour } from "../helpers/colour"; +import * as Types from "../helpers/types"; +import { getCompatibleTypes } from "../helpers/types"; - - -Blockly.Blocks['controls_if'] = { - /** - * Block for if/elseif/else condition. - * @this Blockly.Block - */ - init: function () { - this.setHelpUrl(Blockly.Msg.CONTROLS_IF_HELPURL); - this.setColour(getColour().logic); - this.appendValueInput('IF0') - .setCheck(Types.getCompatibleTypes('boolean')) - .appendField(Blockly.Msg.CONTROLS_IF_MSG_IF); - this.appendStatementInput('DO0') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setMutator(new Blockly.Mutator(['controls_if_elseif', - 'controls_if_else'])); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function () { - if (!thisBlock.elseifCount_ && !thisBlock.elseCount_) { - return Blockly.Msg.CONTROLS_IF_TOOLTIP_1; - } else if (!thisBlock.elseifCount_ && thisBlock.elseCount_) { - return Blockly.Msg.CONTROLS_IF_TOOLTIP_2; - } else if (thisBlock.elseifCount_ && !thisBlock.elseCount_) { - return Blockly.Msg.CONTROLS_IF_TOOLTIP_3; - } else if (thisBlock.elseifCount_ && thisBlock.elseCount_) { - return Blockly.Msg.CONTROLS_IF_TOOLTIP_4; - } - return ''; - }); - this.elseifCount_ = 0; - this.elseCount_ = 0; - }, - /** - * Create XML to represent the number of else-if and else inputs. - * @return {Element} XML storage element. - * @this Blockly.Block - */ - mutationToDom: function () { - if (!this.elseifCount_ && !this.elseCount_) { - return null; - } - var container = document.createElement('mutation'); - if (this.elseifCount_) { - container.setAttribute('elseif', this.elseifCount_); - } - if (this.elseCount_) { - container.setAttribute('else', 1); - } - return container; - }, - /** - * Parse XML to restore the else-if and else inputs. - * @param {!Element} xmlElement XML storage element. - * @this Blockly.Block - */ - domToMutation: function (xmlElement) { - this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10) || 0; - this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10) || 0; - this.updateShape_(); - }, - /** - * Populate the mutator's dialog with this block's components. - * @param {!Blockly.Workspace} workspace Mutator's workspace. - * @return {!Blockly.Block} Root block in mutator. - * @this Blockly.Block - */ - decompose: function (workspace) { - var containerBlock = workspace.newBlock('controls_if_if'); - containerBlock.initSvg(); - var connection = containerBlock.nextConnection; - for (var i = 1; i <= this.elseifCount_; i++) { - var elseifBlock = workspace.newBlock('controls_if_elseif'); - elseifBlock.initSvg(); - connection.connect(elseifBlock.previousConnection); - connection = elseifBlock.nextConnection; - } - if (this.elseCount_) { - var elseBlock = workspace.newBlock('controls_if_else'); - elseBlock.initSvg(); - connection.connect(elseBlock.previousConnection); - } - return containerBlock; - }, - /** - * Reconfigure this block based on the mutator dialog's components. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - compose: function (containerBlock) { - var clauseBlock = containerBlock.nextConnection.targetBlock(); - // Count number of inputs. - this.elseifCount_ = 0; - this.elseCount_ = 0; - var valueConnections = [null]; - var statementConnections = [null]; - var elseStatementConnection = null; - while (clauseBlock) { - switch (clauseBlock.type) { - case 'controls_if_elseif': - this.elseifCount_++; - valueConnections.push(clauseBlock.valueConnection_); - statementConnections.push(clauseBlock.statementConnection_); - break; - case 'controls_if_else': - this.elseCount_++; - elseStatementConnection = clauseBlock.statementConnection_; - break; - default: - throw new Error('Unknown block type.'); - } - clauseBlock = clauseBlock.nextConnection && - clauseBlock.nextConnection.targetBlock(); - } - this.updateShape_(); - // Reconnect any child blocks. - for (var i = 1; i <= this.elseifCount_; i++) { - Blockly.Mutator.reconnect(valueConnections[i], this, 'IF' + i); - Blockly.Mutator.reconnect(statementConnections[i], this, 'DO' + i); - } - Blockly.Mutator.reconnect(elseStatementConnection, this, 'ELSE'); - }, - /** - * Store pointers to any connected child blocks. - * @param {!Blockly.Block} containerBlock Root block in mutator. - * @this Blockly.Block - */ - saveConnections: function (containerBlock) { - var clauseBlock = containerBlock.nextConnection.targetBlock(); - var i = 1; - var inputDo; - while (clauseBlock) { - switch (clauseBlock.type) { - case 'controls_if_elseif': - var inputIf = this.getInput('IF' + i); - inputDo = this.getInput('DO' + i); - clauseBlock.valueConnection_ = - inputIf && inputIf.connection.targetConnection; - clauseBlock.statementConnection_ = - inputDo && inputDo.connection.targetConnection; - i++; - break; - case 'controls_if_else': - inputDo = this.getInput('ELSE'); - clauseBlock.statementConnection_ = - inputDo && inputDo.connection.targetConnection; - break; - default: - throw new Error('Unknown block type.'); - } - clauseBlock = clauseBlock.nextConnection && - clauseBlock.nextConnection.targetBlock(); - } - }, - /** - * Modify this block to have the correct number of inputs. - * @private - * @this Blockly.Block - */ - updateShape_: function () { - // Delete everything. - if (this.getInput('ELSE')) { - this.removeInput('ELSE'); - } - var j = 1; - while (this.getInput('IF' + j)) { - this.removeInput('IF' + j); - this.removeInput('DO' + j); - j++; - } - // Rebuild block. - for (var i = 1; i <= this.elseifCount_; i++) { - this.appendValueInput('IF' + i) - .setCheck(Types.getCompatibleTypes('boolean')) - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); - this.appendStatementInput('DO' + i) - .appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); - } - if (this.elseCount_) { - this.appendStatementInput('ELSE') - .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE); - } +Blockly.Blocks["controls_if"] = { + /** + * Block for if/elseif/else condition. + * @this Blockly.Block + */ + init: function () { + this.setHelpUrl(Blockly.Msg.CONTROLS_IF_HELPURL); + this.setColour(getColour().logic); + this.appendValueInput("IF0") + .setCheck(Types.getCompatibleTypes("boolean")) + .appendField(Blockly.Msg.CONTROLS_IF_MSG_IF); + this.appendStatementInput("DO0").appendField( + Blockly.Msg.CONTROLS_IF_MSG_THEN + ); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setMutator( + new Blockly.Mutator(["controls_if_elseif", "controls_if_else"]) + ); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function () { + if (!thisBlock.elseifCount_ && !thisBlock.elseCount_) { + return Blockly.Msg.CONTROLS_IF_TOOLTIP_1; + } else if (!thisBlock.elseifCount_ && thisBlock.elseCount_) { + return Blockly.Msg.CONTROLS_IF_TOOLTIP_2; + } else if (thisBlock.elseifCount_ && !thisBlock.elseCount_) { + return Blockly.Msg.CONTROLS_IF_TOOLTIP_3; + } else if (thisBlock.elseifCount_ && thisBlock.elseCount_) { + return Blockly.Msg.CONTROLS_IF_TOOLTIP_4; + } + return ""; + }); + this.elseifCount_ = 0; + this.elseCount_ = 0; + }, + /** + * Create XML to represent the number of else-if and else inputs. + * @return {Element} XML storage element. + * @this Blockly.Block + */ + mutationToDom: function () { + if (!this.elseifCount_ && !this.elseCount_) { + return null; } + var container = document.createElement("mutation"); + if (this.elseifCount_) { + container.setAttribute("elseif", this.elseifCount_); + } + if (this.elseCount_) { + container.setAttribute("else", 1); + } + return container; + }, + /** + * Parse XML to restore the else-if and else inputs. + * @param {!Element} xmlElement XML storage element. + * @this Blockly.Block + */ + domToMutation: function (xmlElement) { + this.elseifCount_ = parseInt(xmlElement.getAttribute("elseif"), 10) || 0; + this.elseCount_ = parseInt(xmlElement.getAttribute("else"), 10) || 0; + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this Blockly.Block + */ + decompose: function (workspace) { + var containerBlock = workspace.newBlock("controls_if_if"); + containerBlock.initSvg(); + var connection = containerBlock.nextConnection; + for (var i = 1; i <= this.elseifCount_; i++) { + var elseifBlock = workspace.newBlock("controls_if_elseif"); + elseifBlock.initSvg(); + connection.connect(elseifBlock.previousConnection); + connection = elseifBlock.nextConnection; + } + if (this.elseCount_) { + var elseBlock = workspace.newBlock("controls_if_else"); + elseBlock.initSvg(); + connection.connect(elseBlock.previousConnection); + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + compose: function (containerBlock) { + var clauseBlock = containerBlock.nextConnection.targetBlock(); + // Count number of inputs. + this.elseifCount_ = 0; + this.elseCount_ = 0; + var valueConnections = [null]; + var statementConnections = [null]; + var elseStatementConnection = null; + while (clauseBlock) { + switch (clauseBlock.type) { + case "controls_if_elseif": + this.elseifCount_++; + valueConnections.push(clauseBlock.valueConnection_); + statementConnections.push(clauseBlock.statementConnection_); + break; + case "controls_if_else": + this.elseCount_++; + elseStatementConnection = clauseBlock.statementConnection_; + break; + default: + throw new Error("Unknown block type."); + } + clauseBlock = + clauseBlock.nextConnection && clauseBlock.nextConnection.targetBlock(); + } + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 1; i <= this.elseifCount_; i++) { + Blockly.Mutator.reconnect(valueConnections[i], this, "IF" + i); + Blockly.Mutator.reconnect(statementConnections[i], this, "DO" + i); + } + Blockly.Mutator.reconnect(elseStatementConnection, this, "ELSE"); + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this Blockly.Block + */ + saveConnections: function (containerBlock) { + var clauseBlock = containerBlock.nextConnection.targetBlock(); + var i = 1; + var inputDo; + while (clauseBlock) { + switch (clauseBlock.type) { + case "controls_if_elseif": + var inputIf = this.getInput("IF" + i); + inputDo = this.getInput("DO" + i); + clauseBlock.valueConnection_ = + inputIf && inputIf.connection.targetConnection; + clauseBlock.statementConnection_ = + inputDo && inputDo.connection.targetConnection; + i++; + break; + case "controls_if_else": + inputDo = this.getInput("ELSE"); + clauseBlock.statementConnection_ = + inputDo && inputDo.connection.targetConnection; + break; + default: + throw new Error("Unknown block type."); + } + clauseBlock = + clauseBlock.nextConnection && clauseBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this Blockly.Block + */ + updateShape_: function () { + // Delete everything. + if (this.getInput("ELSE")) { + this.removeInput("ELSE"); + } + var j = 1; + while (this.getInput("IF" + j)) { + this.removeInput("IF" + j); + this.removeInput("DO" + j); + j++; + } + // Rebuild block. + for (var i = 1; i <= this.elseifCount_; i++) { + this.appendValueInput("IF" + i) + .setCheck(Types.getCompatibleTypes("boolean")) + .appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF); + this.appendStatementInput("DO" + i).appendField( + Blockly.Msg.CONTROLS_IF_MSG_THEN + ); + } + if (this.elseCount_) { + this.appendStatementInput("ELSE").appendField( + Blockly.Msg.CONTROLS_IF_MSG_ELSE + ); + } + }, }; -Blockly.Blocks['controls_if_if'] = { - /** - * Mutator block for if container. - * @this Blockly.Block - */ - init: function () { - this.setColour(getColour().logic); - this.appendDummyInput() - .appendField(Blockly.Msg.CONTROLS_IF_IF_TITLE_IF); - this.setNextStatement(true); - this.setTooltip(Blockly.Msg.CONTROLS_IF_IF_TOOLTIP); - this.contextMenu = false; - } +Blockly.Blocks["controls_if_if"] = { + /** + * Mutator block for if container. + * @this Blockly.Block + */ + init: function () { + this.setColour(getColour().logic); + this.appendDummyInput().appendField(Blockly.Msg.CONTROLS_IF_IF_TITLE_IF); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.CONTROLS_IF_IF_TOOLTIP); + this.contextMenu = false; + }, }; -Blockly.Blocks['controls_if_elseif'] = { - /** - * Mutator bolck for else-if condition. - * @this Blockly.Block - */ - init: function () { - this.setColour(getColour().logic); - this.appendDummyInput() - .appendField(Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP); - this.contextMenu = false; - } +Blockly.Blocks["controls_if_elseif"] = { + /** + * Mutator bolck for else-if condition. + * @this Blockly.Block + */ + init: function () { + this.setColour(getColour().logic); + this.appendDummyInput().appendField( + Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF + ); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP); + this.contextMenu = false; + }, }; -Blockly.Blocks['controls_if_else'] = { - /** - * Mutator block for else condition. - * @this Blockly.Block - */ - init: function () { - this.setColour(getColour().logic); - this.appendDummyInput() - .appendField(Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE); - this.setPreviousStatement(true); - this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP); - this.contextMenu = false; - } +Blockly.Blocks["controls_if_else"] = { + /** + * Mutator block for else condition. + * @this Blockly.Block + */ + init: function () { + this.setColour(getColour().logic); + this.appendDummyInput().appendField( + Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE + ); + this.setPreviousStatement(true); + this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP); + this.contextMenu = false; + }, }; +Blockly.defineBlocksWithJsonArray([ + // BEGIN JSON EXTRACT + // Block for boolean data type: true and false. + { + type: "logic_boolean", + message0: "%1", + args0: [ + { + type: "field_dropdown", + name: "BOOL", + options: [ + ["%{BKY_LOGIC_BOOLEAN_TRUE}", "TRUE"], + ["%{BKY_LOGIC_BOOLEAN_FALSE}", "FALSE"], + ], + }, + ], + output: Types.BOOLEAN.typeName, + style: "logic_blocks", + tooltip: "%{BKY_LOGIC_BOOLEAN_TOOLTIP}", + helpUrl: "%{BKY_LOGIC_BOOLEAN_HELPURL}", + }, + { + type: "controls_ifelse", + message0: "%{BKY_CONTROLS_IF_MSG_IF} %1", + args0: [ + { + type: "input_value", + name: "IF0", + check: Types.getCompatibleTypes("boolean"), + }, + ], + message1: "%{BKY_CONTROLS_IF_MSG_THEN} %1", + args1: [ + { + type: "input_statement", + name: "DO0", + }, + ], + message2: "%{BKY_CONTROLS_IF_MSG_ELSE} %1", + args2: [ + { + type: "input_statement", + name: "ELSE", + }, + ], + previousStatement: null, + nextStatement: null, + style: "logic_blocks", + tooltip: "%{BKYCONTROLS_IF_TOOLTIP_2}", + helpUrl: "%{BKY_CONTROLS_IF_HELPURL}", + extensions: ["controls_if_tooltip"], + }, + // Block for comparison operator. + { + type: "logic_compare", + message0: "%1 %2 %3", + args0: [ + { + type: "input_value", + name: "A", + }, + { + type: "field_dropdown", + name: "OP", + options: [ + ["=", "EQ"], + ["\u2260", "NEQ"], + ["\u200F<", "LT"], + ["\u200F\u2264", "LTE"], + ["\u200F>", "GT"], + ["\u200F\u2265", "GTE"], + ], + }, + { + type: "input_value", + name: "B", + }, + ], + inputsInline: true, + output: Types.BOOLEAN.typeName, + style: "logic_blocks", + helpUrl: "%{BKY_LOGIC_COMPARE_HELPURL}", + extensions: ["logic_compare", "logic_op_tooltip"], + }, + // Block for logical operations: 'and', 'or'. + { + type: "logic_operation", + message0: "%1 %2 %3", + args0: [ + { + type: "input_value", + name: "A", + check: Types.getCompatibleTypes("boolean"), + }, + { + type: "field_dropdown", + name: "OP", + options: [ + ["%{BKY_LOGIC_OPERATION_AND}", "AND"], + ["%{BKY_LOGIC_OPERATION_OR}", "OR"], + ], + }, + { + type: "input_value", + name: "B", + check: Types.getCompatibleTypes("boolean"), + }, + ], + inputsInline: true, + output: Types.BOOLEAN.typeName, + style: "logic_blocks", + helpUrl: "%{BKY_LOGIC_OPERATION_HELPURL}", + extensions: ["logic_op_tooltip"], + }, + // Block for negation. + { + type: "logic_negate", + message0: "%{BKY_LOGIC_NEGATE_TITLE}", + args0: [ + { + type: "input_value", + name: "BOOL", + check: Types.getCompatibleTypes("boolean"), + }, + ], + output: Types.BOOLEAN.typeName, + style: "logic_blocks", + tooltip: "%{BKY_LOGIC_NEGATE_TOOLTIP}", + helpUrl: "%{BKY_LOGIC_NEGATE_HELPURL}", + }, + // Block for null data type. + { + type: "logic_null", + message0: "%{BKY_LOGIC_NULL}", + output: null, + style: "logic_blocks", + tooltip: "%{BKY_LOGIC_NULL_TOOLTIP}", + helpUrl: "%{BKY_LOGIC_NULL_HELPURL}", + }, + // Block for ternary operator. + { + type: "logic_ternary", + message0: "%{BKY_LOGIC_TERNARY_CONDITION} %1", + args0: [ + { + type: "input_value", + name: "IF", + check: Types.getCompatibleTypes("boolean"), + }, + ], + message1: "%{BKY_LOGIC_TERNARY_IF_TRUE} %1", + args1: [ + { + type: "input_value", + name: "THEN", + check: Types.getCompatibleTypes("boolean"), + }, + ], + message2: "%{BKY_LOGIC_TERNARY_IF_FALSE} %1", + args2: [ + { + type: "input_value", + name: "ELSE", + check: Types.getCompatibleTypes("boolean"), + }, + ], + output: null, + style: "logic_blocks", + tooltip: "%{BKY_LOGIC_TERNARY_TOOLTIP}", + helpUrl: "%{BKY_LOGIC_TERNARY_HELPURL}", + extensions: ["logic_ternary"], + }, +]); // END JSON EXTRACT (Do not delete this comment.) -Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT - // Block for boolean data type: true and false. - { - "type": "logic_boolean", - "message0": "%1", - "args0": [ - { - "type": "field_dropdown", - "name": "BOOL", - "options": [ - ["%{BKY_LOGIC_BOOLEAN_TRUE}", "TRUE"], - ["%{BKY_LOGIC_BOOLEAN_FALSE}", "FALSE"] - ] - } - ], - "output": Types.BOOLEAN.typeName, - "style": "logic_blocks", - "tooltip": "%{BKY_LOGIC_BOOLEAN_TOOLTIP}", - "helpUrl": "%{BKY_LOGIC_BOOLEAN_HELPURL}" - }, - { - "type": "controls_ifelse", - "message0": "%{BKY_CONTROLS_IF_MSG_IF} %1", - "args0": [ - { - "type": "input_value", - "name": "IF0", - "check": Types.getCompatibleTypes('boolean') - } - ], - "message1": "%{BKY_CONTROLS_IF_MSG_THEN} %1", - "args1": [ - { - "type": "input_statement", - "name": "DO0" - } - ], - "message2": "%{BKY_CONTROLS_IF_MSG_ELSE} %1", - "args2": [ - { - "type": "input_statement", - "name": "ELSE" - } - ], - "previousStatement": null, - "nextStatement": null, - "style": "logic_blocks", - "tooltip": "%{BKYCONTROLS_IF_TOOLTIP_2}", - "helpUrl": "%{BKY_CONTROLS_IF_HELPURL}", - "extensions": ["controls_if_tooltip"] - }, - // Block for comparison operator. - { - "type": "logic_compare", - "message0": "%1 %2 %3", - "args0": [ - { - "type": "input_value", - "name": "A" - }, - { - "type": "field_dropdown", - "name": "OP", - "options": [ - ["=", "EQ"], - ["\u2260", "NEQ"], - ["\u200F<", "LT"], - ["\u200F\u2264", "LTE"], - ["\u200F>", "GT"], - ["\u200F\u2265", "GTE"] - ] - }, - { - "type": "input_value", - "name": "B" - } - ], - "inputsInline": true, - "output": Types.BOOLEAN.typeName, - "style": "logic_blocks", - "helpUrl": "%{BKY_LOGIC_COMPARE_HELPURL}", - "extensions": ["logic_compare", "logic_op_tooltip"] - }, - // Block for logical operations: 'and', 'or'. - { - "type": "logic_operation", - "message0": "%1 %2 %3", - "args0": [ - { - "type": "input_value", - "name": "A", - "check": Types.getCompatibleTypes('boolean') - }, - { - "type": "field_dropdown", - "name": "OP", - "options": [ - ["%{BKY_LOGIC_OPERATION_AND}", "AND"], - ["%{BKY_LOGIC_OPERATION_OR}", "OR"] - ] - }, - { - "type": "input_value", - "name": "B", - "check": Types.getCompatibleTypes('boolean') - } - ], - "inputsInline": true, - "output": Types.BOOLEAN.typeName, - "style": "logic_blocks", - "helpUrl": "%{BKY_LOGIC_OPERATION_HELPURL}", - "extensions": ["logic_op_tooltip"] - }, - // Block for negation. - { - "type": "logic_negate", - "message0": "%{BKY_LOGIC_NEGATE_TITLE}", - "args0": [ - { - "type": "input_value", - "name": "BOOL", - "check": Types.getCompatibleTypes('boolean'), - } - ], - "output": Types.BOOLEAN.typeName, - "style": "logic_blocks", - "tooltip": "%{BKY_LOGIC_NEGATE_TOOLTIP}", - "helpUrl": "%{BKY_LOGIC_NEGATE_HELPURL}" - }, - // Block for null data type. - { - "type": "logic_null", - "message0": "%{BKY_LOGIC_NULL}", - "output": null, - "style": "logic_blocks", - "tooltip": "%{BKY_LOGIC_NULL_TOOLTIP}", - "helpUrl": "%{BKY_LOGIC_NULL_HELPURL}" - }, - // Block for ternary operator. - { - "type": "logic_ternary", - "message0": "%{BKY_LOGIC_TERNARY_CONDITION} %1", - "args0": [ - { - "type": "input_value", - "name": "IF", - "check": Types.getCompatibleTypes('boolean'), - } - ], - "message1": "%{BKY_LOGIC_TERNARY_IF_TRUE} %1", - "args1": [ - { - "type": "input_value", - "name": "THEN", - "check": Types.getCompatibleTypes('boolean'), - } - ], - "message2": "%{BKY_LOGIC_TERNARY_IF_FALSE} %1", - "args2": [ - { - "type": "input_value", - "name": "ELSE", - "check": Types.getCompatibleTypes('boolean'), - } - ], - "output": null, - "style": "logic_blocks", - "tooltip": "%{BKY_LOGIC_TERNARY_TOOLTIP}", - "helpUrl": "%{BKY_LOGIC_TERNARY_HELPURL}", - "extensions": ["logic_ternary"] +Blockly.Blocks["logic_compare"] = { + /** + * Block for comparison operator. + * @this Blockly.Block + */ + init: function () { + var OPERATORS = this.RTL + ? [ + ["=", "EQ"], + ["\u2260", "NEQ"], + [">", "LT"], + ["\u2265", "LTE"], + ["<", "GT"], + ["\u2264", "GTE"], + ] + : [ + ["=", "EQ"], + ["\u2260", "NEQ"], + ["<", "LT"], + ["\u2264", "LTE"], + [">", "GT"], + ["\u2265", "GTE"], + ]; + this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL); + this.setColour(getColour().logic); + this.setOutput(true, Types.BOOLEAN.typeName); + this.appendValueInput("A"); + this.appendValueInput("B").appendField( + new Blockly.FieldDropdown(OPERATORS), + "OP" + ); + this.setInputsInline(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function () { + var op = thisBlock.getFieldValue("OP"); + var TOOLTIPS = { + EQ: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ, + NEQ: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ, + LT: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT, + LTE: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE, + GT: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT, + GTE: Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE, + }; + return TOOLTIPS[op]; + }); + }, + /** + * Called whenever anything on the workspace changes. + * Prevent mismatched types from being compared. + * @param {!Blockly.Events.Abstract} e Change event. + * @this Blockly.Block + */ + onchange: function (e) { + var blockA = this.getInputTargetBlock("A"); + console.log(blockA); + var blockB = this.getInputTargetBlock("B"); + if (blockA === null && blockB === null) { + this.getInput("A").setCheck(null); + this.getInput("B").setCheck(null); } -]); // END JSON EXTRACT (Do not delete this comment.) - - -Blockly.Blocks['logic_compare'] = { - /** - * Block for comparison operator. - * @this Blockly.Block - */ - init: function () { - var OPERATORS = this.RTL ? [ - ['=', 'EQ'], - ['\u2260', 'NEQ'], - ['>', 'LT'], - ['\u2265', 'LTE'], - ['<', 'GT'], - ['\u2264', 'GTE'] - ] : [ - ['=', 'EQ'], - ['\u2260', 'NEQ'], - ['<', 'LT'], - ['\u2264', 'LTE'], - ['>', 'GT'], - ['\u2265', 'GTE'] - ]; - this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL); - this.setColour(getColour().logic); - this.setOutput(true, Types.BOOLEAN.typeName); - this.appendValueInput('A'); - this.appendValueInput('B') - .appendField(new Blockly.FieldDropdown(OPERATORS), 'OP'); - this.setInputsInline(true); - // Assign 'this' to a variable for use in the tooltip closure below. - var thisBlock = this; - this.setTooltip(function () { - var op = thisBlock.getFieldValue('OP'); - var TOOLTIPS = { - 'EQ': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ, - 'NEQ': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ, - 'LT': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT, - 'LTE': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE, - 'GT': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT, - 'GTE': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE - }; - return TOOLTIPS[op]; - }); - }, - /** - * Called whenever anything on the workspace changes. - * Prevent mismatched types from being compared. - * @param {!Blockly.Events.Abstract} e Change event. - * @this Blockly.Block - */ - onchange: function (e) { - var blockA = this.getInputTargetBlock('A'); - var blockB = this.getInputTargetBlock('B'); - if (blockA === null && blockB === null) { - this.getInput('A').setCheck(null); - this.getInput('B').setCheck(null); - } - if (blockA !== null && blockB === null) { - this.getInput('A').setCheck(getCompatibleTypes(blockA.outputConnection.check_[0])); - this.getInput('B').setCheck(getCompatibleTypes(blockA.outputConnection.check_[0])); - } - if (blockB !== null && blockA === null) { - this.getInput('B').setCheck(getCompatibleTypes(blockB.outputConnection.check_[0])); - this.getInput('A').setCheck(getCompatibleTypes(blockB.outputConnection.check_[0])); - } + if (blockA !== null && blockB === null) { + this.getInput("A").setCheck( + getCompatibleTypes(blockA.outputConnection.check_[0]) + ); + this.getInput("B").setCheck( + getCompatibleTypes(blockA.outputConnection.check_[0]) + ); } + if (blockB !== null && blockA === null) { + this.getInput("B").setCheck( + getCompatibleTypes(blockB.outputConnection.check_[0]) + ); + this.getInput("A").setCheck( + getCompatibleTypes(blockB.outputConnection.check_[0]) + ); + } + }, }; +Blockly.Blocks["switch_case"] = { + init: function () { + this.setColour(getColour().logic); + this.setPreviousStatement(true); + this.setTooltip(Blockly.Msg.cases_tooltip); + this.setNextStatement(true); + this.appendValueInput("CONDITION").appendField(Blockly.Msg.cases_switch); + this.appendValueInput("CASECONDITION0").appendField( + Blockly.Msg.cases_condition + ); + this.appendStatementInput("CASE0").appendField(Blockly.Msg.cases_do); + this.setMutator(new Blockly.Mutator(["case_incaseof", "case_default"])); + this.caseCount_ = 0; + this.defaultCount_ = 0; + }, -Blockly.Blocks['switch_case'] = { - init: function () { - this.setColour(getColour().logic); - this.setPreviousStatement(true); - this.setTooltip(Blockly.Msg.cases_tooltip); - this.setNextStatement(true); - this.appendValueInput('CONDITION') - .appendField(Blockly.Msg.cases_switch); - this.appendValueInput('CASECONDITION0') - .appendField(Blockly.Msg.cases_condition); - this.appendStatementInput('CASE0') - .appendField(Blockly.Msg.cases_do); - this.setMutator(new Blockly.Mutator(['case_incaseof', 'case_default'])); - this.caseCount_ = 0; - this.defaultCount_ = 0; - }, - - mutationToDom: function () { - if (!this.caseCount_ && !this.defaultCount_) { - return null; - } - var container = document.createElement('mutation'); - if (this.caseCount_) { - container.setAttribute('case', this.caseCount_); - } - if (this.defaultCount_) { - container.setAttribute('default', 1); - } - return container; - }, - - domToMutation: function (xmlElement) { - this.caseCount_ = parseInt(xmlElement.getAttribute('case'), 10); - this.defaultCount_ = parseInt(xmlElement.getAttribute('default'), 10); - for (var x = 0; x <= this.caseCount_; x++) { - this.appendValueInput('CASECONDITION' + x) - .appendField(Blockly.Msg.cases_condition); - this.appendStatementInput('CASE' + x) - .appendField(Blockly.Msg.cases_do); - } - if (this.defaultCount_) { - this.appendStatementInput('ONDEFAULT') - .appendField('default'); - } - }, - - decompose: function (workspace) { - var containerBlock = workspace.newBlock('control_case'); - containerBlock.initSvg(); - var connection = containerBlock.getInput('STACK').connection; - for (var x = 1; x <= this.caseCount_; x++) { - var caseBlock = workspace.newBlock('case_incaseof'); - caseBlock.initSvg(); - connection.connect(caseBlock.previousConnection); - connection = caseBlock.nextConnection; - } - if (this.defaultCount_) { - var defaultBlock = Blockly.Block.obtain(workspace, 'case_default'); - defaultBlock.initSvg(); - connection.connect(defaultBlock.previousConnection); - } - return containerBlock; - }, - - compose: function (containerBlock) { - //Disconnect all input blocks and remove all inputs. - if (this.defaultCount_) { - this.removeInput('ONDEFAULT'); - } - this.defaultCount_ = 0; - for (var x = this.caseCount_; x > 0; x--) { - this.removeInput('CASECONDITION' + x); - this.removeInput('CASE' + x); - } - this.caseCount_ = 0; - var caseBlock = containerBlock.getInputTargetBlock('STACK'); - while (caseBlock) { - switch (caseBlock.type) { - case 'case_incaseof': - this.caseCount_++; - var caseconditionInput = this.appendValueInput('CASECONDITION' + this.caseCount_) - .appendField(Blockly.Msg.cases_condition); - var caseInput = this.appendStatementInput('CASE' + this.caseCount_) - .appendField(Blockly.Msg.cases_do); - if (caseBlock.valueConnection_) { - caseconditionInput.connection.connect(caseBlock.valueConnection_); - } - if (caseBlock.statementConnection_) { - caseInput.connection.connect(caseBlock.statementConnection_); - } - break; - case 'case_default': - this.defaultCount_++; - var defaultInput = this.appendStatementInput('ONDEFAULT') - .appendField('default'); - if (caseBlock.statementConnection_) { - defaultInput.connection.connect(caseBlock.statementConnection_); - } - break; - default: - throw new Error('Unknown block type.'); - } - caseBlock = caseBlock.nextConnection && - caseBlock.nextConnection.targetBlock(); - } - }, - - saveConnections: function (containerBlock) { - var caseBlock = containerBlock.getInputTargetBlock('STACK'); - var x = 1; - while (caseBlock) { - switch (caseBlock.type) { - case 'case_incaseof': - var caseconditionInput = this.getInput('CASECONDITION' + x); - var caseInput = this.getInput('CASE' + x); - caseBlock.valueConnection_ = caseconditionInput && caseconditionInput.connection.targetConnection; - caseBlock.statementConnection_ = caseInput && caseInput.connection.targetConnection; - x++; - break; - case 'case_default': - var defaultInput = this.getInput('ONDEFAULT'); - caseBlock.satementConnection_ = defaultInput && defaultInput.connection.targetConnection; - break; - default: - throw new Error('Unknown block type'); - } - caseBlock = caseBlock.nextConnection && - caseBlock.nextConnection.targetBlock(); - } + mutationToDom: function () { + if (!this.caseCount_ && !this.defaultCount_) { + return null; } + var container = document.createElement("mutation"); + if (this.caseCount_) { + container.setAttribute("case", this.caseCount_); + } + if (this.defaultCount_) { + container.setAttribute("default", 1); + } + return container; + }, + + domToMutation: function (xmlElement) { + this.caseCount_ = parseInt(xmlElement.getAttribute("case"), 10); + this.defaultCount_ = parseInt(xmlElement.getAttribute("default"), 10); + for (var x = 0; x <= this.caseCount_; x++) { + this.appendValueInput("CASECONDITION" + x).appendField( + Blockly.Msg.cases_condition + ); + this.appendStatementInput("CASE" + x).appendField(Blockly.Msg.cases_do); + } + if (this.defaultCount_) { + this.appendStatementInput("ONDEFAULT").appendField("default"); + } + }, + + decompose: function (workspace) { + var containerBlock = workspace.newBlock("control_case"); + containerBlock.initSvg(); + var connection = containerBlock.getInput("STACK").connection; + for (var x = 1; x <= this.caseCount_; x++) { + var caseBlock = workspace.newBlock("case_incaseof"); + caseBlock.initSvg(); + connection.connect(caseBlock.previousConnection); + connection = caseBlock.nextConnection; + } + if (this.defaultCount_) { + var defaultBlock = Blockly.Block.obtain(workspace, "case_default"); + defaultBlock.initSvg(); + connection.connect(defaultBlock.previousConnection); + } + return containerBlock; + }, + + compose: function (containerBlock) { + //Disconnect all input blocks and remove all inputs. + if (this.defaultCount_) { + this.removeInput("ONDEFAULT"); + } + this.defaultCount_ = 0; + for (var x = this.caseCount_; x > 0; x--) { + this.removeInput("CASECONDITION" + x); + this.removeInput("CASE" + x); + } + this.caseCount_ = 0; + var caseBlock = containerBlock.getInputTargetBlock("STACK"); + while (caseBlock) { + switch (caseBlock.type) { + case "case_incaseof": + this.caseCount_++; + var caseconditionInput = this.appendValueInput( + "CASECONDITION" + this.caseCount_ + ).appendField(Blockly.Msg.cases_condition); + var caseInput = this.appendStatementInput( + "CASE" + this.caseCount_ + ).appendField(Blockly.Msg.cases_do); + if (caseBlock.valueConnection_) { + caseconditionInput.connection.connect(caseBlock.valueConnection_); + } + if (caseBlock.statementConnection_) { + caseInput.connection.connect(caseBlock.statementConnection_); + } + break; + case "case_default": + this.defaultCount_++; + var defaultInput = this.appendStatementInput("ONDEFAULT").appendField( + "default" + ); + if (caseBlock.statementConnection_) { + defaultInput.connection.connect(caseBlock.statementConnection_); + } + break; + default: + throw new Error("Unknown block type."); + } + caseBlock = + caseBlock.nextConnection && caseBlock.nextConnection.targetBlock(); + } + }, + + saveConnections: function (containerBlock) { + var caseBlock = containerBlock.getInputTargetBlock("STACK"); + var x = 1; + while (caseBlock) { + switch (caseBlock.type) { + case "case_incaseof": + var caseconditionInput = this.getInput("CASECONDITION" + x); + var caseInput = this.getInput("CASE" + x); + caseBlock.valueConnection_ = + caseconditionInput && + caseconditionInput.connection.targetConnection; + caseBlock.statementConnection_ = + caseInput && caseInput.connection.targetConnection; + x++; + break; + case "case_default": + var defaultInput = this.getInput("ONDEFAULT"); + caseBlock.satementConnection_ = + defaultInput && defaultInput.connection.targetConnection; + break; + default: + throw new Error("Unknown block type"); + } + caseBlock = + caseBlock.nextConnection && caseBlock.nextConnection.targetBlock(); + } + }, }; -Blockly.Blocks['control_case'] = { - init: function () { - this.setColour(getColour().logic); - this.appendDummyInput() - .appendField(Blockly.Msg.cases_switch); - this.appendStatementInput('STACK'); - this.setTooltip('--Placeholder--'); - this.contextMenu = false; - } +Blockly.Blocks["control_case"] = { + init: function () { + this.setColour(getColour().logic); + this.appendDummyInput().appendField(Blockly.Msg.cases_switch); + this.appendStatementInput("STACK"); + this.setTooltip("--Placeholder--"); + this.contextMenu = false; + }, }; -Blockly.Blocks['case_incaseof'] = { - init: function () { - this.setColour(getColour().logic); - this.appendDummyInput() - .appendField(Blockly.Msg.cases_add); - this.setPreviousStatement(true); - this.setNextStatement(true); - this.setTooltip('--Placeholder--'); - this.contextMenu = false; - } +Blockly.Blocks["case_incaseof"] = { + init: function () { + this.setColour(getColour().logic); + this.appendDummyInput().appendField(Blockly.Msg.cases_add); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip("--Placeholder--"); + this.contextMenu = false; + }, }; -Blockly.Blocks['case_default'] = { - init: function () { - this.setColour(getColour().logic); - this.appendValueInput('default') - .appendField('default'); - this.setPreviousStatement(true); - this.setNextStatement(false); - this.setTooltip('This function will run if there aren\'t any matching cases.'); - this.contextMenu = false; - } +Blockly.Blocks["case_default"] = { + init: function () { + this.setColour(getColour().logic); + this.appendValueInput("default").appendField("default"); + this.setPreviousStatement(true); + this.setNextStatement(false); + this.setTooltip( + "This function will run if there aren't any matching cases." + ); + this.contextMenu = false; + }, }; diff --git a/src/components/Blockly/blocks/sensebox-sd.js b/src/components/Blockly/blocks/sensebox-sd.js index febdf4c..b6fa836 100644 --- a/src/components/Blockly/blocks/sensebox-sd.js +++ b/src/components/Blockly/blocks/sensebox-sd.js @@ -1,80 +1,103 @@ -import * as Blockly from 'blockly/core'; -import { getColour } from '../helpers/colour'; +import * as Blockly from "blockly/core"; +import { getColour } from "../helpers/colour"; +var checkFileName = function (filename) { + var length = filename.length; + if (length > 8) { + alert("dateiname sollte kleiner als 8 Zeichen sein"); + return filename.slice(0, 8); + } + return filename; +}; -Blockly.Blocks['sensebox_sd_open_file'] = { - init: function () { - this.appendDummyInput() - .appendField(Blockly.Msg.senseBox_sd_open_file) - .setAlign(Blockly.ALIGN_LEFT) - .appendField( - new Blockly.FieldTextInput('Data.txt'), - 'Filename'); - this.appendStatementInput('SD') - .setCheck(null); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(getColour().sensebox); - this.setTooltip(Blockly.Msg.senseBox_sd_open_file_tooltip); - this.setHelpUrl('https://docs.sensebox.de/hardware/bee-sd/'); +Blockly.Blocks["sensebox_sd_open_file"] = { + init: function () { + this.appendDummyInput() + .appendField(Blockly.Msg.senseBox_sd_open_file) + .setAlign(Blockly.ALIGN_LEFT) + .appendField( + new Blockly.FieldTextInput("Data", checkFileName), + "Filename" + ) + .appendField(".") + .appendField( + new Blockly.FieldDropdown([ + ["txt", "txt"], + ["csv", "csv"], + ]), + "extension" + ); + this.appendStatementInput("SD").setCheck(null); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(getColour().sensebox); + this.setTooltip(Blockly.Msg.senseBox_sd_open_file_tooltip); + this.setHelpUrl("https://docs.sensebox.de/hardware/bee-sd/"); + }, +}; + +Blockly.Blocks["sensebox_sd_create_file"] = { + init: function () { + this.appendDummyInput() + .appendField(Blockly.Msg.senseBox_sd_create_file) + .setAlign(Blockly.ALIGN_LEFT) + .appendField( + new Blockly.FieldTextInput("Data", checkFileName), + "Filename" + ) + .appendField(".") + .appendField( + new Blockly.FieldDropdown([ + ["txt", "txt"], + ["csv", "csv"], + ]), + "extension" + ); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(getColour().sensebox); + this.setTooltip(Blockly.Msg.senseBox_sd_create_file_tooltip); + this.setHelpUrl("https://docs.sensebox.de/hardware/bee-sd/"); + }, +}; + +Blockly.Blocks["sensebox_sd_write_file"] = { + init: function () { + this.appendDummyInput() + .appendField(Blockly.Msg.senseBox_sd_write_file) + .setAlign(Blockly.ALIGN_LEFT); + this.appendValueInput("DATA").setCheck(null); + this.appendDummyInput("CheckboxText") + .appendField(Blockly.Msg.senseBox_output_linebreak) + .appendField(new Blockly.FieldCheckbox("TRUE"), "linebreak"); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(getColour().sensebox); + this.setTooltip(Blockly.Msg.senseBox_sd_write_file_tooltip); + this.setHelpUrl("https://docs.sensebox.de/hardware/bee-sd/"); + }, + /** + * Called whenever anything on the workspace changes. + * Add warning if block is not nested inside a the correct loop. + * @param {!Blockly.Events.Abstract} e Change event. + * @this Blockly.Block + */ + onchange: function (e) { + var legal = false; + // Is the block nested in a loop? + var block = this; + do { + if (this.LOOP_TYPES.indexOf(block.type) !== -1) { + legal = true; + break; + } + block = block.getSurroundParent(); + } while (block); + if (legal) { + this.setWarningText(null); + } else { + this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING); } -}; - -Blockly.Blocks['sensebox_sd_create_file'] = { - init: function () { - this.appendDummyInput() - .appendField(Blockly.Msg.senseBox_sd_create_file) - .setAlign(Blockly.ALIGN_LEFT) - .appendField(Blockly.Msg.senseBox_output_filename) - .appendField( - new Blockly.FieldTextInput('Data.txt'), - 'Filename'); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(getColour().sensebox); - this.setTooltip(Blockly.Msg.senseBox_sd_create_file_tooltip); - this.setHelpUrl('https://docs.sensebox.de/hardware/bee-sd/'); - } -}; - -Blockly.Blocks['sensebox_sd_write_file'] = { - init: function () { - this.appendDummyInput() - .appendField(Blockly.Msg.senseBox_sd_write_file) - .setAlign(Blockly.ALIGN_LEFT); - this.appendValueInput('DATA') - .setCheck(null); - this.appendDummyInput('CheckboxText') - .appendField(Blockly.Msg.senseBox_output_linebreak) - .appendField(new Blockly.FieldCheckbox('TRUE'), 'linebreak'); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setColour(getColour().sensebox); - this.setTooltip(Blockly.Msg.senseBox_sd_write_file_tooltip); - this.setHelpUrl('https://docs.sensebox.de/hardware/bee-sd/'); - }, - /** - * Called whenever anything on the workspace changes. - * Add warning if block is not nested inside a the correct loop. - * @param {!Blockly.Events.Abstract} e Change event. - * @this Blockly.Block - */ - onchange: function (e) { - var legal = false; - // Is the block nested in a loop? - var block = this; - do { - if (this.LOOP_TYPES.indexOf(block.type) !== -1) { - legal = true; - break; - } - block = block.getSurroundParent(); - } while (block); - if (legal) { - this.setWarningText(null); - } else { - this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING); - } - }, - LOOP_TYPES: ['sensebox_sd_open_file'], + }, + LOOP_TYPES: ["sensebox_sd_open_file"], }; diff --git a/src/components/Blockly/blocks/time.js b/src/components/Blockly/blocks/time.js index 248fe88..2c7a89b 100644 --- a/src/components/Blockly/blocks/time.js +++ b/src/components/Blockly/blocks/time.js @@ -8,123 +8,118 @@ * The arduino built in functions syntax can be found in * http://arduino.cc/en/Reference/HomePage */ -import Blockly from 'blockly'; -import { getColour } from '../helpers/colour' -import * as Types from '../helpers/types' +import Blockly from "blockly"; +import { getColour } from "../helpers/colour"; +import * as Types from "../helpers/types"; - -Blockly.Blocks['time_delay'] = { - /** - * Delay block definition - * @this Blockly.Block - */ - init: function () { - this.setHelpUrl('http://arduino.cc/en/Reference/Delay'); - this.setColour(getColour().time); - this.appendValueInput('DELAY_TIME_MILI') - .setCheck(Types.NUMBER.checkList) - .appendField(Blockly.Msg.ARD_TIME_DELAY); - this.appendDummyInput() - .appendField(Blockly.Msg.ARD_TIME_MS); - this.setInputsInline(true); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_TIP); - } +Blockly.Blocks["time_delay"] = { + /** + * Delay block definition + * @this Blockly.Block + */ + init: function () { + this.setHelpUrl("http://arduino.cc/en/Reference/Delay"); + this.setColour(getColour().time); + this.appendValueInput("DELAY_TIME_MILI") + .setCheck(Types.NUMBER.checkList) + .appendField(Blockly.Msg.ARD_TIME_DELAY); + this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_MS); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_TIP); + }, }; -Blockly.Blocks['time_delaymicros'] = { - /** - * delayMicroseconds block definition - * @this Blockly.Block - */ - init: function () { - this.setHelpUrl('http://arduino.cc/en/Reference/DelayMicroseconds'); - this.setColour(getColour().time); - this.appendValueInput('DELAY_TIME_MICRO') - .setCheck(Types.NUMBER.checkList) - .appendField(Blockly.Msg.ARD_TIME_DELAY); - this.appendDummyInput() - .appendField(Blockly.Msg.ARD_TIME_DELAY_MICROS); - this.setInputsInline(true); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP); - } +Blockly.Blocks["time_delaymicros"] = { + /** + * delayMicroseconds block definition + * @this Blockly.Block + */ + init: function () { + this.setHelpUrl("http://arduino.cc/en/Reference/DelayMicroseconds"); + this.setColour(getColour().time); + this.appendValueInput("DELAY_TIME_MICRO") + .setCheck(Types.NUMBER.checkList) + .appendField(Blockly.Msg.ARD_TIME_DELAY); + this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_DELAY_MICROS); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP); + }, }; -Blockly.Blocks['time_millis'] = { - /** - * Elapsed time in milliseconds block definition - * @this Blockly.Block - */ - init: function () { - this.setHelpUrl('http://arduino.cc/en/Reference/Millis'); - this.setColour(getColour().time); - this.appendDummyInput() - .appendField(Blockly.Msg.ARD_TIME_MILLIS); - this.setOutput(true, Types.LARGE_NUMBER.typeId); - this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP); - }, - /** @return {string} The type of return value for the block, an integer. */ - getBlockType: function () { - return Blockly.Types.LARGE_NUMBER; - } +Blockly.Blocks["time_millis"] = { + /** + * Elapsed time in milliseconds block definition + * @this Blockly.Block + */ + init: function () { + this.setHelpUrl("http://arduino.cc/en/Reference/Millis"); + this.setColour(getColour().time); + this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_MILLIS); + this.setOutput(true, Types.LARGE_NUMBER.typeId); + this.setTooltip(Blockly.Msg.ARD_TIME_MILLIS_TIP); + }, + /** @return {string} The type of return value for the block, an integer. */ + getBlockType: function () { + return Blockly.Types.LARGE_NUMBER; + }, }; -Blockly.Blocks['time_micros'] = { - /** - * Elapsed time in microseconds block definition - * @this Blockly.Block - */ - init: function () { - this.setHelpUrl('http://arduino.cc/en/Reference/Micros'); - this.setColour(getColour().time); - this.appendDummyInput() - .appendField(Blockly.Msg.ARD_TIME_MICROS); - this.setOutput(true, Types.LARGE_NUMBER.typeId); - this.setTooltip(Blockly.Msg.ARD_TIME_MICROS_TIP); - }, - /** - * Should be a long (32bit), but for for now an int. - * @return {string} The type of return value for the block, an integer. - */ - getBlockType: function () { - return Types.LARGE_NUMBER; - } +Blockly.Blocks["time_micros"] = { + /** + * Elapsed time in microseconds block definition + * @this Blockly.Block + */ + init: function () { + this.setHelpUrl("http://arduino.cc/en/Reference/Micros"); + this.setColour(getColour().time); + this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_MICROS); + this.setOutput(true, Types.LARGE_NUMBER.typeId); + this.setTooltip(Blockly.Msg.ARD_TIME_MICROS_TIP); + }, + /** + * Should be a long (32bit), but for for now an int. + * @return {string} The type of return value for the block, an integer. + */ + getBlockType: function () { + return Types.LARGE_NUMBER; + }, }; -Blockly.Blocks['infinite_loop'] = { - /** - * Waits forever, end of program. - * @this Blockly.Block - */ - init: function () { - this.setHelpUrl(''); - this.setColour(getColour().time); - this.appendDummyInput() - .appendField(Blockly.Msg.ARD_TIME_INF); - this.setInputsInline(true); - this.setPreviousStatement(true); - this.setTooltip(Blockly.Msg.ARD_TIME_INF_TIP); - } +Blockly.Blocks["infinite_loop"] = { + /** + * Waits forever, end of program. + * @this Blockly.Block + */ + init: function () { + this.setHelpUrl(""); + this.setColour(getColour().time); + this.appendDummyInput().appendField(Blockly.Msg.ARD_TIME_INF); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setTooltip(Blockly.Msg.ARD_TIME_INF_TIP); + }, }; -Blockly.Blocks['sensebox_interval_timer'] = { - init: function () { - this.setTooltip(Blockly.Msg.senseBox_interval_timer_tip); - this.setInputsInline(true); - this.setHelpUrl(''); - this.setColour(getColour().time); - this.appendDummyInput() - .appendField(Blockly.Msg.senseBox_interval_timer); - this.appendDummyInput() - .setAlign(Blockly.ALIGN_LEFT) - .appendField(new Blockly.FieldTextInput("10000"), "interval") - .appendField(Blockly.Msg.senseBox_interval); - this.appendStatementInput('DO') - .setCheck(null); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - } +Blockly.Blocks["sensebox_interval_timer"] = { + init: function () { + this.setTooltip(Blockly.Msg.senseBox_interval_timer_tip); + this.setInputsInline(true); + this.setHelpUrl(""); + this.setColour(getColour().time); + this.appendDummyInput() + .appendField(Blockly.Msg.senseBox_interval_timer) + .appendField(new Blockly.FieldTextInput("name"), "name"); + this.appendDummyInput() + .appendField(Blockly.Msg.senseBox_interval_time) + .setAlign(Blockly.ALIGN_LEFT) + .appendField(new Blockly.FieldTextInput("10000"), "interval") + .appendField(Blockly.Msg.senseBox_interval); + this.appendStatementInput("DO").setCheck(null); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + }, }; diff --git a/src/components/Blockly/blocks/variables.js b/src/components/Blockly/blocks/variables.js index 6984263..8b6cbf3 100644 --- a/src/components/Blockly/blocks/variables.js +++ b/src/components/Blockly/blocks/variables.js @@ -1,43 +1,43 @@ -import Blockly from 'blockly/core'; -import { getColour } from '../helpers/colour'; -import { getCompatibleTypes } from '../helpers/types' +import Blockly from "blockly/core"; +import { getColour } from "../helpers/colour"; +import { getCompatibleTypes } from "../helpers/types"; +Blockly.Blocks["variables_set_dynamic"] = { + init: function () { + // const type = myVar.type; + this.setColour(getColour().variables); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.appendValueInput("VALUE") + .appendField("set", "set") + .appendField("", "type") + .appendField(new Blockly.FieldVariable("VAR"), "VAR") + .appendField("to"); + }, + onchange: function (e) { + let variableID = this.getFieldValue("VAR"); + let variable = Blockly.getMainWorkspace() + .getVariableMap() + .getVariableById(variableID); + this.getField("type").setValue(variable.type); + this.getInput("VALUE").setCheck(getCompatibleTypes(variable.type)); + }, +}; -Blockly.Blocks['variables_set_dynamic'] = { - init: function () { - - // const type = myVar.type; - this.setColour(getColour().variables); - this.setPreviousStatement(true, null); - this.setNextStatement(true, null); - this.appendValueInput('VALUE') - .appendField('set', 'set') - .appendField('', 'type') - .appendField(new Blockly.FieldVariable('VAR'), 'VAR') - .appendField('to'); - }, - onchange: function (e) { - let variableID = this.getFieldValue('VAR'); - let variable = Blockly.getMainWorkspace().getVariableMap().getVariableById(variableID) - this.getField('type').setValue(variable.type); - this.getInput('VALUE').setCheck(getCompatibleTypes(variable.type)); - - } -} - -Blockly.Blocks['variables_get_dynamic'] = { - init: function () { - this.setColour(getColour().variables); - this.appendDummyInput() - .appendField('', 'type') - .appendField(new Blockly.FieldVariable('VAR'), 'VAR'); - this.setOutput(true); - }, - onchange: function (e) { - let variableID = this.getFieldValue('VAR'); - let variable = Blockly.getMainWorkspace().getVariableMap().getVariableById(variableID) - this.getField('type').setValue(variable.type); - - } -} - +Blockly.Blocks["variables_get_dynamic"] = { + init: function () { + this.setColour(getColour().variables); + this.appendDummyInput() + .appendField("", "type") + .appendField(new Blockly.FieldVariable("VAR"), "VAR"); + this.setOutput(true); + }, + onchange: function (e) { + let variableID = this.getFieldValue("VAR"); + let variable = Blockly.getMainWorkspace() + .getVariableMap() + .getVariableById(variableID); + this.getField("type").setValue(variable.type); + this.setOutput(true, variable.type); + }, +}; diff --git a/src/components/Blockly/generator/sensebox-sd.js b/src/components/Blockly/generator/sensebox-sd.js index 1926d74..184c93a 100644 --- a/src/components/Blockly/generator/sensebox-sd.js +++ b/src/components/Blockly/generator/sensebox-sd.js @@ -1,5 +1,4 @@ -import Blockly from 'blockly'; - +import Blockly from "blockly"; /* SD-Card Blocks using the Standard SD Library*/ /** @@ -10,45 +9,49 @@ import Blockly from 'blockly'; */ Blockly.Arduino.sensebox_sd_create_file = function (block) { - var filename = this.getFieldValue('Filename'); - var res = filename.slice(0, 4); - Blockly.Arduino.libraries_['library_spi'] = '#include '; - Blockly.Arduino.libraries_['library_sd'] = '#include '; - Blockly.Arduino.definitions_['define_' + res] = 'File dataFile' + res + ';'; - Blockly.Arduino.setupCode_['sensebox_sd'] = 'SD.begin(28);'; - Blockly.Arduino.setupCode_['sensebox_sd' + filename] = 'dataFile' + res + ' = SD.open("' + filename + '", FILE_WRITE);\ndataFile' + res + '.close();\n'; - var code = ''; - return code; + var filename = this.getFieldValue("Filename"); + var extension = this.getFieldValue("extension"); + var newFileName = filename.concat(".", extension); + Blockly.Arduino.libraries_["library_spi"] = "#include "; + Blockly.Arduino.libraries_["library_sd"] = "#include "; + Blockly.Arduino.definitions_["define_" + filename] = `File ${filename};`; + Blockly.Arduino.setupCode_["sensebox_sd"] = "SD.begin(28);\n"; + Blockly.Arduino.setupCode_[ + "sensebox_sd" + filename + ] = `${filename} = SD.open("${newFileName}", FILE_WRITE);\n${filename}.close();\n`; + var code = ""; + return code; }; Blockly.Arduino.sensebox_sd_open_file = function (block) { - var filename = this.getFieldValue('Filename'); - var res = filename.slice(0, 4); - var branch = Blockly.Arduino.statementToCode(block, 'SD'); - var code = 'dataFile' + res + ' = SD.open("' + filename + '", FILE_WRITE);\n' - code += branch; - code += 'dataFile' + res + '.close();\n' - return code; + var filename = this.getFieldValue("Filename"); + var extension = this.getFieldValue("extension"); + var newFileName = filename.concat(".", extension); + var branch = Blockly.Arduino.statementToCode(block, "SD"); + var code = `${filename} = SD.open("${newFileName}", FILE_WRITE);\n`; + code += branch; + code += `${filename}.close();\n`; + return code; }; Blockly.Arduino.sensebox_sd_write_file = function (block) { - if (this.parentBlock_ != null) { - var filename = this.getSurroundParent().getFieldValue('Filename'); - } - var res = filename.slice(0, 4); - var text = Blockly.Arduino.valueToCode(this, 'DATA', Blockly.Arduino.ORDER_ATOMIC) || '"Keine Eingabe"'; - var linebreak = this.getFieldValue('linebreak'); - if (linebreak === "TRUE") { - linebreak = "ln"; - } else { - linebreak = ""; - } - var code = ''; - if (text === "gps.getLongitude()" || text === "gps.getLatitude()") { - code = 'dataFile' + res + '.print' + linebreak + '(' + text + ',5);\n' - } - else { - code = 'dataFile' + res + '.print' + linebreak + '(' + text + ');\n' - } - return code; + if (this.parentBlock_ != null) { + var filename = this.getSurroundParent().getFieldValue("Filename"); + } + var branch = + Blockly.Arduino.valueToCode(this, "DATA", Blockly.Arduino.ORDER_ATOMIC) || + '"Keine Eingabe"'; + var linebreak = this.getFieldValue("linebreak"); + if (linebreak === "TRUE") { + linebreak = "ln"; + } else { + linebreak = ""; + } + var code = ""; + if (branch === "gps.getLongitude()" || branch === "gps.getLatitude()") { + code = `${filename}.print${linebreak}(${branch},5);\n`; + } else { + code = `${filename}.print${linebreak}(${branch});\n`; + } + return code; }; diff --git a/src/components/Blockly/generator/time.js b/src/components/Blockly/generator/time.js index 57fc5ec..54edd9b 100644 --- a/src/components/Blockly/generator/time.js +++ b/src/components/Blockly/generator/time.js @@ -1,4 +1,4 @@ -import Blockly from 'blockly'; +import Blockly from "blockly"; /** * @license Licensed under the Apache License, Version 2.0 (the "License"): @@ -16,11 +16,15 @@ import Blockly from 'blockly'; * @param {!Blockly.Block} block Block to generate the code from. * @return {string} Completed code. */ -Blockly.Arduino['time_delay'] = function (block) { - var delayTime = Blockly.Arduino.valueToCode( - block, 'DELAY_TIME_MILI', Blockly.Arduino.ORDER_ATOMIC) || '0'; - var code = 'delay(' + delayTime + ');\n'; - return code; +Blockly.Arduino["time_delay"] = function (block) { + var delayTime = + Blockly.Arduino.valueToCode( + block, + "DELAY_TIME_MILI", + Blockly.Arduino.ORDER_ATOMIC + ) || "0"; + var code = "delay(" + delayTime + ");\n"; + return code; }; /** @@ -29,11 +33,15 @@ Blockly.Arduino['time_delay'] = function (block) { * @param {!Blockly.Block} block Block to generate the code from. * @return {string} Completed code. */ -Blockly.Arduino['time_delaymicros'] = function (block) { - var delayTimeMs = Blockly.Arduino.valueToCode( - block, 'DELAY_TIME_MICRO', Blockly.Arduino.ORDER_ATOMIC) || '0'; - var code = 'delayMicroseconds(' + delayTimeMs + ');\n'; - return code; +Blockly.Arduino["time_delaymicros"] = function (block) { + var delayTimeMs = + Blockly.Arduino.valueToCode( + block, + "DELAY_TIME_MICRO", + Blockly.Arduino.ORDER_ATOMIC + ) || "0"; + var code = "delayMicroseconds(" + delayTimeMs + ");\n"; + return code; }; /** @@ -42,9 +50,9 @@ Blockly.Arduino['time_delaymicros'] = function (block) { * @param {!Blockly.Block} block Block to generate the code from. * @return {array} Completed code with order of operation. */ -Blockly.Arduino['time_millis'] = function (block) { - var code = 'millis()'; - return [code, Blockly.Arduino.ORDER_ATOMIC]; +Blockly.Arduino["time_millis"] = function (block) { + var code = "millis()"; + return [code, Blockly.Arduino.ORDER_ATOMIC]; }; /** @@ -53,9 +61,9 @@ Blockly.Arduino['time_millis'] = function (block) { * @param {!Blockly.Block} block Block to generate the code from. * @return {array} Completed code with order of operation. */ -Blockly.Arduino['time_micros'] = function (block) { - var code = 'micros()'; - return [code, Blockly.Arduino.ORDER_ATOMIC]; +Blockly.Arduino["time_micros"] = function (block) { + var code = "micros()"; + return [code, Blockly.Arduino.ORDER_ATOMIC]; }; /** @@ -64,17 +72,22 @@ Blockly.Arduino['time_micros'] = function (block) { * @param {!Blockly.Block} block Block to generate the code from. * @return {string} Completed code. */ -Blockly.Arduino['infinite_loop'] = function (block) { - return 'while(true);\n'; +Blockly.Arduino["infinite_loop"] = function (block) { + return "while(true);\n"; }; Blockly.Arduino.sensebox_interval_timer = function (block) { - var interval = this.getFieldValue('interval'); - Blockly.Arduino.variables_['define_interval_variables'] = 'const long interval = ' + interval + ';\nlong time_start = 0;\nlong time_actual = 0;'; - var branch = Blockly.Arduino.statementToCode(block, 'DO'); - var code = 'time_start = millis();\n'; - code += 'if (time_start > time_actual + interval) {\n time_actual = millis();\n' - code += branch; - code += '}\n' - return code; -}; \ No newline at end of file + var intervalTime = this.getFieldValue("interval"); + var intervalName = this.getFieldValue("name"); + Blockly.Arduino.variables_[`define_interval_variables${intervalName}`] = ` +const long interval${intervalName} = ${intervalTime}; +long time_start${intervalName} = 0; +long time_actual${intervalName} = 0;`; + var branch = Blockly.Arduino.statementToCode(block, "DO"); + var code = `time_start${intervalName} = millis();\n`; + code += ` +if (time_start${intervalName} > time_actual${intervalName} + interval${intervalName}) {\n time_actual${intervalName} = millis();\n`; + code += branch; + code += "}\n"; + return code; +}; diff --git a/src/components/Blockly/generator/webserver.js b/src/components/Blockly/generator/webserver.js index 0cbee13..6798a53 100644 --- a/src/components/Blockly/generator/webserver.js +++ b/src/components/Blockly/generator/webserver.js @@ -1,114 +1,127 @@ -import Blockly from 'blockly'; +import Blockly from "blockly"; /** * Webserver Blocks by Lucas Steinmann - * + * */ Blockly.Arduino.sensebox_initialize_http_server = function (block) { - var box_id = this.getFieldValue('Port'); - Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; - Blockly.Arduino.codeFunctions_['define_wifi_server'] = 'WiFiServer server(' + box_id + ');'; - Blockly.Arduino.setupCode_['sensebox_wifi_server_beging'] = 'server.begin();'; - return ''; + var box_id = this.getFieldValue("Port"); + Blockly.Arduino.libraries_["library_senseBoxMCU"] = + '#include "SenseBoxMCU.h"'; + Blockly.Arduino.codeFunctions_["define_wifi_server"] = + "WiFiServer server(" + box_id + ");"; + Blockly.Arduino.setupCode_["sensebox_wifi_server_beging"] = "server.begin();"; + return ""; }; Blockly.Arduino.sensebox_http_on_client_connect = function (block) { - var onConnect = Blockly.Arduino.statementToCode(block, 'ON_CONNECT'); - var code = ''; - code += 'WiFiClient client = server.available();\n'; - code += 'if (client && client.available()) {\n'; - code += ' String request_string = listenClient(client);\n'; - code += ' Request request;\n'; - code += ' if (parseRequestSafe(request_string, request)) {\n'; - code += onConnect; - code += ' }\n'; - code += ' delay(1);\n'; - code += ' client.stop();\n'; - code += ' delay(1);\n'; - code += '}\n'; - return code; + var onConnect = Blockly.Arduino.statementToCode(block, "ON_CONNECT"); + var code = ""; + code += "WiFiClient client = server.available();\n"; + code += "if (client && client.available()) {\n"; + code += " String request_string = listenClient(client);\n"; + code += " Request request;\n"; + code += " if (parseRequestSafe(request_string, request)) {\n"; + code += onConnect; + code += " }\n"; + code += " delay(1);\n"; + code += " client.stop();\n"; + code += " delay(1);\n"; + code += "}\n"; + return code; }; Blockly.Arduino.sensebox_http_method = function (block) { - var code = "request.method"; - return [code, Blockly.Arduino.ORDER_ATOMIC]; + var code = "request.method"; + return [code, Blockly.Arduino.ORDER_ATOMIC]; }; - Blockly.Arduino.sensebox_http_uri = function (block) { - var code = "request.uri"; - return [code, Blockly.Arduino.ORDER_ATOMIC]; + var code = "request.uri"; + return [code, Blockly.Arduino.ORDER_ATOMIC]; }; Blockly.Arduino.sensebox_http_protocol_version = function (block) { - var code = "request.protocol_version"; - return [code, Blockly.Arduino.ORDER_ATOMIC]; + var code = "request.protocol_version"; + return [code, Blockly.Arduino.ORDER_ATOMIC]; }; Blockly.Arduino.sensebox_http_user_agent = function (block) { - var code = "request.user_agent"; - return [code, Blockly.Arduino.ORDER_ATOMIC]; + var code = "request.user_agent"; + return [code, Blockly.Arduino.ORDER_ATOMIC]; }; Blockly.Arduino.sensebox_generate_html_doc = function (block) { - var header = Blockly.Arduino.valueToCode(block, 'HEADER', Blockly.Arduino.ORDER_NONE) || '""'; - var body = Blockly.Arduino.valueToCode(block, 'BODY', Blockly.Arduino.ORDER_NONE) || '""'; - var code = 'buildHTML(' + header + ', ' + body + ')'; - return [code, Blockly.Arduino.ORDER_ATOMIC]; + var header = + Blockly.Arduino.valueToCode(block, "HEADER", Blockly.Arduino.ORDER_NONE) || + '""'; + var body = + Blockly.Arduino.valueToCode(block, "BODY", Blockly.Arduino.ORDER_NONE) || + '""'; + var code = "buildHTML(" + header + ", " + body + ")"; + return [code, Blockly.Arduino.ORDER_ATOMIC]; }; Blockly.Arduino.sensebox_generate_http_succesful_response = function (block) { - var content = Blockly.Arduino.valueToCode(block, 'CONTENT', Blockly.Arduino.ORDER_NONE) || '""'; - var code = 'client.println(buildSuccessfulResponse(request, ' + content + '));\n'; - return code; + var content = + Blockly.Arduino.valueToCode(block, "CONTENT", Blockly.Arduino.ORDER_NONE) || + '""'; + var code = + "client.println(buildSuccessfulResponse(request, " + content + "));\n"; + return code; }; Blockly.Arduino.sensebox_generate_http_not_found_response = function (block) { - var code = 'client.println(buildNotFoundResponse(request));\n'; - return code; + var code = "client.println(buildNotFoundResponse(request));\n"; + return code; }; - Blockly.Arduino.sensebox_ip_address = function (block) { - var code = "b->getIpAddress()"; - return [code, Blockly.Arduino.ORDER_ATOMIC]; + var code = "b->getIpAddress()"; + return [code, Blockly.Arduino.ORDER_ATOMIC]; }; Blockly.Arduino.sensebox_general_html_tag = function (block) { - var tag = this.getFieldValue('TAG'); - var code = 'buildTag("' + tag + '",'; - var n = 0; - var branch = Blockly.Arduino.valueToCode(block, 'DO' + n, Blockly.Arduino.ORDER_NONE); - if (branch.length > 0) { - code += '\n ' + branch; - } else { - code += '""'; - } - for (n = 1; n <= block.additionalChildCount_; n++) { - branch = Blockly.Arduino.valueToCode(block, 'DO' + n, Blockly.Arduino.ORDER_NONE); - code += ' +' + branch; - } - return [code + ')', Blockly.Arduino.ORDER_ATOMIC]; + var tag = this.getFieldValue("TAG"); + var code = 'buildTag("' + tag + '",'; + var n = 0; + var branch = Blockly.Arduino.valueToCode( + block, + "DO" + n, + Blockly.Arduino.ORDER_NONE + ); + if (branch.length > 0) { + code += "\n " + branch; + } else { + code += '""'; + } + for (n = 1; n <= block.additionalChildCount_; n++) { + branch = Blockly.Arduino.valueToCode( + block, + "DO" + n, + Blockly.Arduino.ORDER_NONE + ); + code += " +" + branch; + } + return [code + ")", Blockly.Arduino.ORDER_ATOMIC]; }; Blockly.Arduino.sensebox_web_readHTML = function (block) { - var filename = this.getFieldValue('FILENAME'); - Blockly.Arduino.libraries_['library_spi'] = '#include '; - Blockly.Arduino.libraries_['library_sd'] = '#include '; - Blockly.Arduino.codeFunctions_['define_sd' + filename] = 'File webFile;'; - Blockly.Arduino.setupCode_['sensebox_sd'] = 'SD.begin(28);'; - var func = [ - 'String generateHTML(){', - ' webFile = SD.open("' + filename + '", FILE_READ);', - ' String finalString ="";', - ' while (webFile.available())', - ' {', - ' finalString+=(char)webFile.read();', - ' }', - ' return finalString;', - '}']; - var functionName = Blockly.Arduino.addFunction( - 'generateHTML', func.join('\n')); - var code = functionName + '()'; - return [code, Blockly.Arduino.ORDER_ATOMIC]; -}; \ No newline at end of file + var filename = this.getFieldValue("FILENAME"); + Blockly.Arduino.libraries_["library_spi"] = "#include "; + Blockly.Arduino.libraries_["library_sd"] = "#include "; + Blockly.Arduino.codeFunctions_["define_sd" + filename] = "File webFile;"; + Blockly.Arduino.setupCode_["sensebox_sd"] = "SD.begin(28);"; + Blockly.Arduino.codeFunctions_["generateHTML"] = ` +String generateHTML(){ + webFile = SD.open("${filename}", FILE_READ); + String finalString =""; + while (webFile.available()) + { + finalString+=(char)webFile.read(); + } + return finalString; + }`; + var code = `generateHTML()`; + return [code, Blockly.Arduino.ORDER_ATOMIC]; +}; diff --git a/src/components/Blockly/helpers/types.js b/src/components/Blockly/helpers/types.js index 7a663d5..74a54bd 100644 --- a/src/components/Blockly/helpers/types.js +++ b/src/components/Blockly/helpers/types.js @@ -8,103 +8,110 @@ * types. */ - /** Single character. */ export const CHARACTER = { - typeId: 'Character', - typeName: 'char', - typeMsgName: 'ARD_TYPE_CHAR', -} + typeId: "Character", + typeName: "char", + typeMsgName: "ARD_TYPE_CHAR", +}; export const BOOLEAN = { - typeId: 'Boolean', - typeName: 'boolean', - typeMsgName: 'ARD_TYPE_BOOL', -} + typeId: "Boolean", + typeName: "boolean", + typeMsgName: "ARD_TYPE_BOOL", +}; /** Text string. */ export const TEXT = { - typeId: 'Text', - typeName: 'String', - typeMsgName: 'ARD_TYPE_TEXT', -} + typeId: "Text", + typeName: "String", + typeMsgName: "ARD_TYPE_TEXT", +}; /** Short integer number. */ export const SHORT_NUMBER = { - typeId: 'Short_Number', - typeName: 'int', - typeMsgName: 'ARD_TYPE_SHORT', -} + typeId: "Short_Number", + typeName: "int", + typeMsgName: "ARD_TYPE_SHORT", +}; /** Integer number. */ export const NUMBER = { - typeId: 'Number', - typeName: 'int', - typeMsgName: 'ARD_TYPE_NUMBER', -} + typeId: "Number", + typeName: "int", + typeMsgName: "ARD_TYPE_NUMBER", +}; /** Large integer number. */ export const LARGE_NUMBER = { - typeId: 'Large Number', - typeName: 'long', - typeMsgName: 'ARD_TYPE_LONG', -} + typeId: "Large Number", + typeName: "long", + typeMsgName: "ARD_TYPE_LONG", +}; /** Decimal/floating point number. */ export const DECIMAL = { - typeId: 'Decimal', - typeName: 'float', - typeMsgName: 'ARD_TYPE_DECIMAL', -} + typeId: "Decimal", + typeName: "float", + typeMsgName: "ARD_TYPE_DECIMAL", +}; /** Array/List of items. */ export const ARRAY = { - typeId: 'Array', - typeName: 'Array', - typeMsgName: 'ARD_TYPE_ARRAY', - compatibleTypes: [] -} + typeId: "Array", + typeName: "Array", + typeMsgName: "ARD_TYPE_ARRAY", + compatibleTypes: [], +}; /** Null indicate there is no type. */ export const NULL = { - typeId: 'Null', - typeName: 'void', - typeMsgName: 'ARD_TYPE_NULL', -} + typeId: "Null", + typeName: "void", + typeMsgName: "ARD_TYPE_NULL", +}; /** Type not defined, or not yet defined. */ export const UNDEF = { - typeId: 'Undefined', - typeName: 'undef', - typeMsgName: 'ARD_TYPE_UNDEF', -} + typeId: "Undefined", + typeName: "undef", + typeMsgName: "ARD_TYPE_UNDEF", +}; /** Set when no child block (meant to define the variable type) is connected. */ export const CHILD_BLOCK_MISSING = { - typeId: 'ChildBlockMissing', - typeMsgName: 'ARD_TYPE_CHILDBLOCKMISSING', - compatibleTypes: [] -} - -const compatibleTypes = { - Array: ['Array'], - boolean: ['boolean'], - int: ['int', 'long', 'double', 'float'], - char: ['char'], - String: ['String'], - void: ['void'], - long: ['int', 'long'], - double: ['int', 'long', 'double'], - float: ['int', 'long', 'double', 'float'], - null: ['null'] - -} - -export const getCompatibleTypes = (type) => { - return compatibleTypes[type]; + typeId: "ChildBlockMissing", + typeMsgName: "ARD_TYPE_CHILDBLOCKMISSING", + compatibleTypes: [], }; -export const VARIABLE_TYPES = [['SHORT_NUMBER', 'char'], ['NUMBER', 'int'], ['DECIMAL', 'long'], ['TEXT', 'String'], ['CHARACTER', 'char'], ['BOOLEAN', 'boolean'], ['NULL', 'void'], ['UNDEF', 'undefined']]; +const compatibleTypes = { + Array: ["Array"], + boolean: ["boolean"], + int: ["int", "long", "double", "float"], + char: ["char"], + String: ["String"], + void: ["void"], + long: ["int", "long"], + double: ["int", "long", "double"], + float: ["int", "long", "double", "float"], + null: ["null"], +}; + +export const getCompatibleTypes = (type) => { + return compatibleTypes[type]; +}; + +export const VARIABLE_TYPES = [ + ["SHORT_NUMBER", "char"], + ["NUMBER", "int"], + ["DECIMAL", "long"], + ["TEXT", "String"], + ["CHARACTER", "char"], + ["BOOLEAN", "boolean"], + ["NULL", "void"], + ["UNDEF", "undefined"], +]; // /** // * Some Types have circular dependencies on their compatibilities, so add them @@ -233,7 +240,3 @@ export const VARIABLE_TYPES = [['SHORT_NUMBER', 'char'], ['NUMBER', 'int'], ['DE // } // return Blockly.Types.NULL; // }; - - - - diff --git a/src/components/Blockly/msg/de/sensebox-sd.js b/src/components/Blockly/msg/de/sensebox-sd.js index 2e74c8e..54ea63d 100644 --- a/src/components/Blockly/msg/de/sensebox-sd.js +++ b/src/components/Blockly/msg/de/sensebox-sd.js @@ -1,13 +1,16 @@ export const SD = { - /** - * SD-Block - */ - senseBox_sd_create_file: "Erstelle Datei auf SD-Karte", - senseBox_sd_write_file: "Schreibe Daten auf SD-Karte", - senseBox_sd_open_file: "Öffne eine Datei auf der SD-Karte", - senseBox_sd_create_file_tooltip: "Erstellt eine Datei auf der Karte. Stecke das SD-Bee auf den Steckplatz **XBEE2**. Die **maximale** Länge des Dateinamen sind **8 Zeichen**. Die Datei sollte zuerst im *Setup()* erstellt werden", - senseBox_sd_write_file_tooptip: "Schreibe Daten auf die SD-Karte. Beachte, dass die Datei zuerst geöffnet werden muss.", - senseBox_sd_open_file_tooltip: "Öffne die Datei auf der SD-Karte, um Dateien zu speichern. Am Ende der Schleife wird die Datei automatisch wieder geschlossen.", - sensebox_sd_filename: "Daten", - senseBox_sd_decimals: "Dezimalen", -} \ No newline at end of file + /** + * SD-Block + */ + senseBox_sd_create_file: "Erstelle Datei auf SD-Karte", + senseBox_sd_write_file: "Schreibe Daten auf SD-Karte", + senseBox_sd_open_file: "Öffne Datei auf der SD-Karte", + senseBox_sd_create_file_tooltip: + "Erstellt eine Datei auf der Karte. Stecke das SD-Bee auf den Steckplatz **XBEE2**. Die **maximale** Länge des Dateinamen sind **8 Zeichen**. Die Datei sollte zuerst im *Setup()* erstellt werden", + senseBox_sd_write_file_tooptip: + "Schreibe Daten auf die SD-Karte. Beachte, dass die Datei zuerst geöffnet werden muss.", + senseBox_sd_open_file_tooltip: + "Öffne die Datei auf der SD-Karte, um Dateien zu speichern. Am Ende der Schleife wird die Datei automatisch wieder geschlossen.", + sensebox_sd_filename: "Daten", + senseBox_sd_decimals: "Dezimalen", +}; diff --git a/src/components/Blockly/msg/de/time.js b/src/components/Blockly/msg/de/time.js index b29d97c..c951d22 100644 --- a/src/components/Blockly/msg/de/time.js +++ b/src/components/Blockly/msg/de/time.js @@ -1,20 +1,22 @@ export const TIME = { - - /** - * Interval Block - */ - senseBox_interval_timer: "Messintervall", - senseBox_interval: "ms", - senseBox_interval_timer_tip: "Intervall", - ARD_TIME_DELAY: "Warte", - ARD_TIME_DELAY_MICROS: "Mikrosekunden", - ARD_TIME_DELAY_MICRO_TIP: "Warte eine spezifischen Zeit in Microsekunden", - ARD_TIME_DELAY_TIP: "Warte spezifische Zeit in Millisekunden", - ARD_TIME_INF: "Warte für immer (Beende Programm)", - ARD_TIME_INF_TIP: "Stoppt das Programm.", - ARD_TIME_MICROS: "Bereits vergangen Zeit (Mikrosekunden)", - ARD_TIME_MICROS_TIP: "Gibt eine Zahl in Microsekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated - ARD_TIME_MILLIS: "Bereits vergangen Zeit (Millisekunden)", - ARD_TIME_MILLIS_TIP: "Gibt eine Zahl in Millisekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated - ARD_TIME_MS: "Millisekunden", -} \ No newline at end of file + /** + * Interval Block + */ + senseBox_interval_timer: "Intervall:", + senseBox_interval: "ms", + senseBox_interval_timer_tip: "Intervall", + senseBox_interval_time: "Zeit: ", + ARD_TIME_DELAY: "Warte", + ARD_TIME_DELAY_MICROS: "Mikrosekunden", + ARD_TIME_DELAY_MICRO_TIP: "Warte eine spezifischen Zeit in Microsekunden", + ARD_TIME_DELAY_TIP: "Warte spezifische Zeit in Millisekunden", + ARD_TIME_INF: "Warte für immer (Beende Programm)", + ARD_TIME_INF_TIP: "Stoppt das Programm.", + ARD_TIME_MICROS: "Bereits vergangen Zeit (Mikrosekunden)", + ARD_TIME_MICROS_TIP: + "Gibt eine Zahl in Microsekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated + ARD_TIME_MILLIS: "Bereits vergangen Zeit (Millisekunden)", + ARD_TIME_MILLIS_TIP: + "Gibt eine Zahl in Millisekunden zurück, die der Zeitdauer des Aktuellen Programms entspricht. Muss als positiven Integer gespeichert werden", // untranslated + ARD_TIME_MS: "Millisekunden", +}; diff --git a/src/components/Blockly/msg/en/time.js b/src/components/Blockly/msg/en/time.js index a8c6e5d..140e571 100644 --- a/src/components/Blockly/msg/en/time.js +++ b/src/components/Blockly/msg/en/time.js @@ -1,17 +1,19 @@ export const TIME = { - - senseBox_interval: "ms", - senseBox_interval_timer: "Measuring interval", - senseBox_interval_timer_tip: "Setup an Intervall", - ARD_TIME_DELAY: "wait", - ARD_TIME_DELAY_MICROS: "microseconds", - ARD_TIME_DELAY_MICRO_TIP: "Wait specific time in microseconds", - ARD_TIME_DELAY_TIP: "Wait specific time in milliseconds", - ARD_TIME_INF: "wait forever (end program)", - ARD_TIME_INF_TIP: "Wait indefinitely, stopping the program.", - ARD_TIME_MICROS: "current elapsed Time (microseconds)", - ARD_TIME_MICROS_TIP: "Returns the number of microseconds since the Arduino board began running the current program. Has to be stored in a positive long integer", - ARD_TIME_MILLIS: "current elapsed Time (milliseconds)", - ARD_TIME_MILLIS_TIP: "Returns the number of milliseconds since the Arduino board began running the current program. Has to be stored in a positive long integer", - ARD_TIME_MS: "milliseconds", -} + senseBox_interval: "ms", + senseBox_interval_timer: "Interval", + senseBox_interval_timer_tip: "Setup an Interval", + senseBox_interval_time: "time", + ARD_TIME_DELAY: "wait", + ARD_TIME_DELAY_MICROS: "microseconds", + ARD_TIME_DELAY_MICRO_TIP: "Wait specific time in microseconds", + ARD_TIME_DELAY_TIP: "Wait specific time in milliseconds", + ARD_TIME_INF: "wait forever (end program)", + ARD_TIME_INF_TIP: "Wait indefinitely, stopping the program.", + ARD_TIME_MICROS: "current elapsed Time (microseconds)", + ARD_TIME_MICROS_TIP: + "Returns the number of microseconds since the Arduino board began running the current program. Has to be stored in a positive long integer", + ARD_TIME_MILLIS: "current elapsed Time (milliseconds)", + ARD_TIME_MILLIS_TIP: + "Returns the number of milliseconds since the Arduino board began running the current program. Has to be stored in a positive long integer", + ARD_TIME_MS: "milliseconds", +};