From 10d8c1f51dcdb9576cd7dd06ad133416790cc884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E7=AB=8B=E5=B8=AE?= <3294713004@qq.com> Date: Mon, 12 Jan 2026 02:44:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(boards):=20=E6=B7=BB=E5=8A=A0=20`micropyth?= =?UTF-8?q?on=5Fesp32c5`=20=E6=9D=BF=E5=8D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- boards.json | 12 + .../micropython/blocks/actuator_onboard.js | 27 + .../generators/actuator_onboard.js | 9 + .../micropython_esp32c5/.npmignore | 3 + .../blocks/esp32_profile.js | 196 + .../micropython_esp32c5/blocks/inout.js | 259 + .../micropython_esp32c5/blocks/pins.js | 415 + .../micropython_esp32c5/css/color_esp32c5.css | 489 + .../default_src/micropython_esp32c5/export.js | 13 + .../micropython_esp32c5/generators/inout.js | 109 + .../micropython_esp32c5/generators/pins.js | 59 + .../default_src/micropython_esp32c5/index.js | 182 + .../micropython_esp32c5/jsconfig.json | 18 + .../micropython_esp32c5/origin/config.json | 146 + .../origin/examples/map.json | 1 + .../origin/media/esp32c5_compressed.png | Bin 0 -> 84953 bytes .../micropython_esp32c5/package.json | 34 + .../micropython_esp32c5/template.xml | 8029 +++++++++++++++++ .../micropython_esp32c5/webpack.common.js | 12 + .../micropython_esp32c5/webpack.dev.js | 36 + .../micropython_esp32c5/webpack.prod.js | 27 + 21 files changed, 10076 insertions(+) create mode 100644 boards/default_src/micropython_esp32c5/.npmignore create mode 100644 boards/default_src/micropython_esp32c5/blocks/esp32_profile.js create mode 100644 boards/default_src/micropython_esp32c5/blocks/inout.js create mode 100644 boards/default_src/micropython_esp32c5/blocks/pins.js create mode 100644 boards/default_src/micropython_esp32c5/css/color_esp32c5.css create mode 100644 boards/default_src/micropython_esp32c5/export.js create mode 100644 boards/default_src/micropython_esp32c5/generators/inout.js create mode 100644 boards/default_src/micropython_esp32c5/generators/pins.js create mode 100644 boards/default_src/micropython_esp32c5/index.js create mode 100644 boards/default_src/micropython_esp32c5/jsconfig.json create mode 100644 boards/default_src/micropython_esp32c5/origin/config.json create mode 100644 boards/default_src/micropython_esp32c5/origin/examples/map.json create mode 100644 boards/default_src/micropython_esp32c5/origin/media/esp32c5_compressed.png create mode 100644 boards/default_src/micropython_esp32c5/package.json create mode 100644 boards/default_src/micropython_esp32c5/template.xml create mode 100644 boards/default_src/micropython_esp32c5/webpack.common.js create mode 100644 boards/default_src/micropython_esp32c5/webpack.dev.js create mode 100644 boards/default_src/micropython_esp32c5/webpack.prod.js diff --git a/boards.json b/boards.json index e3bf0429..72d0adc5 100644 --- a/boards.json +++ b/boards.json @@ -23,6 +23,18 @@ }, "language": "MicroPython" }, + { + "boardImg": "./boards/default/micropython_esp32c5/media/esp32c5_compressed.png", + "boardType": "Python ESP32-C5", + "boardIndex": "./boards/default/micropython_esp32c5/index.xml", + "env": { + "electron": true, + "web": true, + "webCompiler": true, + "webSocket": true + }, + "language": "MicroPython" + }, { "boardImg": "./boards/default/micropython_esp32c3/media/esp32c3_compressed.png", "boardType": "Python ESP32-C3", diff --git a/boards/default_src/micropython/blocks/actuator_onboard.js b/boards/default_src/micropython/blocks/actuator_onboard.js index d0d9cf24..5e86db27 100644 --- a/boards/default_src/micropython/blocks/actuator_onboard.js +++ b/boards/default_src/micropython/blocks/actuator_onboard.js @@ -970,6 +970,10 @@ export const set_power_output = { this.appendDummyInput() .appendField(new Blockly.FieldDropdown([["1", "1"], ["2", "2"]]), "index"); break; + case 'micropython:esp32c5:mixgo_sowl': + this.appendDummyInput() + .appendField(new Blockly.FieldDropdown([["1", "1"], ["2", "2"], ["4", "4"], ["5", "5"]]), "index"); + break; default: this.appendDummyInput() .appendField(new Blockly.FieldDropdown([["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"]]), "index"); @@ -999,6 +1003,10 @@ export const get_power_output = { this.appendDummyInput() .appendField(new Blockly.FieldDropdown([["1", "1"], ["2", "2"]]), "index"); break; + case 'micropython:esp32c5:mixgo_sowl': + this.appendDummyInput() + .appendField(new Blockly.FieldDropdown([["1", "1"], ["2", "2"], ["4", "4"], ["5", "5"]]), "index"); + break; default: this.appendDummyInput() .appendField(new Blockly.FieldDropdown([["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"]]), "index"); @@ -1030,6 +1038,25 @@ export const set_all_power_output = { } } +export const set_part_power_output = { + init: function () { + this.setColour(ACTUATOR_ONBOARD_HUE); + this.appendDummyInput() + .appendField(Blockly.Msg.LISTS_SET_INDEX_SET + Blockly.Msg.ME_GO_MOTOR_EXTERN) + .appendField(new Blockly.FieldDropdown([["1-2", "1"], ["4-5", "4"]]), "index"); + this.appendValueInput('duty') + .setCheck(Number) + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.blynk_IOT_IR_POWER + Blockly.Msg.MIXLY_PINMODEOUT + Blockly.Msg.MIXLY_FREQUENCY); + this.appendDummyInput() + .appendField('Hz') + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_MIXBOT_MOTOR_EXTERN_TOOLTIP); + } +} + export const analog_keyboard_input = { init: function () { this.setColour(ACTUATOR_ONBOARD_HUE); diff --git a/boards/default_src/micropython/generators/actuator_onboard.js b/boards/default_src/micropython/generators/actuator_onboard.js index 25fbc133..d5619051 100644 --- a/boards/default_src/micropython/generators/actuator_onboard.js +++ b/boards/default_src/micropython/generators/actuator_onboard.js @@ -511,6 +511,15 @@ export const set_all_power_output = function (_, generator) { return code; } +export const set_part_power_output = function (_, generator) { + var version = Boards.getSelectedBoardKey().split(':')[2]; + var index = this.getFieldValue('index'); + var duty = generator.valueToCode(this, 'duty', generator.ORDER_ATOMIC); + generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot'; + var code = 'onboard_bot.usben(' + index + ', freq=' + duty + ')\n'; + return code; +} + export const analog_keyboard_input = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2] var sp = generator.valueToCode(this, 'special', generator.ORDER_ATOMIC); diff --git a/boards/default_src/micropython_esp32c5/.npmignore b/boards/default_src/micropython_esp32c5/.npmignore new file mode 100644 index 00000000..21ab2a3e --- /dev/null +++ b/boards/default_src/micropython_esp32c5/.npmignore @@ -0,0 +1,3 @@ +node_modules +build +origin \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/blocks/esp32_profile.js b/boards/default_src/micropython_esp32c5/blocks/esp32_profile.js new file mode 100644 index 00000000..6f06f4e9 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/blocks/esp32_profile.js @@ -0,0 +1,196 @@ +import { Profile } from 'mixly'; + +const pins = {}; + +pins["元控自立"] = { + description: "MicroPython[ESP32C5 MixGo SOWL]", + digital_pin: Profile.generate(['0-14', '23-28']), + input_pin: Profile.generate(['0-14', '23-28']), + output_pin: Profile.generate(['0-14', '23-28']), + pwm_input: Profile.generate(['0-14', '23-28'], 'pwm', 'pwm'), + analog_input: Profile.generate(['1-6'], 'adc', 'adc'), + pwm_output: Profile.generate(['0-14', '23-28'], 'pwm', 'pwm'), + analog_output: Profile.generate(['1-6'], 'adc', 'adc'), + espnow_channel: Profile.generate(['1-13']), + haskylens_model: Profile.generate(['0-4']), + digital: Profile.generate(['0-14', '23-28'], 'pin', 'pin'), + pwm_pin: Profile.generate(['0-14', '23-28']), + pwm: Profile.generate(['0-14', '23-28'], 'pwm', 'pwm'), + analog_pin: Profile.generate(['1-6']), + analog: Profile.generate(['1-6'], 'adc', 'adc'), + touch: Profile.generate(['1-14'], 'tc', 'tc'), + touch_pin: Profile.generate(['1-14']), + button: [["B1", "B1key"], ["B2", "B2key"], ["A1", "A1key"], ["A2", "A2key"], ["A3", "A3key"], ["A4", "A4key"]], + buttonB: [["B1", "B1key"], ["B2", "B2key"]], + axis: Profile.generate(['0-4']), + exlcdh: Profile.generate(['0-15']), + exlcdv: Profile.generate(['0-7']), + brightness: Profile.generate(['0-9']), + tts_voice: Profile.generate(['0-16']), + tts_builtin_music: Profile.generate(['0-47']), + tts_bgmusic: Profile.generate(['0-15']), + builtinimg: [ + ["Heart", "expression_picture.Heart"], + ["Angry", "expression_picture.Angry"], + ["Bored", "expression_picture.Bored"], + ["Confused", "expression_picture.Confused"], + ["Happy", "expression_picture.Happy"], + ["Paper", "expression_picture.Paper"], + ["Rock", "expression_picture.Rock"], + ["Sad", "expression_picture.Sad"], + ["Scissors", "expression_picture.Scissors"], + ["Silly", "expression_picture.Silly"], + ["Sleep", "expression_picture.Sleep"], + ["Small_heart", "expression_picture.Small_heart"], + ["Small_paper", "expression_picture.Small_paper"], + ["Small_rock", "expression_picture.Small_rock"], + ["Small_scissors", "expression_picture.Small_scissors"], + ["Smile", "expression_picture.Smile"], + ["Surprise", "expression_picture.Surprise"], + ["Wonderful", "expression_picture.Wonderful"], + ["Eyes_Angry", "eye_picture.Eyes_Angry"], + ["Awake", "eye_picture.Awake"], + ["Black_eye", "eye_picture.Black_eye"], + ["Bottom_left", "eye_picture.Bottom_left"], + ["Bottom_right", "eye_picture.Bottom_right"], + ["Crazy_1", "eye_picture.Crazy_1"], + ["Crazy_2", "eye_picture.Crazy_2"], + ["Disappointed", "eye_picture.Disappointed"], + ["Dizzy", "eye_picture.Dizzy"], + ["Down", "eye_picture.Down"], + ["Evil", "eye_picture.Evil"], + ["Hurt", "eye_picture.Hurt"], + ["Knocked_out", "eye_picture.Knocked_out"], + ["Love", "eye_picture.Love"], + ["Middle_left", "eye_picture.Middle_left"], + ["Middle_right", "eye_picture.Middle_right"], + ["Neutral", "eye_picture.Neutral"], + ["Nuclear", "eye_picture.Nuclear"], + ["Pinch_left", "eye_picture.Pinch_left"], + ["Pinch_middle", "eye_picture.Pinch_middle"], + ["Pinch_right", "eye_picture.Pinch_right"], + ["Tear", "eye_picture.Tear"], + ["Tired_left", "eye_picture.Tired_left"], + ["Tired_middle", "eye_picture.Tired_middle"], + ["Tired_right", "eye_picture.Tired_right"], + ["Toxic", "eye_picture.Toxic"], + ["Up", "eye_picture.Up"], + ["Winking", "eye_picture.Winking"], + ["Accept", "informatio_picture.Accept"], + ["Backward", "informatio_picture.Backward"], + ["Decline", "informatio_picture.Decline"], + ["Forward", "informatio_picture.Forward"], + ["Left", "informatio_picture.Left"], + ["No_go", "informatio_picture.No_go"], + ["Question_mark", "informatio_picture.Question_mark"], + ["Right", "informatio_picture.Right"], + ["Stop_1", "informatio_picture.Stop_1"], + ["Stop_2", "informatio_picture.Stop_2"], + ["Thumbs_down", "informatio_picture.Thumbs_down"], + ["Thumbs_up", "informatio_picture.Thumbs_up"], + ["Warning", "informatio_picture.Warning"], + ["Bomb", "object_picture.Bomb"], + ["Boom", "object_picture.Boom"], + ["DOOR_CLOSE", "object_picture.DOOR_CLOSE"], + ["DOOR_OPEN", "object_picture.DOOR_OPEN"], + ["DOOR_OPENING", "object_picture.DOOR_OPENING"], + ["Fire", "object_picture.Fire"], + ["Flowers", "object_picture.Flowers"], + ["Forest", "object_picture.Forest"], + ["Lightning", "object_picture.Lightning"], + ["Light_off", "object_picture.Light_off"], + ["Light_on", "object_picture.Light_on"], + ["Night", "object_picture.Night"], + ["Pirate", "object_picture.Pirate"], + ["Snow", "object_picture.Snow"], + ["Target", "object_picture.Target"], + ["Bar_0", "progres_picture.Bar_0"], + ["Bar_1", "progres_picture.Bar_1"], + ["Bar_2", "progres_picture.Bar_2"], + ["Bar_3", "progres_picture.Bar_3"], + ["Bar_4", "progres_picture.Bar_4"], + ["Dial_0", "progres_picture.Dial_0"], + ["Dial_1", "progres_picture.Dial_1"], + ["Dial_2", "progres_picture.Dial_2"], + ["Dial_3", "progres_picture.Dial_3"], + ["Dial_4", "progres_picture.Dial_4"], + ["Dots_0", "progres_picture.Dots_0"], + ["Dots_1", "progres_picture.Dots_1"], + ["Dots_2", "progres_picture.Dots_2"], + ["Dots_3", "progres_picture.Dots_3"], + ["Hourglass_0", "progres_picture.Hourglass_0"], + ["Hourglass_1", "progres_picture.Hourglass_1"], + ["Hourglass_2", "progres_picture.Hourglass_2"], + ["Timer_0", "progres_picture.Timer_0"], + ["Timer_1", "progres_picture.Timer_1"], + ["Timer_2", "progres_picture.Timer_2"], + ["Timer_3", "progres_picture.Timer_3"], + ["Timer_4", "progres_picture.Timer_4"], + ["Water_level_0", "progres_picture.Water_level_0"], + ["Water_level_1", "progres_picture.Water_level_1"], + ["Water_level_2", "progres_picture.Water_level_2"], + ["Water_level_3", "progres_picture.Water_level_3"], + ["YES", "informatio_picture.YES"], + ["NO", "informatio_picture.NO"] + ], + builtinimg_extern: [["HEART", "matrix32x12.Matrix.HEART"], ["HEART_SMALL", "matrix32x12.Matrix.HEART_SMALL"], ["HAPPY", "matrix32x12.Matrix.HAPPY"], ["SAD", "matrix32x12.Matrix.SAD"], ["SMILE", "matrix32x12.Matrix.SMILE"], ["SILLY", "matrix32x12.Matrix.SILLY"], ["FABULOUS", "matrix32x12.Matrix.FABULOUS"], ["SURPRISED", "matrix32x12.Matrix.SURPRISED"], ["ASLEEP", "matrix32x12.Matrix.ASLEEP"], ["ANGRY", "matrix32x12.Matrix.ANGRY"], ["CONFUSED", "matrix32x12.Matrix.CONFUSED"], ["NO", "matrix32x12.Matrix.NO"], ["YES", "matrix32x12.Matrix.YES"], ["LEFT_ARROW", "matrix32x12.Matrix.LEFT_ARROW"], ["RIGHT_ARROW", "matrix32x12.Matrix.RIGHT_ARROW"], ["DRESS", "matrix32x12.Matrix.DRESS"], ["TRANSFORMERS", "matrix32x12.Matrix.TRANSFORMERS"], ["SCISSORS", "matrix32x12.Matrix.SCISSORS"], ["EXIT", "matrix32x12.Matrix.EXIT"], ["TREE", "matrix32x12.Matrix.TREE"], ["PACMAN", "matrix32x12.Matrix.PACMAN"], ["TARGET", "matrix32x12.Matrix.TARGET"], ["TSHIRT", "matrix32x12.Matrix.TSHIRT"], ["ROLLERSKATE", "matrix32x12.Matrix.ROLLERSKATE"], ["DUCK", "matrix32x12.Matrix.DUCK"], ["HOUSE", "matrix32x12.Matrix.HOUSE"], ["TORTOISE", "matrix32x12.Matrix.TORTOISE"], ["BUTTERFLY", "matrix32x12.Matrix.BUTTERFLY"], ["STICKFIGURE", "matrix32x12.Matrix.STICKFIGURE"], ["GHOST", "matrix32x12.Matrix.GHOST"], ["PITCHFORK", "matrix32x12.Matrix.PITCHFORK"], ["onboard_music_QUAVERS", "matrix32x12.Matrix.onboard_music_QUAVERS"], ["onboard_music_QUAVER", "matrix32x12.Matrix.onboard_music_QUAVER"], ["onboard_music_CROTCHET", "matrix32x12.Matrix.onboard_music_CROTCHET"], ["COW", "matrix32x12.Matrix.COW"], ["RABBIT", "matrix32x12.Matrix.RABBIT"], ["SQUARE_SMALL", "matrix32x12.Matrix.SQUARE_SMALL"], ["SQUARE", "matrix32x12.Matrix.SQUARE"], ["DIAMOND_SMALL", "matrix32x12.Matrix.DIAMOND_SMALL"], ["DIAMOND", "matrix32x12.Matrix.DIAMOND"], ["CHESSBOARD", "matrix32x12.Matrix.CHESSBOARD"], ["TRIANGLE_LEFT", "matrix32x12.Matrix.TRIANGLE_LEFT"], ["TRIANGLE", "matrix32x12.Matrix.TRIANGLE"], ["SNAKE", "matrix32x12.Matrix.SNAKE"], ["UMBRELLA", "matrix32x12.Matrix.UMBRELLA"], ["SKULL", "matrix32x12.Matrix.SKULL"], ["GIRAFFE", "matrix32x12.Matrix.GIRAFFE"], ["SWORD", "matrix32x12.Matrix.SWORD"]], + imglist: [["ALL_CLOCKS", "matrix.Image.ALL_CLOCKS"], ["ALL_ARROWS", "matrix.Image.ALL_ARROWS"]], + playlist: [["DADADADUM", "onboard_music.DADADADUM"], ["ENTERTAINER", "onboard_music.ENTERTAINER"], ["PRELUDE", "onboard_music.PRELUDE"], ["ODE", "onboard_music.ODE"], ["NYAN", "onboard_music.NYAN"], ["RINGTONE", "onboard_music.RINGTONE"], ["FUNK", "onboard_music.FUNK"], ["BLUES", "onboard_music.BLUES"], ["BIRTHDAY", "onboard_music.BIRTHDAY"], ["WEDDING", "onboard_music.WEDDING"], ["FUNERAL", "onboard_music.FUNERAL"], ["PUNCHLINE", "onboard_music.PUNCHLINE"], ["PYTHON", "onboard_music.PYTHON"], ["BADDY", "onboard_music.BADDY"], ["CHASE", "onboard_music.CHASE"], ["BA_DING", "onboard_music.BA_DING"], ["WAWAWAWAA", "onboard_music.WAWAWAWAA"], ["JUMP_UP", "onboard_music.JUMP_UP"], ["JUMP_DOWN", "onboard_music.JUMP_DOWN"], ["POWER_UP", "onboard_music.POWER_UP"], ["POWER_DOWN", "onboard_music.POWER_DOWN"]], + playlist_extern: [["DADADADUM", "DADADADUM"], ["ENTERTAINER", "ENTERTAINER"], ["PRELUDE", "PRELUDE"], ["ODE", "ODE"], ["NYAN", "NYAN"], ["RINGTONE", "RINGTONE"], ["FUNK", "FUNK"], ["BLUES", "BLUES"], ["BIRTHDAY", "BIRTHDAY"], ["WEDDING", "WEDDING"], ["FUNERAL", "FUNERAL"], ["PUNCHLINE", "PUNCHLINE"], ["PYTHON", "PYTHON"], ["BADDY", "BADDY"], ["CHASE", "CHASE"], ["BA_DING", "BA_DING"], ["WAWAWAWAA", "WAWAWAWAA"], ["JUMP_UP", "JUMP_UP"], ["JUMP_DOWN", "JUMP_DOWN"], ["POWER_UP", "POWER_UP"], ["POWER_DOWN", "POWER_DOWN"]], + tone_notes: [ + ["NOTE_C3", "131"], ["NOTE_D3", "147"], ["NOTE_E3", "165"], ["NOTE_F3", "175"], ["NOTE_G3", "196"], ["NOTE_A3", "220"], ["NOTE_B3", "247"], + ["NOTE_C4", "262"], ["NOTE_D4", "294"], ["NOTE_E4", "330"], ["NOTE_F4", "349"], ["NOTE_G4", "392"], ["NOTE_A4", "440"], ["NOTE_B4", "494"], + ["NOTE_C5", "523"], ["NOTE_D5", "587"], ["NOTE_E5", "659"], ["NOTE_F5", "698"], ["NOTE_G5", "784"], ["NOTE_A5", "880"], ["NOTE_B5", "988"] + ], + serial_pin: [["pin0", "0"], ["pin1", "1"], ["pin2", "2"], ["pin8", "8"], ["pin12", "12"], ["pin13", "13"], ["pin14", "14"], ["pin15", "15"], ["pin16", "16"]], + radio_power: [['0', '0'], ['1', '1'], ['2', '2'], ['3', '3'], ['4', '4'], ['5', '5'], ['6', '6'], ['7', '7']], + radio_datarate: [["1Mbit", "RATE_1MBIT"], ["250Kbit", "RATE_250KBIT"], ["2Mbit", "RATE_2MBIT"]], + one_more: [["ONE_SHOT", "ONE_SHOT"], ["PERIODIC", "PERIODIC"]], + digital_dot: [["0", "0"], ["1", "1"], ["2", "2"]], +}; + +pins["ESP32C5 Generic"] = { + description: "MicroPython[ESP32C5 Generic]", + digital_pin: Profile.generate(['0-14', '23-28']), + input_pin: Profile.generate(['0-14', '23-28']), + output_pin: Profile.generate(['0-14', '23-28']), + pwm_input: Profile.generate(['0-14', '23-28'], 'pwm', 'pwm'), + analog_input: Profile.generate(['1-6'], 'adc', 'adc'), + pwm_output: Profile.generate(['0-14', '23-28'], 'pwm', 'pwm'), + analog_output: Profile.generate(['1-6'], 'adc', 'adc'), + espnow_channel: Profile.generate(['1-13']), + haskylens_model: Profile.generate(['0-4']), + digital: Profile.generate(['0-14', '23-28'], 'pin', 'pin'), + pwm_pin: Profile.generate(['0-14', '23-28']), + pwm: Profile.generate(['0-14', '23-28'], 'pwm', 'pwm'), + analog_pin: Profile.generate(['1-6']), + analog: Profile.generate(['1-6'], 'adc', 'adc'), + touch: Profile.generate(['1-14'], 'tc', 'tc'), + touch_pin: Profile.generate(['1-14']), + button: [["B1", "B1key"], ["B2", "B2key"], ["A1", "A1key"], ["A2", "A2key"], ["A3", "A3key"], ["A4", "A4key"]], + buttonB: [["B1", "B1key"], ["B2", "B2key"]], + axis: Profile.generate(['0-4']), + exlcdh: Profile.generate(['0-15']), + exlcdv: Profile.generate(['0-7']), + brightness: Profile.generate(['0-9']), + tts_voice: Profile.generate(['0-16']), + tts_builtin_music: Profile.generate(['0-47']), + tts_bgmusic: Profile.generate(['0-15']), + builtinimg: pins["元控自立"].builtinimg, + builtinimg_extern: [["HEART", "matrix32x12.Matrix.HEART"], ["HEART_SMALL", "matrix32x12.Matrix.HEART_SMALL"], ["HAPPY", "matrix32x12.Matrix.HAPPY"], ["SAD", "matrix32x12.Matrix.SAD"], ["SMILE", "matrix32x12.Matrix.SMILE"], ["SILLY", "matrix32x12.Matrix.SILLY"], ["FABULOUS", "matrix32x12.Matrix.FABULOUS"], ["SURPRISED", "matrix32x12.Matrix.SURPRISED"], ["ASLEEP", "matrix32x12.Matrix.ASLEEP"], ["ANGRY", "matrix32x12.Matrix.ANGRY"], ["CONFUSED", "matrix32x12.Matrix.CONFUSED"], ["NO", "matrix32x12.Matrix.NO"], ["YES", "matrix32x12.Matrix.YES"], ["LEFT_ARROW", "matrix32x12.Matrix.LEFT_ARROW"], ["RIGHT_ARROW", "matrix32x12.Matrix.RIGHT_ARROW"], ["DRESS", "matrix32x12.Matrix.DRESS"], ["TRANSFORMERS", "matrix32x12.Matrix.TRANSFORMERS"], ["SCISSORS", "matrix32x12.Matrix.SCISSORS"], ["EXIT", "matrix32x12.Matrix.EXIT"], ["TREE", "matrix32x12.Matrix.TREE"], ["PACMAN", "matrix32x12.Matrix.PACMAN"], ["TARGET", "matrix32x12.Matrix.TARGET"], ["TSHIRT", "matrix32x12.Matrix.TSHIRT"], ["ROLLERSKATE", "matrix32x12.Matrix.ROLLERSKATE"], ["DUCK", "matrix32x12.Matrix.DUCK"], ["HOUSE", "matrix32x12.Matrix.HOUSE"], ["TORTOISE", "matrix32x12.Matrix.TORTOISE"], ["BUTTERFLY", "matrix32x12.Matrix.BUTTERFLY"], ["STICKFIGURE", "matrix32x12.Matrix.STICKFIGURE"], ["GHOST", "matrix32x12.Matrix.GHOST"], ["PITCHFORK", "matrix32x12.Matrix.PITCHFORK"], ["onboard_music_QUAVERS", "matrix32x12.Matrix.onboard_music_QUAVERS"], ["onboard_music_QUAVER", "matrix32x12.Matrix.onboard_music_QUAVER"], ["onboard_music_CROTCHET", "matrix32x12.Matrix.onboard_music_CROTCHET"], ["COW", "matrix32x12.Matrix.COW"], ["RABBIT", "matrix32x12.Matrix.RABBIT"], ["SQUARE_SMALL", "matrix32x12.Matrix.SQUARE_SMALL"], ["SQUARE", "matrix32x12.Matrix.SQUARE"], ["DIAMOND_SMALL", "matrix32x12.Matrix.DIAMOND_SMALL"], ["DIAMOND", "matrix32x12.Matrix.DIAMOND"], ["CHESSBOARD", "matrix32x12.Matrix.CHESSBOARD"], ["TRIANGLE_LEFT", "matrix32x12.Matrix.TRIANGLE_LEFT"], ["TRIANGLE", "matrix32x12.Matrix.TRIANGLE"], ["SNAKE", "matrix32x12.Matrix.SNAKE"], ["UMBRELLA", "matrix32x12.Matrix.UMBRELLA"], ["SKULL", "matrix32x12.Matrix.SKULL"], ["GIRAFFE", "matrix32x12.Matrix.GIRAFFE"], ["SWORD", "matrix32x12.Matrix.SWORD"]], + imglist: [["ALL_CLOCKS", "matrix.Image.ALL_CLOCKS"], ["ALL_ARROWS", "matrix.Image.ALL_ARROWS"]], + playlist: [["DADADADUM", ".DADADADUM"], ["ENTERTAINER", ".ENTERTAINER"], ["PRELUDE", ".PRELUDE"], ["ODE", ".ODE"], ["NYAN", ".NYAN"], ["RINGTONE", ".RINGTONE"], ["FUNK", ".FUNK"], ["BLUES", ".BLUES"], ["BIRTHDAY", ".BIRTHDAY"], ["WEDDING", ".WEDDING"], ["FUNERAL", ".FUNERAL"], ["PUNCHLINE", ".PUNCHLINE"], ["PYTHON", ".PYTHON"], ["BADDY", ".BADDY"], ["CHASE", ".CHASE"], ["BA_DING", ".BA_DING"], ["WAWAWAWAA", ".WAWAWAWAA"], ["JUMP_UP", ".JUMP_UP"], ["JUMP_DOWN", ".JUMP_DOWN"], ["POWER_UP", ".POWER_UP"], ["POWER_DOWN", ".POWER_DOWN"]], + playlist_extern: [["DADADADUM", "DADADADUM"], ["ENTERTAINER", "ENTERTAINER"], ["PRELUDE", "PRELUDE"], ["ODE", "ODE"], ["NYAN", "NYAN"], ["RINGTONE", "RINGTONE"], ["FUNK", "FUNK"], ["BLUES", "BLUES"], ["BIRTHDAY", "BIRTHDAY"], ["WEDDING", "WEDDING"], ["FUNERAL", "FUNERAL"], ["PUNCHLINE", "PUNCHLINE"], ["PYTHON", "PYTHON"], ["BADDY", "BADDY"], ["CHASE", "CHASE"], ["BA_DING", "BA_DING"], ["WAWAWAWAA", "WAWAWAWAA"], ["JUMP_UP", "JUMP_UP"], ["JUMP_DOWN", "JUMP_DOWN"], ["POWER_UP", "POWER_UP"], ["POWER_DOWN", "POWER_DOWN"]], + tone_notes: [ + ["NOTE_C3", "131"], ["NOTE_D3", "147"], ["NOTE_E3", "165"], ["NOTE_F3", "175"], ["NOTE_G3", "196"], ["NOTE_A3", "220"], ["NOTE_B3", "247"], + ["NOTE_C4", "262"], ["NOTE_D4", "294"], ["NOTE_E4", "330"], ["NOTE_F4", "349"], ["NOTE_G4", "392"], ["NOTE_A4", "440"], ["NOTE_B4", "494"], + ["NOTE_C5", "523"], ["NOTE_D5", "587"], ["NOTE_E5", "659"], ["NOTE_F5", "698"], ["NOTE_G5", "784"], ["NOTE_A5", "880"], ["NOTE_B5", "988"] + ], + serial_pin: [["pin0", "0"], ["pin1", "1"], ["pin2", "2"], ["pin8", "8"], ["pin12", "12"], ["pin13", "13"], ["pin14", "14"], ["pin15", "15"], ["pin16", "16"]], + radio_power: [['0', '0'], ['1', '1'], ['2', '2'], ['3', '3'], ['4', '4'], ['5', '5'], ['6', '6'], ['7', '7']], + radio_datarate: [["1Mbit", "RATE_1MBIT"], ["250Kbit", "RATE_250KBIT"], ["2Mbit", "RATE_2MBIT"]], + one_more: [["ONE_SHOT", "ONE_SHOT"], ["PERIODIC", "PERIODIC"]], + digital_dot: [["0", "0"], ["1", "1"], ["2", "2"]], +}; + +export default pins; \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/blocks/inout.js b/boards/default_src/micropython_esp32c5/blocks/inout.js new file mode 100644 index 00000000..e9aa5243 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/blocks/inout.js @@ -0,0 +1,259 @@ +import * as Blockly from 'blockly/core'; + +const BASE_HUE = 20; //'#ae3838';//40; + +export const inout_highlow = { + init: function () { + this.setColour(BASE_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_HIGH, "HIGH"], [Blockly.Msg.MIXLY_LOW, "LOW"]]), 'BOOL') + this.setOutput(true, Boolean); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_HIGHLOW_TOOLTIP); + } +}; + +export const inout_digital_write = { + init: function () { + this.setColour(BASE_HUE); + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_Digital_PINMODEOUT) + .setCheck(Number); + this.appendValueInput("STAT") + .appendField(Blockly.Msg.MIXLY_STAT) + .setCheck([Number, Boolean]); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_DIGITAL_WRITE_TOOLTIP); + } +}; + +export const inout_digital_read = { + init: function () { + this.setColour(BASE_HUE); + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(Blockly.Msg.MIXLY_Digital_PINMODEIN) + .setCheck(Number); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_MACHINE_VALUE) + this.setInputsInline(true); + this.setOutput(true, [Boolean, Number]); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_DIGITAL_READ_TOOLTIP); + } +}; + +export const inout_analog_write = { + init: function () { + this.setColour(BASE_HUE); + this.appendValueInput("PIN", Number) + .appendField("DAC" + Blockly.Msg.MIXLY_Analog_PINMODEOUT) + .setCheck(Number); + this.appendValueInput("NUM", Number) + .appendField(Blockly.Msg.MIXLY_VALUE2) + .setCheck(Number); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_ANALOG_WRITE_TOOLTIP); + } +}; + +export const inout_analog_write_set = { + init: function () { + this.setColour(BASE_HUE); + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_Analog_PINMODEOUT) + .setCheck(Number); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_PERIOD_MIL) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_mSecond, "period"], + [Blockly.Msg.MIXLY_uSecond, "period_microseconds"] + ]), "key"); + this.appendValueInput("NUM", Number) + .appendField(Blockly.Msg.MIXLY_STAT) + .setCheck(Number); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_ANALOG_WRITE_SET_TOOLTIP); + } +}; + +export const inout_analog_atten = { + init: function () { + this.setColour(BASE_HUE); + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_Analog_PINMODEIN) + .setCheck(Number); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_ESP32_REF_VOLTAGE + Blockly.Msg.MIXLY_STAT) + .appendField(new Blockly.FieldDropdown([ + ["3.3V", "machine.ADC.ATTN_11DB"], + ["2.2V", "machine.ADC.ATTN_6DB"], + ["1.5V", "machine.ADC.ATTN_2_5DB"], + ["1.2V", "machine.ADC.ATTN_0DB"] + ]), "atten"); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_ANALOG_ATTEN_TOOLTIP); + } +}; + + +export const inout_pin_pressed = { + init: function () { + this.setColour(BASE_HUE); + this.appendValueInput('pin') + .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET) + .appendField(Blockly.Msg.MIXLY_ESP32_TOUCH_SENSOR); + // this.appendDummyInput() + // .appendField(Blockly.Msg.MIXLY_IS_TOUCHED); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_ESP32_MACHINE_VALUE) + this.setOutput(true, Number); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_PIN_PRESSED_TOOLTIP); + } +}; + +export const inout_pin_attachInterrupt = { + init: function () { + this.setColour(20); + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_ATTACHINTERRUPT_PIN) + .setCheck(Number); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_MODE) + .appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_RISING, "machine.Pin.IRQ_RISING"], [Blockly.Msg.MIXLY_FALLING, "machine.Pin.IRQ_FALLING"], [Blockly.Msg.MIXLY_CHANGE, "(machine.Pin.IRQ_RISING | machine.Pin.IRQ_FALLING)"]]), "mode"); + this.appendValueInput('DO') + .appendField(Blockly.Msg.MIXLY_DO) + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_PIN_ATTACHINTERRUPT_TOOLTIP); + } +}; + +export const inout_digital_init = { + init: function () { + this.setColour(20); + this.appendDummyInput() + .appendField(Blockly.Msg.MIXLY_SETUP) + .appendField(new Blockly.FieldTextInput('pin#'), 'PIN_OBJ'); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_AS) + // .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE+Blockly.Msg.LISTS_SET_INDEX_INPUT_TO) + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.MIXLY_Digital_PINMODEOUT, "machine.Pin.OUT"], + [Blockly.Msg.MIXLY_Digital_PINMODEIN, "machine.Pin.IN"], + [Blockly.Msg.MIXLY_PINMODEPULLUP, "machine.Pin.IN, machine.Pin.PULL_UP"], + [Blockly.Msg.MIXLY_PINMODEPULLDOWN, "machine.Pin.IN, machine.Pin.PULL_DOWN"] + ]), "MODE") + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_PIN) + .setCheck(Number); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setInputsInline(true); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_DIGITAL_INIT_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('PIN_OBJ') == 'pin#' ? null : this.getFieldValue('PIN_OBJ')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('PIN_OBJ'))) { + this.setTitleValue(newName, 'PIN_OBJ'); + } + } +}; + +export const inout_analog_write_init = { + init: function () { + this.setColour(BASE_HUE); + // this.appendValueInput("PIN", Number) + // .appendField(Blockly.Msg.MIXLY_SETUP) + // .appendField("PWM"+Blockly.Msg.MIXLY_Analog_PINMODEOUT) + // .appendField('pwm') + // .setCheck(Number); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_SETUP) + .appendField(new Blockly.FieldTextInput('dac#'), 'PIN_OBJ') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_AS) + this.appendDummyInput("") + .appendField("DAC" + Blockly.Msg.MIXLY_Analog_PINMODEOUT) + // .appendField('dac') + // .appendField(new Blockly.FieldDropdown(profile.default.dac_pin),"PIN") + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_PIN) + .setCheck(Number); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_ANALOG_WRITE_INIT_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('PIN_OBJ') == 'dac#' ? null : this.getFieldValue('PIN_OBJ')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('PIN_OBJ'))) { + this.setTitleValue(newName, 'PIN_OBJ'); + } + } +}; + +export const inout_pin_pressed_init = { + init: function () { + this.setColour(BASE_HUE); + // this.appendValueInput("PIN", Number) + // .appendField(Blockly.Msg.MIXLY_SETUP) + // .appendField("PWM"+Blockly.Msg.MIXLY_Analog_PINMODEOUT) + // .appendField('pwm') + // .setCheck(Number); + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_SETUP) + .appendField(new Blockly.FieldTextInput('tc#'), 'PIN_OBJ') + .appendField(Blockly.Msg.MIXLY_MICROPYTHON_AS) + this.appendDummyInput("") + .appendField(Blockly.Msg.MIXLY_ESP32_TOUCH_SENSOR) + // .appendField('tc') + // .appendField(new Blockly.FieldDropdown(profile.default.tc_pin),"PIN") + this.appendValueInput("PIN", Number) + .appendField(Blockly.Msg.MIXLY_PIN) + .setCheck(Number); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_PIN_PRESSED_INIT_TOOLTIP); + }, + getVars: function () { + return [this.getFieldValue('PIN_OBJ') == 'tc#' ? null : this.getFieldValue('PIN_OBJ')]; + }, + renameVar: function (oldName, newName) { + if (Blockly.Names.equals(oldName, this.getFieldValue('PIN_OBJ'))) { + this.setTitleValue(newName, 'PIN_OBJ'); + } + } +}; + +export const inout_analog_write_set_freq = { + init: function () { + this.setColour(BASE_HUE); + this.appendValueInput("PIN", Number) + .appendField("PWM" + Blockly.Msg.MIXLY_Analog_PINMODEOUT) + .setCheck(Number); + this.appendValueInput("NUM", Number) + .appendField(Blockly.Msg.MIXLY_FREQUENCY + Blockly.Msg.MIXLY_STAT) + .setCheck(Number); + this.setInputsInline(true); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_PWM_ANALOG_WRITE_SET_FREQ_TOOLTIP); + } +}; + +export const inout_pinMode = inout_digital_init; +export const pin_pressed_init = inout_pin_pressed_init; +export const pin_pressed = inout_pin_pressed; +export const controls_pin_attachInterrupt = inout_pin_attachInterrupt; diff --git a/boards/default_src/micropython_esp32c5/blocks/pins.js b/boards/default_src/micropython_esp32c5/blocks/pins.js new file mode 100644 index 00000000..d46361c9 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/blocks/pins.js @@ -0,0 +1,415 @@ +import * as Blockly from 'blockly/core'; +import { Profile } from 'mixly'; + +const PINS_HUE = 230; + +export const pins_digital = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.digital), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_digital_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.digital_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_input_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.input_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_output_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.output_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const espnow_channel = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.espnow_channel), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const haskylens_model = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.haskylens_model), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pwm_input = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.pwm_input), 'PIN'); + this.setOutput(true); + } +}; + +export const analog_input = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.analog_input), 'PIN'); + this.setOutput(true); + } +}; + +export const pwm_output = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.pwm_output), 'PIN'); + this.setOutput(true); + } +}; + +export const analog_output = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.analog_output), 'PIN'); + this.setOutput(true); + } +}; + +export const i2c_A_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.i2c_A_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const i2c_B_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.i2c_B_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + + +export const spi_A_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.spi_A_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const spi_B_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.spi_B_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const spi_C_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.spi_C_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const spi_D_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.spi_D_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_analog = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.analog), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_analog_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.analog_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_dac = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.dac), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_dac_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.dac_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_button = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.button), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_buttonB = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.buttonB), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_pwm = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.pwm), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_pwm_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.pwm_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_touch_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.touch_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_touch = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.touch), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_serial = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.serial_pin), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_builtinimg = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.builtinimg), 'PIN'); + this.setOutput(true, "esp32_image"); + } +}; + +export const pins_builtinimg_extern = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.builtinimg_extern), 'PIN'); + this.setOutput(true, "esp32_image"); + } +}; + +export const pins_imglist = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.imglist), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_playlist = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.playlist), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_playlist_extern = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.playlist_extern), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_exlcdh = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.exlcdh), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_exlcdv = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.exlcdv), 'PIN'); + this.setOutput(true, Number); + } +}; + + +export const pins_axis = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.axis), 'PIN'); + this.setOutput(true, Number); + } +}; +export const pins_brightness = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.brightness), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_tts_voice = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.tts_voice), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_tts_builtin_music = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.tts_builtin_music), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_tts_bgmusic = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.tts_bgmusic), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_tone_notes = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.tone_notes), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_radio_power = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.radio_power), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_radio_datarate = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.radio_datarate), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const pins_one_more = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.one_more), 'PIN'); + this.setOutput(true); + } +}; + +export const pins_digital_dot = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown(Profile.default.digital_dot), 'PIN'); + this.setOutput(true, Number); + } +}; + +export const timer_id_pin = { + init: function () { + this.setColour(PINS_HUE); + this.appendDummyInput("") + .appendField(new Blockly.FieldDropdown([ + ["0","0"], + ["1","1"], + ["2","2"], + ["3","3"] + ]), 'PIN'); + this.setOutput(true, Number); + } +}; \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/css/color_esp32c5.css b/boards/default_src/micropython_esp32c5/css/color_esp32c5.css new file mode 100644 index 00000000..08b690b9 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/css/color_esp32c5.css @@ -0,0 +1,489 @@ +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/inout.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/inout2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ctrl.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ctrl2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/math.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/math2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/logic.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/logic2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/text.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/text2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/list3.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/list4.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/tuple.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/tuple2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/dict.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/dict2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/set.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/set2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/var.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/var2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/func.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/func2.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/port.png') no-repeat; + background-size: 100% auto; +} + +div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/port2.png') no-repeat; + background-size: 100% auto; +} + +#catOnBoardSensor.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/sensor_onboard.png') no-repeat; + background-size: 100% auto; +} + +#catOnBoardSensor.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/sensor_new2.png') no-repeat; + background-size: 100% auto; +} + +#catOnBoardActuator.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/actuator_onboard.png') no-repeat; + background-size: 100% auto; +} + +#catOnBoardActuator.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/actuator_new2.png') no-repeat; + background-size: 100% auto; +} + +#catOnBoardDisplay.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/display_onboard.png') no-repeat; + background-size: 100% auto; +} + +#catOnBoardDisplay.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/display_new2.png') no-repeat; + background-size: 100% auto; +} + +#catSANT_G3.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/sensor.png') no-repeat; + background-size: 100% auto; +} + +#catSANT_G3.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/sensor2.png') no-repeat; + background-size: 100% auto; +} + +#catExternSensor.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/sensor_extern.png') no-repeat; + background-size: 100% auto; +} + +#catExternSensor.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/sensor_new2.png') no-repeat; + background-size: 100% auto; +} + +#catExternActuator.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/actuator_extern.png') no-repeat; + background-size: 100% auto; +} + +#catExternActuator.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/actuator_new2.png') no-repeat; + background-size: 100% auto; +} + +#catMatrix.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/Matrix.png') no-repeat; + background-size: 100% auto; +} + +#catMatrix.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/Matrix2.png') no-repeat; + background-size: 100% auto; +} + +#catOLED.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/oled.png') no-repeat; + background-size: 100% auto; +} + +#catOLED.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/oled2.png') no-repeat; + background-size: 100% auto; +} + +#catTFT.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/oled.png') no-repeat; + background-size: 100% auto; +} + +#catTFT.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/oled2.png') no-repeat; + background-size: 100% auto; +} + +#catLCD.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/oled.png') no-repeat; + background-size: 100% auto; +} + +#catLCD.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/oled2.png') no-repeat; + background-size: 100% auto; +} + +#cat4Digitdisplay.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/4Digitdisplay.png') no-repeat; + background-size: 100% auto; +} + +#cat4Digitdisplay.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/4Digitdisplay2.png') no-repeat; + background-size: 100% auto; +} + +#catAIsensor.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/image.png') no-repeat; + background-size: 100% auto; +} + +#catAIsensor.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/image2.png') no-repeat; + background-size: 100% auto; +} + +#catAIsensor2.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/image.png') no-repeat; + background-size: 100% auto; +} + +#catAIsensor2.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/image2.png') no-repeat; + background-size: 100% auto; +} + +#catFile.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/file.png') no-repeat; + background-size: 100% auto; +} + +#catFile.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/file2.png') no-repeat; + background-size: 100% auto; +} + +#catBLE.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni.png') no-repeat; + background-size: 100% auto; +} + +#catBLE.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni2.png') no-repeat; + background-size: 100% auto; +} + +#catIR.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni.png') no-repeat; + background-size: 100% auto; +} + +#catIR.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni2.png') no-repeat; + background-size: 100% auto; +} + +#catI2C.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni.png') no-repeat; + background-size: 100% auto; +} + +#catI2C.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni2.png') no-repeat; + background-size: 100% auto; +} + +#catSPI.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni.png') no-repeat; + background-size: 100% auto; +} + +#catSPI.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni2.png') no-repeat; + background-size: 100% auto; +} + +#catRadio.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni.png') no-repeat; + background-size: 100% auto; +} + +#catRadio.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni2.png') no-repeat; + background-size: 100% auto; +} + +#catOneWire.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni.png') no-repeat; + background-size: 100% auto; +} + +#catOneWire.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni2.png') no-repeat; + background-size: 100% auto; +} + +#catESPNow.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni.png') no-repeat; + background-size: 100% auto; +} + +#catESPNow.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni2.png') no-repeat; + background-size: 100% auto; +} + +#catLora.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni.png') no-repeat; + background-size: 100% auto; +} + +#catLora.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni2.png') no-repeat; + background-size: 100% auto; +} + +#catNetwork.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/net3.png') no-repeat; + background-size: 100% auto; +} + +#catNetwork.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/net2.png') no-repeat; + background-size: 100% auto; +} + +#catOnenet.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/onenet.png') no-repeat; + background-size: 100% auto; +} + +#catOnenet.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/onenet2.png') no-repeat; + background-size: 100% auto; +} + +#catBlynk.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/blynk.png') no-repeat; + background-size: 100% auto; +} + +#catBlynk.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/blynk2.png') no-repeat; + background-size: 100% auto; +} + +#catMixIO.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/mixio.png') no-repeat; + background-size: 100% auto; +} + +#catMixIO.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/mixio2.png') no-repeat; + background-size: 100% auto; +} + +#catweather.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/weather.png') no-repeat; + background-size: 100% auto; +} + +#catweather.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/weather2.png') no-repeat; + background-size: 100% auto; +} + +#catTinyWebDB.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/database.png') no-repeat; + background-size: 100% auto; +} + +#catTinyWebDB.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/database2.png') no-repeat; + background-size: 100% auto; +} + +#catAIOT.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ai.png') no-repeat; + background-size: 100% auto; +} + +#catAIOT.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/ai2.png') no-repeat; + background-size: 100% auto; +} + +#catFactory.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/factory3.png') no-repeat; + background-size: 100% auto; +} + +#catFactory.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/factory4.png') no-repeat; + background-size: 100% auto; +} + +#catNova_G1.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/act.png') no-repeat; + background-size: 100% auto; +} + +#catNova_G1.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/act2.png') no-repeat; + background-size: 100% auto; +} + +#catCommunicate.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/requests.png') no-repeat; + background-size: 100% auto; +} + +#catCommunicate.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/requests2.png') no-repeat; + background-size: 100% auto; +} + +#catBLEC.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni.png') no-repeat; + background-size: 100% auto; +} + +#catBLEC.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni2.png') no-repeat; + background-size: 100% auto; +} + +#catBLEKM.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni.png') no-repeat; + background-size: 100% auto; +} + +#catBLEKM.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/comuni2.png') no-repeat; + background-size: 100% auto; +} + +#catAIgraphsensor.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/image.png') no-repeat; + background-size: 100% auto; +} + +#catAIgraphsensor.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/image2.png') no-repeat; + background-size: 100% auto; +} + +#catAIvoicesensor.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/AIvoice.png') no-repeat; + background-size: 100% auto; +} + +#catAIvoicesensor.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/AIvoice2.png') no-repeat; + background-size: 100% auto; +} + +#catAIgraphsensorpro.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/image.png') no-repeat; + background-size: 100% auto; +} + +#catAIgraphsensorpro.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon { + background: url('../../../../common/media/mark/image2.png') no-repeat; + background-size: 100% auto; +} \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/export.js b/boards/default_src/micropython_esp32c5/export.js new file mode 100644 index 00000000..06e27320 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/export.js @@ -0,0 +1,13 @@ +import MicropythonESP32C5Pins from './blocks/esp32_profile'; +import * as MicropythonESP32C5InoutBlocks from './blocks/inout'; +import * as MicropythonESP32C5PinsBlocks from './blocks/pins'; +import * as MicropythonESP32C5InoutGenerators from './generators/inout'; +import * as MicropythonESP32C5PinsGenerators from './generators/pins'; + +export { + MicropythonESP32C5Pins, + MicropythonESP32C5InoutBlocks, + MicropythonESP32C5PinsBlocks, + MicropythonESP32C5InoutGenerators, + MicropythonESP32C5PinsGenerators +}; \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/generators/inout.js b/boards/default_src/micropython_esp32c5/generators/inout.js new file mode 100644 index 00000000..e6dcb9ee --- /dev/null +++ b/boards/default_src/micropython_esp32c5/generators/inout.js @@ -0,0 +1,109 @@ +import * as Blockly from 'blockly/core'; + +// ok +export const inout_highlow = function (_, generator) { + // Boolean values HIGH and LOW. + var code = (this.getFieldValue('BOOL') == 'HIGH') ? '1' : '0'; + return [code, generator.ORDER_ATOMIC]; +} + +// ok +export const inout_digital_write = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC); + var code = ""; + code += dropdown_pin + '.value(' + dropdown_stat + ')\n' + return code; +} + +// ok +export const inout_digital_read = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var code = ""; + code = dropdown_pin + '.value()'; + return [code, generator.ORDER_ATOMIC]; +} + +// ok +export const inout_analog_write = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + //var dropdown_stat = this.getFieldValue('STAT'); + var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC); + //generator.setups_['setup_output'+dropdown_pin] = 'pinMode('+dropdown_pin+', OUTPUT);'; + var code = dropdown_pin + '.write(' + value_num + ')\n'; + return code; +} + +// ok +export const inout_analog_write_set = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC); + var key = this.getFieldValue('key'); + var code = dropdown_pin + '.set_analog_' + key + '(' + value_num + ')\n'; + //var code = 'pin' + dropdown_pin + '.set_analog_period(' + value_num + ')\n'; + return code; +} + +// ok +export const inout_pin_pressed = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var pin = generator.valueToCode(this, 'pin', generator.ORDER_ATOMIC); + var code = pin + '.read()'; + return [code, generator.ORDER_ATOMIC]; +} + +export const inout_pin_attachInterrupt = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var dropdown_mode = this.getFieldValue('mode'); + var atta = generator.valueToCode(this, 'DO', generator.ORDER_ATOMIC); + var code = 'machine.Pin(' + dropdown_pin + ').irq' + '(handler = ' + atta + ', trigger = ' + dropdown_mode + ')\n' + //var funcName = 'attachInterrupt_func_' + dropdown_pin; + //var branch = generator.statementToCode(this, 'DO') || generator.PASS; + //var code2 = 'def' + ' ' + funcName + '(p):\n' + branch + '\n'; + //generator.setups_[funcName] = code2; + return code; +} + +export const inout_digital_init = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var pin_obj = this.getFieldValue('PIN_OBJ') || 'pin#'; + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var dropdown_mode = this.getFieldValue('MODE'); + var varName = (pin_obj == 'pin#') ? 'pin' + dropdown_pin : generator.variableDB_.getName(pin_obj, Blockly.Variables.NAME_TYPE); + var code = varName + ' = machine.Pin(' + dropdown_pin + ', ' + dropdown_mode + ')\n'; + return code; +} + +// ok +export const inout_analog_write_init = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var pin_obj = this.getFieldValue('PIN_OBJ') || 'dac#'; + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var varName = (pin_obj == 'dac#') ? 'dac' + dropdown_pin : generator.variableDB_.getName(pin_obj, Blockly.Variables.NAME_TYPE); + var code = varName + ' = machine.DAC(machine.Pin(' + dropdown_pin + '))\n'; + return code; +} + +export const inout_analog_atten = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + //var dropdown_stat = this.getFieldValue('STAT'); + var value_atten = this.getFieldValue('atten') + var code = dropdown_pin + '.atten(' + value_atten + ')\n'; + return code; +} + +// ok +export const inout_pin_pressed_init = function (_, generator) { + generator.definitions_['import_machine'] = 'import machine'; + var pin_obj = this.getFieldValue('PIN_OBJ') || 'tc#'; + var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); + var varName = (pin_obj == 'tc#') ? 'tc' + dropdown_pin : generator.variableDB_.getName(pin_obj, Blockly.Variables.NAME_TYPE); + var code = varName + ' = machine.TouchPad(machine.Pin(' + dropdown_pin + '))\n'; + return code; +} \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/generators/pins.js b/boards/default_src/micropython_esp32c5/generators/pins.js new file mode 100644 index 00000000..3fd1b85c --- /dev/null +++ b/boards/default_src/micropython_esp32c5/generators/pins.js @@ -0,0 +1,59 @@ +export const pins_digital = function (_, generator) { + const code = this.getFieldValue('PIN'); + return [code, generator.ORDER_ATOMIC]; +}; + +export const pins_button = pins_digital; +export const pins_buttonB = pins_digital; +export const pins_digital_pin = pins_digital; +export const pins_input_pin = pins_digital; +export const pins_output_pin = pins_digital; +export const pins_pwm_input = pins_digital; +export const espnow_channel = pins_digital; +export const haskylens_model = pins_digital; +export const analog_input = pins_digital; +export const pwm_output = pins_digital; +export const analog_output = pins_digital; +export const i2c_A_pin = pins_digital; +export const i2c_B_pin = pins_digital; +export const spi_A_pin = pins_digital; +export const spi_B_pin = pins_digital; +export const spi_C_pin = pins_digital; +export const spi_D_pin = pins_digital; +export const pins_analog_pin = pins_digital; +export const pins_analog = pins_digital; +export const pins_pwm_pin = pins_digital; +export const pins_pwm = pins_digital; +export const pins_dac_pin = pins_digital; +export const pins_dac = pins_digital; +export const pins_touch_pin = pins_digital; +export const pins_touch = pins_digital; +export const pins_interrupt = pins_digital; +export const pins_serial = pins_digital; +export const pins_builtinimg_extern = pins_digital; +export const pins_imglist = pins_digital; +export const pins_playlist = pins_digital; +export const pins_playlist_extern = pins_digital; +export const pins_axis = pins_digital; +export const pins_exlcdh = pins_digital; +export const pins_exlcdv = pins_digital; +export const pins_brightness = pins_digital; +export const pins_tts_voice = pins_digital; +export const pins_tts_builtin_music = pins_digital; +export const pins_tts_bgmusic = pins_digital; +export const pins_tone_notes = pins_digital; +export const pins_radio_power = pins_digital; +export const pins_radio_datarate = pins_digital; +export const pins_one_more = pins_digital; +export const pins_digital_dot = pins_digital; +export const timer_id_pin = pins_digital; + +export const pins_builtinimg = function (_, generator) { + const PIN_VALUE = this.getFieldValue('PIN'); + const data = PIN_VALUE.split('.'); + if (data.length !== 2) { + throw Error('pin value error'); + } + generator.definitions_[`import_${data[0]}_${data[1]}`] = `from ${data[0]} import ${data[1]}`; + return [data[1], generator.ORDER_ATOMIC]; +}; \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/index.js b/boards/default_src/micropython_esp32c5/index.js new file mode 100644 index 00000000..563a8a93 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/index.js @@ -0,0 +1,182 @@ +import * as Blockly from 'blockly/core'; +import { Profile } from 'mixly'; + +import { + PythonVariablesBlocks, + PythonControlBlocks, + PythonMathBlocks, + PythonTextBlocks, + PythonListsBlocks, + PythonDictsBlocks, + PythonLogicBlocks, + PythonStorageBlocks, + PythonProceduresBlocks, + PythonTupleBlocks, + PythonSetBlocks, + PythonHtmlBlocks, + PythonUtilityBlocks, + PythonVariablesGenerators, + PythonControlGenerators, + PythonMathGenerators, + PythonTextGenerators, + PythonListsGenerators, + PythonDictsGenerators, + PythonLogicGenerators, + PythonStorageGenerators, + PythonProceduresGenerators, + PythonTupleGenerators, + PythonSetGenerators, + PythonHtmlGenerators, + PythonUtilityGenerators, + Procedures, + Variables, + Python +} from '@mixly/python'; + +import { + MicroPythonActuatorExternBlocks, + MicroPythonActuatorOnBoardBlocks, + MicroPythonAISensorBlocks, + MicroPythonAIBlocks, + MicroPythonAILocalBlocks, + MicroPythonBlynkBlocks, + MicroPythonCommunicateBlocks, + MicroPythonDisplayExternBlocks, + MicroPythonDisplayOnBoardBlocks, + MicroPythonFactoryBlocks, + MicroPythonInputBlocks, + MicroPythonIotBlocks, + MicroPythonNetworkBlocks, + MicroPythonNovaG1Blocks, + MicroPythonPeG1Blocks, + MicroPythonSensorExternBlocks, + MicroPythonSensorOnBoardBlocks, + MicroPythonSerialBlocks, + MicroPythonSystemBlocks, + MicroPythonWeatherBlocks, + MicroPythonActuatorExternGenerators, + MicroPythonActuatorOnBoardGenerators, + MicroPythonAISensorGenerators, + MicroPythonAIGenerators, + MicroPythonAILocalGenerators, + MicroPythonBlynkGenerators, + MicroPythonCommunicateGenerators, + MicroPythonDisplayExternGenerators, + MicroPythonDisplayOnBoardGenerators, + MicroPythonFactoryGenerators, + MicroPythonInputGenerators, + MicroPythonIotGenerators, + MicroPythonNetworkGenerators, + MicroPythonNovaG1Generators, + MicroPythonPeG1Generators, + MicroPythonSensorExternGenerators, + MicroPythonSensorOnBoardGenerators, + MicroPythonSerialGenerators, + MicroPythonSystemGenerators, + MicroPythonWeatherGenerators, + MicroPythonZhHans, + MicroPythonZhHant, + MicroPythonEn +} from '@mixly/micropython'; + +import { + MicropythonESP32C5Pins, + MicropythonESP32C5InoutBlocks, + MicropythonESP32C5PinsBlocks, + MicropythonESP32C5InoutGenerators, + MicropythonESP32C5PinsGenerators +} from './'; + +import './css/color_esp32c5.css'; + +Object.assign(Blockly.Variables, Variables); +Object.assign(Blockly.Procedures, Procedures); + +Object.assign(Blockly.Lang.ZhHans, MicroPythonZhHans); +Object.assign(Blockly.Lang.ZhHant, MicroPythonZhHant); +Object.assign(Blockly.Lang.En, MicroPythonEn); + +Blockly.Python = Python; +Blockly.generator = Python; + +Profile.default = {}; +Object.assign(Profile, MicropythonESP32C5Pins); +Object.assign(Profile.default, MicropythonESP32C5Pins['元控青春']); + +Object.assign( + Blockly.Blocks, + PythonVariablesBlocks, + PythonControlBlocks, + PythonMathBlocks, + PythonTextBlocks, + PythonListsBlocks, + PythonDictsBlocks, + PythonLogicBlocks, + PythonStorageBlocks, + PythonProceduresBlocks, + PythonTupleBlocks, + PythonSetBlocks, + PythonHtmlBlocks, + PythonUtilityBlocks, + MicroPythonInputBlocks, + MicroPythonSystemBlocks, + MicroPythonSerialBlocks, + MicroPythonCommunicateBlocks, + MicroPythonIotBlocks, + MicroPythonWeatherBlocks, + MicroPythonAISensorBlocks, + MicroPythonAILocalBlocks, + MicroPythonSensorOnBoardBlocks, + MicroPythonSensorExternBlocks, + MicroPythonPeG1Blocks, + MicroPythonNetworkBlocks, + MicroPythonAIBlocks, + MicroPythonActuatorOnBoardBlocks, + MicroPythonActuatorExternBlocks, + MicroPythonDisplayOnBoardBlocks, + MicroPythonDisplayExternBlocks, + MicroPythonFactoryBlocks, + MicroPythonBlynkBlocks, + MicroPythonNovaG1Blocks, + MicropythonESP32C5InoutBlocks, + MicropythonESP32C5PinsBlocks +); + +Object.assign( + Blockly.Python.forBlock, + PythonVariablesGenerators, + PythonControlGenerators, + PythonMathGenerators, + PythonTextGenerators, + PythonListsGenerators, + PythonDictsGenerators, + PythonLogicGenerators, + PythonStorageGenerators, + PythonProceduresGenerators, + PythonTupleGenerators, + PythonSetGenerators, + PythonHtmlGenerators, + PythonUtilityGenerators, + MicroPythonInputGenerators, + MicroPythonSystemGenerators, + MicroPythonSerialGenerators, + MicroPythonCommunicateGenerators, + MicroPythonIotGenerators, + MicroPythonWeatherGenerators, + MicroPythonAISensorGenerators, + MicroPythonAILocalGenerators, + MicroPythonSensorOnBoardGenerators, + MicroPythonSensorExternGenerators, + MicroPythonPeG1Generators, + MicroPythonNetworkGenerators, + MicroPythonAIGenerators, + MicroPythonActuatorOnBoardGenerators, + MicroPythonActuatorExternGenerators, + MicroPythonDisplayOnBoardGenerators, + MicroPythonDisplayExternGenerators, + MicroPythonFactoryGenerators, + MicroPythonBlynkGenerators, + MicroPythonNovaG1Generators, + MicropythonESP32C5InoutGenerators, + MicropythonESP32C5PinsGenerators +); \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/jsconfig.json b/boards/default_src/micropython_esp32c5/jsconfig.json new file mode 100644 index 00000000..1e4522a1 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/jsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "baseUrl": "./", + "paths": { + "@mixly/python": [ + "../python" + ], + "@mixly/micropython": [ + "../micropython" + ] + } + }, + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/origin/config.json b/boards/default_src/micropython_esp32c5/origin/config.json new file mode 100644 index 00000000..f50a21fd --- /dev/null +++ b/boards/default_src/micropython_esp32c5/origin/config.json @@ -0,0 +1,146 @@ +{ + "board": { + "元控自立": { + "key": "micropython:esp32c5:mixgo_sowl", + "config": [ + { + "key": "BurnSpeed", + "label": "Burn Speed", + "messageId": "MICROPYTHON_CONFIG_MESSAGE_BURN_SPEED", + "options": [ + { + "key": "921600", + "label": "921600" + }, + { + "key": "460800", + "label": "460800" + }, + { + "key": "230400", + "label": "230400" + }, + { + "key": "115200", + "label": "115200" + } + ] + } + ] + }, + "C5_generic": { + "key": "micropython:esp32c5:generic", + "config": [ + { + "key": "BurnSpeed", + "label": "Burn Speed", + "messageId": "MICROPYTHON_CONFIG_MESSAGE_BURN_SPEED", + "options": [ + { + "key": "921600", + "label": "921600" + }, + { + "key": "460800", + "label": "460800" + }, + { + "key": "230400", + "label": "230400" + }, + { + "key": "115200", + "label": "115200" + } + ] + } + ] + } + }, + "language": "MicroPython", + "burn": { + "type": "command", + "portSelect": "all", + "micropython:esp32c5:mixgo_sowl": { + "command": "\"{esptool}\" --chip esp32c5 --port {com} --baud {baudrate} --after hard_reset write_flash -e 0x2000 \"{indexPath}/build/Mixgo_Sowl_lib-v1.27.0.bin\" 0x700000 \"{indexPath}/../micropython/build/HZK12.bin\"" + }, + "micropython:esp32c5:generic": { + "command": "\"{esptool}\" --chip esp32c5 --port {com} --baud {baudrate} --after=no_reset write_flash -e 0x2000 \"{indexPath}/build/Generic_C5_lib-v1.27.0.bin\" 0x3A0000 \"{indexPath}/../micropython/build/HZK12.bin\"" + } + }, + "upload": { + "type": "command", + "portSelect": "all", + "libPath": [ + "{indexPath}/build/lib", + "{indexPath}/../micropython/build/lib" + ], + "command": "\"{ampy}\" -p {com} -d 1 -r \"{reset}\" put \"{indexPath}/build/upload\"", + "filePath": "{indexPath}/build/upload/main.py", + "copyLib": false, + "reset": [] + }, + "nav": { + "burn": true, + "upload": true, + "save": { + "py": true + }, + "setting": { + "thirdPartyLibrary": true + } + }, + "serial": { + "ctrlCBtn": true, + "ctrlDBtn": true, + "baudRates": 115200, + "yMax": 100, + "yMin": 0, + "pointNum": 100, + "rts": true, + "dtr": true + }, + "lib": { + "mixly": { + "url": [ + "http://download.mixlylibs.cloud/mixly3-packages/cloud-libs/micropython_esp32c5/libs.json" + ] + } + }, + "pythonToBlockly": false, + "web": { + "devices": { + "serial": true, + "hid": true, + "usb":true + }, + "burn": { + "erase": true, + "micropython:esp32c5:mixgo_sowl": { + "binFile": [ + { + "offset": "0x2000", + "path": "./build/Mixgo_Sowl_lib-v1.27.0.bin" + }, { + "offset": "0x700000", + "path": "../micropython/build/HZK12.bin" + } + ] + }, + "micropython:esp32c5:generic": { + "binFile": [ + { + "offset": "0x2000", + "path": "./build/Generic_C5_lib-v1.27.0.bin" + }, { + "offset": "0x3A0000", + "path": "../micropython/build/HZK12.bin" + } + ] + } + }, + "upload": { + "reset": [] + } + } +} diff --git a/boards/default_src/micropython_esp32c5/origin/examples/map.json b/boards/default_src/micropython_esp32c5/origin/examples/map.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/boards/default_src/micropython_esp32c5/origin/examples/map.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/origin/media/esp32c5_compressed.png b/boards/default_src/micropython_esp32c5/origin/media/esp32c5_compressed.png new file mode 100644 index 0000000000000000000000000000000000000000..4accaa7171fceed49bd95ef0500de0534a289b37 GIT binary patch literal 84953 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 JBV`i&e*h4uwH^Qf literal 0 HcmV?d00001 diff --git a/boards/default_src/micropython_esp32c5/package.json b/boards/default_src/micropython_esp32c5/package.json new file mode 100644 index 00000000..5d01e1f4 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/package.json @@ -0,0 +1,34 @@ +{ + "name": "@mixly/micropython-esp32c5", + "version": "1.0.0", + "description": "适用于mixly的micropython esp32c5模块", + "scripts": { + "serve": "webpack-dev-server --config=webpack.dev.js", + "build:dev": "webpack --config=webpack.dev.js", + "build:prod": "npm run build:examples & webpack --config=webpack.prod.js & npm run build:libraries", + "build:examples": "node ../../../scripts/build-examples.js -t special", + "build:examples:ob": "node ../../../scripts/build-examples.js -t special --obfuscate", + "build:libraries": "python ../../../scripts/build-libraries.py ../../default/micropython_esp32c5/build/lib", + "publish:board": "npm publish --registry https://registry.npmjs.org/" + }, + "main": "./export.js", + "author": "Mixly Team", + "keywords": [ + "mixly", + "mixly-plugin", + "micropython-esp32c5" + ], + "homepage": "https://gitee.com/bnu_mixly/mixly3/tree/master/boards/default_src/micropython_esp32c5", + "bugs": { + "url": "https://gitee.com/bnu_mixly/mixly3/issues" + }, + "repository": { + "type": "git", + "url": "https://gitee.com/bnu_mixly/mixly3.git", + "directory": "default_src/micropython_esp32c5" + }, + "publishConfig": { + "access": "public" + }, + "license": "Apache 2.0" +} \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/template.xml b/boards/default_src/micropython_esp32c5/template.xml new file mode 100644 index 00000000..ee2e2244 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/template.xml @@ -0,0 +1,8029 @@ +<%= htmlWebpackPlugin.tags.headTags.join('\n') %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + 2000 + + + + + + + + + + + + + + + + + + + + + + attachInterrupt_func + + + + + + + + attachInterrupt_func + + + + + + + + + + + + + + + + + + 1 + + + + + + + + 0,1,2,3 + + + + + 0 + + + + + 5 + + + + + 1 + + + + + + + i + + + + + + + + + + + 500 + + + + + 0 + + + + + + + + + + + DIVIDE + + + 1 + + + + + 0 + + + + + + + + + Exception as e + + + + + + + e + + + + + + + + + testThread + + + + + + + + + + testThread + + + WHILE + + + TRUE + + + + + + + Hello Mixly from Thread! + + + + + ms + + + 10 + + + + + + + + + + + + + tim + + + + + + + + + 1000 + + + + + tim_callback + + + + + + + + tim_callback + + + + + + + + + + + + + + + + 2000 + + + + + + + + + + + + + + + + + + + + + + + + 90 + + + + + + + x + + + + + + + 15 + + + + + + + 1 + + + + + 1 + + + + + + + 0 + + + + + 0 + + + + + + + a + + + + + 1 + + + + + + + 0.998 + + + + + + + 1 + + + + + 2 + + + + + + + 4.8 + + + + + 2 + + + + + + + + 997 + + + + + + + 1 + + + + + 100 + + + + + + + 1010 + + + + + + 1000 + + + + + 1 + + + + + 100 + + + + + + + 50 + + + + + 1 + + + + + 100 + + + + + 1 + + + + + 1000 + + + + + + + 1 + + + + + + + 1 + + + + + + + + + + 0 + + + + + x + + + + + 2 + + + + + + + + + + + + x + + + + + 0,1,2,3 + + + + + + + 0,1,2,3 + + + + + 0,1,2,3 + + + + + + + x + + + + + + + Mixly + + + + + Mixly + + + + + Hello + + + + + Mixly + + + + + + + + 65 + + + + + + + a + + + + + + + x + + + + + + + Mixly + + + + + + + + + + + + + + + + + + + Mixly + + + + + 0 + + + + + + + Mixly + + + + + 0 + + + + + 2 + + + + + + + Mixly + + + + + + + Mixly + + + + + + + + Hello,mixly + + + + + l + + + + + + + -- + + + + + mylist + + + + + + + Hello,mixly + + + + + mixly + + + + + mixpy + + + + + + + I love mixly! + + + + + + + + + + + + I love mixly + + + + + + + + Random No. is {} + + + + + int + + + 1 + + + + + 100 + + + + + + + + + input('1+2*3') + + + + + + + + mylist + + + 1,2,3,4,5 + + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 2 + + + + + + + mylist + + + + + + + + mylist + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + 0 + + + + + + + mylist + + + + + + + mylist + + + + + + + mylist + + + + + + + + x + + + + + + + + mytup + + + 1,2,3,4,5 + + + + + + + + mytup + + + + + 0 + + + + + + + mytup + + + + + 0 + + + + + 2 + + + + + + + mytup + + + + + + + mytup + + + + + + + mytup + + + + + + + mytup + + + + + 0 + + + + + + + mytup + + + + + + + mytup1 + + + + + mytup2 + + + + + + + + x + + + + + + + + + + mydict + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + + + mydict + + + + + key + + + + + 0 + + + + + + + mydict + + + + + + + + mydict + + + + + + + mydict + + + + + + + mydict + + + + + + + x + + + + + + + mydict + + + + + + + {"name":"Mixly","color":"green"} + + + + + + + + s1 + + + 1,2,3,4,5 + + + + + + + s1 + + + + + + + s1 + + + + + + + s1 + + + + + s2 + + + + + + + s1 + + + + + s2 + + + + + + + s1 + + + + + 0 + + + + + + + s1 + + + + + Mixly + + + + + + + s1 + + + + + s2 + + + + + + + x + + + + + + + + + + + + Mixly + + + + + + + Mixly + + + + + + + Mixly + + + + + , + + + + + + + + Hello + + + + + Mixly + + + + + + + prompt + + + + + + + 0 + + + + + 2 + + + + + + + Mixly + + + + + + + Mixly + + + + + + + 0XFF00FF + + + + + + + code + + + + + + + + + b + + + Mixly + + + + + Mixly + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + + + + + attachInterrupt_func + + + + + + + + attachInterrupt_func + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + 0 + + + + + Mixly + + + + + + + 0 + + + + + Mixly + + + + + + + 2022 + + + + + 7 + + + + + 1 + + + + + 14 + + + + + 20 + + + + + 45 + + + + + + + 2023,1,1,12,0,0 + + + + + + + + + + + + + + 18029 + + + + + + + 2023,1,1,12,0,0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + + + 440 + + + + + + + 440 + + + + + 1000 + + + + + + + 0 + + + + + + + 100 + + + + + + + + + + + + + + + + + 4 + + + + + 120 + + + + + + + + + + 0 + + + + + 0 + + + + + 0 + + + + + 0 + + + + + + + 0 + + + + + 0 + + + + + 0 + + + + + + + 0 + + + + + 0 + + + + + 0 + + + + + 1000 + + + + + + + 1000 + + + + + + + + + 100 + + + + + + + + 20000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, Mixly! + + + + + 10 + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 0 + + + + + 1 + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + Mixly + + + + + 0 + + + + + + + + + + + Mixly + + + + + 0 + + + + + 0 + + + + + 1 + + + + + 0 + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + Mixly + + + + + 0 + + + + + 0 + + + + + 1 + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + mixly.jpg + + + + + + + + + + + mixly + + + + + + + + + + + Mixly + + + + + 0 + + + + + 0 + + + + + 1 + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + Mixly + + + + + + + Mixly + + + + + 0 + + + + + 5 + + + + + 5 + + + + + 0 + + + + + #ffffff + + + 255,255,0 + + + + + + + Mixly + + + + + + + Mixly + + + + + 5 + + + + + 500 + + + + + #ffffff + + + 255,255,0 + + + + + + + 0 + + + + + 0 + + + + + 20 + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + 0 + + + + + 0 + + + + + 50 + + + + + 50 + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + 20 + + + + + 20 + + + + + 20 + + + + + 15 + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + 60 + + + + + 60 + + + + + 40 + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + 1 + + + + + + + + + + + 0 + + + + + 0 + + + + + + + 0 + + + + + 0 + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + + 0.5 + + + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + + + + + + + + new_clock + + + + + 160 + + + + + 120 + + + + + 40 + + + + + #ffffff + + + 255,255,0 + + + + + + + new_clock + + + + + + + new_clock + + + + + 8 + + + + + 20 + + + + + 0 + + + + + + + new_clock + + + + + + + new_clock + + + + + 0x000000 + + + 0,0,0 + + + + + + + 0 + + + + + #ffffff + + + 255,255,0 + + + + + + + + + + + + + + + + + + + + + + + + + + 你们,米思齐 + + + 3 + + + + + + + + + mixly.jpg + + + + + + + image + + + + + + + + + + + + Model + + + + + + + + + + + + + + + Model + + + + + + + Model + + + + + name + + + + + + + Model + + + + + + + Model + + + + + + + + + + + Model + + + + + + + + + + + Model + + + + + + + + + + + + Model + + + + + + + + + + + + Model + + + + + + + + + + + Model + + + + + + + + + + + Model + + + + + + + + + + + + + + + + + + + + + + + + image + + + + + + + + + image + + + + + 90 + + + + + + + image + + + + + + + image + + + + + mixly.jpg + + + + + 90 + + + + + image + + + + + mixly.jpg + + + + + 240 + + + + + 240 + + + + + + + image + + + + + https://gitee.com/dahanzimin/test/raw/master/pic/mixly.jpg + + + + + 240 + + + + + 240 + + + + + + + + + + mixly.jpg + + + + + + + + + + + mixly.jpg + + + + + 0 + + + + + 0 + + + + + + + + + image + + + + + + image + + + + + 0 + + + + + 0 + + + + + 240 + + + + + 240 + + + + + + + + + image + + + + + + + + + + + image + + + + + 0 + + + + + 0 + + + + + + + + + + + Model + + + + + + + + + + + + + + + Model + + + + + + + + + + + + + face.db + + + + + + + Model + + + + + + + Model + + + + + 256 + + + + + + + Model + + + + + 0,0,0 + + + + + 255,255,255 + + + + + color + + + + + 256 + + + + + + + Model + + + + + image + + + + + name + + + + + + + Model + + + + + 1 + + + + + + + Model + + + + + + + Model + + + + + _results + + + + + Model + + + + + image + + + + + + + + + _results + + + + + + + _results + + + + + + + _results + + + + + 0 + + + + + + + _results + + + + + 0 + + + + + + + _results + + + + + 0 + + + + + + + _results + + + + + 0 + + + + + + + _results + + + + + 0 + + + + + + + + + + + + wifiname + + + + + wifipassword + + + + + + + mixio.mixly.cn + + + + + + + + + + + + mixio.mixly.cn + + + + + A1B2C3 + + + + + + + mixio.mixly.cn + + + + + username + + + + + password + + + + + MyProject + + + + + + + topic + + + + + msg + + + + + + + topic + + + + + msg + + + + + + + topic + + + + + method + + + + + + + + + + method + + + + + EQ + + + msg + + + + + 1 + + + + + + + + + + + content + + "long" + "lat" + "message" + + + 0 + + + + + 1 + + + + + 2 + + + + + + + + + content + + "key1" + "key2" + "key3" + + + 0 + + + + + 1 + + + + + 2 + + + + + + + + + + + + + + + https://mixio.mixly.cn/time.php + + + + + + + + mixio.mixly.cn + + + + + + + + 12.jpg + + + + + + + + + wifiname + + + + + wifipassword + + + + + + + c + + + + + sub_cb + + + + + 31444082 + + + + + 183.230.40.39 + + + + + 141092 + + + + + 61n63JySRowo13ZLDBKw6y896E0= + + + + + MixlyRobot + + + + + + + + + sub_cb + + + + + EQ + + + msg + + + + + 1 + + + + + + + + + + + c + + + + + + iot_dict + "tc" + + + + + tc0 + + + + + + + + + c + + + + + iot_dict + + + + + + + + c + + + + + + + c + + + + + + + + + wifiname + + + + + wifipassword + + + + + + + client + + + + + Enter Your API_KEY + + + + + Enter Your SECRET_KEY + + + + + + + client + + + + + 1 + + + + + + + client + + + + + S72099 + + + + + 北京今天天气如何? + + + + + + + + + wifiname + + + + + wifipassword + + + + + + + + SVa3S0UKHIy9dDArs + + + + + 北京 + + + + + + + + + + + + + + SVa3S0UKHIy9dDArs + + + + + 北京 + + + + + 1 + + + + + + + 1 + + + + + + + 1 + + + + + + + 1 + + + + + + + 1 + + + + + + + + + https://mixio.mixly.cn/tinydb + + + + + username + + + + + password + + + + + + + mqtt_client + + + + + + + mixly + + + + + hello + + + + + + + mixly + + + + + + + + + 1 + + + + + 1 + + + + + mixly + + + + + + + mixly + + + + + + + + + + + ble_c + + + + + + + ble_p + + + + + Mixly + + + + + + + ble_c + + + + + + + ble_c + + + + + Mixly + + + + + + + ble_c + + + + + + + ble_x + + + + + + + ble_x + + + + + + + ble_x + + + + + Mixly + + + + + + + ble_x + + + + + + + ble_x + + + + + ble_method + + + + + + + + ble_method + + + + + EQ + + + data + + + + + Mixly + + + + + + + + + + + + + handle + + + + + handle_method + + + + + + + + + + + handle_method + + + + + + key1 + + + + + key2 + + + + + key3 + + + + + keyx + + + + + + + + + + + + ble_keyboard_mouse + + + + + + + + + 10 + + + + + + + + + + + + + + + + + Hello, Mixly! + + + + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + i2c + + + + + 22 + + + + + 21 + + + + + 100000 + + + + + + + i2c + + + + + 0 + + + + + 0 + + + + + + + i2c + + + + + 0 + + + + + 0 + + + + + + + i2c + + + + + + + i2c + + + + + + + i2c + + + + + + + + + + spi + + + + + 200000 + + + + + 0 + + + + + 4 + + + + + 5 + + + + + + + spi + + + + + 200000 + + + + + + + buf + + + + + 50 + + + + + + + spi + + + + + 10 + + + + + + + spi + + + + + 10 + + + + + 0xff + + + + + + + spi + + + + + buf + + + + + + + spi + + + + + buf + + + + + 0xff + + + + + + + spi + + + + + 12345 + + + + + + + spi + + + + + 12345 + + + + + buf + + + + + + + + + + 1 + + + + + + + + + + Mixly + + + + + + + + + + + + + + + + + + + + + ow + + + + + 12 + + + + + + + ow + + + + + + + ow + + + + + + + ow + + + + + 12345 + + + + + + + ow + + + + + 12345 + + + + + + + ow + + + + + + + + + my_now + + + + + 0 + + + + + + + my_now + + + + + + + my_now + + + + + + + my_now + + + + + FFFFFFFFFFFF + + + + + mixly + + + + + + + my_now + + + + + + + my_now + + + + + cb + + + + + + + + + cb + + + + + EQ + + + msg + + + + + 1 + + + + + + + + + + + + + spi + + + + + 1000000 + + + + + 4 + + + + + 5 + + + + + 12 + + + + + + + spi + + + + + 8 + + + + + my_lora + + + + + 433.92 + + + + + 5 + + + + + 7 + + + + + 16 + + + + + + + my_lora + + + + + + + my_lora + + + + + + + my_lora + + + + + Mixly + + + + + + + + + + i2c_extend + + + + + 4 + + + + + 5 + + + + + 100000 + + + + + + + xsensor + + + + + i2c_extend + + + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + 1013.25 + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + 5000 + + + + + 500 + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + xsensor + + + + + + + + + + xsensor + + + + + + + spi + + + + + 1000000 + + + + + 4 + + + + + 5 + + + + + 12 + + + + + + + spi + + + + + 8 + + + + + ysensor + + + + + + + + + + ysensor + + + + + + + ysensor + + + + + 0 + + + + + + + ysensor + + + + + 0 + + + + + + + ysensor + + + + + 0 + + + + + Mixly + + + + + + + ysensor + + + + + 0 + + + + + Mixly + + + + + + + + ysensor + + + + + + + ysensor + + + + + + 39,119.96,31.67 + + + + + + + ysensor + + + + + + + ysensor + + + + + station + + + + + + + + + + + + + + + + + 4 + + + + + 5 + + + + + + + + ps2_handle + + + + + 2 + + + + + 4 + + + + + 5 + + + + + 12 + + + + + + + ps2_handle + + + + + 50 + + + + + + + ps2_handle + + + + + + + ps2_handle + + + + + + + ws_wr + + + + + 1 + + + + + 2 + + + + + 3 + + + + + + + ws_wr + + + + + + + ws_wr + + + + + + + ws_wr + + + + + 3600 + + + + + + + 1 + + + + + 0 + + + + + + + zsensor + + + + + + + + + zsensor + + + + + + + zsensor + + + + + + + zsensor + + + + + + + zsensor + + + + + + + weight + + + + + 1 + + + + + 2 + + + + + 500 + + + + + + + weight + + + + + KEYPAD_4_4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + A + 4 + 5 + 6 + B + 7 + 8 + 9 + C + * + 0 + # + D + + + + + KEYPAD_4_4 + + + + + var_re + + + + 3 + + + + 4 + + + + + 5 + + + + + rotary_cb + + + + + + + + + rotary_cb + + + + + + + + + + + midi + + + + + 0 + + + + + + + midi + + + + + 440 + + + + + + + midi + + + + + 440 + + + + + 1000 + + + + + + + midi + + + + + + + midi + + + + + 100 + + + + + + + + + + midi + + + + + + + + + + midi + + + + + + + midi + + + + + 4 + + + + + 120 + + + + + + + midi + + + + + + + midi + + + + + + + rgb + + + + + 0 + + + + + 4 + + + + + + + rgb + + + + + 0 + + + + + 0 + + + + + 0 + + + + + 0 + + + + + + + rgb + + + + + 0 + + + + + 0 + + + + + 0 + + + + + + + rgb + + + + + 0 + + + + + 0 + + + + + 0 + + + + + 1000 + + + + + + + rgb + + + + + 1000 + + + + + + + rgb + + + + + + + + + + 100 + + + + + + + + + + + + + + + 100 + + + + + + + + + + + + i2c_extend + + + + + 4 + + + + + 5 + + + + + 400000 + + + + + + + Motor + + + + + i2c_extend + + + + + + + + + Motor + + + + + 100 + + + + + + + + Motor + + + + + 1024 + + + + + 1024 + + + + + + + 0 + + + + + 2 + + + + + + + actuator + + + + + + + + + actuator + + + + + + + + + + actuator + + + + + + + actuator + + + + + + + + + + actuator + + + + + 你好米思齐 + + + + + + + + + + actuator + + + + + + + actuator + + + + + + + actuator + + + + + 20 + + + + + + + actuator + + + + + + + actuator + + + + + mixly*.mp3 + + + + + + + + + + + i2c_extend + + + + + 4 + + + + + 5 + + + + + 400000 + + + + + + + matrix + + + + + i2c_extend + + + + + + + + + matrix + + + + + + + matrix + + + + + + + + + matrix + + + + + Mixly + + + + + 0 + + + + + + + matrix + + + + + Mixly + + + + + + + matrix + + + + + Mixly + + + + + 50 + + + + + 0 + + + + + + + matrix + + + + + Mixly + + + + + + + matrix + + + + + Mixly + + + + + 500 + + + + + + + + + matrix + + + + + + + + matrix + + + + + + + + + + + + + matrix + + + + + + + + + + matrix + + + + + 1 + + + + + + + matrix + + + + + + + + + + + + + matrix + + + + + + + + + + + + + + + + + matrix + + + + + 0.5 + + + + + + + matrix + + + + + + + matrix + + + + + + + + + + + + disp + + + + + 3 + + + + + 4 + + + + + + + + disp + + + + + 2333 + + + + + + + disp + + + + + + + + + + + + + + disp + + + + + 1 + + + + + + + + + i2c_extend + + + + + 4 + + + + + 5 + + + + + 100000 + + + + + + + lcd + + + + + i2c_extend + + + + + 0x27 + + + + + + + + + + lcd + + + + + Mixly + + + + + 0 + + + + + 0 + + + + + + + lcd + + + + + Mixly + + + + + 0 + + + + + 0 + + + + + 5 + + + + + + + lcd + + + + + + + lcd + + + + + + + + + i2c_extend + + + + + 4 + + + + + 5 + + + + + 100000 + + + + + + + oled + + + + + i2c_extend + + + + + 0x3c + + + + + + + + + + oled + + + + + + + + + + + oled + + + + + + + + + 0 + + + + + 0 + + + + + 1 + + + + + + + oled + + + + + Mixly + + + + + + + oled + + + + + Mixly + + + + + 0 + + + + + 0 + + + + + 1 + + + + + 0 + + + + + + + oled + + + + + Mixly + + + + + + + oled + + + + + Mixly + + + + + 0 + + + + + 5 + + + + + 5 + + + + + 0 + + + + + + + oled + + + + + Mixly + + + + + + + oled + + + + + Mixly + + + + + 5 + + + + + 500 + + + + + + + oled + + + + + 0 + + + + + 0 + + + + + 20 + + + + + + + oled + + + + + 0 + + + + + 0 + + + + + 50 + + + + + 50 + + + + + + + oled + + + + + 20 + + + + + 20 + + + + + 20 + + + + + 15 + + + + + + + oled + + + + + 1 + + + + + + + oled + + + + + 0 + + + + + 0 + + + + + + + oled + + + + + 0 + + + + + 0 + + + + + + + + + + + oled + + + + + + + + + spi + + + + + 1000000 + + + + + 1 + + + + + 2 + + + + + 46 + + + + + + + spi + + + + + 4 + + + + + 5 + + + + + tft_st7789 + + + + + 135 + + + + + 240 + + + + + + + + + + tft_st7789 + + + + + + + + + 0 + + + + + 0 + + + + + 1 + + + + + #ffffff + + + 255,255,0 + + + + + + + tft_st7789 + + + + + Mixly + + + + + 0 + + + + + 0 + + + + + 5 + + + + + 0 + + + + + #ffffff + + + 255,255,0 + + + + + + + tft_st7789 + + + + + Mixly + + + + + 0 + + + + + 5 + + + + + 5 + + + + + 0 + + + + + #ffffff + + + 255,255,0 + + + + + + + tft_st7789 + + + + + Mixly + + + + + 5 + + + + + 500 + + + + + #ffffff + + + 255,255,0 + + + + + + + tft_st7789 + + + + + 0 + + + + + 0 + + + + + 40 + + + + + 40 + + + + + #ffffff + + + 255,255,0 + + + + + + + tft_st7789 + + + + + + + + + + 1 + + + + + 2 + + + + + + + ai_sensor + + + + + + + + + ai_sensor + + + + + 9 + + + + + 8 + + + + + + + ai_sensor + + + + + 255,255,0 + + + + + 0,0,255 + + + + + + + ai_sensor + + + + + 'ni-hao','hong-se','lv-se','lan-se','bai-se','hei-se' + + + + + 0.1 + + + + + + + ai_sensor + + + + + 1.wav + + + + + 5 + + + + + + + ai_sensor + + + + + 1.wav + + + + + 100 + + + + + + + ai_sensor + + + + + info + + + + + ai_sensor + + + + + + + + + + qrcode + + + + + info + + + + + ai_sensor + + + + + + + + + + barcode + + + + + info + + + + + ai_sensor + + + + + + + + + + tag + + + + + info + + + + + ai_sensor + + + + + 2500 + + + + + 25 + + + + + 25 + + + + + + + + + + line + + + + + info + + + + + ai_sensor + + + + + 3500 + + + + + 2 + + + + + 100 + + + + + + + + + + circle + + + + + info + + + + + ai_sensor + + + + + 10000 + + + + + + + + + + rect + + + + + info + + + + + ai_sensor + + + + + + + + + + info + + + + + info + + + + + ai_sensor + + + + + color_lab + + + + + 10 + + + + + 1 + + + + + + + + + + colors + + + + + + + ai_sensor + + + + + '猫','狗','笔记本','笔' + + + + + mixgo + + + + + 5 + + + + + 自模型训练 + + + + + info + + + + + ai_sensor + + + + + '猫','狗','笔记本','笔' + + + + + mixgo + + + + + 自模型识别 + + + + + + + + objects + + + + + info + + + + + ai_sensor + + + + + 0.1606, 0.3562, 0.4712, 0.9568, 0.9877, 1.9108, 1.8761, 3.5310, + 3.4423, 5.6823 + + + + + /sd/masks.kmodel + + + + + 外部模型加载 + + + + + + + + objects + + + + + + + + + 1 + + + + + 2 + + + + + + + ai_sensor + + + + + + + + + ai_sensor + + + + + 9 + + + + + 8 + + + + + + + ai_sensor + + + + + 255,255,0 + + + + + 0,0,255 + + + + + + + ai_sensor + + + + + 1.wav + + + + + 5 + + + + + + + ai_sensor + + + + + 1.wav + + + + + 100 + + + + + + info + + + + + ai_sensor + + + + + + + + + licensePlate + + + + + info + + + + + ai_sensor + + + + + + + + + face + + + + + info + + + + + ai_sensor + + + + + + + + + 20objects + + + + + + + ai_sensor + + + + + info + + + + + ai_sensor + + + + + + + + + + qrcode + + + + + info + + + + + ai_sensor + + + + + + + + + + barcode + + + + + info + + + + + ai_sensor + + + + + + + + + + tag + + + + + info + + + + + ai_sensor + + + + + 2500 + + + + + 25 + + + + + 25 + + + + + + + + + + line + + + + + info + + + + + ai_sensor + + + + + 3500 + + + + + 2 + + + + + 100 + + + + + + + + + + circle + + + + + info + + + + + ai_sensor + + + + + 10000 + + + + + + + + + + rect + + + + + info + + + + + ai_sensor + + + + + + + + + + info + + + + + info + + + + + ai_sensor + + + + + color_lab + + + + + 10 + + + + + 1 + + + + + + + + + + colors + + + + + + + + + + spi + + + + + 46 + + + + + sd + + + + + + + sd + + + + + /sd + + + + + + + + filename.txt + + + + + f + + + + + + + Mixly + + + + + f + + + + + + + f + + + + + + + f + + + + + 0 + + + + + + + f + + + + + + + f + + + + + + + f + + + + + + + + + path + + + + + + + path + + + + + + + filename.txt + + + + + + + srcname.txt + + + + + dstname.txt + + + + + + + + f + + + + + + + f + + + + + 0 + + + + + + + + + + wifiname + + + + + wifipassword + + + + + + + wlan + + + + + + + wlan + + + + + + + wlan + + + + + + + wlan + + + + + + + wlan + + + + + 127.16.0.8 + + + + + 01234567 + + + + + + + wlan + + + + + + + wlan + + + + + + + wlan + + + + + + + wlan + + + + + + + wlan + + + + + mixly + + + + + 12345678 + + + + + 1 + + + + + connect_wifi + + + + + wlan + + + + + AP + + + wlan + + + + + True + + + wlan + + + + + + + wlan + + + + + SmallCabbage + + + + + 123456 + + + + + 1 + + + + + WHILE + + + TRUE + + + EQ + + + 0 + + + wlan + + + + + + + 0.0.0.0 + + + + + + + ms + + + 1000 + + + + + + + + + + + + + + + + + TRUE + + + + + + + s + + + + + + + s + + + + + + + + 0.0.0.0 + + + + + 80 + + + + + + + + + s + + + + + + + + 192.168.0.1 + + + + + 80 + + + + + + + + + s + + + + + 5 + + + + + + + s + + + + + + + s + + + + + + + s + + + + + 1024 + + + + + + + s + + + + + b + + + Mixly + + + + + response + + + + + + + s + + + + + 1024 + + + + + + + s + + + + + b + + + Mixly + + + + + response + + + + + + + + 127.0.0.1 + + + + + 80 + + + + + + + + + s + + + + + + + + ntp.aliyun.com + + + + + + + + response + + + + + http://mixio.mixly.cn + + + + + + + response + + + + + http://mixio.mixly.cn + + + + + + + + + + + + + + response + + + + + + + http://192.168.1.1:11434 + + + + + qwen2.5-coder:0.5b + + + + + 5 + + + + + + + https://api.deepseek.com + + + + + API Key + + + + + deepseek-chat + + + + + 5 + + + + + + + 请介绍一下米思齐? + + + + + content_callback + + + + + + + + content_callback + + + + + content + + + + + + + + + + + + + + 请介绍一下米思齐? + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/webpack.common.js b/boards/default_src/micropython_esp32c5/webpack.common.js new file mode 100644 index 00000000..fe9489b3 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/webpack.common.js @@ -0,0 +1,12 @@ +const path = require("path"); +const common = require("../../../webpack.common"); +const { merge } = require("webpack-merge"); + +module.exports = merge(common, { + resolve: { + alias: { + '@mixly/python': path.resolve(__dirname, '../python'), + '@mixly/micropython': path.resolve(__dirname, '../micropython') + } + } +}); \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/webpack.dev.js b/boards/default_src/micropython_esp32c5/webpack.dev.js new file mode 100644 index 00000000..90d2b91a --- /dev/null +++ b/boards/default_src/micropython_esp32c5/webpack.dev.js @@ -0,0 +1,36 @@ +const path = require("path"); +const common = require("./webpack.common"); +const { merge } = require("webpack-merge"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const ESLintPlugin = require('eslint-webpack-plugin'); + +module.exports = merge(common, { + mode: "development", + devtool: 'source-map', + plugins: [ + new ESLintPlugin({ + context: process.cwd(), + }), + new HtmlWebpackPlugin({ + inject: false, + template: path.resolve(process.cwd(), 'template.xml'), + filename: 'index.xml', + minify: false + }) + ], + devServer: { + https: true, + port: 8080, + host: '0.0.0.0', + hot: false, + static: { + directory: path.join(process.cwd(), '../../../'), + watch: false + }, + devMiddleware: { + index: false, + publicPath: `/boards/default/${path.basename(process.cwd())}`, + writeToDisk: false + } + } +}); \ No newline at end of file diff --git a/boards/default_src/micropython_esp32c5/webpack.prod.js b/boards/default_src/micropython_esp32c5/webpack.prod.js new file mode 100644 index 00000000..0e9f3265 --- /dev/null +++ b/boards/default_src/micropython_esp32c5/webpack.prod.js @@ -0,0 +1,27 @@ +const path = require("path"); +const common = require("./webpack.common"); +const { merge } = require("webpack-merge"); +const TerserPlugin = require("terser-webpack-plugin"); +var HtmlWebpackPlugin = require("html-webpack-plugin"); + +module.exports = merge(common, { + mode: "production", + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + extractComments: false, + }), + new HtmlWebpackPlugin({ + inject: false, + template: path.resolve(process.cwd(), 'template.xml'), + filename: 'index.xml', + minify: { + removeAttributeQuotes: true, + collapseWhitespace: true, + removeComments: true, + } + }) + ] + } +}); \ No newline at end of file