'use strict'; function show_or_scroll(blockid1, blockid2, blockid3 = null) { function converter(py2block, func, args, keywords, starargs, kwargs, node) { if (args.length === 1 && keywords.length === 4) {//Image.ALL_CLOCKS, delay=120, wait=True, loop=False, clear=False var imagesblock = null; var delayblock = null; var waitblock = null; var loopblock = null; var clearblock = null; imagesblock = py2block.convert(args[0]); for (var i = 0; i < keywords.length; i++) { var param = keywords[i]; var key = py2block.identifier(param.arg); if (key === "delay") { delayblock = py2block.convert(param.value); } else if (key === "wait" && param.value._astname == "Name") { waitblock = py2block.Name_str(param.value); } else if (key === "loop" && param.value._astname == "Name") { loopblock = py2block.Name_str(param.value); } else if (key === "clear" && param.value._astname == "Name") { clearblock = py2block.Name_str(param.value); } } if (imagesblock != null && delayblock != null && waitblock != null && loopblock != null && clearblock != null) { return [block(blockid2, func.lineno, { 'wait': waitblock, 'loop': loopblock, 'clear': clearblock, }, { 'images': imagesblock, 'delay': delayblock, }, { "inline": "true" })]; } } else if (args.length === 1 && keywords.length === 0) { return [block(blockid1, func.lineno, {}, { 'data': py2block.convert(args[0]), }, { "inline": "true" })]; } else if (args.length === 1 && keywords.length === 1 && blockid3) { var delayblock = py2block.convert(keywords[0].value); return [block(blockid3, func.lineno, {}, { 'data': py2block.convert(args[0]), 'delay': delayblock }, { "inline": "true" })]; } throw new Error("Incorrect number of arguments"); } return converter; } pbc.moduleFunctionD.get('display')['show'] = show_or_scroll('monitor_show_image_or_string', 'microbit_display_show_animation'); pbc.moduleFunctionD.get('display')['scroll'] = show_or_scroll('monitor_scroll_string', 'microbit_display_scroll_string_animation', 'monitor_scroll_string_with_delay'); //创建图像 pbc.globalFunctionD['Image'] = function (py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 1 || args[0]._astname != "Str") { throw new Error("Incorrect number of arguments"); } var colours = [ "#000000", "#440000", "#660000", "#880000", "#aa0000", "#bb0000", "#cc0000", "#dd0000", "#ee0000", "#ff0000" ]; var flag = 0; var tempblock = py2block.Str_value(args[0]); var temptext = new Array(); temptext = tempblock.split(':'); if (temptext.length == 5) { for (var i = 0; i < 5; i++) { if (temptext[i].length == 5) { flag++; } } } if (flag == 5) { return block('microbit_image_create', func.lineno, { "00": colours[temptext[0].charAt(0)], "01": colours[temptext[0].charAt(1)], "02": colours[temptext[0].charAt(2)], "03": colours[temptext[0].charAt(3)], "04": colours[temptext[0].charAt(4)], "10": colours[temptext[1].charAt(0)], "11": colours[temptext[1].charAt(1)], "12": colours[temptext[1].charAt(2)], "13": colours[temptext[1].charAt(3)], "14": colours[temptext[1].charAt(4)], "20": colours[temptext[2].charAt(0)], "21": colours[temptext[2].charAt(1)], "22": colours[temptext[2].charAt(2)], "23": colours[temptext[2].charAt(3)], "24": colours[temptext[2].charAt(4)], "30": colours[temptext[3].charAt(0)], "31": colours[temptext[3].charAt(1)], "32": colours[temptext[3].charAt(2)], "33": colours[temptext[3].charAt(3)], "34": colours[temptext[3].charAt(4)], "40": colours[temptext[4].charAt(0)], "41": colours[temptext[4].charAt(1)], "42": colours[temptext[4].charAt(2)], "43": colours[temptext[4].charAt(3)], "44": colours[temptext[4].charAt(4)], }, {}, { "inline": "false" }); } } pbc.moduleFunctionD.get('image')['height'] = function (py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 1) { throw new Error("Incorrect number of arguments"); } return block('display_image_size', func.lineno, { 'OP': 'height' }, { 'VAR': py2block.convert(args[0]), }, { "inline": "true" }); } pbc.moduleFunctionD.get('image')['width'] = function (py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 1) { throw new Error("Incorrect number of arguments"); } return block('display_image_size', func.lineno, { 'OP': 'width' }, { 'VAR': py2block.convert(args[0]), }, { "inline": "true" }); } function imageShift(mode){ function converter(py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 1) { throw new Error("Incorrect number of arguments"); } var imageblock = py2block.convert(func.value); return block('image_shift', func.lineno, { 'OP': mode }, { 'img': imageblock, 'val': py2block.convert(args[0]), }, { "inline": "true" }); } return converter; } pbc.objectFunctionD.get('shift_up')['Image'] = imageShift('up'); pbc.objectFunctionD.get('shift_down')['Image'] = imageShift('down'); pbc.objectFunctionD.get('shift_left')['Image'] = imageShift('left'); pbc.objectFunctionD.get('shift_right')['Image'] = imageShift('right'); pbc.objectFunctionD.get('copy')['Image'] = function converter(py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 0) { throw new Error("Incorrect number of arguments"); } var imageblock = py2block.convert(func.value); return block('microbit_image_copy', func.lineno, {}, { 'image': imageblock, }, { "inline": "true" }); } pbc.objectFunctionD.get('invert')['Image'] = function converter(py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 0) { throw new Error("Incorrect number of arguments"); } var imageblock = py2block.convert(func.value); return block('microbit_image_invert', func.lineno, {}, { 'image': imageblock, }, { "inline": "true" }); } pbc.moduleFunctionD.get('display')['get_pixel'] = function(py2block, func, args, keywords, starargs, kwargs, node){ if (args.length !== 2){ throw new Error("Incorrect number of arguments"); } var astname = args[0]._astname; var astname1 = args[1]._astname; var xblock; var yblock; pbc.pinType = "pins_axis"; if(astname === "Call" && args[0].func._astname == "Name" && py2block.Name_str(args[0].func) === "int"){ //display.get_pixel(int(0), int(0)) xblock = py2block.convert(args[0].args[0]); }else{ xblock = py2block.convert(args[0]); } if(astname1 === "Call" && args[1].func._astname == "Name" && py2block.Name_str(args[1].func) === "int"){ //display.get_pixel(int(0), int(0)) yblock = py2block.convert(args[1].args[0]); }else{ yblock = py2block.convert(args[1]); } pbc.pinType = null; return block("monitor_get_pixel", func.lineno, {}, { 'x':xblock, 'y':yblock }, { "inline": "true" }); } pbc.moduleFunctionD.get('display')['set_pixel'] = function(py2block, func, args, keywords, starargs, kwargs, node){ if (args.length !== 3){ throw new Error("Incorrect number of arguments"); } var astname = args[0]._astname; var astname1 = args[1]._astname; pbc.pinType = "pins_brightness"; var brightblock = py2block.convert(args[2]); pbc.pinType = null; var xblock; var yblock; pbc.pinType = "pins_axis"; if(astname === "Call" && args[0].func._astname == "Name" && py2block.Name_str(args[0].func) === "int"){ //display.set_pixel(int(0), int(0)) xblock = py2block.convert(args[0].args[0]); }else{ xblock = py2block.convert(args[0]); } if(astname1 === "Call" && args[1].func._astname == "Name" && py2block.Name_str(args[1].func) === "int"){ //display.set_pixel(int(0), int(0)) yblock = py2block.convert(args[1].args[0]); }else{ yblock = py2block.convert(args[1]); } pbc.pinType = null; return [block("monitor_bright_point", func.lineno, {}, { 'x':xblock, 'y':yblock, 'brightness':brightblock, }, { "inline": "true" })]; } function displayOnOrOff(mode){ function converter(py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 0) { throw new Error("Incorrect number of arguments"); } return [block("microbit_display_on", func.lineno, { 'on_off': mode }, {}, { "inline": "true" })]; } return converter; } pbc.moduleFunctionD.get('display')['on'] = displayOnOrOff('on'); pbc.moduleFunctionD.get('display')['off'] = displayOnOrOff('off'); pbc.moduleFunctionD.get('display')['is_on'] = function (py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 0) { throw new Error("Incorrect number of arguments"); } return block("microbit_display_is_on", func.lineno, {}, {}, { "inline": "true" }); } pbc.moduleFunctionD.get('display')['clear'] = function (py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 0) { throw new Error("Incorrect number of arguments"); } return [block("microbit_display_clear", func.lineno, {}, {}, { "inline": "true" })]; } pbc.assignD.get('Rgb')['check_assign'] = function(py2block, node, targets, value) { if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){ return false; } var moduleName = py2block.Name_str(value.func.value); var funcName = py2block.identifier(value.func.attr); if(value._astname === "Call" && moduleName === "neopixel" && funcName === "NeoPixel" && value.args.length === 2) return true; return false; } pbc.assignD.get('Rgb')['create_block'] = function(py2block, node, targets, value){ pbc.pinType = "pins_digital"; var pinblock = py2block.convert(value.args[0]); pbc.pinType = null; var countblock = py2block.convert(value.args[1]); return block("display_rgb_init", node.lineno, {}, { "PIN":pinblock, "LEDCOUNT":countblock }); } pbc.globalFunctionD['mixly_rgb_show'] = function (py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 4) { throw new Error("Incorrect number of arguments"); } return [block("display_rgb", func.lineno, { }, { '_LED_':py2block.convert(args[0]), "RVALUE":py2block.convert(args[1]), "GVALUE":py2block.convert(args[2]), "BVALUE":py2block.convert(args[3]) }, { "inline": "true" })]; } pbc.assignD.get('Lcd')['check_assign'] = function(py2block, node, targets, value) { if(value._astname != "Call" || value.func._astname != "Name"){ return false; } var className = py2block.Name_str(value.func); if(value._astname === "Call" && className === "LCD1602" && value.args.length === 1) return true; return false; } pbc.assignD.get('Lcd')['create_block'] = function(py2block, node, targets, value){ pbc.inScope = "lcd_init"; var argblock = py2block.convert(value.args[0]); pbc.inScope = null; return block("group_lcd_init", node.lineno, {}, { "device":argblock }); } pbc.moduleFunctionD.get('mylcd')['mixly_puts_two_lines'] = function (py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 2) { throw new Error("Incorrect number of arguments"); } return [block("group_lcd_print", func.lineno, { }, { "TEXT":py2block.convert(args[0]), "TEXT2":py2block.convert(args[1]) }, { "inline": "false" })]; } pbc.moduleFunctionD.get('mylcd')['mixly_puts'] = function (py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 3) { throw new Error("Incorrect number of arguments"); } return [block("group_lcd_print2", func.lineno, { }, { "row":py2block.convert(args[1]), "column":py2block.convert(args[2]), "TEXT":py2block.convert(args[0]), }, { "inline": "true" })]; } function mylcdOnOrOffOrClear(mode){ function converter(py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 0) { throw new Error("Incorrect number of arguments"); } return [block("group_lcd_power", func.lineno, { 'STAT': mode }, {}, { "inline": "true" })]; } return converter; } pbc.moduleFunctionD.get('mylcd')['on'] = mylcdOnOrOffOrClear('on()'); pbc.moduleFunctionD.get('mylcd')['off'] = mylcdOnOrOffOrClear('off()'); pbc.moduleFunctionD.get('mylcd')['clear'] = mylcdOnOrOffOrClear('clear()'); pbc.moduleFunctionD.get('mylcd')['backlight'] = function (py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 1 || args[0]._astname != "Name") { throw new Error("Incorrect number of arguments"); } var stat = py2block.Name_str(args[0]); return [block("group_lcd_power", func.lineno, { 'STAT': "backlight(" + stat + ")" }, {}, { "inline": "true" })]; } pbc.globalFunctionD['mixly_oled_text'] = function (py2block, func, args, keywords, starargs, kwargs, node) { if (args.length !== 4) { throw new Error("Incorrect number of arguments"); } return [block("lp2i_u8g_draw_4strings", func.lineno, { }, { "Text_line1":py2block.convert(args[0]), "Text_line2":py2block.convert(args[1]), "Text_line3":py2block.convert(args[2]), "Text_line4":py2block.convert(args[3]) }, { "inline": "false" })]; } pbc.objectFunctionD.get('show_fill')['monitor'] = function(py2block, func, args, keywords, starargs, kwargs, node) { if(args.length!=1){ throw new Error("Incorrect number of arguments"); } var objblock = py2block.convert(func.value); var flagblock = py2block.identifier(args[0].n.v); return [block("display_fill", func.lineno, {'key':flagblock}, { "SUB":objblock, }, { "inline": "true" })]; }