From f6955a256eb2c6f334be5b4bfbfcf98f3cab90c0 Mon Sep 17 00:00:00 2001
From: unknown <1371033826@qq.com>
Date: Tue, 2 Sep 2025 14:52:12 +0800
Subject: [PATCH 1/5] add_mic_blocks
---
blockly/iot/IOT_Blocks.js | 26 ++++++++++++++++++++++++++
ejs/projects.ejs | 10 +++++++++-
js/MixIO.js | 11 +++++++----
js/widgets.js | 2 ++
4 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/blockly/iot/IOT_Blocks.js b/blockly/iot/IOT_Blocks.js
index 2779fae..50df6f7 100644
--- a/blockly/iot/IOT_Blocks.js
+++ b/blockly/iot/IOT_Blocks.js
@@ -693,6 +693,24 @@ Blockly.Blocks['camera_sent'] = {
}
};
+Blockly.Blocks['mic_sent'] = {
+ init: function() {
+ this.setColour(lineChart_HUE);
+ this.appendDummyInput().appendField(Blockly.MIXLY_MICROBIT_JS_CURRENT);
+ this.appendValueInput("name").setCheck("String");
+ this.appendDummyInput().appendField(Blockly.MIC_SENT);
+ this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS+"value");
+ this.setInputsInline(true);
+ this.appendStatementInput('DO0').appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ this.setTooltip("");
+ },
+ getVars:function(){
+ return ["time","value"];
+ }
+};
+
Blockly.Blocks['lineChart_send'] = {
init: function() {
this.appendDummyInput().appendField(Blockly.TO);
@@ -2258,6 +2276,13 @@ Blockly.JavaScript.camera_sent=function(block) {
return code;
};
+Blockly.JavaScript.mic_sent=function(block) {
+ var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.MIC)\n"+".bind(MixIO.eventTags.MIC_SENT, function(event,value){\n"
+ +Blockly.JavaScript.statementToCode(block, "DO0" )+"\n"+"})\n"
+ return code;
+};
+
Blockly.JavaScript.lineChart_send=function(block) {
var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
var message = Blockly.JavaScript.valueToCode(this, 'message', Blockly.JavaScript.ORDER_ATOMIC);
@@ -3250,6 +3275,7 @@ Blockly.GET_BLUETOOTH_STATUS="蓝牙转发器连接的设备";
Blockly.BLUETOOTH_SENT = "蓝牙转发器发送消息"
Blockly.CAMERA_SENT = "摄像头发送消息时"
+Blockly.MIC_SENT = "语音识别发送消息时"
Blockly.BARCHART_RECIEVED="柱状图收到消息时";
Blockly.BARCHART_SEND_MESSAGE="柱状图发送消息";
diff --git a/ejs/projects.ejs b/ejs/projects.ejs
index 20e2fcf..3f9753b 100644
--- a/ejs/projects.ejs
+++ b/ejs/projects.ejs
@@ -971,7 +971,15 @@
-
+
+
+
+
+ name
+
+
+
+
diff --git a/js/MixIO.js b/js/MixIO.js
index daca426..16eddbd 100644
--- a/js/MixIO.js
+++ b/js/MixIO.js
@@ -83,13 +83,14 @@ var MixIO = {
TIMER: 14,
TRIGGER: 15,
BLE: 16,
- CAMERA: 17
+ CAMERA: 17,
+ MIC: 18
},
oldTags: ["input_button", "input_slider", "input_keyboard", "input_controller", "input_rgb", "output_bulb", "output_text",
- "output_chart", "output_bar", "table", "output_dashboard", "output_map", "input_weather", "timer", "trigger", "ble", "camera"
+ "output_chart", "output_bar", "table", "output_dashboard", "output_map", "input_weather", "timer", "trigger", "ble", "camera", "input_mic"
],
- zhcnTags: ["按键/开关", "滑杆", "文本输入", "摇杆手柄", "RGB色盘", "指示灯", "文本显示屏", "折线图表", "柱状图表", "数据表格", "仪表盘", "数据地图", "实时气象仪", "定时触发器", "条件触发器", "蓝牙转发器", "摄像头"],
+ zhcnTags: ["按键/开关", "滑杆", "文本输入", "摇杆手柄", "RGB色盘", "指示灯", "文本显示屏", "折线图表", "柱状图表", "数据表格", "仪表盘", "数据地图", "实时气象仪", "定时触发器", "条件触发器", "蓝牙转发器", "摄像头", "语音识别"],
/*合法的MixIO事件种类*/
eventTags: {
@@ -133,7 +134,9 @@ var MixIO = {
BLUETOOTH_TRIGGERED: "1611",
- CAMERA_SENT: "1711"
+ CAMERA_SENT: "1711",
+
+ MIC_SENT: "1811"
},
diff --git a/js/widgets.js b/js/widgets.js
index 10dcc72..535452f 100644
--- a/js/widgets.js
+++ b/js/widgets.js
@@ -1558,6 +1558,7 @@ function add_mic(user_title, user_topic, user_content, user_style, title_style)
sendIcon.children().addClass("fa-microphone")
recognition.stop();
publish(topic.text(), messDiv.val())
+ itemdiv.trigger(MixIO.eventTags.MIC_SENT, messDiv.val())
isRecording = false
}
})
@@ -1594,6 +1595,7 @@ function add_mic(user_title, user_topic, user_content, user_style, title_style)
sendIcon.children().addClass("fa-microphone")
recognition.stop();
publish(topic.text(), messDiv.val())
+ itemdiv.trigger(MixIO.eventTags.MIC_SENT, messDiv.val())
isRecording = false
}
})
From 65873c1e348638f8b2451ead3cba097b9a766cc7 Mon Sep 17 00:00:00 2001
From: unknown <1371033826@qq.com>
Date: Tue, 2 Sep 2025 15:35:14 +0800
Subject: [PATCH 2/5] add_select_blocks
---
blockly/iot/IOT_Blocks.js | 68 ++++++++++++++++++++++++++++++++++++++-
ejs/projects.ejs | 29 ++++++++++++++++-
js/MixIO.js | 21 ++++++++----
js/widgets.js | 6 +++-
4 files changed, 115 insertions(+), 9 deletions(-)
diff --git a/blockly/iot/IOT_Blocks.js b/blockly/iot/IOT_Blocks.js
index 50df6f7..7a1e41d 100644
--- a/blockly/iot/IOT_Blocks.js
+++ b/blockly/iot/IOT_Blocks.js
@@ -325,6 +325,20 @@ Blockly.Blocks['through_textinput_send'] = {
}
};
+Blockly.Blocks['through_select_send'] = {
+ init: function() {
+ this.setColour(textinput_HUE);
+ this.appendDummyInput().appendField(Blockly.THROUGH);
+ this.appendValueInput("name").setCheck("String");
+ this.appendDummyInput().appendField(Blockly.SELECT_SEND);
+ this.appendValueInput("message").setCheck("String");
+ this.setInputsInline(true);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ this.setTooltip("");
+ }
+};
+
Blockly.Blocks['get_keyboard_input'] = {
init: function() {
this.setColour(textinput_HUE);
@@ -336,6 +350,17 @@ Blockly.Blocks['get_keyboard_input'] = {
}
};
+Blockly.Blocks['get_select_options'] = {
+ init: function() {
+ this.setColour(textinput_HUE);
+ this.appendDummyInput().appendField(Blockly.MIXLY_MICROBIT_PY_STORAGE_GET);
+ this.appendValueInput("name").setCheck("String");
+ this.appendDummyInput().appendField(Blockly.GET_SELECT_OPTIONS);
+ this.setOutput(true, null);
+ this.setTooltip("");
+ }
+};
+
joystick_HUE = "#4e73df";
Blockly.Blocks['when_joystick_dragged'] = {
@@ -711,6 +736,24 @@ Blockly.Blocks['mic_sent'] = {
}
};
+Blockly.Blocks['select_sent'] = {
+ init: function() {
+ this.setColour(lineChart_HUE);
+ this.appendDummyInput().appendField(Blockly.MIXLY_MICROBIT_JS_CURRENT);
+ this.appendValueInput("name").setCheck("String");
+ this.appendDummyInput().appendField(Blockly.SELECT_SENT);
+ this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS+"value");
+ this.setInputsInline(true);
+ this.appendStatementInput('DO0').appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ this.setTooltip("");
+ },
+ getVars:function(){
+ return ["time","value"];
+ }
+};
+
Blockly.Blocks['lineChart_send'] = {
init: function() {
this.appendDummyInput().appendField(Blockly.TO);
@@ -2110,7 +2153,14 @@ Blockly.JavaScript.when_textinput_send=function(block) {
Blockly.JavaScript.through_textinput_send=function(block) {
var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
var message = Blockly.JavaScript.valueToCode(this, 'message', Blockly.JavaScript.ORDER_ATOMIC);
- var code="MixIO.getInstance("+name+",MixIO.typeTags.KEYBOARD)\n"+".trigger(MixIO.actionTags.KEYBOARD_SEND,"+message+")"
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.KEYBOARD)\n"+".trigger(MixIO.actionTags.KEYBOARD_SEND,"+message+")\n"
+ return code;
+};
+
+Blockly.JavaScript.through_select_send=function(block) {
+ var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
+ var message = Blockly.JavaScript.valueToCode(this, 'message', Blockly.JavaScript.ORDER_ATOMIC);
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.SELECT)\n"+".trigger(MixIO.actionTags.SELECT_SEND,"+message+")\n"
return code;
};
@@ -2127,6 +2177,12 @@ Blockly.JavaScript.get_keyboard_input=function(block) {
return [code, Blockly.JavaScript.ORDER_ATOMIC];
};
+Blockly.JavaScript.get_select_options=function(block) {
+ var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.SELECT).getOptions()";
+ return [code, Blockly.JavaScript.ORDER_ATOMIC];
+};
+
Blockly.JavaScript.through_joystick_send=function(block) {
var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
var x = Blockly.JavaScript.valueToCode(this, 'x', Blockly.JavaScript.ORDER_ATOMIC);
@@ -2283,6 +2339,13 @@ Blockly.JavaScript.mic_sent=function(block) {
return code;
};
+Blockly.JavaScript.select_sent=function(block) {
+ var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.SELECT)\n"+".bind(MixIO.eventTags.SELECT_SENT, function(event,value){\n"
+ +Blockly.JavaScript.statementToCode(block, "DO0" )+"\n"+"})\n"
+ return code;
+};
+
Blockly.JavaScript.lineChart_send=function(block) {
var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
var message = Blockly.JavaScript.valueToCode(this, 'message', Blockly.JavaScript.ORDER_ATOMIC);
@@ -3235,6 +3298,7 @@ Blockly.SLIDER_NUM="滑杆的数值";
Blockly.WHEN_TEXTINPUT_SEND="文本输入发送消息时";
Blockly.THROUGH="通过";
Blockly.TEXTINPUT_SEND="文本输入发送消息";
+Blockly.SELECT_SEND="下拉选项发送消息并变更选项为";
Blockly.JOYSTICK_DRAGGED="摇杆被拖动时";
Blockly.JOYSTICK_SENDXY="摇杆发送位置消息";
@@ -3276,6 +3340,7 @@ Blockly.BLUETOOTH_SENT = "蓝牙转发器发送消息"
Blockly.CAMERA_SENT = "摄像头发送消息时"
Blockly.MIC_SENT = "语音识别发送消息时"
+Blockly.SELECT_SENT = "下拉选项发送消息时"
Blockly.BARCHART_RECIEVED="柱状图收到消息时";
Blockly.BARCHART_SEND_MESSAGE="柱状图发送消息";
@@ -3351,6 +3416,7 @@ Blockly.GET_LONG = "获取当前经度";
Blockly.GET_LATI = "获取当前纬度";
Blockly.GET_KEYBOARD_INPUT="文本输入的文本";
+Blockly.GET_SELECT_OPTIONS = "下拉选项的选项列表"
Blockly.JSON2TEXT = "字典转文本";
Blockly.TEXT2JSON = "文本转字典";
diff --git a/ejs/projects.ejs b/ejs/projects.ejs
index 3f9753b..205014f 100644
--- a/ejs/projects.ejs
+++ b/ejs/projects.ejs
@@ -980,7 +980,34 @@
-
+
+
+
+
+ name
+
+
+
+
+
+
+ name
+
+
+
+
+ message
+
+
+
+
+
+
+ name
+
+
+
+
diff --git a/js/MixIO.js b/js/MixIO.js
index 16eddbd..094c2fe 100644
--- a/js/MixIO.js
+++ b/js/MixIO.js
@@ -84,13 +84,14 @@ var MixIO = {
TRIGGER: 15,
BLE: 16,
CAMERA: 17,
- MIC: 18
+ MIC: 18,
+ SELECT: 19
},
oldTags: ["input_button", "input_slider", "input_keyboard", "input_controller", "input_rgb", "output_bulb", "output_text",
- "output_chart", "output_bar", "table", "output_dashboard", "output_map", "input_weather", "timer", "trigger", "ble", "camera", "input_mic"
+ "output_chart", "output_bar", "table", "output_dashboard", "output_map", "input_weather", "timer", "trigger", "ble", "camera", "input_mic", "tinydb"
],
- zhcnTags: ["按键/开关", "滑杆", "文本输入", "摇杆手柄", "RGB色盘", "指示灯", "文本显示屏", "折线图表", "柱状图表", "数据表格", "仪表盘", "数据地图", "实时气象仪", "定时触发器", "条件触发器", "蓝牙转发器", "摄像头", "语音识别"],
+ zhcnTags: ["按键/开关", "滑杆", "文本输入", "摇杆手柄", "RGB色盘", "指示灯", "文本显示屏", "折线图表", "柱状图表", "数据表格", "仪表盘", "数据地图", "实时气象仪", "定时触发器", "条件触发器", "蓝牙转发器", "摄像头", "语音识别", "下拉选项"],
/*合法的MixIO事件种类*/
eventTags: {
@@ -136,7 +137,9 @@ var MixIO = {
CAMERA_SENT: "1711",
- MIC_SENT: "1811"
+ MIC_SENT: "1811",
+
+ SELECT_SENT: "1911"
},
@@ -176,9 +179,11 @@ var MixIO = {
WEATHER_SYNC: "1321", //更新气象仪数据
WEATHER_SEND: "1322", //发送气象仪数据
- TRIGGER_TIMER: "1411",
+ TRIGGER_TIMER: "1421",
- BLUETOOTH_SENT: "1611"
+ BLUETOOTH_SENT: "1621",
+
+ SELECT_SEND: "1921"
},
publish: function(topic, message) {
// if message undefined
@@ -248,6 +253,10 @@ var MixIO = {
instance.getText = function() {
return instance.attr('user-content')
}
+ } else if (type === MixIO.typeTags.SELECT) {
+ instance.getOptions = function() {
+ return instance.attr('user-content').split(",")
+ }
} else if (type === MixIO.typeTags.RGB_PICKER) {
//获取RGB色盘当前颜色
instance.getColor = function() {
diff --git a/js/widgets.js b/js/widgets.js
index 535452f..b19be3c 100644
--- a/js/widgets.js
+++ b/js/widgets.js
@@ -1307,6 +1307,7 @@ function add_tinydb(user_title, user_topic, user_content, user_style, title_styl
sendIcon.bind('click', function(event) {
event.stopPropagation()
publish(topic.text(), messDiv.val())
+ itemdiv.trigger(MixIO.eventTags.SELECT_SENT, messDiv.val())
sendIcon.removeClass("btn-primary")
sendIcon.addClass("btn-success")
sendIcon.children().removeClass('fa-paper-plane')
@@ -1322,6 +1323,7 @@ function add_tinydb(user_title, user_topic, user_content, user_style, title_styl
sendIcon.bind('touchend', function(event) {
event.stopPropagation()
publish(topic.text(), messDiv.val())
+ itemdiv.trigger(MixIO.eventTags.SELECT_SENT, messDiv.val())
sendIcon.removeClass("btn-primary")
sendIcon.addClass("btn-success")
sendIcon.children().removeClass('fa-paper-plane')
@@ -1335,7 +1337,8 @@ function add_tinydb(user_title, user_topic, user_content, user_style, title_styl
})
contents.push(keyDiv)
var itemdiv = add_block(3, 1, contents, attrs)
- itemdiv.bind(MixIO.actionTags.KEYBOARD_SEND, function(event, message) {
+ // Aug 2025
+ itemdiv.bind(MixIO.actionTags.SELECT_SEND, function(event, message) {
messDiv.val(message)
publish(topic.text(), messDiv.val())
sendIcon.removeClass("btn-primary")
@@ -1526,6 +1529,7 @@ function add_mic(user_title, user_topic, user_content, user_style, title_style)
sendIcon.bind('mouseup', function(event) {
event.stopPropagation()
})
+ // Aug 2025
if (window.screen.width > 800)
sendIcon.bind('click', function(event) {
event.stopPropagation()
From e93ad6ac87a73447907a3e1e58bc2113b148e287 Mon Sep 17 00:00:00 2001
From: unknown <1371033826@qq.com>
Date: Tue, 2 Sep 2025 16:48:00 +0800
Subject: [PATCH 3/5] add_pixel_blocks
---
blockly/iot/IOT_Blocks.js | 50 +++++++++++++++++++++++++++++++++++++++
ejs/projects.ejs | 27 ++++++++++++++++++++-
js/MixIO.js | 15 ++++++++----
js/projects.js | 1 +
js/widgets.js | 40 +++++++++++++++++++++----------
5 files changed, 116 insertions(+), 17 deletions(-)
diff --git a/blockly/iot/IOT_Blocks.js b/blockly/iot/IOT_Blocks.js
index 7a1e41d..f8fbda7 100644
--- a/blockly/iot/IOT_Blocks.js
+++ b/blockly/iot/IOT_Blocks.js
@@ -217,6 +217,25 @@ Blockly.Blocks['button_switch'] = {
}
};
+Blockly.Blocks['pixel_switch'] = {
+ init: function() {
+ this.setColour(button_HUE);
+ this.appendDummyInput().appendField(Blockly.PIXEL_SWITCH);
+ this.appendValueInput("name").setCheck("String");
+ this.appendDummyInput().appendField(Blockly.PIXEL_SWITCH_STATE);
+ this.appendDummyInput().appendField("x");
+ this.appendValueInput("X").setCheck("Number");
+ this.appendDummyInput().appendField("y");
+ this.appendValueInput("Y").setCheck("Number");
+ this.appendDummyInput().appendField(Blockly.MIXLY_MICROPYTHON_SOCKET_TO);
+ this.appendDummyInput().appendField(new Blockly.FieldDropdown([["亮",'true'],["灭",'false']]), "state");
+ this.setInputsInline(true);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ this.setTooltip("");
+ }
+};
+
Blockly.Blocks['get_button_state'] = {
init: function() {
this.setColour(button_HUE);
@@ -1049,6 +1068,19 @@ Blockly.Blocks['clear_datamap'] = {
}
};
+Blockly.Blocks['clear_pixel'] = {
+ init: function() {
+ this.appendDummyInput().appendField(Blockly.LET);
+ this.appendValueInput("name").setCheck("String");
+ this.appendDummyInput().appendField(Blockly.CLEAR_PIXEL);
+ this.setInputsInline(true);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ this.setColour(datamap_HUE);
+ this.setTooltip('');
+}
+};
+
weathersynced_HUE = "#4e73df";
Blockly.Blocks['ws_updated'] = {
@@ -2110,6 +2142,15 @@ Blockly.JavaScript.button_switch=function(block) {
return code;
};
+Blockly.JavaScript.pixel_switch=function(block) {
+ var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
+ var state = this.getFieldValue('state');
+ var x = Blockly.JavaScript.valueToCode(this, 'X', Blockly.JavaScript.ORDER_ATOMIC);
+ var y = Blockly.JavaScript.valueToCode(this, 'Y', Blockly.JavaScript.ORDER_ATOMIC);
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.PIXEL)\n"+".trigger(MixIO.actionTags.PIXEL_SWITCH,["+x + ","+y + "," + state+"])\n";
+ return code;
+};
+
Blockly.JavaScript.get_button_state=function(block) {
var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
var code="MixIO.getInstance("+name+",MixIO.typeTags.BUTTON).isOn()";
@@ -2475,6 +2516,12 @@ Blockly.JavaScript.clear_datamap=function(block) {
return code;
};
+Blockly.JavaScript.clear_pixel=function(block) {
+ var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.PIXEL)\n"+".clearPixel()\n"
+ return code;
+};
+
Blockly.JavaScript.ws_updated=function(block) {
var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
var code="MixIO.getInstance("+name+",MixIO.typeTags.WEATHER)\n"+".bind(MixIO.eventTags.WEATHER_SYNCED, function(event,district,weather_type,temperature,humidity,wind_dir,wind_class){\n"
@@ -3289,6 +3336,8 @@ Blockly.BUTTON_UP="按键/开关被松开时";
Blockly.BUTTON_RECIEVE_MESSAGE="开关收到消息时";
Blockly.BUTTON_SWITCH="切换";
Blockly.BUTTON_SWITCH_STATE="开关的状态";
+Blockly.PIXEL_SWITCH="切换";
+Blockly.PIXEL_SWITCH_STATE="点阵屏的像素";
Blockly.DRAG_SLIDER="滑杆被拖动时";
Blockly.SLIDER_RECIEVE_MESSAGE="滑杆收到消息时";
@@ -3362,6 +3411,7 @@ Blockly.DATAMAP_LONG="经度";
Blockly.DATAMAP_LAT="纬度";
Blockly.DATAMAP_SEND_MESSAGE="发送消息列表";
Blockly.CLEAR_DATAMAP="数据地图清空";
+Blockly.CLEAR_PIXEL="点阵屏清空画布";
Blockly.WS_UPDATED="气象仪更新数据时";
Blockly.WS_SEND="气象仪发送数据时";
diff --git a/ejs/projects.ejs b/ejs/projects.ejs
index 205014f..23988fd 100644
--- a/ejs/projects.ejs
+++ b/ejs/projects.ejs
@@ -1064,7 +1064,32 @@
-
+
+
+
+
+ name
+
+
+
+
+ X
+
+
+
+
+ Y
+
+
+
+
+
+
+ name
+
+
+
+
diff --git a/js/MixIO.js b/js/MixIO.js
index 094c2fe..8d25054 100644
--- a/js/MixIO.js
+++ b/js/MixIO.js
@@ -85,13 +85,14 @@ var MixIO = {
BLE: 16,
CAMERA: 17,
MIC: 18,
- SELECT: 19
+ SELECT: 19,
+ PIXEL: 20
},
oldTags: ["input_button", "input_slider", "input_keyboard", "input_controller", "input_rgb", "output_bulb", "output_text",
- "output_chart", "output_bar", "table", "output_dashboard", "output_map", "input_weather", "timer", "trigger", "ble", "camera", "input_mic", "tinydb"
+ "output_chart", "output_bar", "table", "output_dashboard", "output_map", "input_weather", "timer", "trigger", "ble", "camera", "input_mic", "tinydb", "pixel"
],
- zhcnTags: ["按键/开关", "滑杆", "文本输入", "摇杆手柄", "RGB色盘", "指示灯", "文本显示屏", "折线图表", "柱状图表", "数据表格", "仪表盘", "数据地图", "实时气象仪", "定时触发器", "条件触发器", "蓝牙转发器", "摄像头", "语音识别", "下拉选项"],
+ zhcnTags: ["按键/开关", "滑杆", "文本输入", "摇杆手柄", "RGB色盘", "指示灯", "文本显示屏", "折线图表", "柱状图表", "数据表格", "仪表盘", "数据地图", "实时气象仪", "定时触发器", "条件触发器", "蓝牙转发器", "摄像头", "语音识别", "下拉选项", "点阵屏"],
/*合法的MixIO事件种类*/
eventTags: {
@@ -183,7 +184,9 @@ var MixIO = {
BLUETOOTH_SENT: "1621",
- SELECT_SEND: "1921"
+ SELECT_SEND: "1921",
+
+ PIXEL_SWITCH: "2021"
},
publish: function(topic, message) {
// if message undefined
@@ -368,6 +371,10 @@ var MixIO = {
instance.getBluetoothStatus = function() {
return instance.attr('user-content')
}
+ } else if (type === MixIO.typeTags.PIXEL){
+ instance.clearPixel = function() {
+ MixIO.publish(instance.attr('user-topic'), "cls")
+ }
}
return instance
},
diff --git a/js/projects.js b/js/projects.js
index 3ed6c19..b68ee27 100644
--- a/js/projects.js
+++ b/js/projects.js
@@ -304,6 +304,7 @@ async function run_project() {
logicFunction()
}
} catch (e) {
+ console.log(e)
MixIO.log(e)
showtext(JSLang[lang].logicError)
isRunning = false;
diff --git a/js/widgets.js b/js/widgets.js
index b19be3c..4ebfa91 100644
--- a/js/widgets.js
+++ b/js/widgets.js
@@ -207,22 +207,37 @@ function add_pixel(user_title, user_topic, user_content, user_style, title_style
var bottomDiv = $('
')
var confirmEdit = $('')
bottomDiv.append(confirmEdit)
+ // Aug 2025
+ itemdiv.bind(MixIO.actionTags.PIXEL_SWITCH, function(event, x, y, status) {
+ var color = "#EEEEEE"
+ if(status)
+ color = "#4E73DF"
+ itemdiv.find('.pixelrow').eq(x).find('.pixel').eq(y).css('background-color', color)
+ })
client.on('message', function(topic1, message1) {
if (isAlive && isRunning)
if (topic1.split("/")[(isMixly ? 3 : 2)] == topic.text()) {
+ // Aug 2025
var content = message1.toString()
- var pixels = content.split(',')
- for (var i = 0; i < pixels.length; i++) {
- var pixel = pixels[i].split('-')
- var x = parseInt(pixel[0])
- var y = parseInt(pixel[1])
- var color = pixel[2]
- if(color == '0')
- color = '#EEEEEE'
- else if(color == '1')
- color = '#4E73DF'
- var pixel = itemdiv.find('.pixelrow').eq(x).find('.pixel').eq(y)
- pixel.css('background-color', color)
+ if(content == "cls")
+ {
+ itemdiv.find('.pixelrow').find('.pixel').css('background-color', "#EEEEEE")
+ }
+ else
+ {
+ var pixels = content.split(',')
+ for (var i = 0; i < pixels.length; i++) {
+ var pixel = pixels[i].split('-')
+ var x = parseInt(pixel[0])
+ var y = parseInt(pixel[1])
+ var color = pixel[2]
+ if(color == '0')
+ color = '#EEEEEE'
+ else if(color == '1')
+ color = '#4E73DF'
+ var pixel = itemdiv.find('.pixelrow').eq(x).find('.pixel').eq(y)
+ pixel.css('background-color', color)
+ }
}
}
})
@@ -1303,6 +1318,7 @@ function add_tinydb(user_title, user_topic, user_content, user_style, title_styl
sendIcon.bind('mouseup', function(event) {
event.stopPropagation()
})
+ // Aug 2025
if (window.screen.width > 800)
sendIcon.bind('click', function(event) {
event.stopPropagation()
From 1d208f6d0caeb14761459838502d865f0e9d7db6 Mon Sep 17 00:00:00 2001
From: unknown <1371033826@qq.com>
Date: Tue, 2 Sep 2025 17:14:01 +0800
Subject: [PATCH 4/5] add_face_blocks
---
blockly/iot/IOT_Blocks.js | 27 +++++++++++++++++++++++++++
ejs/projects.ejs | 10 +++++++++-
js/MixIO.js | 11 +++++++----
js/widgets.js | 7 +++++++
4 files changed, 50 insertions(+), 5 deletions(-)
diff --git a/blockly/iot/IOT_Blocks.js b/blockly/iot/IOT_Blocks.js
index f8fbda7..a93c54c 100644
--- a/blockly/iot/IOT_Blocks.js
+++ b/blockly/iot/IOT_Blocks.js
@@ -1037,6 +1037,25 @@ Blockly.Blocks['datamap_recieved'] = {
}
};
+Blockly.Blocks['face_recognized'] = {
+ init: function() {
+ this.setColour(datamap_HUE);
+ this.appendDummyInput().appendField(Blockly.MIXLY_MICROBIT_JS_CURRENT);
+ this.appendValueInput("name").setCheck("String");
+ this.appendDummyInput().appendField(Blockly.FACE_RECOGNIZED);
+ this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS+"id, status, faceName, isMouthOpen, faceProbability, happy, sad, angry, surprised, disgusted, fearful");
+ this.setInputsInline(true);
+ this.appendStatementInput('DO0').appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ this.setTooltip("");
+ },
+ getVars:function(){
+ return ["clientid","long","lat","message"];
+ }
+};
+
+
Blockly.Blocks['datamap_send'] = {
init: function() {
this.appendDummyInput().appendField(Blockly.TO);
@@ -2500,6 +2519,13 @@ Blockly.JavaScript.datamap_recieved=function(block) {
return code;
};
+Blockly.JavaScript.face_recognized =function(block) {
+ var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.FACE)\n"+".bind(MixIO.eventTags.FACE_RECOGNIZED, function(event,id,status,faceName,isMouthOpen,faceProbability,happy,sad,angry,surprised,disgusted,fearful){\n"
+ +Blockly.JavaScript.statementToCode(block, "DO0" )+"\n"+"})\n"
+ return code;
+};
+
Blockly.JavaScript.datamap_send=function(block) {
var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
var long = Blockly.JavaScript.valueToCode(this, 'long', Blockly.JavaScript.ORDER_ATOMIC);
@@ -3412,6 +3438,7 @@ Blockly.DATAMAP_LAT="纬度";
Blockly.DATAMAP_SEND_MESSAGE="发送消息列表";
Blockly.CLEAR_DATAMAP="数据地图清空";
Blockly.CLEAR_PIXEL="点阵屏清空画布";
+Blockly.FACE_RECOGNIZED = "人脸识别组件识别到人脸时"
Blockly.WS_UPDATED="气象仪更新数据时";
Blockly.WS_SEND="气象仪发送数据时";
diff --git a/ejs/projects.ejs b/ejs/projects.ejs
index 23988fd..3a5679c 100644
--- a/ejs/projects.ejs
+++ b/ejs/projects.ejs
@@ -1090,7 +1090,15 @@
-
+
+
+
+
+ name
+
+
+
+
diff --git a/js/MixIO.js b/js/MixIO.js
index 8d25054..2742113 100644
--- a/js/MixIO.js
+++ b/js/MixIO.js
@@ -86,13 +86,14 @@ var MixIO = {
CAMERA: 17,
MIC: 18,
SELECT: 19,
- PIXEL: 20
+ PIXEL: 20,
+ FACE: 21
},
oldTags: ["input_button", "input_slider", "input_keyboard", "input_controller", "input_rgb", "output_bulb", "output_text",
- "output_chart", "output_bar", "table", "output_dashboard", "output_map", "input_weather", "timer", "trigger", "ble", "camera", "input_mic", "tinydb", "pixel"
+ "output_chart", "output_bar", "table", "output_dashboard", "output_map", "input_weather", "timer", "trigger", "ble", "camera", "input_mic", "tinydb", "pixel", "face"
],
- zhcnTags: ["按键/开关", "滑杆", "文本输入", "摇杆手柄", "RGB色盘", "指示灯", "文本显示屏", "折线图表", "柱状图表", "数据表格", "仪表盘", "数据地图", "实时气象仪", "定时触发器", "条件触发器", "蓝牙转发器", "摄像头", "语音识别", "下拉选项", "点阵屏"],
+ zhcnTags: ["按键/开关", "滑杆", "文本输入", "摇杆手柄", "RGB色盘", "指示灯", "文本显示屏", "折线图表", "柱状图表", "数据表格", "仪表盘", "数据地图", "实时气象仪", "定时触发器", "条件触发器", "蓝牙转发器", "摄像头", "语音识别", "下拉选项", "点阵屏", "人脸识别"],
/*合法的MixIO事件种类*/
eventTags: {
@@ -140,7 +141,9 @@ var MixIO = {
MIC_SENT: "1811",
- SELECT_SENT: "1911"
+ SELECT_SENT: "1911",
+
+ FACE_RECOGNIZED: "2111"
},
diff --git a/js/widgets.js b/js/widgets.js
index 4ebfa91..094747a 100644
--- a/js/widgets.js
+++ b/js/widgets.js
@@ -6631,10 +6631,17 @@ function add_face(user_title, user_topic, user_content, user_style, title_style)
}
if(!lastPublishTime || new Date().getTime() - lastFacePublishTime >= interval)
{
+ // Aug 2025
if(min_index == -1)
+ {
publish(user_topic, JSON.stringify({id: min_index, status: (min_index==-1?0:1), name: "Unknown", isMouthOpen: isMouthOpen, faceProbability: resizedDetections[0].detection.score.toFixed(3), happy: resizedDetections[0].expressions.happy.toFixed(3), sad: resizedDetections[0].expressions.sad.toFixed(3), angry: resizedDetections[0].expressions.angry.toFixed(3), surprised: resizedDetections[0].expressions.surprised.toFixed(3), disgusted: resizedDetections[0].expressions.disgusted.toFixed(3), fearful: resizedDetections[0].expressions.fearful.toFixed(3)}))
+ itemdiv.trigger(MixIO.eventTags.FACE_RECOGNIZED, [min_index, (min_index==-1?0:1), "Unknown", isMouthOpen, resizedDetections[0].detection.score.toFixed(3), resizedDetections[0].expressions.happy.toFixed(3), resizedDetections[0].expressions.sad.toFixed(3), resizedDetections[0].expressions.angry.toFixed(3), resizedDetections[0].expressions.surprised.toFixed(3), resizedDetections[0].expressions.disgusted.toFixed(3), resizedDetections[0].expressions.fearful.toFixed(3)])
+ }
else
+ {
publish(user_topic, JSON.stringify({id: min_index, status: (min_index==-1?0:1), name: user_data[min_index]["name"], isMouthOpen: isMouthOpen, faceProbability: resizedDetections[0].detection.score.toFixed(3), happy: resizedDetections[0].expressions.happy.toFixed(3), sad: resizedDetections[0].expressions.sad.toFixed(3), angry: resizedDetections[0].expressions.angry.toFixed(3), surprised: resizedDetections[0].expressions.surprised.toFixed(3), disgusted: resizedDetections[0].expressions.disgusted.toFixed(3), fearful: resizedDetections[0].expressions.fearful.toFixed(3)}))
+ itemdiv.trigger(MixIO.eventTags.FACE_RECOGNIZED, [min_index, (min_index==-1?0:1), user_data[min_index]["name"], isMouthOpen, resizedDetections[0].detection.score.toFixed(3), resizedDetections[0].expressions.happy.toFixed(3), resizedDetections[0].expressions.sad.toFixed(3), resizedDetections[0].expressions.angry.toFixed(3), resizedDetections[0].expressions.surprised.toFixed(3), resizedDetections[0].expressions.disgusted.toFixed(3), resizedDetections[0].expressions.fearful.toFixed(3)])
+ }
lastFacePublishTime = new Date().getTime()
}
}
From d73fa2db434228a5a81a560557af296212164a88 Mon Sep 17 00:00:00 2001
From: unknown <1371033826@qq.com>
Date: Tue, 2 Sep 2025 18:25:53 +0800
Subject: [PATCH 5/5] add_beep_and_qr_blocks
---
blockly/iot/IOT_Blocks.js | 68 +++++++++++++++++++++++++++++++++++++--
ejs/projects.ejs | 26 +++++++++++++--
js/MixIO.js | 18 ++++++++---
js/widgets.js | 11 ++++++-
4 files changed, 113 insertions(+), 10 deletions(-)
diff --git a/blockly/iot/IOT_Blocks.js b/blockly/iot/IOT_Blocks.js
index a93c54c..a658eb6 100644
--- a/blockly/iot/IOT_Blocks.js
+++ b/blockly/iot/IOT_Blocks.js
@@ -1049,9 +1049,48 @@ Blockly.Blocks['face_recognized'] = {
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("");
- },
- getVars:function(){
- return ["clientid","long","lat","message"];
+ }
+};
+
+Blockly.Blocks['beep_received'] = {
+ init: function() {
+ this.setColour(datamap_HUE);
+ this.appendDummyInput().appendField(Blockly.MIXLY_MICROBIT_JS_CURRENT);
+ this.appendValueInput("name").setCheck("String");
+ this.appendDummyInput().appendField(Blockly.BEEP_RECEIVED);
+ this.setInputsInline(true);
+ this.appendStatementInput('DO0').appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ this.setTooltip("");
+ }
+};
+
+Blockly.Blocks['qr_recognized'] = {
+ init: function() {
+ this.setColour(datamap_HUE);
+ this.appendDummyInput().appendField(Blockly.MIXLY_MICROBIT_JS_CURRENT);
+ this.appendValueInput("name").setCheck("String");
+ this.appendDummyInput().appendField(Blockly.QR_RECOGNIZED);
+ this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS+"value");
+ this.setInputsInline(true);
+ this.appendStatementInput('DO0').appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ this.setTooltip("");
+ }
+};
+
+Blockly.Blocks['beep_send'] = {
+ init: function() {
+ this.appendDummyInput().appendField(Blockly.LET);
+ this.appendValueInput("name").setCheck("String");
+ this.appendDummyInput().appendField(Blockly.BEEP_SEND);
+ this.setInputsInline(true);
+ this.setPreviousStatement(true);
+ this.setNextStatement(true);
+ this.setColour(datamap_HUE);
+ this.setTooltip('');
}
};
@@ -2526,6 +2565,26 @@ Blockly.JavaScript.face_recognized =function(block) {
return code;
};
+Blockly.JavaScript.beep_received =function(block) {
+ var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.BEEP)\n"+".bind(MixIO.eventTags.BEEP_RECEIVED, function(event){\n"
+ +Blockly.JavaScript.statementToCode(block, "DO0" )+"\n"+"})\n"
+ return code;
+};
+
+Blockly.JavaScript.qr_recognized =function(block) {
+ var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.QR)\n"+".bind(MixIO.eventTags.QR_RECOGNIZED, function(event, value){\n"
+ +Blockly.JavaScript.statementToCode(block, "DO0" )+"\n"+"})\n"
+ return code;
+};
+
+Blockly.JavaScript.beep_send=function(block) {
+ var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
+ var code="MixIO.getInstance("+name+",MixIO.typeTags.BEEP)\n"+".beep()\n"
+ return code;
+};
+
Blockly.JavaScript.datamap_send=function(block) {
var name = Blockly.JavaScript.valueToCode(this, 'name', Blockly.JavaScript.ORDER_ATOMIC);
var long = Blockly.JavaScript.valueToCode(this, 'long', Blockly.JavaScript.ORDER_ATOMIC);
@@ -3439,6 +3498,9 @@ Blockly.DATAMAP_SEND_MESSAGE="发送消息列表";
Blockly.CLEAR_DATAMAP="数据地图清空";
Blockly.CLEAR_PIXEL="点阵屏清空画布";
Blockly.FACE_RECOGNIZED = "人脸识别组件识别到人脸时"
+Blockly.BEEP_RECEIVED = "蜂鸣器发出声音时"
+Blockly.BEEP_SEND = "蜂鸣器发出声音"
+Blockly.QR_RECOGNIZED = "二维码识别组件识别到二维码时"
Blockly.WS_UPDATED="气象仪更新数据时";
Blockly.WS_SEND="气象仪发送数据时";
diff --git a/ejs/projects.ejs b/ejs/projects.ejs
index 3a5679c..ed9bd68 100644
--- a/ejs/projects.ejs
+++ b/ejs/projects.ejs
@@ -1099,7 +1099,29 @@
-
-
+
+
+
+
+ name
+
+
+
+
+
+
+ name
+
+
+
+
+
+
+
+ name
+
+
+
+