Commit ab75f705 authored by Carlos Pereira Atencio's avatar Carlos Pereira Atencio Committed by carlospamg

Added unfinished version of Arduino code generator.

parent b339cc5e
......@@ -203,7 +203,7 @@ Blockly.Arduino.scrub_ = function(block, code) {
// Collect comment for this block.
var comment = block.getCommentText();
if (comment) {
commentCode += this.prefixLines(comment, '// ') + '\n';
commentCode += Blockly.Generator.prefixLines(comment, '// ') + '\n';
}
// Collect comments for all value arguments.
// Don't collect comments for nested statements.
......@@ -211,9 +211,9 @@ Blockly.Arduino.scrub_ = function(block, code) {
if (block.inputList[x].type == Blockly.INPUT_VALUE) {
var childBlock = block.inputList[x].connection.targetBlock();
if (childBlock) {
var comment = this.allNestedComments(childBlock);
var comment = Blockly.Generator.allNestedComments(childBlock);
if (comment) {
commentCode += this.prefixLines(comment, '// ');
commentCode += Blockly.Generator.prefixLines(comment, '// ');
}
}
}
......
/**
* Visual Blocks Language
*
* Copyright 2012 Google Inc.
* http://blockly.googlecode.com/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview Generating Arduino for control blocks.
* @author gasolin@gmail.com (Fred Lin)
*/
'use strict';
Blockly.Arduino = Blockly.Generator.get('Arduino');
Blockly.Arduino.controls_if = function() {
// If/elseif/else condition.
var n = 0;
var argument = Blockly.Arduino.valueToCode(this, 'IF' + n,
Blockly.Arduino.ORDER_NONE) || 'false';
var branch = Blockly.Arduino.statementToCode(this, 'DO' + n);
var code = 'if (' + argument + ') {\n' + branch + '\n}';
for (n = 1; n <= this.elseifCount_; n++) {
argument = Blockly.Arduino.valueToCode(this, 'IF' + n,
Blockly.Arduino.ORDER_NONE) || 'false';
branch = Blockly.Arduino.statementToCode(this, 'DO' + n);
code += ' else if (' + argument + ') {\n' + branch + '}';
}
if (this.elseCount_) {
branch = Blockly.Arduino.statementToCode(this, 'ELSE');
code += ' else {\n' + branch + '\n}';
}
return code + '\n';
};
Blockly.Arduino.controls_repeat = function() {
// Repeat n times.
var repeats = Number(this.getTitleValue('TIMES'));
var branch = Blockly.Arduino.statementToCode(this, 'DO');
if (Blockly.Arduino.INFINITE_LOOP_TRAP) {
branch = Blockly.Arduino.INFINITE_LOOP_TRAP.replace(/%1/g,
'\'' + this.id + '\'') + branch;
}
var loopVar = Blockly.Arduino.variableDB_.getDistinctName(
'count', Blockly.Variables.NAME_TYPE);
var code = 'for (' + loopVar + ' = 0; ' +
loopVar + ' < ' + repeats + '; ' +
loopVar + '++) {\n' +
branch + '}\n';
return code;
};
Blockly.Arduino.controls_whileUntil = function() {
// Do while/until loop.
var argument0 = Blockly.Arduino.valueToCode(this, 'BOOL',
Blockly.Arduino.ORDER_NONE) || 'false';
var branch = Blockly.Arduino.statementToCode(this, 'DO');
if (Blockly.Arduino.INFINITE_LOOP_TRAP) {
branch = Blockly.Arduino.INFINITE_LOOP_TRAP.replace(/%1/g,
'\'' + this.id + '\'') + branch;
}
if (this.getTitleValue('MODE') == 'UNTIL') {
if (!argument0.match(/^\w+$/)) {
argument0 = '(' + argument0 + ')';
}
argument0 = '!' + argument0;
}
return 'while (' + argument0 + ') {\n' + branch + '}\n';
};
Blockly.Arduino.controls_for = function() {
// For loop.
var variable0 = Blockly.Arduino.variableDB_.getName(
this.getTitleValue('VAR'), Blockly.Variables.NAME_TYPE);
var argument0 = Blockly.Arduino.valueToCode(this, 'FROM',
Blockly.Arduino.ORDER_ASSIGNMENT) || '0';
var argument1 = Blockly.Arduino.valueToCode(this, 'TO',
Blockly.Arduino.ORDER_ASSIGNMENT) || '0';
var branch = Blockly.Arduino.statementToCode(this, 'DO');
if (Blockly.Arduino.INFINITE_LOOP_TRAP) {
branch = Blockly.Arduino.INFINITE_LOOP_TRAP.replace(/%1/g,
'\'' + this.id + '\'') + branch;
}
var code;
if (argument0.match(/^-?\d+(\.\d+)?$/) &&
argument1.match(/^-?\d+(\.\d+)?$/)) {
// Both arguments are simple numbers.
var up = parseFloat(argument0) <= parseFloat(argument1);
code = 'for (' + variable0 + ' = ' + argument0 + '; ' +
variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' +
variable0 + (up ? '++' : '--') + ') {\n' +
branch + '}\n';
} else {
code = '';
// Cache non-trivial values to variables to prevent repeated look-ups.
var startVar = argument0;
if (!argument0.match(/^\w+$/) && !argument0.match(/^-?\d+(\.\d+)?$/)) {
var startVar = Blockly.Arduino.variableDB_.getDistinctName(
variable0 + '_start', Blockly.Variables.NAME_TYPE);
code += 'int ' + startVar + ' = ' + argument0 + ';\n';
}
var endVar = argument1;
if (!argument1.match(/^\w+$/) && !argument1.match(/^-?\d+(\.\d+)?$/)) {
var endVar = Blockly.Arduino.variableDB_.getDistinctName(
variable0 + '_end', Blockly.Variables.NAME_TYPE);
code += 'int ' + endVar + ' = ' + argument1 + ';\n';
}
code += 'for (' + variable0 + ' = ' + startVar + ';\n' +
' (' + startVar + ' <= ' + endVar + ') ? ' +
variable0 + ' <= ' + endVar + ' : ' +
variable0 + ' >= ' + endVar + ';\n' +
' ' + variable0 + ' += (' + startVar + ' <= ' + endVar +
') ? 1 : -1) {\n' +
branch0 + '}\n';
}
return code;
};
Blockly.Arduino.controls_forEach = function() {
// For each loop.
var variable0 = Blockly.Arduino.variableDB_.getName(
this.getTitleValue('VAR'), Blockly.Variables.NAME_TYPE);
var argument0 = Blockly.Arduino.valueToCode(this, 'LIST',
Blockly.Arduino.ORDER_ASSIGNMENT) || '[]';
var branch = Blockly.Arduino.statementToCode(this, 'DO');
if (Blockly.Arduino.INFINITE_LOOP_TRAP) {
branch = Blockly.Arduino.INFINITE_LOOP_TRAP.replace(/%1/g,
'\'' + this.id + '\'') + branch;
}
var code = 'for (var ' + variable0 + ' in ' + argument0 + ') {\n' +
branch + '}\n';
return code;
};
Blockly.Arduino.controls_flow_statements = function() {
// Flow statements: continue, break.
switch (this.getTitleValue('FLOW')) {
case 'BREAK':
return 'break;\n';
case 'CONTINUE':
return 'continue;\n';
}
throw 'Unknown flow statement.';
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment