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 + + + + \ No newline at end of file diff --git a/js/MixIO.js b/js/MixIO.js index 2742113..f812f5b 100644 --- a/js/MixIO.js +++ b/js/MixIO.js @@ -87,13 +87,15 @@ var MixIO = { MIC: 18, SELECT: 19, PIXEL: 20, - FACE: 21 + FACE: 21, + BEEP: 22, + QR: 23 }, 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", "face" + "output_chart", "output_bar", "table", "output_dashboard", "output_map", "input_weather", "timer", "trigger", "ble", "camera", "input_mic", "tinydb", "pixel", "face", "ocr", "qr" ], - zhcnTags: ["按键/开关", "滑杆", "文本输入", "摇杆手柄", "RGB色盘", "指示灯", "文本显示屏", "折线图表", "柱状图表", "数据表格", "仪表盘", "数据地图", "实时气象仪", "定时触发器", "条件触发器", "蓝牙转发器", "摄像头", "语音识别", "下拉选项", "点阵屏", "人脸识别"], + zhcnTags: ["按键/开关", "滑杆", "文本输入", "摇杆手柄", "RGB色盘", "指示灯", "文本显示屏", "折线图表", "柱状图表", "数据表格", "仪表盘", "数据地图", "实时气象仪", "定时触发器", "条件触发器", "蓝牙转发器", "摄像头", "语音识别", "下拉选项", "点阵屏", "人脸识别", "蜂鸣器", "二维码识别"], /*合法的MixIO事件种类*/ eventTags: { @@ -143,7 +145,11 @@ var MixIO = { SELECT_SENT: "1911", - FACE_RECOGNIZED: "2111" + FACE_RECOGNIZED: "2111", + + BEEP_RECEIVED: "2211", + + QR_RECOGNIZED: "2311" }, @@ -378,6 +384,10 @@ var MixIO = { instance.clearPixel = function() { MixIO.publish(instance.attr('user-topic'), "cls") } + } else if (type === MixIO.typeTags.BEEP){ + instance.beep = function() { + MixIO.publish(instance.attr('user-topic'), 1) + } } return instance }, diff --git a/js/widgets.js b/js/widgets.js index 094747a..c711e7f 100644 --- a/js/widgets.js +++ b/js/widgets.js @@ -7003,6 +7003,8 @@ function add_ocr(user_title, user_topic, user_content, user_style, title_style) bell_icon.css("color", "#e74a3b") itemdiv.css("box-shadow", "#e74a3b 1px 1px 10px") } + // Aug 2025 + itemdiv.trigger(MixIO.eventTags.BEEP_RECEIVED); setTimeout(function(){ bell_icon.css("color", "#858796") itemdiv.css("box-shadow", "") @@ -7158,7 +7160,11 @@ function add_qr(user_title, user_topic, user_content, user_style, title_style) { { bottomDiv11.text(code.data) if(isRunning && isAlive) + { publish(user_topic, code.data) + // Aug 2025 + itemdiv.trigger(MixIO.eventTags.QR_RECOGNIZED, [code.data]); + } } else { @@ -7171,11 +7177,14 @@ function add_qr(user_title, user_topic, user_content, user_style, title_style) { readers: ["code_128_reader", "ean_reader", "ean_8_reader", "code_39_reader", "code_39_vin_reader", "codabar_reader", "upc_reader", "upc_e_reader", "i2of5_reader", "2of5_reader", "code_93_reader"] // 指定条形码格式 } }, function(result){ - console.log(result) if (result && result.codeResult) { bottomDiv11.text(result.codeResult.code); if(isRunning && isAlive) + { publish(user_topic, result.codeResult.code) + // Aug 2025 + itemdiv.trigger(MixIO.eventTags.QR_RECOGNIZED, [result.codeResult.code]); + } } else bottomDiv11.text("无二维码或条形码")