566 lines
19 KiB
JavaScript
566 lines
19 KiB
JavaScript
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 nano_pin = function () {
|
|
return "";
|
|
}
|
|
|
|
export const promini_pin = nano_pin;
|
|
export const leonardo_pin = nano_pin;
|
|
export const uno_pin = nano_pin;
|
|
export const mega_pin = nano_pin;
|
|
|
|
//获取两个日期差值
|
|
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];
|
|
} |