UNPKG

@mixly/arduino-avr

Version:
557 lines (522 loc) 20.2 kB
import { Variables } from 'blockly/core'; export const factory_notes = function () { var content = this.getFieldValue('VALUE'); //console.log(content); if (content) { var content2arr = content.split('\n'); var code = ''; for (var eachElement in content2arr) { //console.log(content2arr[eachElement]); content2arr[eachElement] = '//' + content2arr[eachElement] + '\n'; //console.log(content2arr[eachElement]); } for (var eachElement of content2arr) { code += eachElement; } return code; } return '//\n'; } export const folding_block = function (_, generator) { var branch = generator.statementToCode(this, 'DO'); branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格 return '' + branch + '\n'; } export const IICSCAN = function (_, generator) { generator.definitions_['include_WIRE'] = '#include <Wire.h>'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['setup_wire_begin'] = 'Wire.begin();'; generator.setups_['setup_Serial.println("I2C Scanner")'] = 'Serial.println("I2C Scanner");'; var code = 'byte error, address;\n' + 'int nDevices;\n' + 'Serial.println("Scanning...");\n' + 'nDevices = 0;\n' + 'for (address = 1; address < 127; address++ ){\n' + ' Wire.beginTransmission(address);\n' + ' error = Wire.endTransmission();\n' + ' if (error == 0){\n' + ' Serial.print("I2C device found at address 0x");\n' + ' if (address < 16)\n' + ' Serial.print("0");\n' + ' Serial.print(address, HEX);\n' + ' Serial.println(" !");\n' + ' nDevices++;\n' + ' }\n' + ' else if (error == 4){\n' + ' Serial.print("Unknow error at address 0x");\n' + ' if (address < 16)\n' + ' Serial.print("0");\n' + ' Serial.println(address, HEX);\n' + ' }\n' + '}\n' + 'if (nDevices == 0)\n' + ' Serial.println("No I2C devices found");\n' + 'else\n' + ' Serial.println("done");\n' + 'delay(5000);\n'; return code; } function string_Bin_to_Hex(outstr_select) { switch (outstr_select) { case '0000': outstr_select = '0'; break; case '0001': outstr_select = '1'; break; case '0010': outstr_select = '2'; break; case '0011': outstr_select = '3'; break; case '0100': outstr_select = '4'; break; case '0101': outstr_select = '5'; break; case '0110': outstr_select = '6'; break; case '0111': outstr_select = '7'; break; case '1000': outstr_select = '8'; break; case '1001': outstr_select = '9'; break; case '1010': outstr_select = 'A'; break; case '1011': outstr_select = 'B'; break; case '1100': outstr_select = 'C'; break; case '1101': outstr_select = 'D'; break; case '1110': outstr_select = 'E'; break; case '1111': outstr_select = 'F'; break; } return outstr_select; } //将文本或符号编码 function encodeUnicode(str) { let res = []; for (let i = 0; i < str.length; i++) { res[i] = ("00" + str.charCodeAt(i).toString(16)).slice(-4); } return "_u" + res.join("_u"); } //将字符串转整数 function myAtoi(str) { str = str.replace(/(^\s*)|(\s*$)/g, "");//去掉字符串最前面的空格,中间的不用管 var str1 = ""; for (let i = 0; i < str.length; i++) { if ((str.charAt(i) == "-" || str.charAt(i) == "+") && i == 0) { str1 = str1.concat(str.charAt(i)) }//如果“+”“-”号在最前面 else if (/^\d+$/.test(str.charAt(i))) { str1 = str1.concat(str.charAt(i)) }//用字符串存储值 else { break//直接跳出for循环 } } if (str1 - 0 > 2147483647) { return 2147483647 } //str-0 字符串化为数组最简单也是最常用的方法 else if (str1 - 0 < -2147483648) { return -2147483648 } if (isNaN(str1 - 0)) return 0//"+"/"-"这种情况,返回0 return str1 - 0 } //取模工具显示数据部分 export const tool_modulus_show = function (_, generator) { var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), Variables.NAME_TYPE); var checkbox_save_hz = this.getFieldValue('save_hz') == 'TRUE'; var value_input = generator.valueToCode(this, 'input_data', generator.ORDER_ATOMIC); var X_1 = 0; for (var i of value_input) { if (i == ',') X_1++; } X_1++; this.setFieldValue(X_1, "x"); if (checkbox_save_hz) generator.libs_[varName] = 'static const unsigned char PROGMEM ' + varName + '[' + X_1 + '] = ' + '{' + value_input + '};'; else generator.libs_[varName] = 'unsigned char ' + varName + '[' + X_1 + '] = ' + '{' + value_input + '};'; var code = ''; return code; } //取模工具设置部分 var bitArr = new Array(); for (var i = 0; i < 8; i++)bitArr[i] = (0x80 >> i);//初始化位数组 var canvas = document.createElement("canvas");//创建canvas var ctx = canvas.getContext("2d");//获得内容描述句柄 export const tool_modulus = function (_, generator) { var dropdown_bitmap_formats = this.getFieldValue('bitmap_formats'); var dropdown_modulus_way = this.getFieldValue('modulus_way'); var dropdown_modulus_direction = this.getFieldValue('modulus_direction'); var dropdown_hz_sharp = this.getFieldValue('hz_sharp'); var text_hz_line_height = this.getFieldValue('hz_line_height'); var dropdown_hz_up_down = this.getFieldValue('hz_up_down'); var text_hz_up_down_data = this.getFieldValue('hz_up_down_data'); var dropdown_hz_left_right = this.getFieldValue('hz_left_right'); var text_hz_left_right_data = this.getFieldValue('hz_left_right_data'); var text_bitmap_width = this.getFieldValue('bitmap_width'); var text_bitmap_height = this.getFieldValue('bitmap_height'); var angle_bitmap_rotate = 0; // var checkbox_show_hz = this.getFieldValue('show_hz') == 'TRUE'; var checkbox_show_hz = 'TRUE'; var text_input_data = this.getFieldValue('input_data'); var dropdown_hz_variant = 'normal'; var dropdown_hz_style = 'normal'; var dropdown_hz_thickness = 'normal'; var fontSize_width = myAtoi(text_bitmap_width); var fontSize_height = myAtoi(text_bitmap_height); var bs = Math.ceil(fontSize_width / 8);//每行占字节数 var move_x = 0; var move_y = 0; if (dropdown_hz_up_down == "hz_down") { move_y = myAtoi(text_hz_up_down_data); } else { move_y = myAtoi("-" + text_hz_up_down_data); } if (dropdown_hz_left_right == "hz_right") { move_x = myAtoi(text_hz_left_right_data); } else { move_x = myAtoi("-" + text_hz_left_right_data); } canvas.width = fontSize_width; canvas.height = fontSize_height; ctx.font = dropdown_hz_style + ' ' + dropdown_hz_variant + ' ' + dropdown_hz_thickness + ' ' + text_hz_line_height + 'px ' + dropdown_hz_sharp; ctx.textAlign = "left"; ctx.textBaseline = "top"; var c = text_input_data; ctx.fillStyle = "#000000"; ctx.fillRect(0, 0, fontSize_width, fontSize_height);//涂背景 ctx.fillStyle = "#ffffff"; ctx.translate(fontSize_width / 2, fontSize_height / 2); ctx.rotate(Math.PI / 180 * (angle_bitmap_rotate - 0)); ctx.fillText(c, move_x - fontSize_width / 2, move_y - fontSize_height / 2);//写字 //ctx.drawImage(img,0,0,100,100);//写字 var data = ctx.getImageData(0, 0, fontSize_width, fontSize_height).data;//获取图像 var zm = new Array(bs * fontSize_height); for (var i = 0; i < zm.length; i++)zm[i] = 0;//初始化字模数组 for (var i = 0; i < fontSize_height; i++)//读像素值组成字模数组 for (var j = 0; j < fontSize_width; j++) if (data[i * fontSize_width * 4 + j * 4]) zm[parseInt(j / 8) + i * bs] += bitArr[j % 8]; var zm1 = new Array(bs * fontSize_height); var outstr1 = ""; for (var i in zm) zm1[i] = zm[i].toString(2); for (var i in zm1) { var str = ""; for (var j = 0; j < 8 - zm1[i].length; j++)str += "0"; zm1[i] = str + zm1[i]; } for (var i in zm1) outstr1 += zm1[i]; var HZ_image = ""; var num_hz = 0; for (var i = 0; i < fontSize_width; i++) { HZ_image += "--"; if (i == (fontSize_width - 1)) HZ_image += "\n|"; } for (var data_hz of outstr1) { num_hz++; if (num_hz == outstr1.length) { HZ_image += "|\n"; } else if (num_hz % (bs * 8) < fontSize_width && num_hz % (bs * 8) > 0) { if (data_hz == "0") HZ_image += " "; else if (data_hz == "1") HZ_image += "0 "; } else if (num_hz % (bs * 8) == 0) { HZ_image += "|\n|"; } } for (var i = 0; i < fontSize_width; i++) { HZ_image += "--"; } HZ_image = "/*" + "\n" + HZ_image + "\n" + "*/"; var hz_sharp = ""; switch (dropdown_hz_sharp) { case "STHeiti": hz_sharp = "华文黑体"; break; case "STKaiti": hz_sharp = "华文楷体"; break; case "STXihei": hz_sharp = "华文细黑"; break; case "STSong": hz_sharp = "华文宋体"; break; case "STZhongsong": hz_sharp = "华文中宋"; break; case "STFangsong": hz_sharp = "华文仿宋"; break; case "STCaiyun": hz_sharp = "华文彩云"; break; case "STHupo": hz_sharp = "华文琥珀"; break; case "STLiti": hz_sharp = "华文隶书"; break; case "STXingkai": hz_sharp = "华文行楷"; break; case "STXinwei": hz_sharp = "华文新魏"; break; case "simHei": hz_sharp = "黑体"; break; case "simSun": hz_sharp = "宋体"; break; case "NSimSun": hz_sharp = "新宋体"; break; case "FangSong": hz_sharp = "仿宋"; break; case "KaiTi": hz_sharp = "楷体"; break; case "FangSong_GB2312": hz_sharp = "仿宋_GB2312"; break; case "KaiTi_GB2312": hz_sharp = "楷体_GB2312"; break; case "LiSu": hz_sharp = "隶书"; break; case "YouYuan": hz_sharp = "幼圆"; break; case "PMingLiU": hz_sharp = "新细明体"; break; case "MingLiU": hz_sharp = "细明体"; break; case "DFKai-SB": hz_sharp = "标楷体"; break; case "Microsoft JhengHei": hz_sharp = "微软正黑体"; break; case "Microsoft YaHei": hz_sharp = "微软雅黑体"; break; default: hz_sharp = dropdown_hz_sharp; break; } hz_sharp = "字体:" + hz_sharp + " 字号:" + text_hz_line_height + "px" + " 显示文字:" + text_input_data + '\n' + HZ_image; var modulus_array = new Array(); for (var i = 0; i < fontSize_height; i++) { modulus_array[i] = new Array(); for (var j = 0; j < bs * 8; j++) { modulus_array[i][j] = ""; } } for (var i = 1; i <= fontSize_height; i++) { for (var j = 1; j <= bs * 8; j++) { modulus_array[i - 1][j - 1] = outstr1.charAt((i - 1) * bs * 8 + j - 1); } } //取模方式 //逐列式 - 1,逐行式 - 2,列行式 - 3,行列式 - 4 //取模走向 //顺向(高位在前) - 1,逆向(低位在前) - 2 var bit_num = fontSize_height * bs; var modulus_data = ""; var array_x = 0; var array_y = 0; var modulus_y = Math.ceil(fontSize_height / 8); var modulus_x = Math.ceil(fontSize_width / 8); //if(dropdown_modulus_direction == '1') //{ //逐列式 - 1 if (dropdown_modulus_way == '1') { bit_num = modulus_y * fontSize_width; for (var j = 1; j <= bit_num; j++) { for (var i = 1; i <= 8; i++) { if (j % modulus_y == 0) array_y = (modulus_y - 1) * 8 + i - 1; else array_y = (j % modulus_y - 1) * 8 + i - 1; array_x = Math.ceil(j / modulus_y) - 1; if (array_x > (fontSize_width - 1)) break; if (array_y > (fontSize_height - 1)) { if (dropdown_bitmap_formats == '1') modulus_data += "0"; else modulus_data += "1"; continue; } //modulus_data+=modulus_array[array_y][array_x]; if (dropdown_bitmap_formats == '1') modulus_data += modulus_array[array_y][array_x]; else { if (modulus_array[array_y][array_x] == "0") modulus_data += "1"; else modulus_data += "0"; } } modulus_data += ","; } } //逐行式 - 2 else if (dropdown_modulus_way == '2') { bit_num = modulus_x * fontSize_height; for (var j = 1; j <= bit_num; j++) { for (var i = 1; i <= 8; i++) { if (j % modulus_x == 0) array_x = (modulus_x - 1) * 8 + i - 1; else array_x = (j % modulus_x - 1) * 8 + i - 1; array_y = Math.ceil(j / modulus_x) - 1; //modulus_data+=modulus_array[array_y][array_x]; if (dropdown_bitmap_formats == '1') modulus_data += modulus_array[array_y][array_x]; else { if (modulus_array[array_y][array_x] == "0") modulus_data += "1"; else modulus_data += "0"; } } modulus_data += ","; } } //列行式 - 3 else if (dropdown_modulus_way == '3') { bit_num = modulus_y * fontSize_width; for (var j = 1; j <= bit_num; j++) { for (var i = 1; i <= 8; i++) { if (j % (modulus_x * 8) == 0) array_x = modulus_x * 8 - 1; else array_x = j % (modulus_x * 8) - 1; array_y = (Math.ceil(j / (modulus_x * 8)) - 1) * 8 + i - 1; if (array_x > (fontSize_width - 1)) break; if (array_y > (fontSize_height - 1)) { if (dropdown_bitmap_formats == '1') modulus_data += "0"; else modulus_data += "1"; continue; } //modulus_data+=modulus_array[array_y][array_x]; if (dropdown_bitmap_formats == '1') modulus_data += modulus_array[array_y][array_x]; else { if (modulus_array[array_y][array_x] == "0") modulus_data += "1"; else modulus_data += "0"; } } modulus_data += ","; } } //行列式 - 4 else if (dropdown_modulus_way == '4') { bit_num = modulus_x * fontSize_height; for (var j = 1; j <= bit_num; j++) { for (var i = 1; i <= 8; i++) { if (j % fontSize_height == 0) array_y = fontSize_height - 1; else array_y = j % fontSize_height - 1; array_x = (Math.ceil(j / fontSize_height) - 1) * 8 + i - 1; //modulus_data+=modulus_array[array_y][array_x]; if (dropdown_bitmap_formats == '1') modulus_data += modulus_array[array_y][array_x]; else { if (modulus_array[array_y][array_x] == "0") modulus_data += "1"; else modulus_data += "0"; } } modulus_data += ","; } } //} var now_data = ""; var end_data = ""; if (dropdown_modulus_direction == 2) { for (var i of modulus_data) { if (i == ",") { end_data += now_data; end_data += ","; now_data = ""; } else now_data = i + now_data; } modulus_data = end_data; } now_data = ""; end_data = "0x"; for (var i of modulus_data) { if (i == ",") { end_data += ",0x"; continue; } now_data += i; if (now_data.length == 4) { end_data += string_Bin_to_Hex(now_data); now_data = ""; } } modulus_data = end_data; modulus_data = modulus_data.substring(0, modulus_data.length - 3); if (checkbox_show_hz) generator.definitions_['var_declare_tool_modulus_data_' + dropdown_hz_sharp + '_' + text_hz_line_height + 'px' + encodeUnicode(text_input_data)] = '//' + hz_sharp; var code = modulus_data; return [code, generator.ORDER_ATOMIC]; } //获取两个日期差值 export const get_the_number_of_days_between_the_two_dates = function (_, generator) { var year_start = generator.valueToCode(this, 'year_start', generator.ORDER_ATOMIC); var month_start = generator.valueToCode(this, 'month_start', generator.ORDER_ATOMIC); var day_start = generator.valueToCode(this, 'day_start', generator.ORDER_ATOMIC); var year_end = generator.valueToCode(this, 'year_end', generator.ORDER_ATOMIC); var month_end = generator.valueToCode(this, 'month_end', generator.ORDER_ATOMIC); var day_end = generator.valueToCode(this, 'day_end', generator.ORDER_ATOMIC); generator.definitions_['get_the_number_of_days_between_the_two_dates'] = 'int day_diff(int year_start, int month_start, int day_start, int year_end, int month_end, int day_end)\n{\n int y2, m2, d2;\n int y1, m1, d1;\n m1 = (month_start + 9) % 12;\n y1 = year_start - m1/10;\n d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);\n m2 = (month_end + 9) % 12;\n y2 = year_end - m2/10;\n d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + (day_end - 1);\n return (d2 - d1);\n}'; var code = 'day_diff(' + year_start + ', ' + month_start + ', ' + day_start + ', ' + year_end + ', ' + month_end + ', ' + day_end + ')'; return [code, generator.ORDER_ATOMIC]; } export const esp8266_board_pin = function (_, generator) { var pin = this.getFieldValue('pin'); var code = '' + pin + ''; return [code, generator.ORDER_ATOMIC]; }