From 4aa693b7bf3118a85b71c72c23e9c6c5338268a6 Mon Sep 17 00:00:00 2001 From: Irene-Maxine <114802521+Irene-Maxine@users.noreply.github.com> Date: Thu, 20 Nov 2025 22:47:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E4=BA=9B=E6=9D=BF=E8=BD=BD=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../micropython/blocks/actuator_extern.js | 14 ++++ .../micropython/blocks/ai_local.js | 5 ++ .../micropython/blocks/display_onboard.js | 52 ++++++++++++++ .../micropython/generators/actuator_extern.js | 8 +++ .../generators/actuator_onboard.js | 2 +- .../micropython/generators/ai_cloud.js | 8 ++- .../micropython/generators/ai_local.js | 4 +- .../micropython/generators/display_onboard.js | 33 +++++++++ .../micropython_esp32/template.xml | 15 ++++ .../micropython_esp32c2/template.xml | 12 +++- .../micropython_esp32c3/template.xml | 25 +++++++ .../micropython_esp32s2/template.xml | 15 ++++ .../micropython_esp32s3/template.xml | 72 ++++++++++++++++++- common/msg/blockly/en.js | 4 ++ common/msg/blockly/zh-hans.js | 4 ++ common/msg/blockly/zh-hant.js | 4 ++ 16 files changed, 270 insertions(+), 7 deletions(-) diff --git a/boards/default_src/micropython/blocks/actuator_extern.js b/boards/default_src/micropython/blocks/actuator_extern.js index b9d19839..d9a56bcb 100644 --- a/boards/default_src/micropython/blocks/actuator_extern.js +++ b/boards/default_src/micropython/blocks/actuator_extern.js @@ -72,6 +72,20 @@ export const esp32_music_play_list = { } } +export const backstage_esp32_music_play_list = { + init: function () { + this.setColour(ACTUATOR_EXTERN_HUE); + this.appendValueInput('SUB') + this.appendValueInput('LIST') + .appendField(Blockly.Msg.MIXLY_BACKSTAGE + Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_BACKSTAGE + Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS); + + } +} + export const esp32_music_set_tempo_extern = { init: function () { this.setColour(ACTUATOR_EXTERN_HUE); diff --git a/boards/default_src/micropython/blocks/ai_local.js b/boards/default_src/micropython/blocks/ai_local.js index 15f3631d..6d4f7c82 100644 --- a/boards/default_src/micropython/blocks/ai_local.js +++ b/boards/default_src/micropython/blocks/ai_local.js @@ -349,8 +349,13 @@ export const OPEN_IMAGE = { ['180','180'], ['270','270'] ]),'angle'); + this.appendValueInput("w") + .appendField(Blockly.Msg.MIXLY_Enlarge_and_scale_to) + this.appendValueInput("h") + .appendField(Blockly.Msg.MIXLY_High_zoom_level_to) this.setOutput(true); this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_OPEN_IMAGE_TOOLTIP); } }; diff --git a/boards/default_src/micropython/blocks/display_onboard.js b/boards/default_src/micropython/blocks/display_onboard.js index 5ebb95e5..889927a3 100644 --- a/boards/default_src/micropython/blocks/display_onboard.js +++ b/boards/default_src/micropython/blocks/display_onboard.js @@ -1607,6 +1607,58 @@ export const onboard_tft_show_texts = { } }; +export const onboard_tft_show_qrcode = { + init: function () { + this.setColour(DISPLAY_ONBOARD_HUE); + this.appendValueInput('direct') + .appendField(Blockly.Msg.OLED_BITMAP) + .appendField(Blockly.Msg.MIXLY_QR_CODE); + if (JSFuncs.getPlatform() === 'Python ESP32-S3') { + this.appendValueInput('boolean') + .appendField( Blockly.Msg.MIXLY_synchronize); + } + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + } +}; + + +export const onboard_tft_show_qrcode_details = { + init: function () { + this.setColour(DISPLAY_ONBOARD_HUE); + this.appendValueInput('data') + .appendField(Blockly.Msg.OLED_BITMAP) + .appendField(Blockly.Msg.MIXLY_QR_CODE); + this.appendValueInput("x") + .setCheck(Number) + .appendField('x'); + this.appendValueInput("y") + .setCheck(Number) + .appendField('y'); + this.appendValueInput("size") + .setCheck(Number) + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_NUMBER); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_ERROR_RATE) + .appendField(new Blockly.FieldDropdown([ + ["0","7%"], + ["1","15%"], + ["2","25%"], + ["3","30"] + ]),"correct"); + this.appendValueInput('VAR') + .appendField(Blockly.Msg.HTML_COLOUR); + if (JSFuncs.getPlatform() === 'Python ESP32-S3') { + this.appendValueInput('boolean') + .appendField( Blockly.Msg.MIXLY_synchronize); + } + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + } +}; + /** * @deprecated To be removed in the future */ diff --git a/boards/default_src/micropython/generators/actuator_extern.js b/boards/default_src/micropython/generators/actuator_extern.js index 13c9b01d..3cea0efd 100644 --- a/boards/default_src/micropython/generators/actuator_extern.js +++ b/boards/default_src/micropython/generators/actuator_extern.js @@ -139,6 +139,14 @@ export const esp32_music_play_list = function (_, generator) { return code; } +export const backstage_esp32_music_play_list = function (_, generator) { + generator.definitions_['import_music'] = 'import music'; + var lst = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT); + var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var code = v + ".play_thread(" + v + '.' + lst + ")\n"; + return code; +} + export const esp32_music_reset_extern = function (_, generator) { generator.definitions_['import_music'] = 'import music'; var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); diff --git a/boards/default_src/micropython/generators/actuator_onboard.js b/boards/default_src/micropython/generators/actuator_onboard.js index 7cbe99b1..25fbc133 100644 --- a/boards/default_src/micropython/generators/actuator_onboard.js +++ b/boards/default_src/micropython/generators/actuator_onboard.js @@ -815,7 +815,7 @@ export const record_audio = function (_,generator){ generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot'; var str = generator.valueToCode(this, 'str', generator.ORDER_ATOMIC); var t = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC); - var code = 'onboard_bot.mic_pga('+str+','+ t +')\n'; + var code = 'onboard_bot.pcm_record('+str+','+ t +')\n'; return code; } diff --git a/boards/default_src/micropython/generators/ai_cloud.js b/boards/default_src/micropython/generators/ai_cloud.js index 8fc87790..4a7b4382 100644 --- a/boards/default_src/micropython/generators/ai_cloud.js +++ b/boards/default_src/micropython/generators/ai_cloud.js @@ -56,20 +56,22 @@ export const llm_set_callback = function (_, generator) { var v1 = generator.valueToCode(this, "VAR1", generator.ORDER_NONE) || "None"; var v2 = generator.valueToCode(this, "VAR2", generator.ORDER_NONE) || "None"; var v3 = generator.valueToCode(this, "VAR3", generator.ORDER_NONE) || "None"; - var a0 = generator.valueToCode(this, "ADD0", generator.ORDER_NONE) || "None"; + // var a0 = generator.valueToCode(this, "ADD0", generator.ORDER_NONE) || "None"; var callback = generator.variableDB_.getName( generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None", Blockly.Procedures.NAME_TYPE ); var code = new Array(this.itemCount_); - var default_value = '0'; + var default_value = "()"; for (var n = 0; n < this.itemCount_; n++) { code[n] = generator.valueToCode(this, 'ADD' + n, generator.ORDER_NONE) || default_value; } if (this.itemCount_ > 1){ var code = v1 +'.function_call(' + callback + ', ' + v2 + ', ' + v3 + ', (' + code.join(', ') +'))\n'; - }else{ + }else if(this.itemCount_ == 1){ var code = v1 +'.function_call(' + callback + ', ' + v2 + ', ' + v3 + ', ' + code.join(', ') +')\n'; + }else{ + var code = v1 +'.function_call(' + callback + ', ' + v2 + ', ' + v3 +')\n'; } return code; diff --git a/boards/default_src/micropython/generators/ai_local.js b/boards/default_src/micropython/generators/ai_local.js index 2a3291a9..01683994 100644 --- a/boards/default_src/micropython/generators/ai_local.js +++ b/boards/default_src/micropython/generators/ai_local.js @@ -158,7 +158,9 @@ export const OPEN_IMAGE = function (_, generator) { generator.definitions_['camera_import_Image'] = 'from camera import Image'; var direct = generator.valueToCode(this, 'direct', generator.ORDER_ATOMIC); var a = this.getFieldValue('angle'); - var code = 'Image.open(path=' + direct +',rotation=' + a + ')'; + var w = generator.valueToCode(this, 'w', generator.ORDER_ATOMIC); + var h = generator.valueToCode(this, 'h', generator.ORDER_ATOMIC); + var code = 'Image.open(path=' + direct +',rotation=' + a + ',scale_width='+w+',scale_height='+h+')'; return [code, generator.ORDER_ATOMIC]; } diff --git a/boards/default_src/micropython/generators/display_onboard.js b/boards/default_src/micropython/generators/display_onboard.js index 34c220a9..cc7a5f53 100644 --- a/boards/default_src/micropython/generators/display_onboard.js +++ b/boards/default_src/micropython/generators/display_onboard.js @@ -1183,6 +1183,39 @@ export const onboard_tft_show_texts = function (_, generator) { return code; } +export const onboard_tft_show_qrcode = function (_, generator) { + var version = Boards.getSelectedBoardKey().split(':')[2]; + generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; + var direct = generator.valueToCode(this, 'direct', generator.ORDER_ATOMIC); + var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC) || 'True'; + var code = 'onboard_tft.qrcode(' + direct + ',sync='+ bool + ')\n'; + return code; +} + +export const onboard_tft_show_qrcode_details = function (_, generator) { + var version = Boards.getSelectedBoardKey().split(':')[2]; + generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; + var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT); + var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT); + var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT); + var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT); + var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC); + var s = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC) || 'True'; + var correct = this.getFieldValue('correct'); + if (color.slice(0, 2) == "0x") { + var code = "onboard_tft.qrcode(" + data + ',x=' + x + ',y=' + y + ',size=' + size + ',correct=' + correct+ ',color='+ color +",sync=" + s +")\n"; + } else { + const rgbValues = color.match(/\d+/g); + const r = parseInt(rgbValues[0]); + const g = parseInt(rgbValues[1]); + const b = parseInt(rgbValues[2]); + var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0"); + var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3; + var code = "onboard_tft.qrcode(" + data + ',x=' + x + ',y=' + y + ',size=' + size + ',correct=' + correct + ',color=0x' + rgb565.toString(16) + ",sync=" + s + ")\n"; + } + return code; +} + /** * @deprecated To be removed in the future */ diff --git a/boards/default_src/micropython_esp32/template.xml b/boards/default_src/micropython_esp32/template.xml index d3bf8f29..bfb8a98c 100644 --- a/boards/default_src/micropython_esp32/template.xml +++ b/boards/default_src/micropython_esp32/template.xml @@ -1612,6 +1612,11 @@ + + + + +