Skip to content

Commit 595d4fd

Browse files
committed
add tracking block
1 parent a3a22c9 commit 595d4fd

12 files changed

Lines changed: 299 additions & 15 deletions

File tree

blocks/msg/en.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@ Blockly.Msg.DEMO_RANGE_DEFAULT = "default:";
5252
Blockly.Msg.DEMO_RANGE_INPUT = "Slider range, do:";
5353
Blockly.Msg.DEMO_RANGE_SHOW = "Show value:";
5454
Blockly.Msg.DEMO_RANGE_VALUE = "value:";
55+
Blockly.Msg.DEMO_YOUTUBE_CHANGEID = "Change";
56+
Blockly.Msg.DEMO_YOUTUBE_CHANGEID_ID = "video's id:";
57+
Blockly.Msg.DEMO_TRACKING_SET = "Set Tracking";
58+
Blockly.Msg.DEMO_TRACKING_COLOR = "color";
59+
Blockly.Msg.DEMO_TRACKING_FACE = "face";
60+
Blockly.Msg.DEMO_TRACKING_MODULE = "module";
61+
Blockly.Msg.DEMO_TRACKING_START = "Start tracking";
62+
Blockly.Msg.DEMO_TRACKING_DO = "do ( choose )";
63+
Blockly.Msg.DEMO_TRACKING_RUN = "Continued Tracking";
64+
Blockly.Msg.DEMO_TRACKING_STOP = "Stop Tracking";
65+
Blockly.Msg.DEMO_TRACKING_VAL = "Tracking value";
66+
Blockly.Msg.DEMO_TRACKING_VALTOTAL = "total ( face )";
67+
Blockly.Msg.DEMO_TRACKING_VALCOLOR = "color ( color )";
5568

5669
Blockly.Msg.CUSTOM_JS_CONSOLE = "Console:";
5770
Blockly.Msg.CUSTOM_JS_Date = "Date:";

blocks/msg/zh-hant.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@ Blockly.Msg.DEMO_RANGE_DEFAULT = "預設值";
5858
Blockly.Msg.DEMO_RANGE_INPUT = "調整拉霸,執行";
5959
Blockly.Msg.DEMO_RANGE_SHOW = "數值顯示";
6060
Blockly.Msg.DEMO_RANGE_VALUE = "拉霸的數值";
61+
Blockly.Msg.DEMO_YOUTUBE_CHANGEID = "更換";
62+
Blockly.Msg.DEMO_YOUTUBE_CHANGEID_ID = "影片,要更換的 id:";
63+
Blockly.Msg.DEMO_TRACKING_SET = "載入追蹤";
64+
Blockly.Msg.DEMO_TRACKING_COLOR = "顏色";
65+
Blockly.Msg.DEMO_TRACKING_FACE = "臉";
66+
Blockly.Msg.DEMO_TRACKING_MODULE = "模組";
67+
Blockly.Msg.DEMO_TRACKING_START = "開始追蹤";
68+
Blockly.Msg.DEMO_TRACKING_DO = "執行 ( 可不填 )";
69+
Blockly.Msg.DEMO_TRACKING_RUN = "繼續追蹤";
70+
Blockly.Msg.DEMO_TRACKING_STOP = "停止追蹤";
71+
Blockly.Msg.DEMO_TRACKING_VAL = "追蹤數值";
72+
Blockly.Msg.DEMO_TRACKING_VALTOTAL = "total ( 臉 )";
73+
Blockly.Msg.DEMO_TRACKING_VALCOLOR = "color ( 顏色 )";
6174

6275

6376
// Console

blocks/webduino.js

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,9 +389,9 @@ Blockly.Blocks['demo_youtube_status'] = {
389389
Blockly.Blocks['demo_youtube_id'] = {
390390
init: function () {
391391
this.appendValueInput("id_")
392-
.appendField("更換")
392+
.appendField(Blockly.Msg.DEMO_YOUTUBE_CHANGEID,"更換")
393393
.appendField(new Blockly.FieldVariable("youtube"), "name_")
394-
.appendField("影片,要更換的 id:");
394+
.appendField(Blockly.Msg.DEMO_YOUTUBE_CHANGEID_ID,"影片,要更換的 id:");
395395
this.setPreviousStatement(true);
396396
this.setNextStatement(true);
397397
this.setTooltip('');
@@ -400,6 +400,80 @@ Blockly.Blocks['demo_youtube_id'] = {
400400
}
401401
};
402402

403+
Blockly.Blocks['demo_tracking'] = {
404+
init: function () {
405+
this.appendDummyInput()
406+
.appendField(Blockly.Msg.DEMO_TRACKING_SET,"載入辨識")
407+
.appendField(new Blockly.FieldDropdown([
408+
[Blockly.Msg.DEMO_TRACKING_COLOR, "color"],
409+
[Blockly.Msg.DEMO_TRACKING_FACE, "face"]
410+
]), "type_")
411+
.appendField(Blockly.Msg.DEMO_TRACKING_MODULE,"模組");
412+
this.setPreviousStatement(true);
413+
this.setNextStatement(true);
414+
this.setTooltip('');
415+
this.setColour(Blockly.Blocks.colour.HUE);
416+
this.setHelpUrl('http://www.example.com/');
417+
}
418+
};
419+
420+
Blockly.Blocks['demo_tracking_on'] = {
421+
init: function () {
422+
this.appendDummyInput()
423+
.appendField(Blockly.Msg.DEMO_TRACKING_START,"開始辨識");
424+
this.appendStatementInput("do_")
425+
.appendField(Blockly.Msg.DEMO_TRACKING_DO,"執行 ( 可不填 )");
426+
this.setPreviousStatement(true);
427+
this.setNextStatement(true);
428+
this.setTooltip('');
429+
this.setColour(Blockly.Blocks.colour.HUE);
430+
this.setHelpUrl('http://www.example.com/');
431+
}
432+
};
433+
434+
Blockly.Blocks['demo_tracking_run'] = {
435+
init: function () {
436+
this.appendDummyInput()
437+
.appendField(Blockly.Msg.DEMO_TRACKING_RUN,"繼續辨識");
438+
this.setPreviousStatement(true);
439+
this.setNextStatement(true);
440+
this.setTooltip('');
441+
this.setColour(Blockly.Blocks.colour.HUE);
442+
this.setHelpUrl('http://www.example.com/');
443+
}
444+
};
445+
446+
Blockly.Blocks['demo_tracking_stop'] = {
447+
init: function () {
448+
this.appendDummyInput()
449+
.appendField(Blockly.Msg.DEMO_TRACKING_STOP,"停止辨識");
450+
this.setPreviousStatement(true);
451+
this.setNextStatement(true);
452+
this.setTooltip('');
453+
this.setColour(Blockly.Blocks.colour.HUE);
454+
this.setHelpUrl('http://www.example.com/');
455+
}
456+
};
457+
458+
Blockly.Blocks['demo_tracking_val'] = {
459+
init: function () {
460+
this.appendDummyInput()
461+
.appendField(Blockly.Msg.DEMO_TRACKING_VAL,"辨識數值")
462+
.appendField(new Blockly.FieldDropdown([
463+
["x", "x"],
464+
["y", "y"],
465+
["width", "width"],
466+
["height", "height"],
467+
[Blockly.Msg.DEMO_TRACKING_VALTOTAL, "total"],
468+
[Blockly.Msg.DEMO_TRACKING_VALCOLOR, "color"]
469+
]), "val_");
470+
this.setOutput(true);
471+
this.setTooltip('');
472+
this.setColour(Blockly.Blocks.colour.HUE);
473+
this.setHelpUrl('http://www.example.com/');
474+
}
475+
};
476+
403477
/*
404478
. oooo
405479
.o8 `888

css/blockly.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@
223223
padding-left:5px!important;
224224
}
225225
.blocklyTreeRoot>div>div>div>div>.blocklyTreeRow{
226-
padding-left:15px!important;
226+
padding-left:5px!important;
227227
}
228228
.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {
229229
padding-right: 0;

css/style.css

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,3 +576,24 @@ td#copyCode div{
576576
outline:none;
577577
margin:0 10px 10px 0;
578578
}
579+
#demo-area-08-content{
580+
position: relative;
581+
width:100%;
582+
max-width:300px;
583+
height:200px;
584+
}
585+
#demo-area-08-video{
586+
top:0;
587+
left:0;
588+
position: absolute;
589+
width:100%;
590+
height:100%;
591+
}
592+
593+
#demo-area-08-canvas{
594+
top:0;
595+
left:0;
596+
position: absolute;
597+
width:100%;
598+
height:100%;
599+
}

generators/webduino.js

Lines changed: 108 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -287,30 +287,126 @@ ooo. .oo. .oo. .oooo. .o888oo 888 .oo.
287287
o888o o888o o888o `Y888""8o "888" o888o o888o
288288
*/
289289

290-
Blockly.JavaScript['math_round_digit'] = function(block) {
290+
Blockly.JavaScript['math_round_digit'] = function (block) {
291291
var dropdown_type_ = block.getFieldValue('type_');
292292
var dropdown_digit_ = block.getFieldValue('digit_');
293293
var value_round_ = Blockly.JavaScript.valueToCode(block, 'round_', Blockly.JavaScript.ORDER_ATOMIC);
294294
var code;
295-
if(dropdown_digit_==0){
296-
code = 'Math.'+dropdown_type_+'('+value_round_+')';
297-
}else{
298-
var a = Math.pow(10,dropdown_digit_);
299-
code = '(Math.'+dropdown_type_+'(('+value_round_+')*'+a+'))/'+a;
295+
if (dropdown_digit_ == 0) {
296+
code = 'Math.' + dropdown_type_ + '(' + value_round_ + ')';
297+
} else {
298+
var a = Math.pow(10, dropdown_digit_);
299+
code = '(Math.' + dropdown_type_ + '((' + value_round_ + ')*' + a + '))/' + a;
300300
}
301301
return [code, Blockly.JavaScript.ORDER_ATOMIC];
302302
};
303303

304-
Blockly.JavaScript['math_value_conversion'] = function(block) {
304+
Blockly.JavaScript['math_value_conversion'] = function (block) {
305305
var value_source_ = Blockly.JavaScript.valueToCode(block, 'source_', Blockly.JavaScript.ORDER_ATOMIC);
306306
var value_omin_ = Blockly.JavaScript.valueToCode(block, 'omin_', Blockly.JavaScript.ORDER_ATOMIC);
307307
var value_omax_ = Blockly.JavaScript.valueToCode(block, 'omax_', Blockly.JavaScript.ORDER_ATOMIC);
308308
var value_cmin_ = Blockly.JavaScript.valueToCode(block, 'cmin_', Blockly.JavaScript.ORDER_ATOMIC);
309309
var value_cmax_ = Blockly.JavaScript.valueToCode(block, 'cmax_', Blockly.JavaScript.ORDER_ATOMIC);
310-
var code = '(('+value_source_+' - ('+value_omin_+')) * (1/(('+value_omax_+')-('+value_omin_+')))) * (('+value_cmax_+')-('+value_cmin_+')) + ('+value_cmin_+')';
310+
var code = '((' + value_source_ + ' - (' + value_omin_ + ')) * (1/((' + value_omax_ + ')-(' + value_omin_ + ')))) * ((' + value_cmax_ + ')-(' + value_cmin_ + ')) + (' + value_cmin_ + ')';
311311
return [code, Blockly.JavaScript.ORDER_NONE];
312312
};
313313

314+
Blockly.JavaScript['demo_tracking'] = function (block) {
315+
var dropdown_type_ = block.getFieldValue('type_');
316+
var code;
317+
if (dropdown_type_ == 'color') {
318+
code = 'var canvas = document.getElementById("demo-area-08-canvas");\n' +
319+
'var context = canvas.getContext("2d");\n' +
320+
'tracking.ColorTracker.registerColor("red", function(r, g, b) {\n' +
321+
' if (r > 150 && g < 50 && b < 50) {\n' +
322+
' return true;\n' +
323+
' }\n' +
324+
' return false;\n' +
325+
'});\n' +
326+
'tracking.ColorTracker.registerColor("black", function(r, g, b) {\n' +
327+
' if (r < 50 && g < 50 && b < 50) {\n' +
328+
' return true;\n' +
329+
' }\n' +
330+
' return false;\n' +
331+
'});\n' +
332+
'tracking.ColorTracker.registerColor("white", function(r, g, b) {\n' +
333+
' if (r > 200 && g > 200 && b > 200) {\n' +
334+
' return true;\n' +
335+
' }\n' +
336+
' return false;\n' +
337+
'});\n' +
338+
'tracking.ColorTracker.registerColor("green", function(r, g, b) {\n' +
339+
' if (r < 50 && g > 150 && b < 50) {\n' +
340+
' return true;\n' +
341+
' }\n' +
342+
' return false;\n' +
343+
'});\n\n' +
344+
'var myTracker = new tracking.ColorTracker(["magenta", "cyan", "yellow", "red", "black", "white", "green"]);\n' +
345+
'var storkColor = {\n' +
346+
' magenta: "#f09",\n' +
347+
' red: "#f00",\n' +
348+
' cyan: "#0ff",\n' +
349+
' yellow: "#ff0",\n' +
350+
' black: "#000",\n' +
351+
' white: "#fff",\n' +
352+
' green: "#0c0"\n' +
353+
'};\n\n';
354+
} else if (dropdown_type_ == 'face') {
355+
code = 'var canvas = document.getElementById("demo-area-08-canvas");\n' +
356+
'var context = canvas.getContext("2d");\n\n' +
357+
'var myTracker = new tracking.ObjectTracker("face");\n' +
358+
'myTracker.setInitialScale(3);\n' +
359+
'myTracker.setStepSize(1.5);\n' +
360+
'myTracker.setEdgesDensity(0.1);\n\n';
361+
}
362+
return code;
363+
};
364+
365+
Blockly.JavaScript['demo_tracking_on'] = function (block) {
366+
var statements_do_ = Blockly.JavaScript.statementToCode(block, 'do_');
367+
var code = 'myTracker.on("track", function(event) {\n' +
368+
' if (event.data.length === 0) {\n' +
369+
' context.clearRect(0, 0, canvas.width, canvas.height);\n' +
370+
' } else {\n' +
371+
' context.clearRect(0, 0, canvas.width, canvas.height);\n' +
372+
' event.data.forEach(function(data) {\n' +
373+
' '+statements_do_+
374+
' if(data.color){\n' +
375+
' context.strokeStyle = storkColor[data.color];\n' +
376+
' }else{\n' +
377+
' context.strokeStyle = "#f00";\n' +
378+
' }\n' +
379+
' context.lineWidth = 5;\n' +
380+
' context.strokeRect(data.x, data.y, data.width, data.height-30);\n' +
381+
' context.font = "11px Helvetica";\n' +
382+
' context.fillStyle = "#fff";\n' +
383+
' });\n' +
384+
' }\n' +
385+
'});\n' +
386+
'var trackerTask = tracking.track("#demo-area-08-video", myTracker, {\n' +
387+
' camera: true\n' +
388+
'});\n\n' +
389+
'trackerTask.run();\n';
390+
return code;
391+
};
392+
393+
Blockly.JavaScript['demo_tracking_run'] = function (block) {
394+
var code = 'trackerTask.run();\n';
395+
return code;
396+
};
397+
398+
Blockly.JavaScript['demo_tracking_stop'] = function (block) {
399+
var code = 'context.clearRect(0, 0, canvas.width, canvas.height);\n' +
400+
'trackerTask.stop();\n';
401+
return code;
402+
};
403+
404+
Blockly.JavaScript['demo_tracking_val'] = function (block) {
405+
var dropdown_val_ = block.getFieldValue('val_');
406+
var code = 'data.' + dropdown_val_;
407+
return [code, Blockly.JavaScript.ORDER_ATOMIC];
408+
};
409+
314410

315411
/*
316412
o8o
@@ -416,13 +512,13 @@ Blockly.JavaScript['board_ready'] = function (block) {
416512
var checkbox_check_ = block.getFieldValue('check_');
417513
var dropdown_rate_ = block.getFieldValue('rate_');
418514
var statements_callbacks_ = Blockly.JavaScript.statementToCode(block, 'callbacks_');
419-
515+
420516
var type;
421-
if(checkbox_type_=='1'){
517+
if (checkbox_type_ == '1') {
422518
type = 'boardReady(' + value_device_ + ', function (board) {\n';
423-
}else if(checkbox_type_=='2'){
519+
} else if (checkbox_type_ == '2') {
424520
type = 'boardReady({ transport: \'serial\', path:' + value_device_ + ' }, function (board) {\n';
425-
}else if(checkbox_type_=='3'){
521+
} else if (checkbox_type_ == '3') {
426522
type = 'boardReady({ transport: \'bluetooth\', address:' + value_device_ + ' }, function (board) {\n';
427523
}
428524

index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
<script src='lib/firebase.js'></script>
3434
<script src="lib/iframe_api"></script>
3535
<script src="lib/clipboard.js"></script>
36+
<script src="lib/tracking-min.js"></script>
37+
<script src="lib/face-min.js"></script>
3638
</head>
3739

3840
<body>

lib/face-min.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/tracking-min.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

msg/en.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ var MSG = {
5757
catMenu2: "Sensors",
5858
catMenu3: "Toies",
5959
catSpeech: "Speech",
60+
catTracking: "Tracking",
6061
catKeyCode: "Keyboard",
6162
catPlus: "Advanced",
6263
catStandard: "Standard",
@@ -82,6 +83,7 @@ var MSG = {
8283
demoAreaSelect5: "Button",
8384
demoAreaSelect6: "Range",
8485
demoAreaSelect7: "Youtube",
86+
demoAreaSelect8: "Tracking",
8587
demoAreaBtn1: "Button 1",
8688
demoAreaBtn2: "Button 2",
8789
demoAreaBtn3: "Button 3",

0 commit comments

Comments
 (0)