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()