{"version":3,"sources":["webpack:///./src/assets/blockly/blocks/gta_ai_robot_B.js","webpack:///./node_modules/core-js/internals/same-value.js","webpack:///./node_modules/core-js/modules/es.string.search.js","webpack:///./src/assets/blockly/blocks/gta_ai_robot.js"],"names":["Blockly","Blocks","init","this","appendDummyInput","appendField","setOutput","setStyle","setTooltip","setInputsInline","setHelpUrl","Msg","Python","block","code","ORDER_NONE","appendValueInput","setCheck","setAlign","ALIGN_RIGHT","FieldTextInput","setPreviousStatement","setNextStatement","robot","valueToCode","name","getFieldValue","ORDER_FUNCTION_CALL","FieldNumber","lf","lb","rf","rb","timeout","axiosX","axiosY","angle","FieldDropdown","servo","number_red","number_green","number_blue","lowH","lowS","lowV","highH","highS","highV","lowColor","trim","highColor","JSON","parse","h","s","v","pattern","X","Y","module","exports","Object","is","x","y","fixRegExpWellKnownSymbolLogic","anObject","requireObjectCoercible","sameValue","regExpExec","SEARCH","nativeSearch","maybeCallNative","regexp","O","searcher","undefined","call","RegExp","String","res","done","value","rx","S","previousLastIndex","lastIndex","result","index","number_duration","number_on_time","number_off_time","dropdown_on","dropdown_speed","number_timeout_","dropdown_block","number_distance_","number_angle_","value_name","console","log","text_text","text_filename","length","error","dropdown_volume","gta_robot_play_emotion_1","dropdown_emotion","gta_robot_play_emotion_2","gta_robot_play_emotion_3","gta_robot_play_emotion_4","gta_robot_play_emotion_5","gta_robot_play_emotion_6","number_min_size","number_max_size","dropdown_group","number_index","dropdown_index"],"mappings":"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","file":"js/chunk-c9863eb6.14d24617.js","sourcesContent":["/**\n * @override\n * 自定义积木,要采用统一样式,必须在定义积木样式,\n * 设置output:'String/Number/Boolean/...'\n *\n */\nimport Blockly from 'blockly'\n\n// 默认的机器人robot\nBlockly.Blocks['gta_robot'] = {\n init: function() {\n this.appendDummyInput().appendField('robot')\n this.setOutput(true)\n this.setStyle('event_blocks')\n this.setTooltip('')\n this.setInputsInline(true)\n this.setHelpUrl(Blockly.Msg['gta_robot'])\n },\n}\nBlockly.Python['gta_robot'] = function(block) {\n var code = 'robot'\n return [code, Blockly.Python.ORDER_NONE]\n}\n\n// define a robot\nBlockly.Blocks['gta_define_robot_B'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField('请连接一个robot ID')\n .appendField(new Blockly.FieldTextInput(''), 'NAME')\n this.setStyle('event_blocks')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip(\n '在同个局域网内,搜寻STA模式下的机器设备,并建立连接。参数:string类型,指代机器设备的名称(ID)默认值为 \"robot\"。返回无。'\n )\n this.setHelpUrl(Blockly.Msg['gta_define_robot_B'])\n },\n}\n\nBlockly.Python['gta_define_robot_B'] = function(block) {\n var robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var name = block.getFieldValue('NAME')\n var code = `${robot} = RobotX('${name}')\\n`\n return code\n}\n\n// 断开机器人连接\nBlockly.Blocks['gta_robot_B_close'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField('断开连接')\n this.setStyle('event_blocks')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip('断开机器人连接。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_B_close'])\n },\n}\nBlockly.Python['gta_robot_B_close'] = function(block) {\n var robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var name = block.getFieldValue('NAME')\n var code = `${robot}.close()\\n`\n return code\n}\n\n// 获取机器人电量\nBlockly.Blocks['gta_robot_B_get_battery'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField(' 获取电量')\n this.setStyle('event_blocks')\n this.setOutput(true)\n this.setTooltip('获取机器人电量。无参数。返回:0~100;返回剩余电量百分比。')\n this.setHelpUrl(Blockly.Msg['gta_robot_B_get_battery'])\n },\n}\nBlockly.Python['gta_robot_B_get_battery'] = function(block) {\n var robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var name = block.getFieldValue('NAME')\n var code = `${robot}.get_battery()`\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n// 获取机器人序列号\nBlockly.Blocks['gta_robot_B_get_sn'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField(' 获取序列号')\n this.setStyle('event_blocks')\n this.setOutput(true)\n this.setTooltip('获取机器人序列号。无参数。返回:SN字符串。')\n this.setHelpUrl(Blockly.Msg['gta_robot_B_get_sn'])\n },\n}\nBlockly.Python['gta_robot_B_get_sn'] = function(block) {\n var robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var name = block.getFieldValue('NAME')\n var code = `${robot}.get_sn()`\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n// 获取机器人固件版本号\nBlockly.Blocks['gta_robot_B_get_version'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField(' 获取固件版本号')\n this.setStyle('event_blocks')\n this.setOutput(true)\n this.setTooltip('获取机器人固件版本号。无参数。返回:固件版本号。')\n this.setHelpUrl(Blockly.Msg['gta_robot_B_get_version'])\n },\n}\n\nBlockly.Python['gta_robot_B_get_version'] = function(block) {\n var robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var code = `${robot}.get_version()`\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n/**\n * 轮Chassis模块\n * */\n\n// 设置麦轮速度\nBlockly.Blocks['gta_robot_B_drive_wheels'] = {\n init: function() {\n this.appendDummyInput()\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField(' 麦轮速度:')\n .appendField(' 左前轮 ')\n .appendField(new Blockly.FieldNumber(0, -100, 100, 1), 'lf')\n .appendField(' 左后轮 ')\n .appendField(new Blockly.FieldNumber(0, -100, 100, 1), 'lb')\n .appendField(' 右前轮 ')\n .appendField(new Blockly.FieldNumber(0, -100, 100, 1), 'rf')\n .appendField(' 右后轮 ')\n .appendField(new Blockly.FieldNumber(0, -100, 100, 1), 'rb')\n .appendField(' ')\n .appendField(new Blockly.FieldNumber(10), 'timeout')\n .appendField('秒停止运动')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('drive_blocks')\n this.setTooltip(\n '设置不同速度可以实现前进、后退、旋转、平移等运动。参数:左前轮速度、左后轮速度、右前轮速度、右后轮速度、几秒后停止运动。返回:设置成功返回True,失败返回False。'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_drive_wheels'])\n },\n}\n\nBlockly.Python['gta_robot_B_drive_wheels'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n let lf = block.getFieldValue('lf')\n let lb = block.getFieldValue('lb')\n let rf = block.getFieldValue('rf')\n let rb = block.getFieldValue('rb')\n let timeout = block.getFieldValue('timeout')\n\n var code = `${robot}.chassis.drive_wheels(lf=${lf}, lb=${lb}, rf=${rf}, rb=${rb}, timeout=${timeout})\\n`\n return code\n}\n\n// 设置路径规划。\nBlockly.Blocks['gta_robot_B_chassis_move'] = {\n init: function() {\n this.appendDummyInput()\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField('运动路径:')\n .appendField(' 向X轴运动')\n .appendField(new Blockly.FieldNumber(0, -160, 160, 1), 'axiosX')\n .appendField('厘米 向Y轴运动')\n .appendField(new Blockly.FieldNumber(0, -160, 160, 1), 'axiosY')\n .appendField('厘米 旋转')\n .appendField(new Blockly.FieldNumber(0, -180, 180, 1), 'angle')\n .appendField('角度')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('drive_blocks')\n this.setTooltip(\n '设置路径规划。当前位置为原点,向X轴运动(0)厘米,向Y轴运动(0)厘米,然后旋转(0)角度。参数:1.向X轴运动(0)厘米,整数类型,-160~160;2.向Y轴运动厘米,整数类型,-160~160;3.旋转()角度,整数类型,-180~180。无返回。'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_chassis_move'])\n },\n}\n\nBlockly.Python['gta_robot_B_chassis_move'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n let axiosX = block.getFieldValue('axiosX')\n let axiosY = block.getFieldValue('axiosY')\n let angle = block.getFieldValue('angle')\n\n var code = `${robot}.chassis.move(x=${axiosX},y=${axiosY}, a=${angle})\\n`\n return code\n}\n\n/**\n * 臂Arm模块\n * */\n\n// 机械臂回到初始位置\nBlockly.Blocks['gta_robot_B_arm_recenter'] = {\n init: function() {\n this.appendDummyInput()\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField(' 机械臂回到初始位置')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip(\n '机械臂回到初始位置;bool :回中完成返回True,否则返回False;初始位置坐标点为(12,15)。'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_arm_recenter'])\n },\n}\n\nBlockly.Python['gta_robot_B_arm_recenter'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var code = `${robot}.arm.recenter()\\n`\n return code\n}\n// 移动机械臂到绝对位置:X()Y()\nBlockly.Blocks['gta_robot_B_arm_move_to'] = {\n init: function() {\n this.appendDummyInput()\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField(' 机械臂移动到 x')\n .appendField(new Blockly.FieldNumber(12, 12, 18, 1), 'axiosX')\n .appendField(' y')\n .appendField(new Blockly.FieldNumber(15, 3, 19, 1), 'axiosY')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip(\n '移动机械臂到绝对位置:X()Y()。X轴取值范围为12~18的整数值;Y轴取值范围为3~19的整数值;但是由于机器臂的动作的局限,机械臂移动不到在X、Y活动区间的一些的位置,比如机器臂可能移动不到(13,18)位置。'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_arm_move_to'])\n },\n}\n\nBlockly.Python['gta_robot_B_arm_move_to'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n let axiosX = block.getFieldValue('axiosX')\n let axiosY = block.getFieldValue('axiosY')\n\n var code = `${robot}.arm.move_to(x=${axiosX},y=${axiosY})\\n`\n return code\n}\n\n/**\n * 夹Gripper模块\n * */\n\n// 获取机械手状态\nBlockly.Blocks['gta_robot_B_gripper_get_status'] = {\n init: function() {\n this.appendDummyInput()\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField(' 获取机械手状态')\n this.setInputsInline(true)\n this.setOutput(true)\n this.setStyle('posture_blocks')\n this.setTooltip(\n '获取机械手状态。返回:a.int :0:完全张开, 1:完全闭合, 2:中间状态;b. bool :False:异常。'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_gripper_get_status'])\n },\n}\n\nBlockly.Python['gta_robot_B_gripper_get_status'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n\n var code = `${robot}.gripper.get_status()`\n return [code, Blockly.Python.ORDER_NONE]\n}\n\n// 机械手闭合\nBlockly.Blocks['gta_robot_B_gripper_close'] = {\n init: function() {\n this.appendDummyInput()\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField(' 机械手闭合')\n\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip(\n '机械手闭合。参数:无。返回bool :机械手关闭为True,否则为False'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_gripper_close'])\n },\n}\n\nBlockly.Python['gta_robot_B_gripper_close'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n\n var code = `${robot}.gripper.close()\\n`\n return code\n}\n\n// 机械手打开\nBlockly.Blocks['gta_robot_B_gripper_open'] = {\n init: function() {\n this.appendDummyInput()\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField(' 机械手打开')\n\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip(\n '机械手打开。参数:无。返回bool :机械手打开为True,否则为False'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_gripper_open'])\n },\n}\n\nBlockly.Python['gta_robot_B_gripper_open'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n\n var code = `${robot}.gripper.open()\\n`\n return code\n}\n\n/**\n * 舵机Servo模块\n * */\n\n// 获取舵机角度值\nBlockly.Blocks['gta_robot_B_servo_get_angle'] = {\n init: function() {\n this.appendDummyInput()\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField(' 获取舵机角度值')\n .appendField(\n new Blockly.FieldDropdown([\n ['左舵机', '0'],\n ['右舵机', '1'],\n ]),\n 'angle'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip('获取舵机角度值。返回: int :舵机角度')\n this.setHelpUrl(Blockly.Msg['gta_robot_B_servo_get_angle'])\n },\n}\n\nBlockly.Python['gta_robot_B_servo_get_angle'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var angle = block.getFieldValue('angle')\n var code = `${robot}.servo.get_angle(id=${angle})`\n return code\n}\n\n// 舵机旋转\nBlockly.Blocks['gta_robot_B_servo_move_to'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField(' 舵机旋转')\n .appendField(\n new Blockly.FieldDropdown([\n ['左舵机:(85,180]', '0'],\n ['右舵机:[0,100)', '1'],\n ]),\n 'servo'\n )\n .appendField(' 旋转')\n .appendField(new Blockly.FieldNumber(0, 0, 180, 1), 'angle')\n .appendField(' °')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip(\n '旋转舵机。参数:a.左舵机:旋转范围范围(85,180];b.右舵机,范围0~110; 返回bool :移动成功返回 True, 否则返回 False'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_servo_move_to'])\n },\n}\n\nBlockly.Python['gta_robot_B_servo_move_to'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var servo = block.getFieldValue('servo')\n var angle = block.getFieldValue('angle')\n var code = `${robot}.servo.move_to(id=${servo},angle=${angle})\\n`\n return code\n}\n\n/**\n * 灯LED模块 -舍弃\n * */\n\n// 开启RGB灯光\nBlockly.Blocks['gta_robot_B_led_set_led'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField('开启RGB灯光:')\n .appendField(new Blockly.FieldNumber(0, 0, 255, 1), 'RED')\n .appendField(new Blockly.FieldNumber(0, 0, 255, 1), 'GREEN')\n .appendField(new Blockly.FieldNumber(0, 0, 255, 1), 'BLUE')\n this.setStyle('light_blocks')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip(\n '开启RGB灯光。返回bool : 设置成功返回 True, 设置失败返回 False'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_led_set_led'])\n },\n}\n\nBlockly.Python['gta_robot_B_led_set_led'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var number_red = block.getFieldValue('RED')\n var number_green = block.getFieldValue('GREEN')\n var number_blue = block.getFieldValue('BLUE')\n var code = `${robot}.led.set_led(color=(${number_red},${number_green},${number_blue}))\\n`\n return code\n}\n\n/**\n * 摄像头Camera模块\n * */\n\n// 打开摄像头-功能:在主程序运行过程中开启服务,并持续显示图像\nBlockly.Blocks['gta_robot_B_display_video'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField('打开摄像头')\n this.setStyle('robot_B_camera')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip('主程序运行过程中开启服务,持续显示图像。')\n this.setHelpUrl(Blockly.Msg['gta_robot_B_display_video'])\n },\n}\n\nBlockly.Python['gta_robot_B_display_video'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var code = `${robot}.display_video()\\n`\n return code\n}\n\n// 获取摄像头图像\nBlockly.Blocks['gta_robot_B_get_camera_image'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField('获取摄像头图像')\n this.setStyle('robot_B_camera')\n // this.setPreviousStatement(true, null)\n // this.setNextStatement(true, null)\n this.setOutput(true)\n this.setTooltip(\n '获取当前摄像头的图像,返回网络图片地址。参数:无。返回:网络地址URL'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_get_camera_image'])\n },\n}\n\nBlockly.Python['gta_robot_B_get_camera_image'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var code = `${robot}.get_camera_image()`\n return [code, Blockly.Python.ORDER_NONE]\n}\n\n/**\n * 技能Skill模块\n * */\n// 检测色块:\nBlockly.Blocks['gta_robot_B_detect_color_blob'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField('检测色块: 下边界')\n this.appendValueInput('LOW')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField(' 上边界')\n this.appendValueInput('HIGH')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(0, 1), 'timeout')\n this.setStyle('robot_B_skill')\n // this.setPreviousStatement(true, null)\n // this.setNextStatement(true, null)\n this.setOutput(true)\n this.setTooltip(\n '检测图像中是否有指定HSV范围内的色块的线段,如有则返回True 和数组[X1,Y1,X2,Y2](指代线段起点坐标与终点坐标)。参数:下边界:HSV颜色值,上边界:HSV颜色值,停止:几秒后停止'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_detect_color_blob'])\n },\n}\n\nBlockly.Python['gta_robot_B_detect_color_blob'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n let lowColor = Blockly.Python.valueToCode(\n block,\n 'LOW',\n Blockly.Python.ORDER_NONE\n ).trim()\n let highColor = Blockly.Python.valueToCode(\n block,\n 'HIGH',\n Blockly.Python.ORDER_NONE\n )\n\n let lowH, lowS, lowV, highH, highS, highV\n lowH = lowS = lowV = highH = highS = highV = 0\n\n if (lowColor && typeof lowColor == 'string' && lowColor != '...') {\n lowColor = JSON.parse(lowColor)\n lowH = lowColor.h\n lowS = lowColor.s\n lowV = lowColor.v\n }\n if (highColor && typeof highColor == 'string' && highColor != '...') {\n highColor = JSON.parse(highColor)\n highH = highColor.h\n highS = highColor.s\n highV = highColor.v\n }\n var timeout = block.getFieldValue('timeout')\n var code = `${robot}.skill.detect_color_blob(hsv_low=(${lowH}, ${lowS}, ${lowV}),hsv_high=(${highH}, ${highS}, ${highV}),timeout=${timeout})\\n`\n return [code, Blockly.Python.ORDER_NONE]\n\n}\n\n// HSV色块:\nBlockly.Blocks['gta_robot_hsv'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('HSV色块: H')\n .appendField(new Blockly.FieldNumber(0, 0, 360, 1), 'h')\n .appendField(' S')\n .appendField(new Blockly.FieldNumber(0, 0, 100, 1), 's')\n .appendField(' V')\n .appendField(new Blockly.FieldNumber(0, 0, 100, 1), 'v')\n this.setInputsInline(true)\n this.setStyle('robot_B_skill')\n this.setOutput(true)\n this.setTooltip(\n 'HSV色块,输出hsv颜色值。参数H色调、S饱和度、V明度。输出HSV值'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_hsv'])\n },\n}\n\nBlockly.Python['gta_robot_hsv'] = function(block) {\n var h = block.getFieldValue('h')\n var s = block.getFieldValue('s')\n var v = block.getFieldValue('v')\n var code = `{\"h\":${h},\"s\":${s},\"v\":${v}}`\n return [code, Blockly.Python.ORDER_NONE]\n}\n\n// 自动巡线\nBlockly.Blocks['gta_robot_B_move_along_line'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput().appendField('自动巡线')\n this.setStyle('robot_B_skill')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip(\n '自动巡线。参数:无。返回bool :巡线结束返回True,异常返回False'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_move_along_line'])\n },\n}\n\nBlockly.Python['gta_robot_B_move_along_line'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n var code = `${robot}.skill.move_along_line()\\n`\n return code\n}\n\n// 检测图案\nBlockly.Blocks['gta_robot_B_detect_pattern'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField('检测图案 ')\n .appendField(' 图案')\n .appendField(new Blockly.FieldTextInput('A'), 'pattern')\n .appendField(' ')\n .appendField(new Blockly.FieldNumber(0), 'timeout')\n .appendField('秒后停止')\n this.setStyle('robot_B_skill')\n // this.setPreviousStatement(true, null)\n // this.setNextStatement(true, null)\n this.setOutput(true)\n this.setTooltip(\n \"检测图案。参数:a.图案:支持图案'A'-'Z','0'~'9',b.几秒后停止。返回bool :检测到指定图案返回True,未检测到返回False\"\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_detect_pattern'])\n },\n}\n\nBlockly.Python['gta_robot_B_detect_pattern'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n let pattern = block.getFieldValue('pattern')\n let timeout = block.getFieldValue('timeout')\n var code = `${robot}.skill.detect_pattern(id='${pattern}', timeout=${timeout})`\n return [code, Blockly.Python.ORDER_NONE]\n}\n\n// 移动至图案(A)前方指定位置X(0)Y(13)\nBlockly.Blocks['gta_robot_B_move_to_pattern'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField('移动至图案前指定位置 ')\n .appendField(' 图案')\n .appendField(new Blockly.FieldTextInput('A'), 'pattern')\n .appendField(' X')\n .appendField(new Blockly.FieldNumber(30, -30, 30, 1), 'X')\n .appendField(' Y')\n .appendField(new Blockly.FieldNumber(0, -13, 60, 1), 'Y')\n this.setStyle('robot_B_skill')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip(\n \"移动至图案前指定位置。参数:a.图案:支持图案'A'-'Z','0'~'9',b. X:停止时,图案中心线与机器人中心线左右距离,单位cm,-30~30,整数值;c. Y:停止时,图案处于机器人摄像头平面前方距离,单位cm,-13~60,整数值;d.几秒后停止;返回bool :成功移动到图案前指定位置返回True,失败返回False\"\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_B_move_to_pattern'])\n },\n}\n\nBlockly.Python['gta_robot_B_move_to_pattern'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n let pattern = block.getFieldValue('pattern')\n let X = block.getFieldValue('X')\n let Y = block.getFieldValue('Y')\n var code = `${robot}.skill.move_to_pattern(id='${pattern}',x=${X},y=${Y})\\n`\n return code\n}\n\n// 检测人脸\nBlockly.Blocks['gta_robot_B_detect_face'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField('检测人脸 ')\n .appendField(new Blockly.FieldNumber(0), 'timeout')\n .appendField('秒后停止')\n this.setStyle('robot_B_skill')\n // this.setPreviousStatement(true, null)\n // this.setNextStatement(true, null)\n this.setOutput(true)\n this.setTooltip('检测人脸。参数:几秒后停止。')\n this.setHelpUrl(Blockly.Msg['gta_robot_B_detect_face'])\n },\n}\n\nBlockly.Python['gta_robot_B_detect_face'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n let timeout = block.getFieldValue('timeout')\n var code = `${robot}.skill.detect_face(timeout=${timeout})`\n return [code, Blockly.Python.ORDER_NONE]\n}\n\n// 检测二维码,(1)秒后停止\nBlockly.Blocks['gta_robot_B_detect_qrcode'] = {\n init: function() {\n this.appendValueInput('ROBOT')\n .setCheck(null)\n .setAlign(Blockly.ALIGN_RIGHT)\n this.appendDummyInput()\n .appendField('检测二维码 ')\n .appendField(new Blockly.FieldNumber(0, 0), 'timeout')\n .appendField('秒后停止')\n this.setStyle('robot_B_skill')\n // this.setPreviousStatement(true, null)\n // this.setNextStatement(true, null)\n this.setOutput(true)\n this.setTooltip('检测二维码。参数:几秒后停止。')\n this.setHelpUrl(Blockly.Msg['gta_robot_B_detect_qrcode'])\n },\n}\n\nBlockly.Python['gta_robot_B_detect_qrcode'] = function(block) {\n let robot = Blockly.Python.valueToCode(\n block,\n 'ROBOT',\n Blockly.Python.ORDER_NONE\n )\n let timeout = block.getFieldValue('timeout')\n var code = `${robot}.skill.detect_qrcode(timeout=${timeout})`\n return [code, Blockly.Python.ORDER_NONE]\n}\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","/**\n * @override\n * 自定义积木,要采用统一样式,必须在定义积木样式,\n * 设置output:'String/Number/Boolean/...'\n *\n */\nimport Blockly from 'blockly'\n// define a robot\nBlockly.Blocks['gta_define_robot'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('请连接一个robot ID')\n .appendField(new Blockly.FieldTextInput('robot'), 'NAME')\n this.setStyle('event_blocks')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip('在同个局域网内,搜寻STA模式下的机器设备,并建立连接。参数:string类型,指代机器设备的名称(ID)默认值为 \"robot\"。返回无。')\n this.setHelpUrl(Blockly.Msg['gta_define_robot'])\n },\n}\n\nBlockly.Python['gta_define_robot'] = function(block) {\n var name = block.getFieldValue('NAME')\n var code = `robot = Robot('${name}')\\n`\n return code\n}\n\n\n// 设置灯光的rgb颜色\nBlockly.Blocks['gta_set_light_color'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('设置rgb颜色: r')\n .appendField(new Blockly.FieldNumber(0, 0, 255, 1), 'RED')\n .appendField(' g')\n .appendField(new Blockly.FieldNumber(0, 0, 255, 1), 'GREEN')\n .appendField(' b')\n .appendField(new Blockly.FieldNumber(0, 0, 255, 1), 'BLUE')\n this.setStyle('light_blocks')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip('设置灯光颜色。参数:rgb颜色数值,值范围0~255。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_set_light_color'])\n },\n}\n\nBlockly.Python['gta_set_light_color'] = function(block) {\n var number_red = block.getFieldValue('RED')\n var number_green = block.getFieldValue('GREEN')\n var number_blue = block.getFieldValue('BLUE')\n var code = `robot.set_light_color(r=${number_red},g=${number_green},b=${number_blue})\\n`\n return code\n}\n\n// 灯光配置:常亮模式\nBlockly.Blocks['gta_set_light_mode_on'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('常亮模式:')\n .appendField(' 持续时间')\n .appendField(new Blockly.FieldNumber(0, 0, 30000, 1), 'duration')\n .appendField('ms')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('light_blocks')\n this.setTooltip('配置灯光的闪烁方式和持续时间。常亮状态持续指定时间。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_set_light_mode_on'])\n },\n}\n\nBlockly.Python['gta_set_light_mode_on'] = function(block) {\n // var dropdown_name = block.getFieldValue('NAME')\n var number_duration = block.getFieldValue('duration')\n var code = `robot.set_light_mode(mode='on', duration=${number_duration})\\n`\n return code\n}\n\n// 灯光配置:闪烁模式\nBlockly.Blocks['gta_set_light_mode_blink'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('闪烁模式:')\n .appendField(' 持续时间')\n .appendField(new Blockly.FieldNumber(0, 0, 30000, 1), 'duration')\n .appendField('ms')\n .appendField(' 亮灯间隔')\n .appendField(new Blockly.FieldNumber(0, 0, 10000, 1), 'on_time')\n .appendField('ms')\n .appendField(' 熄灭间隔')\n .appendField(new Blockly.FieldNumber(0, 0, 10000, 1), 'off_time')\n .appendField('ms')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('light_blocks')\n this.setTooltip('配置灯光的闪烁方式和持续时间。闪烁状态持续指定时间,点亮指定时间,熄灭指定时间。参数:持续时间(0)ms,0~30000; 默认值:0。亮灯间隔(0)ms,0~30000; 默认值:0。熄灭间隔(0)ms,0~30000; 默认值:0;。')\n this.setHelpUrl(Blockly.Msg['gta_set_light_mode_blink'])\n },\n}\n\nBlockly.Python['gta_set_light_mode_blink'] = function(block) {\n var number_duration = block.getFieldValue('duration')\n var number_on_time = block.getFieldValue('on_time')\n var number_off_time = block.getFieldValue('off_time')\n\n var code = `robot.set_light_mode(mode='blink', duration=${number_duration}, on_time=${number_on_time}, off_time=${number_off_time})\\n`\n return code\n}\n// 灯光配置:闪烁模式\nBlockly.Blocks['gta_set_light_mode_breathe'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('渐变模式:')\n .appendField(' 持续时间')\n .appendField(new Blockly.FieldNumber(0, 0, 30000, 1), 'duration')\n .appendField('ms')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('light_blocks')\n this.setTooltip('配置灯光的闪烁方式和持续时间。渐变呼吸状态持续指定时间。参数:持续时间(0)ms。;0~30000; 默认值:0。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_set_light_mode_breathe'])\n },\n}\n\nBlockly.Python['gta_set_light_mode_breathe'] = function(block) {\n var number_duration = block.getFieldValue('duration')\n var code = `robot.set_light_mode(mode='breathe', duration=${number_duration})\\n`\n return code\n}\n\n// 启动灯光 或 熄灭灯光。\nBlockly.Blocks['gta_light_on_of'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('灯光')\n .appendField(\n new Blockly.FieldDropdown([\n ['启动', 'on'],\n ['关闭', 'off'],\n ]),\n 'ON'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('light_blocks')\n this.setTooltip('启动灯光 或 熄灭灯光。选项:灯光(启动)、灯光(关闭)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_light_on_of'])\n },\n}\n\nBlockly.Python['gta_light_on_of'] = function(block) {\n var dropdown_on = block.getFieldValue('ON')\n var code = dropdown_on == 'on' ? `robot.light_on()\\n` : `robot.light_off()\\n`\n return code\n}\n\n/**\n * motions组件\n * */\n\n// 定向运动\nBlockly.Blocks['gta_move_in_open_loop'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('定向运动:')\n .appendField('速度')\n .appendField(\n new Blockly.FieldDropdown([\n ['前进2挡', '-2'],\n ['前进1挡', '-1'],\n ['后退1挡', '1'],\n ['后退2挡', '2'],\n ]),\n 'SPEED'\n )\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(0, 0, 10000, 1), 'timeout ')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('drive_blocks')\n this.setTooltip('控制机器车轮运行。开环方式,以规定速度运行,指定时间后停止。参数:速度前进挡、速度后退档。')\n this.setHelpUrl(Blockly.Msg['gta_move_in_open_loop'])\n },\n}\n\nBlockly.Python['gta_move_in_open_loop'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_timeout_ = block.getFieldValue('timeout ')\n var dropdown_block = block.getFieldValue('block')\n\n // TODO: Assemble Python into code variable.\n var code = `robot.move_in_open_loop(speed=${dropdown_speed}, timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n// 定距运动\nBlockly.Blocks['gta_straight_move'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('定距运动:')\n .appendField(\n new Blockly.FieldDropdown([\n ['慢速', '1'],\n ['常速', '2'],\n ['快速', '3'],\n ]),\n 'SPEED'\n )\n .appendField(' 距离')\n .appendField(new Blockly.FieldNumber(0, -1000, 1000, 1), 'distance')\n .appendField('mm')\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(0, 0, 10000, 1), 'timeout')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('drive_blocks')\n this.setTooltip('控制机器车轮运行。开环方式,以规定速度运行指定距离,超过指定时间后停止。参数:速度(慢速、常速、快速);距离;停止时间、是否阻塞(auto/never/all)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_straight_move'])\n },\n}\n\nBlockly.Python['gta_straight_move'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_distance_ = block.getFieldValue('distance')\n var number_timeout_ = block.getFieldValue('timeout')\n var dropdown_block = block.getFieldValue('block')\n // TODO: Assemble Python into code variable.\n var code = `robot.straight_move(speed=${dropdown_speed},distance=${number_distance_}, timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n// 闭环车轮运动 -转角运动\nBlockly.Blocks['gta_robot_turn'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('转角运动:')\n .appendField('速度挡')\n .appendField(\n new Blockly.FieldDropdown([\n ['1', '1'],\n ['2', '2'],\n ['3', '3'],\n ]),\n 'SPEED'\n )\n .appendField(' 转弯')\n .appendField(new Blockly.FieldNumber(0, -360, 360, 1), 'angle')\n .appendField('°')\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(0, 0, 10000, 1), 'timeout')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('drive_blocks')\n this.setTooltip('控制机器车轮转弯。闭环控制,以规定速度精确转动指定角度,超过指定时间后停止。参数:速度挡(1挡、2挡、3挡);转弯, -360°~360°;停止时间ms,0~10000ms;是否阻塞(auto/never/all)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_turn'])\n },\n}\n\nBlockly.Python['gta_robot_turn'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_angle_ = block.getFieldValue('angle')\n var number_timeout_ = block.getFieldValue('timeout')\n var dropdown_block = block.getFieldValue('block')\n // TODO: Assemble Python into code variable.\n var code = `robot.turn(speed=${dropdown_speed},angle=${number_angle_}, timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n// 小臂运动 开环方式,以时间为停止标志。\nBlockly.Blocks['gta_forearm_move_in_open_loop'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('小臂运动: ')\n .appendField('速度')\n .appendField(\n new Blockly.FieldDropdown([\n ['向外伸展2挡', '2'],\n ['向外伸展1挡', '1'],\n ['向内收缩2挡', '-2'],\n ['向内收缩1挡', '-1'],\n ]),\n 'SPEED'\n )\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(0, 0, 10000, 1), 'timeout')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip('控制小臂运行。开环方式,以规定速度运行,指定时间后停止。参数:速度(向外伸展2挡、1挡、向内收缩2挡、1挡);停止时间(0)ms,0~10000;是否阻塞(auto/never/all)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_forearm_move_in_open_loop'])\n },\n}\n\nBlockly.Python['gta_forearm_move_in_open_loop'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_timeout_ = block.getFieldValue('timeout')\n var dropdown_block = block.getFieldValue('block')\n // TODO: Assemble Python into code variable.\n var code = `robot.forearm_move_in_open_loop(speed=${dropdown_speed},timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n//小臂运行角度\nBlockly.Blocks['gta_forearm_move'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('小臂运行角度:')\n .appendField(\n new Blockly.FieldDropdown([\n ['慢速', '1'],\n ['常速', '2'],\n ['快速', '3'],\n ]),\n 'SPEED'\n )\n .appendField(' 运行角度')\n .appendField(new Blockly.FieldNumber(0, 0, 210, 0), 'angle')\n .appendField('°')\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(5000, 0, 10000, 1), 'timeout')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip('控制小臂运行。开环方式,以规定速度运行规定角度,指定时间后停止。参数:速度(慢速、常速、快速);停止时间(0)ms,0~10000;是否阻塞(auto/never/all)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_forearm_move'])\n },\n}\n\nBlockly.Python['gta_forearm_move'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_angle_ = block.getFieldValue('angle')\n var number_timeout_ = block.getFieldValue('timeout')\n var dropdown_block = block.getFieldValue('block')\n // TODO: Assemble Python into code variable.\n var code = `robot.forearm_move(speed=${dropdown_speed},angle=${number_angle_}, timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n// 大臂运动 开环方式,以时间为停止标志。\nBlockly.Blocks['gta_arm_move_in_open_loop'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('大臂运动: ')\n .appendField('速度挡')\n .appendField(\n new Blockly.FieldDropdown([\n ['向前伸展2挡', '2'],\n ['向前伸展1挡', '1'],\n ['向后伸展2挡', '-2'],\n ['向后伸展1挡', '-1'],\n ]),\n 'SPEED'\n )\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(0, 0, 10000, 1), 'timeout')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip('控制大臂运行。开环方式,以规定速度运行,指定时间后停止。参数:速度(向前伸展2挡、向前伸展1挡、向前伸展2挡、向前伸展1挡);停止时间(0)ms,0~10000;是否阻塞(auto/never/all)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_arm_move_in_open_loop'])\n },\n}\n\nBlockly.Python['gta_arm_move_in_open_loop'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_timeout_ = block.getFieldValue('timeout')\n var dropdown_block = block.getFieldValue('block')\n // TODO: Assemble Python into code variable.\n var code = `robot.arm_move_in_open_loop(speed=${dropdown_speed},timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n//大臂运行角度\nBlockly.Blocks['gta_arm_move'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('大臂运行角度:')\n .appendField(\n new Blockly.FieldDropdown([\n ['慢速', '1'],\n ['常速', '2'],\n ['快速', '3'],\n ]),\n 'SPEED'\n )\n .appendField(' 运行角度')\n .appendField(new Blockly.FieldNumber(0, 0, 160, 1), 'angle')\n .appendField('°')\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(5000, 0, 10000, 1), 'timeout')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip('控制大臂运行。开环方式,以规定速度运行规定角度,指定时间后停止。参数:速度(慢速、常速、快速);运行角度(0)°, 0~160°;停止时间(0)ms,0~10000;是否阻塞(auto/never/all)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_arm_move'])\n },\n}\n\nBlockly.Python['gta_arm_move'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_angle_ = block.getFieldValue('angle')\n var number_timeout_ = block.getFieldValue('timeout')\n var dropdown_block = block.getFieldValue('block')\n // TODO: Assemble Python into code variable.\n var code = `robot.arm_move(speed=${dropdown_speed},angle=${number_angle_}, timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n// 头部运动 开环方式,以时间为停止标志。\nBlockly.Blocks['gta_head_move_in_open_loop'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('头部运动: ')\n .appendField('速度挡')\n .appendField(\n new Blockly.FieldDropdown([\n ['向下伸展2挡', '-2'],\n ['向下伸展1挡', '-1'],\n ['向上伸展2挡', '2'],\n ['向上伸展1挡', '1'],\n ]),\n 'SPEED'\n )\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(0, 0, 10000, 1), 'timeout')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip('控制头部运行。开环方式,以规定速度运行,指定时间后停止。参数:速度(向下伸展2挡、向下伸展1挡、向上伸展2挡、向上伸展1挡);停止时间(0)ms,0~10000;是否阻塞(auto/never/all)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_head_move_in_open_loop'])\n },\n}\n\nBlockly.Python['gta_head_move_in_open_loop'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_timeout_ = block.getFieldValue('timeout')\n var dropdown_block = block.getFieldValue('block')\n // TODO: Assemble Python into code variable.\n var code = `robot.head_move_in_open_loop(speed=${dropdown_speed},timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n//头部运行角度\nBlockly.Blocks['gta_head_move'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('头部运行角度:')\n .appendField(\n new Blockly.FieldDropdown([\n ['慢速', '1'],\n ['常速', '2'],\n ['快速', '3'],\n ]),\n 'SPEED'\n )\n .appendField(' 运行角度')\n .appendField(new Blockly.FieldNumber(0, -15, 65, 1), 'angle')\n .appendField('°')\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(2000, 0, 10000, 1), 'timeout')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip('控制头部运行。开环方式,以规定速度运行规定角度,指定时间后停止。参数:速度(慢速、常速、快速);运行角度(0)°, 0~160°;停止时间(0)ms,0~10000;是否阻塞(auto/never/all)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_head_move'])\n },\n}\n\nBlockly.Python['gta_head_move'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_angle_ = block.getFieldValue('angle')\n var number_timeout_ = block.getFieldValue('timeout')\n var dropdown_block = block.getFieldValue('block')\n // TODO: Assemble Python into code variable.\n var code = `robot.head_move(speed=${dropdown_speed},angle=${number_angle_}, timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n// 手抓运动 开环方式,以时间为停止标志。\nBlockly.Blocks['gta_paw_move_in_open_loop'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('手抓运动: ')\n .appendField('速度挡')\n .appendField(\n new Blockly.FieldDropdown([\n ['向外张开2挡', '-2'],\n ['向外张开1挡', '-1'],\n ['向内收缩2挡', '2'],\n ['向内收缩1挡', '1'],\n ]),\n 'SPEED'\n )\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(0, 0, 10000, 1), 'timeout')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip('控制手抓运行。开环方式,以规定速度运行,指定时间后停止。参数:速度(向外张开2挡、向外张开1挡、向内收缩2挡、向内收缩1挡);停止时间(0)ms,0~10000ms;是否阻塞(auto/never/all)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_paw_move_in_open_loop'])\n },\n}\n\nBlockly.Python['gta_paw_move_in_open_loop'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_timeout_ = block.getFieldValue('timeout')\n var dropdown_block = block.getFieldValue('block')\n // TODO: Assemble Python into code variable.\n var code = `robot.paw_move_in_open_loop(speed=${dropdown_speed},timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n//手抓运行角度:\nBlockly.Blocks['gta_paw_move'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('手抓运行角度:')\n .appendField(\n new Blockly.FieldDropdown([\n ['慢速', '1'],\n ['常速', '2'],\n ['快速', '3'],\n ]),\n 'SPEED'\n )\n .appendField(' 运行角度')\n .appendField(new Blockly.FieldNumber(0, 0, 100, 1), 'angle')\n .appendField('°')\n .appendField(' 停止时间')\n .appendField(new Blockly.FieldNumber(2000, 0, 10000, 1), 'timeout')\n .appendField('ms')\n .appendField('是否阻塞')\n .appendField(\n new Blockly.FieldDropdown([\n ['auto', 'auto'],\n ['never', 'never'],\n ['all', 'all'],\n ]),\n 'block'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('posture_blocks')\n this.setTooltip('控制手抓运行。开环方式,以规定速度运行规定角度,指定时间后停止。参数:速度(慢速、常速、快速);运行角度(0)°, 0~160°;停止时间(0)ms,0~10000 ms;是否阻塞(auto/never/all)。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_paw_move'])\n },\n}\n\nBlockly.Python['gta_paw_move'] = function(block) {\n var dropdown_speed = block.getFieldValue('SPEED')\n var number_angle_ = block.getFieldValue('angle')\n var number_timeout_ = block.getFieldValue('timeout')\n var dropdown_block = block.getFieldValue('block')\n // TODO: Assemble Python into code variable.\n var code = `robot.paw_move(speed=${dropdown_speed},angle=${number_angle_}, timeout=${number_timeout_}, block='${dropdown_block}')\\n`\n return code\n}\n\n/**\n * player 组件\n * */\n Blockly.Blocks['gta_robot_display_audio'] = {\n init: function() {\n this.appendDummyInput().appendField('设备播放音频:')\n this.appendValueInput('NAME').setCheck(null)\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('robot_print')\n this.setTooltip('上传一个音频文件至服务器,使用积木调用接口,最终在果小聪播放音频。参数:音频url。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_display_audio'])\n },\n}\n\n\nBlockly.Python['gta_robot_display_audio'] = function(block) {\n var value_name = Blockly.Python.valueToCode(\n block,\n 'NAME',\n Blockly.Python.ORDER_NONE\n )\n console.log('value_name',value_name)\n // TODO: Assemble Python into code variable.\n var code = `robot.display_audio(${value_name})\\n`\n return code\n}\n\n\n\nBlockly.Blocks['gta_robot_tts'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('转语音:')\n .appendField(' 文本')\n .appendField(new Blockly.FieldTextInput('default'), 'TEXT')\n .appendField(' 文本名:')\n .appendField(new Blockly.FieldTextInput('default'), 'fileName')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('voice_blocks')\n this.setTooltip('实现文字转语音功能,存储再指定文本名的文件内,最终可通过机器人播放。参数:文本(default),内容长度不大于100个;文本名(default),长度不能大于10个。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_tts'])\n },\n}\n\nBlockly.Python['gta_robot_tts'] = function(block) {\n var text_text = block.getFieldValue('TEXT')\n var text_filename = block.getFieldValue('fileName')\n\n if (text_text.length > 100) {\n console.error('文字/容不能大于100')\n }\n\n if (text_filename.length > 100) {\n console.error('文本名字符不能大于10')\n }\n var code = `robot.tts('${text_text}','${text_filename}')\\n`\n return code\n}\n\nBlockly.Blocks['gta_robot_play'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('播放转语音的文本名:')\n .appendField(new Blockly.FieldTextInput('default'), 'fileName')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('voice_blocks')\n this.setTooltip('通过机器人播放指定文本名的文件。参数:文本名(default),长度不能大于10个。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_play'])\n },\n}\n\nBlockly.Python['gta_robot_play'] = function(block) {\n var text_filename = block.getFieldValue('fileName')\n if (text_filename.length > 100) {\n console.error('文本名符不能大于10')\n }\n var code = `robot.play('${text_filename}')\\n`\n return code\n}\n\n// 播放状态\nBlockly.Blocks['gta_get_play_status'] = {\n init: function() {\n this.appendDummyInput().appendField('获取文本转语音播放状态')\n this.setInputsInline(true)\n this.setOutput(true, null);\n this.setStyle('voice_blocks')\n this.setTooltip('获取文本转语音播放状态。返回值为布尔值。')\n this.setHelpUrl(Blockly.Msg['gta_get_play_status'])\n },\n}\n\nBlockly.Python['gta_get_play_status'] = function(block) {\n var code = 'robot.get_play_status()'\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n// 播放音量\nBlockly.Blocks['gta_set_volume'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('设置播放音量')\n .appendField(\n new Blockly.FieldDropdown([\n ['1', '1'],\n ['2', '2'],\n ['3', '3'],\n ['4', '4'],\n ['5', '5'],\n ]),\n 'volume'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('voice_blocks')\n this.setTooltip('设置音频播放音量。参数:音量。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_set_volume'])\n },\n}\n\nBlockly.Python['gta_set_volume'] = function(block) {\n var dropdown_volume = block.getFieldValue('volume')\n var code = `robot.set_volume(${dropdown_volume})\\n`\n return code\n // return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n// 播放状态\nBlockly.Blocks['gta_get_volume'] = { \n init: function() {\n this.appendDummyInput().appendField('获取播放音量')\n this.setInputsInline(true)\n // this.setPreviousStatement(true, null)\n // this.setNextStatement(true, null)\n this.setOutput(true)\n this.setStyle('voice_blocks')\n this.setTooltip('获取播放音量。无参数。无返回')\n this.setHelpUrl(Blockly.Msg['gta_get_volume'])\n },\n}\n\nBlockly.Python['gta_get_volume'] = function(block) {\n var code = 'robot.get_volume()'\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n // return code\n}\n\n/**\n * file 组件\n * */\n\n// // 上传图片\n// Blockly.Blocks['gta_robot_upload'] = {\n// init: function() {\n// this.appendDummyInput().appendField('上传图片到机器人')\n// this.appendValueInput('NAME').setCheck(null)\n// this.setInputsInline(true)\n// this.setPreviousStatement(true, null)\n// this.setNextStatement(true, null)\n// this.setStyle('event_blocks')\n// this.setTooltip('')\n// this.setHelpUrl('')\n// },\n// }\n\n\n// Blockly.Python['gta_robot_upload'] = function(block) {\n// var value_name = Blockly.Python.valueToCode(\n// block,\n// 'NAME',\n// Blockly.Python.ORDER_ATOMIC\n// )\n// // TODO: Assemble Python into code variable.\n// var code = `robot.upload('${value_name}')\\n`\n// return code\n// }\n\n\n//屏幕显示(图片)\nBlockly.Blocks['gta_robot_display_image'] = {\n init: function() {\n this.appendDummyInput().appendField('设备屏幕显示图片:')\n this.appendValueInput('NAME').setCheck(null)\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('robot_print')\n this.setTooltip('上传一张本地图片至服务器,使用积木调用接口,最终在果小聪屏幕显示图片。参数:图片路径。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_display_image'])\n },\n}\n\n\nBlockly.Python['gta_robot_display_image'] = function(block) {\n var value_name = Blockly.Python.valueToCode(\n block,\n 'NAME',\n Blockly.Python.ORDER_NONE\n )\n // TODO: Assemble Python into code variable.\n var code = `robot.display_image(${value_name})\\n`\n return code\n}\n\n\n/**\n * screen 组件\n * */\n\n// 显示摄像头画面\nBlockly.Blocks['gta_robot_show_camera'] = {\n init: function() {\n this.appendDummyInput().appendField('设备显示摄像头画面')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('robot_print')\n this.setTooltip('打开机器的摄像头显示画面。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_show_camera'])\n },\n}\nBlockly.Python['gta_robot_show_camera'] = function(block) {\n var code = `robot.show_camera()\\n`\n return code\n}\n\n// // 停止摄像头画面\n// Blockly.Blocks['gta_stop_showing'] = {\n// init: function() {\n// this.appendDummyInput().appendField('停止robot摄像头')\n// this.setInputsInline(true)\n// this.setPreviousStatement(true, null)\n// this.setNextStatement(true, null)\n// this.setStyle('robot_print')\n// this.setTooltip('停止机器屏幕的画面显示。无参数。无返回。')\n// this.setHelpUrl('gta_stop_showing')\n// },\n// }\n// Blockly.Python['gta_stop_showing'] = function(block) {\n// var code = `robot.stop_showing()\\n`\n// return code\n// }\n\n/**\n * emotion 表情组件\n * */\n\n\nBlockly.Blocks.gta_robot_play_emotion_1 = {\n init: function() {\n this.appendDummyInput()\n .appendField('播放:')\n .appendField(\n new Blockly.FieldDropdown([\n ['apple苹果', 'a_apl'],\n ['dog狗', 'dog_a'],\n ['cat猫', 'c_cat'],\n ['block积木', 'b_blk'],\n ]),\n 'emotion'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('emotion_blocks')\n this.setTooltip('设备播放定制情绪有:apple苹果、dog狗、cat猫、block积木。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_play_emotion_1'])\n }\n}\nBlockly.Python.gta_robot_play_emotion_1 = function(block) {\n var dropdown_emotion = block.getFieldValue('emotion')\n var code = \"robot.play_emotion('\"+dropdown_emotion+\"')\\n\"\n return code\n}\n\n\nBlockly.Blocks.gta_robot_play_emotion_2 = {\n init: function() {\n this.appendDummyInput()\n .appendField('表情:')\n .appendField(\n new Blockly.FieldDropdown([\n ['生气', 'agy_a'],\n ['开心a', 'hpy_a'],\n ['开心b', 'hpy_b'],\n ['带羞涩的开心', 'hpy_sl'],//happy with shy\n ['害怕a', 'scr_a'],\n ['害怕b', 'scr_b'],\n ['难过a', 'sd_a'],\n ['难过b', 'sd_e'],\n ['叹气', 'sgh_a'],\n ['害羞', 'shy_a'],\n \n ]),\n 'emotion'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('emotion_blocks')\n this.setTooltip('设备播放定制表情有:生气、开心a、开心b、带羞涩的开心、害怕a、害怕b、难过a、难过b、叹气、害羞a。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_play_emotion_2'])\n }\n}\nBlockly.Python.gta_robot_play_emotion_2 = function(block) {\n var dropdown_emotion = block.getFieldValue('emotion')\n var code = \"robot.play_emotion('\"+dropdown_emotion+\"')\\n\"\n return code\n}\n\nBlockly.Blocks.gta_robot_play_emotion_3 = {\n init: function() {\n this.appendDummyInput()\n .appendField('表情:')\n .appendField(\n new Blockly.FieldDropdown([\n ['睡觉', 'slp_a'],\n ['打喷嚏', 'snz_a'],\n ['震惊a', 'sok_a'],\n ['震惊b', 'sok_wt'],\n ['满怀希望', 'st_a'],\n ['激动的tada', 'td_a'],//exciting tada\n ['慢慢醒来', 'wgl_a'],\n ['伸展a', 'ywn_a'],\n ['伸展b', 'ywn_b'],\n ]),\n 'emotion'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('emotion_blocks')\n this.setTooltip('设备播放定制表情有:睡觉、打喷嚏、震惊a、震惊b、满怀希望、激动的tada、慢慢醒来、伸展a、伸展b。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_play_emotion_3'])\n }\n}\nBlockly.Python.gta_robot_play_emotion_3 = function(block) {\n var dropdown_emotion = block.getFieldValue('emotion')\n var code = \"robot.play_emotion('\"+dropdown_emotion+\"')\\n\"\n return code\n}\n\nBlockly.Blocks.gta_robot_play_emotion_4 = {\n init: function() {\n this.appendDummyInput()\n .appendField('表情:')\n .appendField(\n new Blockly.FieldDropdown([\n ['爱心', 'hrt_a'],\n ['喵喵', 'cat_a'],//see a cat\n ['喜欢炫耀', 'hpy_swl'],\n ['打盹a', 'nap_a'],\n ['打盹b', 'nap_b'],\n ['怀疑', 'dbt_a'],\n ['头晕', 'dizy'],\n ['蒙眼睛a', 'obt_a'],\n ['蒙眼睛b', 'obt_b'],\n ['蒙眼睛c', 'obt_c'],\n ['转身跳舞', 'dns_a'],\n ]),\n 'emotion'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('emotion_blocks')\n this.setTooltip('设备播放定制表情有:爱心、喵喵、喜欢炫耀、打盹a、打盹b、怀疑、头晕、蒙眼睛a、蒙眼睛b、蒙眼睛c、转身跳舞。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_play_emotion_4'])\n }\n}\nBlockly.Python.gta_robot_play_emotion_4 = function(block) {\n var dropdown_emotion = block.getFieldValue('emotion')\n var code = \"robot.play_emotion('\"+dropdown_emotion+\"')\\n\"\n return code\n}\n\nBlockly.Blocks.gta_robot_play_emotion_5 = {\n init: function() {\n this.appendDummyInput()\n .appendField('说:')\n .appendField(\n new Blockly.FieldDropdown([\n ['你好a', 'hi_a'],\n ['你好b', 'hi_b'],\n ['你好c', 'hll_a'],\n ['你好吗', 'hry'],\n ['很高兴见到你', 'ntsy'],\n ]),\n 'emotion'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('emotion_blocks')\n this.setTooltip('设备播放说的语言表情:你好a、你好b、你好c、你好吗、很高兴见到你。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_play_emotion_5'])\n }\n}\nBlockly.Python.gta_robot_play_emotion_5 = function(block) {\n var dropdown_emotion = block.getFieldValue('emotion')\n var code = \"robot.play_emotion('\"+dropdown_emotion+\"')\\n\"\n return code\n}\n\nBlockly.Blocks.gta_robot_play_emotion_6 = {\n init: function() {\n this.appendDummyInput()\n .appendField('唱:')\n .appendField(\n new Blockly.FieldDropdown([\n ['《little star》', 'song_a'],\n ['《jingle bell》', 'song_b'],\n ['《ten little fingers》', 'song_c'],\n ]),\n 'emotion'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('emotion_blocks')\n this.setTooltip('设备播放唱歌曲目:《little star》、《jingle bell》、《ten little fingers》。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_play_emotion_6'])\n }\n}\nBlockly.Python.gta_robot_play_emotion_6 = function(block) {\n var dropdown_emotion = block.getFieldValue('emotion')\n var code = \"robot.play_emotion('\"+dropdown_emotion+\"')\\n\"\n return code\n}\n\n\n// 打开表情\nBlockly.Blocks['gta_turn_on_expression'] = {\n init: function() {\n this.appendDummyInput().appendField('打开屏幕表情')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('emotion_blocks')\n this.setTooltip('打开屏幕的表情(默认打开)。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_turn_on_expression'])\n },\n}\nBlockly.Python['gta_turn_on_expression'] = function(block) {\n var code = `robot.turn_on_expression()\\n`\n return code\n}\n\n// 关闭表情\nBlockly.Blocks['gta_turn_off_expression'] = {\n init: function() {\n this.appendDummyInput().appendField('关闭屏幕表情')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('emotion_blocks')\n this.setTooltip('关闭屏幕表情。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_turn_off_expression'])\n },\n}\nBlockly.Python['gta_turn_off_expression'] = function(block) {\n var code = `robot.turn_off_expression()\\n`\n return code\n}\n// 开启运动-通过这个接口可打开一个运行(轮子或手臂)\nBlockly.Blocks['gta_turn_on_motion'] = {\n init: function() {\n this.appendDummyInput().appendField('开启运动')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('event_blocks')\n this.setTooltip('开启一个运动(轮子或手臂)。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_turn_on_motion'])\n },\n}\nBlockly.Python['gta_turn_on_motion'] = function(block) {\n var code = `robot.turn_on_motion()\\n`\n return code\n}\n// 关闭运动-通过这个接口可关闭一个运行(轮子或手臂)\nBlockly.Blocks['gta_turn_off_motion'] = {\n init: function() {\n this.appendDummyInput().appendField('关闭运动')\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('event_blocks')\n this.setTooltip('关闭一个运动(轮子或手臂)。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_turn_off_motion'])\n },\n}\nBlockly.Python['gta_turn_off_motion'] = function(block) {\n var code = `robot.turn_off_motion()\\n`\n return code\n}\n\n/**\n * face-detection 组件\n * */\n\n// 检测人脸\nBlockly.Blocks['gta_detect_face'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('检测人脸:')\n .appendField(' 最小尺寸')\n .appendField(new Blockly.FieldNumber(50, 10, 300,1), 'min_size')\n .appendField(' 最大尺寸')\n .appendField(new Blockly.FieldNumber(300, 10, 300,1), 'max_size')\n this.setStyle('detect_blocks')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip('在屏幕显示检测到的人脸区域。参数:检测人脸区域的最小尺寸、最大尺寸。返回数组。备注:最多可以侦测5个;最大尺寸过小(约47)会触发错误且程序不继续执行,建议更改默认值为50到300。')\n this.setHelpUrl(Blockly.Msg['gta_detect_face'])\n },\n}\n\nBlockly.Python['gta_detect_face'] = function(block) {\n var number_min_size = block.getFieldValue('min_size')\n var number_max_size = block.getFieldValue('max_size')\n var code = `robot.detect_face(min_size=${number_min_size},max_size=${number_max_size})\\n`\n return code\n}\n\n\n//打开地面检测\nBlockly.Blocks['gta_turn_on_cliff_detection'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('打开地面检测')\n this.setStyle('detect_blocks')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip('打开地面检测。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_turn_on_cliff_detection'])\n },\n}\n\nBlockly.Python['gta_turn_on_cliff_detection'] = function(block) {\n var code = `robot.turn_on_cliff_detection()\\n`\n return code\n}\n\n\n//关闭地面检测\nBlockly.Blocks['gta_turn_off_cliff_detection'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('关闭地面检测')\n this.setStyle('detect_blocks')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip('关闭地面检测。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_turn_off_cliff_detection'])\n },\n}\n\nBlockly.Python['gta_turn_off_cliff_detection'] = function(block) {\n var code = `robot.turn_off_cliff_detection()\\n`\n return code\n}\n\n\n// 查看(前)红外状态\nBlockly.Blocks['gta_robot_read_infrared'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('查看 ')\n .appendField(\n new Blockly.FieldDropdown([\n ['前', 'front'],\n ['后', 'end'],\n ]),\n 'group'\n )\n .appendField(' 红外状态')\n this.setInputsInline(true)\n // this.setPreviousStatement(true, null)\n // this.setNextStatement(true, null)\n this.setOutput(true)\n this.setStyle('detect_blocks')\n this.setTooltip('查看机器人身体底部装置的红外。用于测距避障,检测前后是否有障碍。参数:选项为前进或后退。返回数组,需要可赋值给变量.')\n this.setHelpUrl(Blockly.Msg['gta_robot_read_infrared'])\n },\n}\n\nBlockly.Python['gta_robot_read_infrared'] = function(block) {\n var dropdown_group = block.getFieldValue('group')\n var code = `robot.read_infrared(location='${dropdown_group}')`\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n\n\n//读取陀螺仪数据1\nBlockly.Blocks['gta_read_gyroscope'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('读取陀螺仪数据1')\n this.setStyle('detect_blocks')\n // this.setPreviousStatement(true, null)\n // this.setNextStatement(true, null)\n this.setOutput(true)\n this.setTooltip('读取陀螺仪的W, X, Y, Z四元数。返回数组,需要可赋值给变量')\n this.setHelpUrl(Blockly.Msg['gta_read_gyroscope'])\n },\n}\n\nBlockly.Python['gta_read_gyroscope'] = function(block) {\n var code = `robot.read_gyroscope()`\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n\n//读取陀螺仪数据2\nBlockly.Blocks['gta_read_gyroscope2'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('读取陀螺仪数据2')\n this.setStyle('detect_blocks')\n this.setOutput(true)\n this.setTooltip('读取陀螺仪的 pitch, roll, yaw数据。返回数组,需要可赋值给变量')\n this.setHelpUrl(Blockly.Msg['gta_read_gyroscope2'])\n },\n}\n\nBlockly.Python['gta_read_gyroscope2'] = function(block) {\n var code = `robot.read_gyroscope2()`\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n\n// 获取人脸特征\nBlockly.Blocks['gta_get_face_feature'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('获取人脸特征:')\n .appendField(new Blockly.FieldNumber(0, 0, 100,1), 'index')\n this.setStyle('detect_blocks')\n // this.setPreviousStatement(true, null)\n // this.setNextStatement(true, null)\n this.setOutput(true);\n this.setTooltip('在屏幕显示指定索引值的人脸的五个关键点。无参数。返回数组')\n this.setHelpUrl(Blockly.Msg['gta_get_face_feature'])\n },\n}\n\nBlockly.Python['gta_get_face_feature'] = function(block) {\n var number_index = block.getFieldValue('index')\n var code = `robot.get_face_feature(index=${number_index})`\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n/**\n * pattern detection 组件 \n * */\n\n// 检测图案\nBlockly.Blocks['gta_detect_pattern'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('检测图案类别')\n .appendField(\n new Blockly.FieldDropdown([\n ['数字', 'number'],\n ['字母', 'letter'],\n ['动物', 'animal'],\n ]),\n 'group'\n )\n this.setInputsInline(true)\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setStyle('detect_blocks')\n this.setTooltip('在屏幕显示检测到的指定类别的图案。参数选项为:数字、字母、动物。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_detect_pattern'])\n },\n}\n\nBlockly.Python['gta_detect_pattern'] = function(block) {\n var dropdown_group = block.getFieldValue('group')\n var code = `robot.detect_pattern(group='${dropdown_group}', min_size=10, max_size=300)\\n`\n return code\n}\n\n// 获取图片路径\nBlockly.Blocks['gta_get_pattern_location'] = {\n init: function() {\n this.appendDummyInput()\n .appendField('通过索引')\n .appendField(new Blockly.FieldNumber(0, 0, 100,1), 'index')\n .appendField('获得图片路径')\n this.setInputsInline(true)\n // this.setPreviousStatement(true, null)\n // this.setNextStatement(true, null)\n this.setOutput(true);\n this.setStyle('detect_blocks')\n this.setTooltip('返回指定索引的位置参数。参数:索引值。返回:图片路径。')\n this.setHelpUrl(Blockly.Msg['gta_get_pattern_location'])\n },\n}\n\nBlockly.Python['gta_get_pattern_location'] = function(block) {\n var dropdown_index = block.getFieldValue('index')\n var code = `robot.get_pattern_location(index=${dropdown_index})`\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n/**\n * video 组件\n * */\n\n// 打开摄像头-功能:在主程序运行过程中开启服务,并持续显示图像\nBlockly.Blocks['gta_display_video'] = {\n init: function() {\n this.appendDummyInput().appendField('打开摄像头')\n this.setStyle('robot_B_camera')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip('在主程序运行过程中开启服务,并持续显示图像。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_display_video'])\n },\n}\n\nBlockly.Python['gta_display_video'] = function(block) {\n var code = `robot.display_video()\\n`\n return code\n}\n\n\n// 获取摄像头图像\nBlockly.Blocks['gta_robot_get_camera_image'] = {\n init: function() {\n this.appendDummyInput().appendField('获取摄像头图像')\n this.setStyle('robot_B_camera')\n this.setOutput(true)\n this.setTooltip(\n '获取当前摄像头的图像,返回网络图片地址。参数:无。返回:网络地址URL'\n )\n this.setHelpUrl(Blockly.Msg['gta_robot_get_camera_image'])\n },\n}\n\nBlockly.Python['gta_robot_get_camera_image'] = function(block) {\n var code = `robot.get_camera_image()`\n return [code, Blockly.Python.ORDER_FUNCTION_CALL]\n}\n\n\n\n\n// 关闭录像\n// Blockly.Blocks['gta_close_video'] = {\n// init: function() {\n// this.appendDummyInput().appendField('关闭录像')\n// this.setStyle('detect_blocks')\n// this.setPreviousStatement(true, null)\n// this.setNextStatement(true, null)\n// this.setTooltip('')\n// this.setHelpUrl(Blockly.Msg['gta_close_video'])\n// },\n// }\n\n// Blockly.Python['gta_close_video'] = function(block) {\n// var code = `robot.close_video()\\n`\n// return code\n// }\n\n// 设备关闭摄像头画面\nBlockly.Blocks['gta_robot_stop_showing'] = {\n init: function() {\n this.appendDummyInput().appendField('设备关闭摄像头画面')\n this.setStyle('robot_print')\n this.setPreviousStatement(true, null)\n this.setNextStatement(true, null)\n this.setTooltip('停止机器屏幕的画面显示。无参数。无返回。')\n this.setHelpUrl(Blockly.Msg['gta_robot_stop_showing'])\n },\n}\n\nBlockly.Python['gta_robot_stop_showing'] = function(block) {\n var code = `robot.stop_showing()\\n`\n return code\n}\n\n\n// // 打开视频数据流\n// Blockly.Blocks['gta_open_video_data'] = {\n// init: function() {\n// this.appendDummyInput().appendField('打开视频数据流')\n// this.setStyle('detect_blocks')\n// this.setPreviousStatement(true, null)\n// this.setNextStatement(true, null)\n// this.setTooltip('')\n// this.setHelpUrl(Blockly.Msg['gta_open_video_data'])\n// },\n// }\n\n// Blockly.Python['gta_open_video_data'] = function(block) {\n// var code = `robot.open_video_data()\\n`\n// return code\n// }\n// 关闭视频数据流\n// Blockly.Blocks['gta_close_video_data'] = {\n// init: function() {\n// this.appendDummyInput().appendField('关闭视频数据流')\n// this.setStyle('detect_blocks')\n// this.setPreviousStatement(true, null)\n// this.setNextStatement(true, null)\n// this.setTooltip('')\n// this.setHelpUrl(Blockly.Msg['gta_close_video_data'])\n// },\n// }\n\n// Blockly.Python['gta_close_video_data'] = function(block) {\n// var code = `robot.close_video_data()\\n`\n// return code\n// }\n// 获取录像中的图片\n// Blockly.Blocks['gta_get_image_from_video'] = {\n// init: function() {\n// this.appendDummyInput().appendField('获取录像中的图片')\n// this.setStyle('detect_blocks')\n// this.setPreviousStatement(true, null)\n// this.setNextStatement(true, null)\n// this.setTooltip('')\n// this.setHelpUrl(Blockly.Msg['gta_get_image_from_video'])\n// },\n// }\n\n// Blockly.Python['gta_get_image_from_video'] = function(block) {\n// var code = `robot.get_image_from_video()\\n`\n// return code\n// }\n"],"sourceRoot":""}