diff --git a/boards/default_src/arduino_esp32/origin/examples/map.json b/boards/default_src/arduino_esp32/origin/examples/map.json index 8e86269b..44d90d76 100644 --- a/boards/default_src/arduino_esp32/origin/examples/map.json +++ b/boards/default_src/arduino_esp32/origin/examples/map.json @@ -1,6 +1,10 @@ { "ESP32 Dev Module": { "Handbit": { + "RGB LED.mix": { + "__file__": true, + "__name__": "RGB LED.mix" + }, "buzzer play two tigers.mix": { "__file__": true, "__name__": "buzzer play two tigers.mix" @@ -13,13 +17,13 @@ "__file__": true, "__name__": "display Text.mix" }, - "RGB LED.mix": { - "__file__": true, - "__name__": "RGB LED.mix" - }, "__file__": false, "__name__": "Handbit" }, + "MPU6050打印数值.mix": { + "__file__": true, + "__name__": "MPU6050打印数值.mix" + }, "MixGo": { "MPU9250.mix": { "__file__": true, @@ -28,10 +32,6 @@ "__file__": false, "__name__": "MixGo" }, - "MPU6050打印数值.mix": { - "__file__": true, - "__name__": "MPU6050打印数值.mix" - }, "PWM模拟输出.mix": { "__file__": true, "__name__": "PWM模拟输出.mix" diff --git a/boards/default_src/micropython/blocks/ai_local.js b/boards/default_src/micropython/blocks/ai_local.js index 74368934..6848ca7d 100644 --- a/boards/default_src/micropython/blocks/ai_local.js +++ b/boards/default_src/micropython/blocks/ai_local.js @@ -4,6 +4,18 @@ const AI_LOCAL_GRAPH_HUE = '#90A244'; const IOT_HUE = '#526FC3'; const DISPLAY_ONBOARD_HUE = '#569A98'; +export const yesorno = { + init: function () { + this.setColour(AI_LOCAL_GRAPH_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, "False"], + [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, "1"] + ]), "state"); + this.setOutput(true); + } +}; + //voice part export const VOICE_RECOGNITION_CONTROL = { init: function () { @@ -269,7 +281,7 @@ export const CREATE_CAMERA = { this.setColour(AI_LOCAL_GRAPH_HUE); this.appendDummyInput("") .appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_SMARTCAMERA) - .appendField(Blockly.Msg.LISTS_SET_INDEX_SET + Blockly.Msg.MIXLY_SHOOTING_SIZE) + .appendField(Blockly.Msg.MIXLY_SHOOTING_SIZE) .appendField(new Blockly.FieldDropdown([ ['240px*240px', "R240X240"], ['320px*320px', "R320X320"], @@ -280,18 +292,10 @@ export const CREATE_CAMERA = { ['QVGA : 320px*240px', "QVGA"], ['QQVGA : 160px*120px', "QQVGA"] ]), "cmd"); - this.appendDummyInput("") + this.appendValueInput("HM") .appendField(Blockly.Msg.MIXLY_HORIZONTAL_MIRRORING) - .appendField(new Blockly.FieldDropdown([ - [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, "False"], - [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, "True"] - ]),"hm"); - this.appendDummyInput("") - .appendField(Blockly.Msg.MIXLY_VERTICAL_MIRRORING) - .appendField(new Blockly.FieldDropdown([ - [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, "False"], - [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, "True"] - ]),"vf"); + this.appendValueInput("VF") + .appendField(Blockly.Msg.MIXLY_VERTICAL_MIRRORING); this.setPreviousStatement(true); this.setNextStatement(true); this.setInputsInline(true); @@ -320,15 +324,83 @@ export const SHOOT_AND_SAVE_PICTURE = { } }; +export const GET_IMAGE_AND_SAVE = { + init: function () { + this.setColour(AI_LOCAL_GRAPH_HUE); + this.appendValueInput("SUB") + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE) + this.appendValueInput('direct') + .appendField(Blockly.Msg.MICROPYTHON_HUSKYLENS_SAVE_AS + Blockly.Msg.blockpy_turtle_set_num + Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH); + this.appendValueInput('quality') + .appendField(Blockly.Msg.MIXLY_IMAGE_QUALITY); + this.appendDummyInput('') + .appendField(Blockly.Msg.MIXLY_ROTATION_ANGLE) + .appendField(new Blockly.FieldDropdown([ + ['0','0'], + ['90','90'], + ['180','180'], + ['270','270'] + ]),'angle'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setInputsInline(true); + } +}; + +export const OPEN_IMAGE = { + init: function () { + this.setColour(AI_LOCAL_GRAPH_HUE); + this.appendValueInput('direct') + .appendField(Blockly.Msg.MIXLY_MICROBIT_Turn_on_display + Blockly.Msg.MIXLY_MICROBIT_IMAGE + Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH + Blockly.Msg.blockpy_turtle_set_num); + this.appendDummyInput('') + .appendField(Blockly.Msg.MIXLY_ROTATION_ANGLE) + .appendField(new Blockly.FieldDropdown([ + ['0','0'], + ['90','90'], + ['180','180'], + ['270','270'] + ]),'angle'); + this.setOutput(true); + this.setInputsInline(true); + } +}; + +export const CAMERA_LOOGOUT = { + init: function () { + this.setColour(AI_LOCAL_GRAPH_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_LOGOUT + Blockly.Msg.MIXLY_SMARTCAMERA) + this.setPreviousStatement(true,null); + this.setNextStatement(true,null) + this.setInputsInline(true); + } +}; + export const GET_PICTURE_DATA_EXACT = { init: function () { this.setColour(AI_LOCAL_GRAPH_HUE); this.appendDummyInput() .appendField(Blockly.Msg.MIXLY_GET_PICTURE_DATA) + // .appendField(new Blockly.FieldDropdown([ + // ["RGB565" + Blockly.Msg.MIXLY_SD_DATA,"0"], + // ["JPG" + Blockly.Msg.MIXLY_SD_DATA,"1"], + // [Blockly.Msg.MIXLY_JPG_base64_CODE + Blockly.Msg.MIXLY_SD_DATA ,"2"] + // ]),"kind") + this.setOutput(true); + this.setInputsInline(true); + } +}; + +export const CONVERT_IMAGE_TO_JPG = { + init: function () { + this.setColour(AI_LOCAL_GRAPH_HUE); + this.appendValueInput("SUB") + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE) + this.appendDummyInput() + .appendField(Blockly.Msg.A_TO_B) .appendField(new Blockly.FieldDropdown([ - ["RGB565" + Blockly.Msg.MIXLY_SD_DATA,"0"], - ["JPG" + Blockly.Msg.MIXLY_SD_DATA,"1"], - [Blockly.Msg.MIXLY_JPG_base64_CODE + Blockly.Msg.MIXLY_SD_DATA ,"2"] + ["JPG" + Blockly.Msg.MIXLY_SD_DATA,"0"], + [Blockly.Msg.MIXLY_JPG_base64_CODE + Blockly.Msg.MIXLY_SD_DATA ,"1"] ]),"kind") this.setOutput(true); this.setInputsInline(true); @@ -338,12 +410,14 @@ export const GET_PICTURE_DATA_EXACT = { export const GET_PICTURE_DATA_WHS = { init: function () { this.setColour(AI_LOCAL_GRAPH_HUE); + this.appendValueInput("SUB") + .appendField(Blockly.Msg.MIXLY_GET); this.appendDummyInput() - .appendField(Blockly.Msg.MIXLY_GET_PICTURE_DATA) + .appendField(Blockly.Msg.MIXLY_DE) .appendField(new Blockly.FieldDropdown([ - [Blockly.Msg.MIXLY_WIDTH,"get_pixel_width"], - [Blockly.Msg.MIXLY_HEIGHT,"get_pixel_height"], - [Blockly.Msg.MIXLY_SMARTCAMERA + Blockly.Msg.MIXLY_MODEL_NUMBER ,"get_sensor_name"] + [Blockly.Msg.MIXLY_WIDTH,"width"], + [Blockly.Msg.MIXLY_HEIGHT,"height"], + [Blockly.Msg.MIXLY_MICROBIT_JS_I2C_FORMAT,"format"] ]),"kind") this.setOutput(true); this.setInputsInline(true); @@ -352,14 +426,9 @@ export const GET_PICTURE_DATA_WHS = { export const SCREEN_SHOW_CAM_GRAPH_SHOOT = { init: function () { - this.setColour(AI_LOCAL_GRAPH_HUE); - this.appendDummyInput('') - .appendField(Blockly.Msg.MIXlY_SCREEN_SHOW_CAM_SHOOT) - // this.appendValueInput('direct') - // .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_MONITOR_SHOW_IMAGE) - // .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH); - // this.appendDummyInput('') - // .appendField('(' + Blockly.Msg.MIXLY_ONLY + Blockly.Msg.MIXLY_SUPPORT + 'jpg/jpeg)') + this.setColour(DISPLAY_ONBOARD_HUE); + this.appendValueInput("SUB") + .appendField(Blockly.Msg.MIXLY_MICROBIT_monitor + Blockly.Msg.OLEDDISPLAY + Blockly.Msg.MIXLY_MICROBIT_IMAGE) this.appendDummyInput('') .appendField(Blockly.Msg.MIXLY_SYNC_DISPLAY) .appendField(new Blockly.FieldDropdown([ @@ -398,6 +467,16 @@ export const SCREEN_DISPLAY_IMAGE = { } }; +export const GET_SCREEN_IMAGE = { + init: function () { + this.setColour(DISPLAY_ONBOARD_HUE); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_GET + Blockly.Msg.MIXLY_MICROBIT_monitor + Blockly.Msg.MIXLY_MICROBIT_IMAGE) + this.setOutput(true); + this.setInputsInline(true); + } +}; + export const AI_CAMERA_INIT = { init: function () { this.setColour(AI_LOCAL_GRAPH_HUE); @@ -413,6 +492,29 @@ export const AI_CAMERA_INIT = { [Blockly.Msg.MIXLY_HUMAN + Blockly.Msg.MIXLY_RECOGNITION, "HumanDetector"], [Blockly.Msg.MIXLY_AipFace, "FaceDetector"] ]), "kind"); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_WIDTH) + .appendField(new Blockly.FieldDropdown([ + ["240px","240"], + ["320px","320"], + ["128px","128"], + ["96px","96"], + ["640px","640"], + ["480px","480"], + ["160px","160"] + ]),"width"); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_HEIGHT) + .appendField(new Blockly.FieldDropdown([ + ["240px","240"], + ["320px","320"], + ["128px","128"], + ["96px","96"], + ["480px","480"], + ["320px","320"], + ["240px","240"], + ["120px","120"] + ]),"height"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); @@ -425,6 +527,29 @@ export const AI_CAMERA_INIT_FACERECOGNIZE = { this.appendValueInput('SUB') .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE) .setCheck("var"); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_WIDTH) + .appendField(new Blockly.FieldDropdown([ + ["240px","240"], + ["320px","320"], + ["128px","128"], + ["96px","96"], + ["640px","640"], + ["480px","480"], + ["160px","160"] + ]),"width"); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_HEIGHT) + .appendField(new Blockly.FieldDropdown([ + ["240px","240"], + ["320px","320"], + ["128px","128"], + ["96px","96"], + ["480px","480"], + ["320px","320"], + ["240px","240"], + ["120px","120"] + ]),"height"); this.appendDummyInput("") .appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.LISTS_SET_INDEX_INPUT_TO) .appendField(Blockly.Msg.MIXLY_FACE_RECOGNIZER); @@ -623,7 +748,7 @@ export const Register_color_recognition_fixed = { .appendField(Blockly.Msg.MIXLY_TENSORFLOW_MODEL) .setCheck("var"); this.appendDummyInput("") - .appendField(Blockly.Msg.MIXLY_RECOGNITION_RECGNITION + Blockly.Msg.HTML_COLOUR) + .appendField(Blockly.Msg.MIXLY_REGISTER + Blockly.Msg.MIXLY_RECOGNITION_RECGNITION + Blockly.Msg.HTML_COLOUR) .appendField(new Blockly.FieldDropdown([ [Blockly.Msg.COLOUR_RGB_RED,"red"], [Blockly.Msg.COLOUR_RGB_GREEN,"green"], @@ -649,7 +774,7 @@ export const Register_color_recognition = { .appendField(Blockly.Msg.MIXLY_TENSORFLOW_MODEL) .setCheck("var"); this.appendDummyInput("") - .appendField(Blockly.Msg.REGUSTER_COLOR_RECOGNITION) + .appendField(Blockly.Msg.REGISTER_COLOR_RECOGNITION) this.appendValueInput("MIN") .appendField('H、S、V' + Blockly.Msg.blockpy_TUPLE_MIN); this.appendValueInput("MAX") diff --git a/boards/default_src/micropython/generators/ai_local.js b/boards/default_src/micropython/generators/ai_local.js index a210d688..e3c6454b 100644 --- a/boards/default_src/micropython/generators/ai_local.js +++ b/boards/default_src/micropython/generators/ai_local.js @@ -1,5 +1,11 @@ import { Boards } from 'mixly'; + +export const yesorno = function (_, generator) { + var code = this.getFieldValue('state'); + return [code, generator.ORDER_ATOMIC]; +} + //voice part export const VOICE_RECOGNITION_CONTROL = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2]; @@ -124,11 +130,11 @@ export const CI130X_BROADCAST_SYSTEM_TIME = function (_, generator) { //graph part export const CREATE_CAMERA = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2]; - generator.definitions_['import_Camera_FrameSize_PixelFormat'] = 'from camera import Camera,FrameSize,PixelFormat'; + generator.definitions_['import_Camera_FrameSize'] = 'from camera import Camera,FrameSize'; var cmd = this.getFieldValue('cmd'); - var hm = this.getFieldValue('hm'); - var vf = this.getFieldValue('vf'); - var code = 'cam = Camera(FrameSize.' + cmd + ',hmirror='+ hm + ',vflip='+ vf +')\n'; + var hm = generator.valueToCode(this, 'HM', generator.ORDER_ATOMIC); + var vf = generator.valueToCode(this, 'VF', generator.ORDER_ATOMIC); + var code = 'camera = Camera(FrameSize.' + cmd + ',hmirror='+ hm + ',vflip='+ vf +')\n'; return code; } @@ -136,30 +142,67 @@ export const SHOOT_AND_SAVE_PICTURE = function (_, generator) { var direct = generator.valueToCode(this, 'direct', generator.ORDER_ATOMIC); var q = generator.valueToCode(this, 'quality', generator.ORDER_ATOMIC); var a = this.getFieldValue('angle'); - var code = 'cam.snapshot(' + direct + ',quality='+ q + ',rotation=' + a + ')\n'; + var code = 'camera.snapshot(' + direct + ',quality='+ q + ',rotation=' + a + ')\n'; + return code; +} + +export const GET_IMAGE_AND_SAVE = function (_, generator) { + generator.definitions_['camera_import_Image'] = 'from camera import Image'; + var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); + var direct = generator.valueToCode(this, 'direct', generator.ORDER_ATOMIC); + var q = generator.valueToCode(this, 'quality', generator.ORDER_ATOMIC); + var a = this.getFieldValue('angle'); + var code = 'Image.save('+ sub + ',path=' + direct + ',quality='+ q + ',rotation=' + a + ')\n'; + return code; +} + +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 + ')'; + return [code, generator.ORDER_ATOMIC]; +} + +export const CAMERA_LOOGOUT = function (_, generator) { + var code = 'camera.deinit()\n'; return code; } export const GET_PICTURE_DATA_EXACT = function (_, generator) { - generator.definitions_['import_base64'] = 'import base64'; + // var kind = this.getFieldValue('kind'); + var code = 'camera.capture()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const CONVERT_IMAGE_TO_JPG = function (_, generator) { + generator.definitions_['camera_import_Image'] = 'from camera import Image'; + var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); var kind = this.getFieldValue('kind'); - var code = 'cam.snapshot(formats=' + kind +')'; + var code = 'Image.convert(' + sub + ', formats=' + kind + ')'; return [code, generator.ORDER_ATOMIC]; } export const GET_PICTURE_DATA_WHS = function (_, generator) { + generator.definitions_['camera_import_Image'] = 'from camera import Image'; + var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); var kind = this.getFieldValue('kind'); - var code = 'cam.' + kind +'()'; + var code = sub + '.' + kind ; return [code, generator.ORDER_ATOMIC]; } export const SCREEN_SHOW_CAM_GRAPH_SHOOT = function (_, generator) { + var version = Boards.getSelectedBoardKey().split(':')[2]; + generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; + var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); var s = this.getFieldValue('sync'); - var code = 'onboard_tft.display(data, sync='+ s +')\n'; + var code = 'onboard_tft.display(' + sub +', sync='+ s +')\n'; return code; } export const SCREEN_DISPLAY_IMAGE = 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 a = this.getFieldValue('angle'); var s = this.getFieldValue('sync'); @@ -167,11 +210,20 @@ export const SCREEN_DISPLAY_IMAGE = function (_, generator) { return code; } +export const GET_SCREEN_IMAGE = function (_, generator) { + var version = Boards.getSelectedBoardKey().split(':')[2]; + generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; + var code = 'onboard_tft.screenshot()'; + return [code, generator.ORDER_ATOMIC]; +} + export const AI_CAMERA_INIT = function (_, generator) { generator.definitions_['import_esp_dl'] = 'import esp_dl'; var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); var cmd = this.getFieldValue('kind'); - var code = sub +' = esp_dl.'+cmd + '(width=cam.get_pixel_width(), height=cam.get_pixel_height())\n'; + var width = this.getFieldValue('width'); + var height = this.getFieldValue('height'); + var code = sub +' = esp_dl.'+cmd + '(width='+width+', height='+height+')\n'; return code; } @@ -179,7 +231,9 @@ export const AI_CAMERA_INIT_FACERECOGNIZE = function (_, generator) { generator.definitions_['import_esp_dl'] = 'import esp_dl'; var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC); var path = generator.valueToCode(this, 'PATH', generator.ORDER_ATOMIC); - var code = sub +' = esp_dl.FaceRecognizer(width=cam.get_pixel_width(), height=cam.get_pixel_height(), db_path='+ path +')\n'; + var width = this.getFieldValue('width'); + var height = this.getFieldValue('height'); + var code = sub +' = esp_dl.FaceRecognizer(width='+width+', height='+height+', db_path='+ path +')\n'; return code; } diff --git a/boards/default_src/micropython_esp32s3/template.xml b/boards/default_src/micropython_esp32s3/template.xml index 67b228e1..1f185a0c 100644 --- a/boards/default_src/micropython_esp32s3/template.xml +++ b/boards/default_src/micropython_esp32s3/template.xml @@ -2412,7 +2412,36 @@ - + + + + + + + + + + + + image + + + + + + + + image + + + + + + + image + + + @@ -2425,13 +2454,31 @@ - - frame - - + + + + image + + + + mixly.jpg + + + + + 90 + + - + + + + mixly.jpg + + + + @@ -2439,17 +2486,14 @@ + - - - mixly.jpg + + + image - - - - @@ -2476,6 +2520,76 @@ + + + + Model + + + + + 256 + + + + + + + Model + + + + + 0,0,0 + + + + + 255,255,255 + + + + + color + + + + + 256 + + + + + + + Model + + + + + name + + + + + + + Model + + + + + 1 + + + + + + + Model + + + _results @@ -2487,7 +2601,7 @@ - frame + image @@ -2568,76 +2682,7 @@ - - - - Model - - - - - 256 - - - - - - - Model - - - - - 0,0,0 - - - - - 255,255,255 - - - - - color - - - - - 256 - - - - - - - Model - - - - - name - - - - - - - Model - - - - - 1 - - - - - - - Model - - - +