Skip to content

Commit f408b5c

Browse files
author
Ke, Mingze
committed
Merge branch 'promise' into gh-pages
2 parents c172649 + 51d2fd7 commit f408b5c

9 files changed

Lines changed: 203 additions & 120 deletions

File tree

blocks/msg/en.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@ Blockly.Msg.CUSTOM_JS_CONSOLE = "Console:";
99
Blockly.Msg.WEBDUINO_TIMER_AFTER = "After";
1010
Blockly.Msg.WEBDUINO_TIMER_SECOND = "seconds";
1111
Blockly.Msg.WEBDUINO_TIMER_DO = "do";
12-
Blockly.Msg.WEBDUINO_DO = "do";
13-
Blockly.Msg.WEBDUINO_EXEC_SEQ = "sequence";
14-
Blockly.Msg.WEBDUINO_EXEC_THEN = "then";
15-
Blockly.Msg.WEBDUINO_EXEC_THEN_STMS = "then";
12+
13+
Blockly.Msg.WEBDUINO_DELAY = "delay";
14+
Blockly.Msg.WEBDUINO_DELAY_SECONDS = "seconds";
1615

1716
Blockly.Msg.WEBDUINO_BOARD_READY_WEBDUINO = "Board";
1817
Blockly.Msg.WEBDUINO_BOARD_READY_DEVICE = "device";
@@ -34,6 +33,7 @@ Blockly.Msg.WEBDUINO_RGBLED_SETCOLOR = "set color";
3433

3534
Blockly.Msg.WEBDUINO_ULTRASONIC_NEW_TRIG = "Ultrasonic, Trig:";
3635
Blockly.Msg.WEBDUINO_ULTRASONIC_NEW_ECHO = " Echo:";
36+
Blockly.Msg.WEBDUINO_ULTRASONIC_GET = "get distance";
3737
Blockly.Msg.WEBDUINO_ULTRASONIC_GET_DISTANCE = "get distance over every";
3838
Blockly.Msg.WEBDUINO_ULTRASONIC_GET_TIME = "ms ( 1/1000 sec )";
3939
Blockly.Msg.WEBDUINO_ULTRASONIC_GET_DO = "do";

blocks/msg/zh-hant.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@ Blockly.Msg.CUSTOM_JS_CONSOLE = "控制台顯示";
99
Blockly.Msg.WEBDUINO_TIMER_AFTER = "在";
1010
Blockly.Msg.WEBDUINO_TIMER_SECOND = "秒之後";
1111
Blockly.Msg.WEBDUINO_TIMER_DO = "執行";
12-
Blockly.Msg.WEBDUINO_DO = "執行";
13-
Blockly.Msg.WEBDUINO_EXEC_SEQ = "依序";
14-
Blockly.Msg.WEBDUINO_EXEC_THEN = "然後";
15-
Blockly.Msg.WEBDUINO_EXEC_THEN_STMS = "然後";
12+
13+
Blockly.Msg.WEBDUINO_DELAY = "延遲";
14+
Blockly.Msg.WEBDUINO_DELAY_SECONDS = "秒";
1615

1716
Blockly.Msg.WEBDUINO_BOARD_READY_WEBDUINO = "開發版";
1817
Blockly.Msg.WEBDUINO_BOARD_READY_DEVICE = "device";
@@ -61,6 +60,7 @@ Blockly.Msg.WEBDUINO_BUZZER_CHOOSE_MUSIC4 = "超級瑪莉和弦";
6160

6261
Blockly.Msg.WEBDUINO_ULTRASONIC_NEW_TRIG = "超音波傳感器,Trig:";
6362
Blockly.Msg.WEBDUINO_ULTRASONIC_NEW_ECHO = " Echo:";
63+
Blockly.Msg.WEBDUINO_ULTRASONIC_GET = "擷取距離";
6464
Blockly.Msg.WEBDUINO_ULTRASONIC_GET_DISTANCE = "擷取距離,每";
6565
Blockly.Msg.WEBDUINO_ULTRASONIC_GET_TIME = "豪秒 ( 1/1000 秒 ) 擷取一次";
6666
Blockly.Msg.WEBDUINO_ULTRASONIC_GET_DO = "執行:";

blocks/webduino.js

Lines changed: 22 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ Blockly.Blocks['car_move'] = {
190190
this.setInputsInline(true);
191191
this.setPreviousStatement(true);
192192
this.setNextStatement(true);
193-
this.setColour(180);
193+
this.setColour(65);
194194
this.setTooltip('');
195195
this.setHelpUrl('http://www.example.com/');
196196
}
@@ -199,63 +199,29 @@ Blockly.Blocks['car_move'] = {
199199
Blockly.Blocks['timer'] = {
200200
init: function () {
201201
this.appendValueInput("secs_")
202-
.appendField(Blockly.Msg.WEBDUINO_TIMER_AFTER, "After");
202+
.appendField(Blockly.Msg.WEBDUINO_TIMER_AFTER);
203203
this.appendDummyInput()
204-
.appendField(Blockly.Msg.WEBDUINO_TIMER_SECOND, "second(s),");
204+
.appendField(Blockly.Msg.WEBDUINO_TIMER_SECOND);
205205
this.appendStatementInput("do_")
206206
.appendField(Blockly.Msg.WEBDUINO_TIMER_DO, "do");
207207
this.setInputsInline(true);
208208
this.setPreviousStatement(true);
209209
this.setNextStatement(true);
210-
this.setColour(290);
211-
this.setTooltip('');
212-
this.setHelpUrl('http://www.example.com/');
213-
}
214-
};
215-
216-
Blockly.Blocks['do'] = {
217-
init: function () {
218-
this.appendValueInput("return_")
219-
.appendField(Blockly.Msg.WEBDUINO_DO);
220-
this.setPreviousStatement(true);
221-
this.setNextStatement(true);
222-
this.setColour(290);
210+
this.setColour(180);
223211
this.setTooltip('');
224212
this.setHelpUrl('http://www.example.com/');
225213
}
226214
};
227215

228-
Blockly.Blocks['exec_seq'] = {
216+
Blockly.Blocks['delay'] = {
229217
init: function () {
218+
this.appendValueInput("secs_")
219+
.appendField(Blockly.Msg.WEBDUINO_DELAY);
230220
this.appendDummyInput()
231-
.appendField(Blockly.Msg.WEBDUINO_EXEC_SEQ);
232-
this.appendStatementInput("seq_");
233-
this.setOutput(true);
234-
this.setColour(20);
235-
this.setTooltip('');
236-
this.setHelpUrl('http://www.example.com/');
237-
}
238-
};
239-
240-
Blockly.Blocks['exec_then'] = {
241-
init: function () {
242-
this.appendValueInput("then_")
243-
.appendField(Blockly.Msg.WEBDUINO_EXEC_THEN, "then");
221+
.appendField(Blockly.Msg.WEBDUINO_DELAY_SECONDS);
244222
this.setPreviousStatement(true);
245223
this.setNextStatement(true);
246-
this.setColour(20);
247-
this.setTooltip('');
248-
this.setHelpUrl('http://www.example.com/');
249-
}
250-
};
251-
252-
Blockly.Blocks['exec_then_stms'] = {
253-
init: function () {
254-
this.appendStatementInput("then_")
255-
.appendField(Blockly.Msg.WEBDUINO_EXEC_THEN_STMS, "then");
256-
this.setPreviousStatement(true);
257-
this.setNextStatement(true);
258-
this.setColour(20);
224+
this.setColour(180);
259225
this.setTooltip('');
260226
this.setHelpUrl('http://www.example.com/');
261227
}
@@ -309,6 +275,19 @@ Blockly.Blocks['ultrasonic_get'] = {
309275
}
310276
};
311277

278+
Blockly.Blocks['ultrasonic_get_promise'] = {
279+
init: function () {
280+
this.appendDummyInput()
281+
.appendField(new Blockly.FieldVariable("ultrasonic"), "var_")
282+
.appendField(Blockly.Msg.WEBDUINO_ULTRASONIC_GET);
283+
this.setPreviousStatement(true);
284+
this.setNextStatement(true);
285+
this.setColour(65);
286+
this.setTooltip('');
287+
this.setHelpUrl('http://www.example.com/');
288+
}
289+
};
290+
312291
// https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#vv8fx4
313292
Blockly.Blocks['ultrasonic_distance'] = {
314293
init: function () {

code.js

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,148 @@ Code.discard = function () {
495495
}
496496
};
497497

498+
Code.promisifyBlock = function (block, code) {
499+
var prev = block.getParent(),
500+
next = block.getNextBlock(),
501+
type, ocurr, count;
502+
503+
if (block.promise && block.type !== 'controls_if' && block.type !== 'procedures_callnoreturn') {
504+
code = 'return ' + code;
505+
}
506+
507+
if (prev !== null && prev.promise && prev.getNextBlock() === block) {
508+
count = 0;
509+
ocurr = code.match(/\n/g).length;
510+
code = code.replace(/\n/g, function () {
511+
count++;
512+
if (count < ocurr) {
513+
return '\n ';
514+
}
515+
return '\n';
516+
});
517+
code = '.then(function () {\n ' + (block.type === 'procedures_callnoreturn' ? 'return ' : '') + code + '})';
518+
block.promise = true;
519+
type = 1;
520+
} else {
521+
if (block.promise && code.endsWith(';\n') && next !== null) {
522+
code = code.substr(0, code.length - 2);
523+
type = 2;
524+
}
525+
}
526+
527+
if (block.promise && next === null) {
528+
if (type) {
529+
code += ';\n';
530+
}
531+
}
532+
533+
return code;
534+
};
535+
536+
Code.debug = function () {
537+
var space = '';
538+
for (var i = 0; i < Blockly.JavaScript.depth; i++) {
539+
space += ' ';
540+
}
541+
console.log.apply(console, [space].concat(Array.prototype.slice.apply(arguments)));
542+
};
543+
544+
Blockly.JavaScript.blockToCode = function (block) {
545+
if (!block) {
546+
return '';
547+
}
548+
if (block.disabled) {
549+
// Skip past this block if it is disabled.
550+
return this.blockToCode(block.getNextBlock());
551+
}
552+
553+
var func = this[block.type];
554+
goog.asserts.assertFunction(func,
555+
'Language "%s" does not know how to generate code for block type "%s".',
556+
this.name_, block.type);
557+
558+
delete block.promise;
559+
560+
// First argument to func.call is the value of 'this' in the generator.
561+
// Prior to 24 September 2013 'this' was the only way to access the block.
562+
// The current prefered method of accessing the block is through the second
563+
// argument to func.call, which becomes the first parameter to the generator.
564+
var code = func.call(block, block);
565+
if (goog.isArray(code)) {
566+
// Value blocks return tuples of code and operator order.
567+
568+
// Code.debug('CODE', code[0]);
569+
Blockly.JavaScript.depth++;
570+
var scrub = this.scrub_(block, code[0]);
571+
Blockly.JavaScript.depth--;
572+
// Code.debug('<- ' + scrub);
573+
574+
return [scrub, code[1]];
575+
} else if (goog.isString(code)) {
576+
if (this.STATEMENT_PREFIX) {
577+
code = this.STATEMENT_PREFIX.replace(/%1/g, '\'' + block.id + '\'') +
578+
code;
579+
}
580+
581+
// var prev = block.getParent();
582+
// Code.debug({
583+
// type: block.type,
584+
// depth: Blockly.JavaScript.depth,
585+
// promise: block.promise,
586+
// prev: prev ? prev.type : null
587+
// });
588+
code = Code.promisifyBlock(block, code);
589+
590+
// Code.debug('CODE', code);
591+
Blockly.JavaScript.depth++;
592+
var scrub = this.scrub_(block, code);
593+
Blockly.JavaScript.depth--;
594+
// Code.debug('<- ' + scrub);
595+
596+
return scrub;
597+
} else if (code === null) {
598+
// Block has handled code generation itself.
599+
return '';
600+
} else {
601+
goog.asserts.fail('Invalid code generated: %s', code);
602+
}
603+
};
604+
605+
Blockly.Block.prototype.setPromise = function (isPromise) {
606+
var block = this;
607+
this.promise = isPromise;
608+
if (isPromise) {
609+
while ((block = block.getSurroundParent()) !== null) {
610+
if (block.type.indexOf('procedures_def') === 0) {
611+
block.promise = true;
612+
return;
613+
}
614+
}
615+
}
616+
};
617+
618+
Blockly.JavaScript['_procedures_callnoreturn'] = Blockly.JavaScript['procedures_callnoreturn'];
619+
620+
Blockly.JavaScript['procedures_callnoreturn'] = function (block) {
621+
var funcName = Blockly.JavaScript.variableDB_.getName(
622+
block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE);
623+
var code = Blockly.JavaScript['_procedures_callnoreturn'].call(Blockly.JavaScript, block);
624+
var blocks = Code.workspace.getTopBlocks();
625+
var blk;
626+
for (var i = 0; i < blocks.length; i++) {
627+
blk = blocks[i];
628+
if (blk.type.indexOf('procedures_def') === 0 && blk.getProcedureDef()[0] === funcName) {
629+
if (blk.promise) {
630+
block.promise = true;
631+
}
632+
break;
633+
}
634+
}
635+
return code;
636+
};
637+
638+
Blockly.JavaScript.depth = 0;
639+
498640
// Load the Code demo's language strings.
499641
document.write('<script src="' + baseUrl + '/msg/' + Code.LANG + '.js"></script>\n');
500642
// Load Blockly's language strings.

generators/webduino.js

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,8 @@ Blockly.JavaScript['car_move'] = function (block) {
6363
var variable_car_ = Blockly.JavaScript.variableDB_.getName(block.getFieldValue('car_'), Blockly.Variables.NAME_TYPE);
6464
var dropdown_move_ = block.getFieldValue('move_');
6565
var value_secs_ = Blockly.JavaScript.valueToCode(block, 'secs_', Blockly.JavaScript.ORDER_NONE);
66-
var code = variable_car_ + '.' + dropdown_move_ + '(' + value_secs_ + ')';
67-
code = promisifyBlockCode(block, code);
68-
return code;
69-
};
70-
71-
Blockly.JavaScript['do'] = function (block) {
72-
var value_return_ = Blockly.JavaScript.valueToCode(block, 'return_', Blockly.JavaScript.ORDER_NONE);
73-
var code = value_return_.trim() + ';\n';
66+
var code = variable_car_ + '.' + dropdown_move_ + '(' + value_secs_ + ');\n';
67+
block.setPromise(true);
7468
return code;
7569
};
7670

@@ -81,25 +75,10 @@ Blockly.JavaScript['timer'] = function (block) {
8175
return code;
8276
};
8377

84-
Blockly.JavaScript['exec_seq'] = function (block) {
85-
var statements_seq_ = Blockly.JavaScript.statementToCode(block, 'seq_');
86-
var code = statements_seq_.trim();
87-
return [code, Blockly.JavaScript.ORDER_NONE];
88-
};
89-
90-
Blockly.JavaScript['exec_then'] = function (block) {
91-
var value_then_ = Blockly.JavaScript.valueToCode(block, 'then_', Blockly.JavaScript.ORDER_NONE);
92-
var code = '.then(function () {\n return ' + value_then_ + ';\n})';
93-
return code;
94-
};
95-
96-
Blockly.JavaScript['exec_then_stms'] = function (block) {
97-
var statements_then_ = Blockly.JavaScript.statementToCode(block, 'then_');
98-
var code = '.then(function () {\n' + statements_then_ + '})';
99-
var next = getNextBlock(block);
100-
if (next === null || ['car_move', 'exec_then', 'exec_then_stms'].indexOf(next.type) === -1) {
101-
code += ';\n';
102-
}
78+
Blockly.JavaScript['delay'] = function (block) {
79+
var value_secs_ = Blockly.JavaScript.valueToCode(block, 'secs_', Blockly.JavaScript.ORDER_NONE);
80+
var code = 'delay(' + value_secs_ + ');\n';
81+
block.setPromise(true);
10382
return code;
10483
};
10584

@@ -122,6 +101,13 @@ Blockly.JavaScript['ultrasonic_get'] = function (block) {
122101
return code;
123102
};
124103

104+
Blockly.JavaScript['ultrasonic_get_promise'] = function (block) {
105+
var variable_var_ = Blockly.JavaScript.variableDB_.getName(block.getFieldValue('var_'), Blockly.Variables.NAME_TYPE);
106+
var code = variable_var_ + '.ping();\n';
107+
block.setPromise(true);
108+
return code;
109+
};
110+
125111
Blockly.JavaScript['ultrasonic_distance'] = function (block) {
126112
var variable_var_ = Blockly.JavaScript.variableDB_.getName(block.getFieldValue('var_'), Blockly.Variables.NAME_TYPE);
127113
var code = variable_var_ + '.distance';

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<script src="components/blockly/blocks_compressed.js"></script>
1313
<script src="components/blockly/javascript_compressed.js"></script>
1414
<script src="lib/handlebars-3.0.3.min.js"></script>
15-
<script src="lib/webduino-all-0.1.6.min.js"></script>
15+
<script src="lib/webduino-all.min.js"></script>
1616
<script src="code.js"></script>
1717
<script src="webduino-blockly.js"></script>
1818
<script src="blocks/webduino.js"></script>
Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

views/index.handlebars

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,17 +256,12 @@
256256
<category id="catFunctions" custom="PROCEDURE"></category>
257257
<category id="catExec">
258258
<block type="timer"></block>
259-
<block type="do"></block>
260-
<block type="exec_seq"></block>
261-
<block type="exec_then"></block>
262-
<block type="exec_then_stms"></block>
259+
<block type="delay"></block>
263260
</category>
264261
<category id="catConsole">
265262
<block type="console"></block>
266263
</category>
267264
<sep></sep>
268-
<sep></sep>
269-
<sep></sep>
270265
<category id="catBoard">
271266
<block type="board_ready">
272267
<value name="device_">
@@ -445,6 +440,7 @@
445440
</block>
446441
</value>
447442
</block>
443+
<block type="ultrasonic_get_promise"></block>
448444
<block type="ultrasonic_distance"></block>
449445
</category>
450446
<category id="catDht">

0 commit comments

Comments
 (0)