Skip to content

Commit 4bce142

Browse files
author
Ke, Mingze
committed
Added dynamic board dropdown menu
1 parent f100070 commit 4bce142

4 files changed

Lines changed: 80 additions & 34 deletions

File tree

blocks/webduino.js

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -785,20 +785,54 @@ Blockly.Blocks['pin_num'] = {
785785
}
786786
};
787787

788-
Blockly.Blocks['pin_get_num'] = {
788+
Blockly.Blocks['pin_board'] = {
789789
init: function () {
790-
this.appendValueInput("number_")
791-
.setCheck("Number")
792-
.appendField(Blockly.Msg.WEBDUINO_PIN, "Pin");
793-
this.appendValueInput("board_")
794-
.setCheck("String")
795-
.appendField(Blockly.Msg.WEBDUINO_PIN_ON, "On")
796-
.appendField(Blockly.Msg.WEBDUINO_BOARD, "Board");
797-
this.setInputsInline(true);
790+
this.appendValueInput("pin_")
791+
.setCheck(["Number", "pin_num"])
792+
.appendField(Blockly.Msg.WEBDUINO_BOARD, "Board")
793+
.appendField(new Blockly.FieldDropdown(this.getBoardsDropdown), "board_");
798794
this.setOutput(true);
799795
this.setColour(230);
800796
this.setTooltip('');
801797
this.setHelpUrl('http://www.example.com/');
798+
},
799+
getBoardsDropdown: function () {
800+
var nameMap = {
801+
'1': Blockly.Msg.WEBDUINO_BOARD_WIFI,
802+
'2': Blockly.Msg.WEBDUINO_BOARD_SERIAL,
803+
'3': Blockly.Msg.WEBDUINO_BOARD_BLUETOOTH
804+
},
805+
xml = Blockly.Xml.workspaceToDom(Code.workspace),
806+
boards = xml.querySelectorAll("block[type=board_ready]"),
807+
menus = [];
808+
809+
if (boards.length < 1) {
810+
return [
811+
['', '']
812+
];
813+
}
814+
815+
for (var i = 0; i < boards.length; i++) {
816+
var item = boards[i],
817+
type = item.querySelector('field[name=type_]').textContent,
818+
param = item.querySelector('value[name=device_]').textContent;
819+
820+
switch (type) {
821+
case '1':
822+
menus.push(['(' + nameMap['1'] + ') ' + param, "{ transport: 'mqtt', device: '" + param + "' }"]);
823+
break;
824+
825+
case '2':
826+
menus.push(['(' + nameMap['2'] + ') ' + param, "{ transport: 'serial', path: '" + param + "' }"]);
827+
break;
828+
829+
case '3':
830+
menus.push(['(' + nameMap['3'] + ') ' + param, "{ transport: 'bluetooth', address: '" + param + "' }"]);
831+
break;
832+
}
833+
}
834+
835+
return menus;
802836
}
803837
};
804838

generators/webduino.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -613,22 +613,23 @@ Blockly.JavaScript['board_pin_state'] = function (block) {
613613
};
614614

615615
Blockly.JavaScript['pin_get'] = function (block) {
616+
var input_pin_block = block.getInputTargetBlock('pin');
616617
var value_pin = Blockly.JavaScript.valueToCode(block, 'pin', Blockly.JavaScript.ORDER_ATOMIC);
617-
var code = 'getPin(board, ' + value_pin + ')';
618+
var code = 'getPin(' + (input_pin_block.type === 'pin_num' || input_pin_block.type === 'math_number' ? 'board, ' : '') + value_pin + ')';
618619
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
619620
};
620621

621-
Blockly.JavaScript['pin_num'] = function(block) {
622+
Blockly.JavaScript['pin_num'] = function (block) {
622623
var dropdown_pin_ = block.getFieldValue('pin_');
623624
var code = dropdown_pin_;
624625
return [code, Blockly.JavaScript.ORDER_ATOMIC];
625626
};
626627

627-
Blockly.JavaScript['pin_get_num'] = function (block) {
628-
var value_board_ = Blockly.JavaScript.valueToCode(block, 'board_', Blockly.JavaScript.ORDER_ATOMIC);
629-
var value_number_ = Blockly.JavaScript.valueToCode(block, 'number_', Blockly.JavaScript.ORDER_ATOMIC);
630-
var code = 'getPin(' + value_board_ + ', ' + value_number_ + ')';
631-
return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
628+
Blockly.JavaScript['pin_board'] = function (block) {
629+
var dropdown_board_ = block.getFieldValue('board_');
630+
var value_pin_ = Blockly.JavaScript.valueToCode(block, 'pin_', Blockly.JavaScript.ORDER_ATOMIC);
631+
var code = dropdown_board_ + ', ' + value_pin_;
632+
return [code, Blockly.JavaScript.ORDER_ATOMIC];
632633
};
633634

634635
Blockly.JavaScript['pin_set_mode'] = function (block) {

views/index.handlebars

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -467,21 +467,19 @@
467467
<block type="variables_set">
468468
<field name="VAR">pin</field>
469469
<value name="VALUE">
470-
<block type="pin_get_num">
471-
<value name="board_">
472-
<block type="text"></block>
473-
</value>
474-
<value name="number_">
475-
<block type="math_number">
476-
<field name="NUM">10</field>
470+
<block type="pin_get">
471+
<value name="pin">
472+
<block type="pin_board">
473+
<value name="pin_">
474+
<block type="pin_num">
475+
<field name="pin_">10</field>
476+
</block>
477+
</value>
477478
</block>
478479
</value>
479480
</block>
480481
</value>
481482
</block>
482-
<block type="pin_num">
483-
<field name="pin_">10</field>
484-
</block>
485483
<block type="pin_set_mode"></block>
486484
<block type="pin_read"></block>
487485
<block type="pin_write">

webduino-blockly.js

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,18 +62,31 @@
6262
}
6363

6464
function getPin(board, pinNum) {
65-
if (typeof board === 'string') {
66-
boards.some(function (b) {
67-
var match = b._options.device === board;
68-
if (match) {
69-
board = b;
70-
}
71-
return match;
72-
});
65+
if (board.transport) {
66+
board = searchBoard(board);
7367
}
68+
7469
return board ? board.getPin(pinNum) : undef;
7570
}
7671

72+
function searchBoard(options) {
73+
var keys = Object.keys(options),
74+
candidate,
75+
matched;
76+
77+
boards.some(function (b) {
78+
matched = !keys.some(function (k) {
79+
return options[k] !== b._options[k];
80+
});
81+
if (matched) {
82+
candidate = b;
83+
}
84+
return matched;
85+
});
86+
87+
return candidate;
88+
}
89+
7790
function getLed(board, pin) {
7891
return new webduino.module.Led(board, board.getDigitalPin(pin));
7992
}

0 commit comments

Comments
 (0)