import * as Blockly from 'blockly/core'; Blockly['Arduino']['controls_repeat_ext'] = function (Block) { // Repeat n times. const repeats = Blockly['Arduino'].valueToCode( Block, 'TIMES', Blockly['Arduino'].ORDER_ASSIGNMENT ) || '0'; let branch = Blockly['Arduino'].statementToCode(Block, 'DO'); branch = Blockly['Arduino'].addLoopTrap(branch, Block.id); let code = ''; const loopVar = 'simple_loop_variable'; code += 'for (' + loopVar + ' = 1; ' + loopVar + ' <= ' + repeats + '; ' + loopVar + ' += 1) {\n' + branch + '}\n'; return code; }; Blockly['Arduino']['controls_for'] = function (Block) { const loopIndexVariable = Blockly.mainWorkspace.getVariableById( Block.getFieldValue('VAR') ).name; const branch = Blockly['Arduino'].statementToCode(Block, 'DO'); const startNumber = Blockly['Arduino'].valueToCode( Block, 'FROM', Blockly['Arduino'].ORDER_ASSIGNMENT ) || '0'; const toNumber = Blockly['Arduino'].valueToCode( Block, 'TO', Blockly['Arduino'].ORDER_ASSIGNMENT ) || '0'; let byNumber = Math.abs( parseInt( Blockly['Arduino'].valueToCode( Block, 'BY', Blockly['Arduino'].ORDER_ASSIGNMENT ) ) ); byNumber = byNumber === 0 ? 1 : byNumber; const addingSub = startNumber < toNumber ? ' +' : ' -'; const sign = startNumber < toNumber ? ' <= ' : ' >= '; return ( 'for (' + loopIndexVariable + ' = ' + startNumber + '; ' + loopIndexVariable + sign + toNumber + '; ' + loopIndexVariable + addingSub + '= ' + byNumber + ') {\n' + branch + '}\n' ); }; Blockly['Arduino']['controls_whileUntil'] = function (Block) { // Do while/until loop. const until = Block.getFieldValue('MODE') === 'UNTIL'; let argument0 = Blockly['Arduino'].valueToCode( Block, 'BOOL', Blockly['Arduino'].ORDER_LOGICAL_AND ) || 'false'; let branch = Blockly['Arduino'].statementToCode(Block, 'DO'); branch = Blockly['Arduino'].addLoopTrap(branch, Block.id); if (until) { argument0 = '!' + argument0; } return '\twhile (' + argument0 + ') {\n' + branch + '\t}\n'; }; Blockly['Arduino']['controls_flow_statements'] = function (Block) { // Flow statements: continue, break. switch (Block.getFieldValue('FLOW')) { case 'BREAK': return 'break;\n'; case 'CONTINUE': return 'continue;\n'; default: break; } throw Error('Unknown flow statement.'); };