初始化提交

This commit is contained in:
王立帮
2024-07-19 10:16:00 +08:00
parent 4c7b571f20
commit 4a2d56dcc4
7084 changed files with 741212 additions and 63 deletions

View File

@@ -0,0 +1,732 @@
import { JSFuncs } from 'mixly';
import { Variables } from 'blockly/core';
export const servo_move = function (_, generator) {
var dropdown_pin = this.getFieldValue('PIN');
var value_degree = generator.valueToCode(this, 'DEGREE', generator.ORDER_ATOMIC);
var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '0'
generator.definitions_['include_Servo'] = '#include <Servo.h>';
generator.definitions_['var_declare_servo' + dropdown_pin] = 'Servo servo_' + dropdown_pin + ';';
generator.setups_['setup_servo_' + dropdown_pin] = 'servo_' + dropdown_pin + '.attach(' + dropdown_pin + ');';
var code = 'servo_' + dropdown_pin + '.write(' + value_degree + ');\n' + 'delay(' + delay_time + ');\n';
return code;
};
export const servo_writeMicroseconds = function (_, generator) {
var dropdown_pin = this.getFieldValue('PIN');
var value_degree = generator.valueToCode(this, 'DEGREE', generator.ORDER_ATOMIC);
generator.definitions_['include_Servo'] = '#include <Servo.h>';
generator.definitions_['var_declare_servo' + dropdown_pin] = 'Servo servo_' + dropdown_pin + ';';
generator.setups_['setup_servo_' + dropdown_pin] = 'servo_' + dropdown_pin + '.attach(' + dropdown_pin + ');';
var code = 'servo_' + dropdown_pin + '.writeMicroseconds(' + value_degree + ');\n';
return code;
};
export const servo_read_degrees = function (_, generator) {
var dropdown_pin = this.getFieldValue('PIN');
generator.definitions_['include_Servo'] = '#include <Servo.h>';
generator.definitions_['var_declare_servo' + dropdown_pin] = 'Servo servo_' + dropdown_pin + ';';
generator.setups_['setup_servo_' + dropdown_pin] = 'servo_' + dropdown_pin + '.attach(' + dropdown_pin + ');';
var code = 'servo_' + dropdown_pin + '.read()';
return [code, generator.ORDER_ATOMIC];
};
export const servo_move1 = function (_, generator) {
var mode = this.getFieldValue('mode');
var dropdown_pin = this.getFieldValue('PIN');
var value_degree = generator.valueToCode(this, 'DEGREE', generator.ORDER_ATOMIC);
var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '0'
if (mode == 0) {
generator.definitions_['include_Servo'] = '#include <Servo.h>';
generator.definitions_['var_declare_servo' + dropdown_pin] = 'Servo servo_' + dropdown_pin + ';';
}
if (mode == 1) {
generator.definitions_['include_Servo'] = '#include <Timer2ServoPwm.h>';
generator.definitions_['var_declare_servo' + dropdown_pin] = 'Timer2Servo servo_' + dropdown_pin + ';';
}
generator.setups_['setup_servo_' + dropdown_pin] = 'servo_' + dropdown_pin + '.attach(' + dropdown_pin + ');';
var code = 'servo_' + dropdown_pin + '.write(' + value_degree + ');\n' + 'delay(' + delay_time + ');\n';
return code;
};
export const servo_writeMicroseconds1 = function (_, generator) {
var mode = this.getFieldValue('mode');
var dropdown_pin = this.getFieldValue('PIN');
var value_degree = generator.valueToCode(this, 'DEGREE', generator.ORDER_ATOMIC);
if (mode == 0) {
generator.definitions_['include_Servo'] = '#include <Servo.h>';
generator.definitions_['var_declare_servo' + dropdown_pin] = 'Servo servo_' + dropdown_pin + ';';
}
if (mode == 1) {
generator.definitions_['include_Servo'] = '#include <Timer2ServoPwm.h>';
generator.definitions_['var_declare_servo' + dropdown_pin] = 'Timer2Servo servo_' + dropdown_pin + ';';
}
generator.setups_['setup_servo_' + dropdown_pin] = 'servo_' + dropdown_pin + '.attach(' + dropdown_pin + ');';
var code = 'servo_' + dropdown_pin + '.writeMicroseconds(' + value_degree + ');\n';
return code;
};
export const servo_read_degrees1 = function (_, generator) {
var mode = this.getFieldValue('mode');
var dropdown_pin = this.getFieldValue('PIN');
if (mode == 0) {
generator.definitions_['include_Servo'] = '#include <Servo.h>';
generator.definitions_['var_declare_servo' + dropdown_pin] = 'Servo servo_' + dropdown_pin + ';';
}
if (mode == 1) {
generator.definitions_['include_Servo'] = '#include <Timer2ServoPwm.h>';
generator.definitions_['var_declare_servo' + dropdown_pin] = 'Timer2Servo servo_' + dropdown_pin + ';';
}
generator.setups_['setup_servo_' + dropdown_pin] = 'servo_' + dropdown_pin + '.attach(' + dropdown_pin + ');';
var code = 'servo_' + dropdown_pin + '.read()';
return [code, generator.ORDER_ATOMIC];
};
export const tone_notes = function (_, generator) {
var code = this.getFieldValue('STAT');
return [code, generator.ORDER_ATOMIC];
};
export const controls_tone = function (_, generator) {
/*var xmlDom = Blockly.Xml.workspaceToDom(Mixly.Editor.blockEditor);
var xmlText = Blockly.Xml.domToPrettyText(xmlDom);
if (xmlText.indexOf("type=\"ir_recv\"") == -1 && xmlText.indexOf("type=\"ir_recv_enable\"") == -1 && xmlText.indexOf("type=\"ir_recv_raw\"") == -1) {
this.setWarningText(null);
}
else {
this.setWarningText(Blockly.Msg.IR_AND_TONE_WARNING);
}*/
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var fre = generator.valueToCode(this, 'FREQUENCY',
generator.ORDER_ASSIGNMENT) || '0';
var code = "";
if (window.isNaN(dropdown_pin)) {
code = code + 'pinMode(' + dropdown_pin + ', OUTPUT);\n';
} else {
generator.setups_['setup_output_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', OUTPUT);';
}
code += "tone(" + dropdown_pin + "," + fre + ");\n";
return code;
};
export const controls_notone = function (_, generator) {
/*var xmlDom = Blockly.Xml.workspaceToDom(Mixly.Editor.blockEditor);
var xmlText = Blockly.Xml.domToPrettyText(xmlDom);
if (xmlText.indexOf("type=\"ir_recv\"") == -1 && xmlText.indexOf("type=\"ir_recv_enable\"") == -1 && xmlText.indexOf("type=\"ir_recv_raw\"") == -1) {
this.setWarningText(null);
}
else {
this.setWarningText(Blockly.Msg.IR_AND_TONE_WARNING);
}*/
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = '';
if (window.isNaN(dropdown_pin)) {
code = code + 'pinMode(' + dropdown_pin + ', OUTPUT);\n';
} else {
generator.setups_['setup_output_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', OUTPUT);';
}
code += "noTone(" + dropdown_pin + ");\n";
return code;
};
// 执行器-蜂鸣器
export const controls_tone_noTimer = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var fre = generator.valueToCode(this, 'FREQUENCY', generator.ORDER_ASSIGNMENT) || '0';
var dur = generator.valueToCode(this, 'DURATION', generator.ORDER_ASSIGNMENT) || '0';
generator.definitions_['include_NewTone'] = '#include <NewTone.h>';
generator.setups_['setup_output_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', OUTPUT);';
var code = "NewTone(" + dropdown_pin + "," + fre + "," + dur + ");\n";
return code;
};
// 执行器-蜂鸣器结束声音
export const controls_notone_noTimer = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
generator.setups_['setup_output_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', OUTPUT);';
var code = "NewNoTone(" + dropdown_pin + ");\n";
return code;
};
export const group_stepper_setup = function (_, generator) {
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), Variables.NAME_TYPE);
var dropdown_pin1 = generator.valueToCode(this, 'PIN1', generator.ORDER_ATOMIC);
var dropdown_pin2 = generator.valueToCode(this, 'PIN2', generator.ORDER_ATOMIC);
var steps = generator.valueToCode(this, 'steps', generator.ORDER_ATOMIC);
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
generator.definitions_['include_Stepper'] = '#include <Stepper.h>';
generator.definitions_['var_declare_stepper' + varName] = 'Stepper ' + varName + '(' + steps + ',' + dropdown_pin1 + ',' + dropdown_pin2 + ');';
generator.setups_['setup_stepper' + varName] = varName + '.setSpeed(' + speed + ');';
return '';
};
export const group_stepper_setup2 = function (_, generator) {
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), Variables.NAME_TYPE);
var dropdown_pin1 = generator.valueToCode(this, 'PIN1', generator.ORDER_ATOMIC);
var dropdown_pin2 = generator.valueToCode(this, 'PIN2', generator.ORDER_ATOMIC);
var dropdown_pin3 = generator.valueToCode(this, 'PIN3', generator.ORDER_ATOMIC);
var dropdown_pin4 = generator.valueToCode(this, 'PIN4', generator.ORDER_ATOMIC);
var steps = generator.valueToCode(this, 'steps', generator.ORDER_ATOMIC);
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
generator.definitions_['include_Stepper'] = '#include <Stepper.h>';
generator.definitions_['var_declare_stepper' + varName] = 'Stepper ' + varName + '(' + steps + ',' + dropdown_pin1 + ',' + dropdown_pin2 + ',' + dropdown_pin3 + ',' + dropdown_pin4 + ');';
generator.setups_['setup_stepper' + varName] = varName + '.setSpeed(' + speed + ');';
return '';
};
export const group_stepper_move = function (_, generator) {
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), Variables.NAME_TYPE);
var step = generator.valueToCode(this, 'step', generator.ORDER_ATOMIC);
generator.definitions_['include_Stepper'] = '#include <Stepper.h>';
return varName + '.step(' + step + ');\n';
};
export const RGB_color_seclet = function (_, generator) {
var colour = this.getFieldValue('COLOR');
colour = '0x' + colour.substring(1, colour.length);
return [colour, generator.ORDER_NONE];
};
export const RGB_color_rgb = function (_, generator) {
var R = generator.valueToCode(this, 'R', generator.ORDER_ATOMIC);
var G = generator.valueToCode(this, 'G', generator.ORDER_ATOMIC);
var B = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC);
var colour = "((" + R + " & 0xffffff) << 16) | ((" + G + " & 0xffffff) << 8) | " + B;
return [colour, generator.ORDER_NONE];
};
export const display_rgb_init = function (_, generator) {
var dropdown_rgbpin = this.getFieldValue('PIN');
var type = this.getFieldValue('TYPE');
var value_ledcount = generator.valueToCode(this, 'LEDCOUNT', generator.ORDER_ATOMIC);
generator.definitions_['include_Adafruit_NeoPixel'] = '#include <Adafruit_NeoPixel.h>';
generator.definitions_['var_declare_rgb_display' + dropdown_rgbpin] = 'Adafruit_NeoPixel rgb_display_' + dropdown_rgbpin + ' = Adafruit_NeoPixel(' + value_ledcount + ',' + dropdown_rgbpin + ',' + type + ' + NEO_KHZ800);';
generator.setups_['setup_rgb_display_begin_' + dropdown_rgbpin] = 'rgb_display_' + dropdown_rgbpin + '.begin();';
return '';
};
export const display_rgb_Brightness = function (_, generator) {
var dropdown_rgbpin = this.getFieldValue('PIN');
var Brightness = generator.valueToCode(this, 'Brightness', generator.ORDER_ATOMIC);
generator.definitions_['include_Adafruit_NeoPixel'] = '#include <Adafruit_NeoPixel.h>';
generator.setups_['setup_rgb_display_begin_' + dropdown_rgbpin] = 'rgb_display_' + dropdown_rgbpin + '.begin();';
var code = 'rgb_display_' + dropdown_rgbpin + '.setBrightness(' + Brightness + ');\n';
return code;
};
export const display_rgb = function (_, generator) {
var dropdown_rgbpin = this.getFieldValue('PIN');
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
var COLOR = generator.valueToCode(this, 'COLOR', generator.ORDER_ATOMIC);
COLOR = COLOR.replace(/#/g, "0x");
var code = 'rgb_display_' + dropdown_rgbpin + '.setPixelColor((' + value_led + ')-1, ' + COLOR + ');\n';
return code;
};
export const RGB_color_HSV = function (_, generator) {
var dropdown_rgbpin = this.getFieldValue('PIN');
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
var H = generator.valueToCode(this, 'H', generator.ORDER_ATOMIC);
var S = generator.valueToCode(this, 'S', generator.ORDER_ATOMIC);
var V = generator.valueToCode(this, 'V', generator.ORDER_ATOMIC);
var code = 'rgb_display_' + dropdown_rgbpin + '.setPixelColor((' + value_led + ')-1, ' + 'rgb_display_' + dropdown_rgbpin + '.ColorHSV(' + H + ',' + S + ',' + V + '));\n';
return code;
};
export const display_rgb_show = function () {
var board_type = JSFuncs.getPlatform();
var dropdown_rgbpin = this.getFieldValue('PIN');
var code = 'rgb_display_' + dropdown_rgbpin + '.show();\n';
if (board_type.match(RegExp(/ESP32/))) {
code += 'rgb_display_' + dropdown_rgbpin + '.show();\n';
}
return code;
};
export const display_rgb_rainbow1 = function (_, generator) {
var dropdown_rgbpin = this.getFieldValue('PIN');
var wait_time = generator.valueToCode(this, 'WAIT', generator.ORDER_ATOMIC);
generator.setups_['setup_rgb_display_begin_' + dropdown_rgbpin] = 'rgb_display_' + dropdown_rgbpin + '.begin();\n';
var funcName2 = 'Wheel';
var code2 = 'uint32_t Wheel(byte WheelPos){\n'
+ ' if(WheelPos < 85){\n'
+ ' return rgb_display_' + dropdown_rgbpin + '.Color(WheelPos * 3, 255 - WheelPos * 3, 0);\n'
+ ' }\n'
+ ' else if(WheelPos < 170){\n'
+ ' WheelPos -= 85;\n'
+ ' return rgb_display_' + dropdown_rgbpin + '.Color(255 - WheelPos * 3, 0, WheelPos * 3);\n'
+ ' }\n '
+ ' else{\n'
+ ' WheelPos -= 170;\n'
+ ' return rgb_display_' + dropdown_rgbpin + '.Color(0, WheelPos * 3, 255 - WheelPos * 3);\n'
+ ' }\n'
+ '}\n';
generator.definitions_[funcName2] = code2;
var funcName3 = 'rainbow';
var code3 = 'void rainbow(uint8_t wait){\n'
+ ' uint16_t i, j;\n'
+ ' for(j=0; j<256; j++){\n'
+ ' for(i=0; i<rgb_display_' + dropdown_rgbpin + '.numPixels(); i++){\n'
+ ' rgb_display_' + dropdown_rgbpin + '.setPixelColor(i, Wheel((i+j) & 255));\n'
+ ' }\n'
+ ' rgb_display_' + dropdown_rgbpin + '.show();\n'
+ ' delay(wait);\n'
+ ' }\n'
+ '}\n';
generator.definitions_[funcName3] = code3;
var code = 'rainbow(' + wait_time + ');\n'
return code;
};
export const display_rgb_rainbow2 = function (_, generator) {
var dropdown_rgbpin = this.getFieldValue('PIN');
var wait_time = generator.valueToCode(this, 'WAIT', generator.ORDER_ATOMIC);
var funcName2 = 'Wheel';
var code2 = 'uint32_t Wheel(byte WheelPos){\n'
+ ' if(WheelPos < 85){\n'
+ ' return rgb_display_' + dropdown_rgbpin + '.Color(WheelPos * 3, 255 - WheelPos * 3, 0);\n'
+ ' }\n'
+ ' else if(WheelPos < 170){\n'
+ ' WheelPos -= 85;\n'
+ ' return rgb_display_' + dropdown_rgbpin + '.Color(255 - WheelPos * 3, 0, WheelPos * 3);\n'
+ ' }\n'
+ ' else{\n'
+ ' WheelPos -= 170;\n'
+ ' return rgb_display_' + dropdown_rgbpin + '.Color(0, WheelPos * 3, 255 - WheelPos * 3);\n'
+ ' }\n'
+ '}\n';
generator.definitions_[funcName2] = code2;
var funcName3 = 'rainbow';
var code3 = 'void rainbow(uint8_t wait){\n'
+ ' uint16_t i, j;\n'
+ ' for(j=0; j<256; j++){\n'
+ ' for(i=0; i<rgb_display_' + dropdown_rgbpin + '.numPixels(); i++){\n'
+ ' rgb_display_' + dropdown_rgbpin + '.setPixelColor(i, Wheel((i+j) & 255));\n'
+ ' }\n'
+ ' rgb_display_' + dropdown_rgbpin + '.show();\n'
+ ' delay(wait);\n'
+ ' }\n'
+ '}\n';
generator.definitions_[funcName3] = code3;
var funcName4 = 'rainbowCycle';
var code4 = 'void rainbowCycle(uint8_t wait){\n'
+ ' uint16_t i, j;\n'
+ ' for(j=0; j<256*5; j++){\n'
+ ' for(i=0; i< rgb_display_' + dropdown_rgbpin + '.numPixels(); i++){\n'
+ ' rgb_display_' + dropdown_rgbpin + '.setPixelColor(i, Wheel(((i * 256 / rgb_display_' + dropdown_rgbpin + '.numPixels()) + j) & 255));\n'
+ ' }\n'
+ ' rgb_display_' + dropdown_rgbpin + '.show();\n'
+ ' delay(wait);\n'
+ ' }\n'
+ '}\n';
generator.definitions_[funcName4] = code4;
var code = 'rainbowCycle(' + wait_time + ');\n'
return code;
};
export const display_rgb_rainbow3 = function (_, generator) {
var dropdown_rgbpin = this.getFieldValue('PIN');
var rainbow_color = generator.valueToCode(this, 'rainbow_color', generator.ORDER_ATOMIC);
var type = this.getFieldValue('TYPE');
var funcName2 = 'Wheel';
var code2 = 'uint32_t Wheel(byte WheelPos){\n'
+ ' if(WheelPos < 85){\n'
+ ' return rgb_display_' + dropdown_rgbpin + '.Color(WheelPos * 3, 255 - WheelPos * 3, 0);\n'
+ ' }\n'
+ ' else if(WheelPos < 170){\n'
+ ' WheelPos -= 85;\n'
+ ' return rgb_display_' + dropdown_rgbpin + '.Color(255 - WheelPos * 3, 0, WheelPos * 3);\n'
+ ' }\n'
+ ' else{\n'
+ ' WheelPos -= 170;return rgb_display_' + dropdown_rgbpin + '.Color(0, WheelPos * 3, 255 - WheelPos * 3);\n'
+ ' }\n'
+ '}\n';
generator.definitions_[funcName2] = code2;
if (type == "normal")
var code3 = 'for(int RGB_RAINBOW_i = 0; RGB_RAINBOW_i < rgb_display_' + dropdown_rgbpin + '.numPixels(); RGB_RAINBOW_i++){\n'
+ ' rgb_display_' + dropdown_rgbpin + '.setPixelColor(RGB_RAINBOW_i, Wheel(' + rainbow_color + ' & 255));\n'
+ '}\n'
+ 'rgb_display_' + dropdown_rgbpin + '.show();\n';
else
var code3 = 'for(int RGB_RAINBOW_i = 0; RGB_RAINBOW_i < rgb_display_' + dropdown_rgbpin + '.numPixels(); RGB_RAINBOW_i++){\n'
+ ' rgb_display_' + dropdown_rgbpin + '.setPixelColor(RGB_RAINBOW_i, Wheel(((RGB_RAINBOW_i * 256 / rgb_display_' + dropdown_rgbpin + '.numPixels()) + ' + rainbow_color + ') & 255));\n'
+ '}\n'
+ 'rgb_display_' + dropdown_rgbpin + '.show();\n';
return code3;
};
// 执行器-电机转动
export const Mixly_motor = function (_, generator) {
var PIN1 = generator.valueToCode(this, 'PIN1', generator.ORDER_ATOMIC);
var PIN2 = generator.valueToCode(this, 'PIN2', generator.ORDER_ATOMIC);
var PIN_EN = generator.valueToCode(this, 'PIN_EN', generator.ORDER_ATOMIC);
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ASSIGNMENT) || '0';
var code = 'setMotor(' + PIN1 + ', ' + PIN2 + ', ' + PIN_EN + ', ' + speed + ');\n';
generator.setups_['setup_output_' + PIN1 + PIN2 + '_S'] = 'pinMode(' + PIN1 + ', OUTPUT);';
generator.setups_['setup_output_' + PIN1 + PIN2 + '_D'] = 'pinMode(' + PIN2 + ', OUTPUT);';
generator.setups_['setup_output_' + PIN1 + PIN2 + '_S_W'] = 'digitalWrite(' + PIN1 + ', LOW);';
generator.setups_['setup_output_' + PIN1 + PIN2 + '_D_W'] = 'digitalWrite(' + PIN2 + ', LOW);';
var funcName = 'setMotor';
var code2 = 'void ' + funcName + '(int dirpin1, int dirpin2, int speedpin, int speed) {\n'
+ ' digitalWrite(dirpin2,!digitalRead(dirpin1));\n'
+ ' if (speed == 0) {\n'
+ ' digitalWrite(dirpin1, LOW);\n'
+ ' analogWrite(speedpin, 0);\n'
+ ' } else if (speed > 0) {\n'
+ ' digitalWrite(dirpin1, LOW);\n'
+ ' analogWrite(speedpin, speed);\n'
+ ' } else {\n'
+ ' digitalWrite(dirpin1, HIGH);\n'
+ ' analogWrite(speedpin, -speed);\n'
+ ' }\n'
+ '}\n';
generator.definitions_[funcName] = code2;
return code;
};
export const Motor_8833 = function (_, generator) {
var PIN1 = generator.valueToCode(this, 'PIN1', generator.ORDER_ATOMIC);
var PIN2 = generator.valueToCode(this, 'PIN2', generator.ORDER_ATOMIC);
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ASSIGNMENT) || '0';
var code = 'setMotor8833(' + PIN1 + ', ' + PIN2 + ', ' + speed + ');\n';
generator.setups_['setup_output_' + PIN1 + PIN2 + '_S'] = 'pinMode(' + PIN1 + ', OUTPUT);';
generator.setups_['setup_output_' + PIN1 + PIN2 + '_D'] = 'pinMode(' + PIN2 + ', OUTPUT);';
generator.setups_['setup_output_' + PIN1 + PIN2 + '_S_W'] = 'digitalWrite(' + PIN1 + ', LOW);';
generator.setups_['setup_output_' + PIN1 + PIN2 + '_D_W'] = 'digitalWrite(' + PIN2 + ', LOW);';
var funcName = 'setMotor8833';
var code2 = 'void ' + funcName + '(int speedpin, int dirpin, int speed) {\n'
+ ' if (speed == 0) {\n'
+ ' digitalWrite(dirpin, LOW);\n'
+ ' analogWrite(speedpin, 0);\n'
+ ' } else if (speed > 0) {\n'
+ ' digitalWrite(dirpin, LOW);\n'
+ ' analogWrite(speedpin, speed);\n'
+ ' } else {\n'
+ ' digitalWrite(dirpin, HIGH);\n'
+ ' analogWrite(speedpin, 255 + speed);\n'
+ ' }\n'
+ '}\n';
generator.definitions_[funcName] = code2;
return code;
};
// 语音模块68段日常用语
export const voice_module = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_voice = this.getFieldValue('VOICE');
var wait_time = generator.valueToCode(this, 'WAIT', generator.ORDER_ASSIGNMENT) || '0';
generator.setups_['setup_output_sda'] = 'pinMode(' + dropdown_pin + ', OUTPUT);';
var code = 'send_data(' + dropdown_voice + '); //volume control 0xE0-E7;\n';
code += 'delay(' + wait_time + ');\n'
var code2 = 'void send_data(int addr) {\n'
+ ' int i;\n'
+ ' digitalWrite(' + dropdown_pin + ', LOW);\n'
+ ' delay(3); //>2ms\n'
+ ' for (i = 0; i < 8; i++) {\n'
+ ' digitalWrite(' + dropdown_pin + ', HIGH);\n'
+ ' if (addr & 1) {\n'
+ ' delayMicroseconds(2400); //>2400us\n'
+ ' digitalWrite(' + dropdown_pin + ', LOW);\n'
+ ' delayMicroseconds(800);\n'
+ ' } //>800us\n'
+ ' else {\n'
+ ' delayMicroseconds(800); //>800us\n'
+ ' digitalWrite(' + dropdown_pin + ', LOW);\n'
+ ' delayMicroseconds(2400);\n'
+ ' } //>2400us\n'
+ ' addr >>= 1;\n'
+ ' }\n'
+ ' digitalWrite(' + dropdown_pin + ', HIGH);\n'
+ '}\n';
generator.definitions_['funcName'] = code2;
return code;
};
// gd5800 mp3 控制播放
export const GD5800_MP3_CONTROL = function (_, generator) {
var rxpin = generator.valueToCode(this, 'RXPIN', generator.ORDER_ATOMIC);
var txpin = generator.valueToCode(this, 'TXPIN', generator.ORDER_ATOMIC);
var CONTROL_TYPE = this.getFieldValue('CONTROL_TYPE');
generator.definitions_['include_GD5800'] = '#include <GD5800_Serial.h>';
generator.definitions_['var_declare_GD5800_ mp3' + rxpin + txpin] = 'GD5800_Serial mp3' + rxpin + txpin + '(' + rxpin + ', ' + txpin + ');';
generator.setups_['setup_ mp3' + rxpin + txpin] = 'mp3' + rxpin + txpin + '.begin(9600);';
var code = 'mp3' + rxpin + txpin + '.' + CONTROL_TYPE + '\n';
return code;
};
export const GD5800_MP3_Set_Device = function (_, generator) {
var rxpin = generator.valueToCode(this, 'RXPIN', generator.ORDER_ATOMIC);
var txpin = generator.valueToCode(this, 'TXPIN', generator.ORDER_ATOMIC);
var DEVICEID = this.getFieldValue('DEVICEID');
generator.definitions_['include_GD5800'] = '#include <GD5800_Serial.h>';
generator.definitions_['var_declare_GD5800_ mp3' + rxpin + txpin] = 'GD5800_Serial mp3' + rxpin + txpin + '(' + rxpin + ', ' + txpin + ');';
generator.setups_['setup_ mp3' + rxpin + txpin] = 'mp3' + rxpin + txpin + '.begin(9600);';
var code = 'mp3' + rxpin + txpin + '.setDevice(' + DEVICEID + ');\n';
return code;
};
// gd5800 mp3 循环模式
export const GD5800_MP3_LOOP_MODE = function (_, generator) {
var rxpin = generator.valueToCode(this, 'RXPIN', generator.ORDER_ATOMIC);
var txpin = generator.valueToCode(this, 'TXPIN', generator.ORDER_ATOMIC);
var LOOP_MODE = this.getFieldValue('LOOP_MODE');
generator.definitions_['include_GD5800'] = '#include <GD5800_Serial.h>';
generator.definitions_['var_declare_GD5800_ mp3' + rxpin + txpin] = 'GD5800_Serial mp3' + rxpin + txpin + '(' + rxpin + ', ' + txpin + ');';
generator.setups_['setup_ mp3' + rxpin + txpin] = 'mp3' + rxpin + txpin + '.begin(9600);';
var code = 'mp3' + rxpin + txpin + '.setLoopMode(' + LOOP_MODE + ');\n';
return code;
};
// gd5800 mp3 EQ模式
export const GD5800_MP3_EQ_MODE = function (_, generator) {
var rxpin = generator.valueToCode(this, 'RXPIN', generator.ORDER_ATOMIC);
var txpin = generator.valueToCode(this, 'TXPIN', generator.ORDER_ATOMIC);
var EQ_MODE = this.getFieldValue('EQ_MODE');
generator.definitions_['include_GD5800'] = '#include <GD5800_Serial.h>';
generator.definitions_['var_declare_GD5800_ mp3' + rxpin + txpin] = 'GD5800_Serial mp3' + rxpin + txpin + '(' + rxpin + ', ' + txpin + ');';
generator.setups_['setup_ mp3' + rxpin + txpin] = 'mp3' + rxpin + txpin + '.begin(9600);';
var code = 'mp3' + rxpin + txpin + '.setEqualizer(' + EQ_MODE + ');\n';
return code;
};
// gd5800 mp3 设置音量
export const GD5800_MP3_VOL = function (_, generator) {
var rxpin = generator.valueToCode(this, 'RXPIN', generator.ORDER_ATOMIC);
var txpin = generator.valueToCode(this, 'TXPIN', generator.ORDER_ATOMIC);
var vol = generator.valueToCode(this, 'vol', generator.ORDER_ATOMIC);
generator.definitions_['include_GD5800'] = '#include <GD5800_Serial.h>';
generator.definitions_['var_declare_GD5800_ mp3' + rxpin + txpin] = 'GD5800_Serial mp3' + rxpin + txpin + '(' + rxpin + ', ' + txpin + ');';
generator.setups_['setup_ mp3' + rxpin + txpin] = 'mp3' + rxpin + txpin + '.begin(9600);';
var code = 'mp3' + rxpin + txpin + '.setVolume(' + vol + ');\n';
return code;
};
// gd5800 mp3 播放第N首
export const GD5800_MP3_PLAY_NUM = function (_, generator) {
var rxpin = generator.valueToCode(this, 'RXPIN', generator.ORDER_ATOMIC);
var txpin = generator.valueToCode(this, 'TXPIN', generator.ORDER_ATOMIC);
var NUM = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
generator.definitions_['include_GD5800'] = '#include <GD5800_Serial.h>';
generator.definitions_['var_declare_GD5800_ mp3' + rxpin + txpin] = 'GD5800_Serial mp3' + rxpin + txpin + '(' + rxpin + ', ' + txpin + ');';
generator.setups_['setup_ mp3' + rxpin + txpin] = 'mp3' + rxpin + txpin + '.begin(9600);';
var code = 'mp3' + rxpin + txpin + '.playFileByIndexNumber(' + NUM + ');\n';
return code;
};
export const AFMotorRun = function (_, generator) {
generator.definitions_['include_AFMotor'] = '#include <AFMotor.h>';
var motorNO = this.getFieldValue('motor');
var direction = this.getFieldValue('direction');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = "";
generator.definitions_['var_declare_motor_' + motorNO] = "AF_DCMotor" + ' motor' + motorNO + '(' + motorNO + ');';
code = ' motor' + motorNO + ".setSpeed(" + speed + ");\n" + ' motor' + motorNO + ".run(" + direction + ");\n";
return code;
};
export const AFMotorStop = function (_, generator) {
generator.definitions_['include_AFMotor'] = '#include <AFMotor.h>';
var motorNO = this.getFieldValue('motor');
var code = "";
generator.definitions_['var_declare_motor_' + motorNO] = "AF_DCMotor" + ' motor' + motorNO + '(' + motorNO + ');';
code = ' motor' + motorNO + ".setSpeed(0);\n" + ' motor' + motorNO + ".run(RELEASE);\n";
return code;
};
// 初始化DFPlayer Mini
export const arduino_dfplayer_mini_begin = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var value_dfplayer_pin = generator.valueToCode(this, 'dfplayer_pin', generator.ORDER_ATOMIC);
generator.definitions_['include_Arduino'] = '#include "generator.h"';
generator.definitions_['include_DFRobotDFPlayerMini'] = '#include "DFRobotDFPlayerMini.h"';
generator.definitions_['var_declare_DFPlayerMini_' + text_dfplayer_name] = 'DFRobotDFPlayerMini ' + text_dfplayer_name + ';';
generator.setups_['setup_DFPlayerMini_' + text_dfplayer_name] = '' + text_dfplayer_name + '.begin(' + value_dfplayer_pin + ');';
var code = '';
return code;
};
// 定义DFPlayer Mini 所使用的串口类型
export const arduino_dfplayer_mini_pin = function (_, generator) {
var dropdown_pin_type = this.getFieldValue('pin_type');
generator.definitions_['include_SoftwareSerial'] = '#include <SoftwareSerial.h>';
var code = dropdown_pin_type;
return [code, generator.ORDER_ATOMIC];
};
// DFPlayer Mini 设置串口通信的超时时间
export const arduino_dfplayer_mini_setTimeOut = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var value_timeout_data = generator.valueToCode(this, 'timeout_data', generator.ORDER_ATOMIC);
var code = '' + text_dfplayer_name + '.setTimeOut(' + value_timeout_data + ');\n';
return code;
};
// DFPlayer Mini 设置音量
export const arduino_dfplayer_mini_volume = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var value_volume_data = generator.valueToCode(this, 'volume_data', generator.ORDER_ATOMIC);
var code = '' + text_dfplayer_name + '.volume(' + value_volume_data + ');\n';
return code;
};
// DFPlayer Mini 音量+|-
export const arduino_dfplayer_mini_volume_up_down = function () {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var dropdown_volume_type = this.getFieldValue('volume_type');
var code = '' + text_dfplayer_name + '.' + dropdown_volume_type + '();\n';
return code;
};
// DFPlayer Mini 设置音效
export const arduino_dfplayer_mini_EQ = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var value_eq_data = generator.valueToCode(this, 'eq_data', generator.ORDER_ATOMIC);
var code = '' + text_dfplayer_name + '.EQ(' + value_eq_data + ');\n';
return code;
};
// DFPlayer Mini 定义音效类型
export const arduino_dfplayer_mini_EQ_type = function (_, generator) {
var dropdown_eq_type = this.getFieldValue('eq_type');
var code = dropdown_eq_type;
return [code, generator.ORDER_ATOMIC];
};
// DFPlayer Mini 指定播放设备
export const arduino_dfplayer_mini_outputDevice = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var value_outputdevice_data = generator.valueToCode(this, 'outputdevice_data', generator.ORDER_ATOMIC);
var code = '' + text_dfplayer_name + '.outputDevice(' + value_outputdevice_data + ');\n';
return code;
};
// DFPlayer Mini 定义播放设备类型
export const arduino_dfplayer_mini_outputDevice_type = function (_, generator) {
var dropdown_outputdevice_type = this.getFieldValue('outputdevice_type');
var code = dropdown_outputdevice_type;
return [code, generator.ORDER_ATOMIC];
};
// DFPlayer Mini 设置-1
export const arduino_dfplayer_set_1 = function () {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var dropdown_set_data = this.getFieldValue('set_data');
var code = '' + text_dfplayer_name + '.' + dropdown_set_data + '();\n';
return code;
};
// DFPlayer Mini 播放和循环指定曲目
export const arduino_dfplayer_play_loop = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var value_play_data = generator.valueToCode(this, 'play_data', generator.ORDER_ATOMIC);
var dropdown_play_type = this.getFieldValue('play_type');
var code = '' + text_dfplayer_name + '.' + dropdown_play_type + '(' + value_play_data + ');\n';
return code;
};
// DFPlayer Mini 播放指定文件夹下的曲目
export const arduino_dfplayer_playFolder = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var value_fold_data = generator.valueToCode(this, 'fold_data', generator.ORDER_ATOMIC);
var dropdown_fold_type = this.getFieldValue('fold_type');
var value_play_data = generator.valueToCode(this, 'play_data', generator.ORDER_ATOMIC);
var code = '' + text_dfplayer_name + '.' + dropdown_fold_type + '(' + value_fold_data + ', ' + value_play_data + ');\n';
return code;
};
// DFPlayer Mini 循环播放指定文件夹下的曲目
export const arduino_dfplayer_loopFolder = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var value_fold_data = generator.valueToCode(this, 'fold_data', generator.ORDER_ATOMIC);
var code = '' + text_dfplayer_name + '.loopFolder(' + value_fold_data + ');\n';
return code;
};
// DFPlayer Mini 获取当前信息
export const arduino_dfplayer_read_now = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var dropdown_read_type = this.getFieldValue('read_type');
var code = '' + text_dfplayer_name + '.' + dropdown_read_type + '()';
return [code, generator.ORDER_ATOMIC];
};
// DFPlayer Mini 获取U盘|SD卡|FLASH的总文件数
export const arduino_dfplayer_readFileCounts = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var value_device_type = generator.valueToCode(this, 'device_type', generator.ORDER_ATOMIC);
var dropdown_play_data = this.getFieldValue('play_data');
var code = '' + text_dfplayer_name + '.' + dropdown_play_data + '(' + value_device_type + ')';
return [code, generator.ORDER_ATOMIC];
};
// DFPlayer Mini 获取指定文件夹下的文件数
export const arduino_dfplayer_readFileCountsInFolder = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var value_folder_data = generator.valueToCode(this, 'folder_data', generator.ORDER_ATOMIC);
var code = '' + text_dfplayer_name + '.readFileCountsInFolder(' + value_folder_data + ')';
return [code, generator.ORDER_ATOMIC];
};
export const arduino_dfplayer_available = function (_, generator) {
var text_dfplayer_name = this.getFieldValue('dfplayer_name');
var dropdown_type = this.getFieldValue('type');
var code = '' + text_dfplayer_name + '.' + dropdown_type + '()';
return [code, generator.ORDER_ATOMIC];
};
export const I2Cmotor = function (_, generator) {
var motorNO = this.getFieldValue('motor');
var speed = generator.valueToCode(this, 'SPEED', generator.ORDER_ASSIGNMENT) || '0';
generator.definitions_['include_Wire'] = '#include <Wire.h> ';
generator.definitions_['include_Adafruit_PWMServoDriver'] = '#include <Adafruit_PWMServoDriver.h>';
generator.definitions_['var_declare_Adafruit_PWMServoDriver'] = 'Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();';
generator.setups_['setup_pwm_begin'] = 'pwm.begin();\n'
+ 'pwm.setOscillatorFrequency(27000000);\n'
+ 'pwm.setPWMFreq(400);\n'
+ 'Wire.setClock(400000);';
var code2;
code2 = 'void motor(int ID,int SPEED){ //0-7\n'
+ ' if(SPEED>0){pwm.setPin(ID*2, 0 );pwm.setPin(ID*2+1, (SPEED+1)*16-1);}\n'
+ ' else if(SPEED==0){pwm.setPin(ID*2, 4095 );pwm.setPin(ID*2+1, 4095);}\n'
+ ' else if(SPEED<0){pwm.setPin(ID*2, 1-(SPEED+1)*16);pwm.setPin(ID*2+1, 0);}\n'
+ ' }\n';
generator.definitions_['motor'] = code2;
var code = 'motor(' + motorNO + ',' + speed + ');\n';
return code;
};
// M9101X mp3 单线控制播放
export const M9101X_S_MP3_CONTROL = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var CONTROL_TYPE = this.getFieldValue('CONTROL_TYPE');
generator.definitions_['include_N910X'] = '#include <RL_N910X.h>';
generator.definitions_['var_declare_N910X_ mp3' + dropdown_pin] = 'N910X mp3_' + dropdown_pin + '(' + dropdown_pin + ');';
generator.setups_['setup_ mp3' + dropdown_pin] = 'mp3_' + dropdown_pin + '.begin();';
var code = 'mp3_' + dropdown_pin + '.' + CONTROL_TYPE + '\n';
return code;
};
// M9101X mp3 单线音量控制
export const M9101X_S_MP3_VOL_CONTROL = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var vol = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
generator.definitions_['include_N910X'] = '#include <RL_N910X.h>';
generator.definitions_['var_declare_N910X_ mp3' + dropdown_pin] = 'N910X mp3_' + dropdown_pin + '(' + dropdown_pin + ');';
generator.setups_['setup_ mp3' + dropdown_pin] = ' mp3_' + dropdown_pin + '.begin();';
var code = 'mp3_' + dropdown_pin + '.set_volume(' + vol + ');\n';
return code;
};
// M9101X mp3 单线播放第N首
export const M9101X_S_MP3_PLAY_NUM = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
generator.definitions_['include_N910X'] = '#include <RL_N910X.h>';
generator.definitions_['var_declare_N910X_ mp3' + dropdown_pin] = 'N910X mp3_' + dropdown_pin + '(' + dropdown_pin + ');';
generator.setups_['setup_ mp3' + dropdown_pin] = ' mp3_' + dropdown_pin + '.begin();';
var code = 'mp3_' + dropdown_pin + '.set_play_number(' + num + ');\n';
return code;
};

View File

@@ -0,0 +1,894 @@
import { JSFuncs } from 'mixly';
import { Variables } from 'blockly/core';
// 物联网-授权码
export const blynk_iot_auth = function () {
return '';
};
// 物联网-一键配网
export const blynk_smartconfig = function (_, generator) {
let auth_key = generator.valueToCode(this, 'auth_key', generator.ORDER_ATOMIC);
let server_add = generator.valueToCode(this, 'server_add', generator.ORDER_ATOMIC);
if (!isNaN(server_add.charAt(2))) {
server_add = server_add.replace(/"/g, "").replace(/\./g, ",");
server_add = 'IPAddress(' + server_add + ')';
}
let board_type = JSFuncs.getPlatform();
generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial';
generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth_key + ';';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.setups_['setup_smartconfig'] = 'WiFi.mode(WIFI_STA);\n'
+ ' int cnt = 0;\n'
+ ' while (WiFi.status() != WL_CONNECTED) {\n'
+ ' delay(500); \n'
+ ' Serial.print("."); \n'
+ ' if (cnt++ >= 10) {\n'
+ ' WiFi.beginSmartConfig();\n'
+ ' while (1) {\n'
+ ' delay(1000);\n'
+ ' if (WiFi.smartConfigDone()) {\n'
+ ' Serial.println();\n'
+ ' Serial.println("SmartConfig: Success");\n'
+ ' break;\n'
+ ' }\n'
+ ' Serial.print("|");\n'
+ ' }\n'
+ ' }\n'
+ ' }\n'
+ ' WiFi.printDiag(Serial);\n';
if (board_type.match(RegExp(/ESP8266/))) {
generator.definitions_['include_ESP8266WiFi'] = '#include <ESP8266WiFi.h>';
generator.definitions_['include_BlynkSimpleEsp8266'] = '#include <BlynkSimpleEsp8266.h>';
}
else if (board_type.match(RegExp(/ESP32/))) {
generator.definitions_['include_WiFi'] = '#include <WiFi.h>';
generator.definitions_['include_WiFiClient'] = '#include <WiFiClient.h>';
generator.definitions_['include_BlynkSimpleEsp32'] = '#include <BlynkSimpleEsp32.h>';
}
generator.setups_['setup_smartconfig'] += 'Blynk.config(auth,' + server_add + ',8080);';
let code = "Blynk.run();\n";
return code;
};
// 物联网-wifi信息
export const blynk_server = function (_, generator) {
let wifi_ssid = generator.valueToCode(this, 'wifi_ssid', generator.ORDER_ATOMIC);
let wifi_pass = generator.valueToCode(this, 'wifi_pass', generator.ORDER_ATOMIC);
let auth_key = generator.valueToCode(this, 'auth_key', generator.ORDER_ATOMIC);
let server_add = generator.valueToCode(this, 'server_add', generator.ORDER_ATOMIC);
let board_type = JSFuncs.getPlatform();
//let board_type ="ESP8266";
generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial';
generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth_key + ';';
generator.definitions_['var_declare_wifi_ssid'] = 'char ssid[] = ' + wifi_ssid + ';';
generator.definitions_['var_declare_wifi_pass'] = 'char pass[] = ' + wifi_pass + ';';
if (board_type.match(RegExp(/AVR/))) {
generator.definitions_['include_ESP8266WiFi'] = '#include <ESP8266_Lib.h>';
generator.definitions_['include_BlynkSimpleEsp8266'] = '#include <BlynkSimpleShieldEsp8266.h>';
generator.definitions_['define_BLYNK_PRINT'] = '#define ESP8266_BAUD 115200';
generator.definitions_['var_declare_ESP8266'] = 'ESP8266 wifi(&Serial);';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(115200);';
generator.setups_['delay_10_1'] = 'delay(10);';
generator.setups_['wifi.setOprToStation'] = 'wifi.setOprToStation(2, 2);';
generator.setups_['delay_10_2'] = 'delay(10);';
generator.setups_['wifi.enableMUX'] = 'wifi.enableMUX();';
generator.setups_['delay_10_3'] = 'delay(10);';
generator.setups_['setup_Blynk.begin'] = 'Blynk.begin(auth, wifi,ssid, pass,' + server_add + ',8080);';
}
if (!isNaN(server_add.charAt(2))) {
server_add = server_add.replace(/"/g, "").replace(/\./g, ",");
server_add = 'IPAddress(' + server_add + ')';
}
if (board_type.match(RegExp(/ESP8266/))) {
generator.definitions_['include_ESP8266WiFi'] = '#include <ESP8266WiFi.h>';
generator.definitions_['include_BlynkSimpleEsp8266'] = '#include <BlynkSimpleEsp8266.h>';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.setups_['setup_Blynk.begin'] = ' Blynk.begin(auth, ssid, pass,' + server_add + ',8080);';
}
else if (board_type.match(RegExp(/ESP32/))) {
generator.definitions_['include_WiFi'] = '#include <WiFi.h>';
generator.definitions_['include_WiFiClient'] = '#include <WiFiClient.h>';
generator.definitions_['include_BlynkSimpleEsp32'] = '#include <BlynkSimpleEsp32.h>';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.setups_['setup_Blynk.begin'] = 'Blynk.begin(auth, ssid, pass,' + server_add + ',8080);';
}
let code = "Blynk.run();\n";
return code;
};
// 物联网-wifi信息
export const blynk_usb_server = function (_, generator) {
// generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT DebugSerial';
generator.definitions_['include_SoftwareSerial'] = '#include <SoftwareSerial.h>';
generator.definitions_['include_BlynkSimpleStream'] = '#include <BlynkSimpleStream.h>';
generator.definitions_['var_declare_SoftwareSerial'] = 'SoftwareSerial DebugSerial(2, 3);';
let auth_key = generator.valueToCode(this, 'auth_key', generator.ORDER_ATOMIC);
generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth_key + ';';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.setups_['setup_Blynk.begin'] = 'Blynk.begin(Serial, auth);';
generator.setups_['setup_DebugSerial'] = 'DebugSerial.begin(9600);';
let code = "Blynk.run();\n";
return code;
};
// 物联网-发送数据到app
export const blynk_iot_push_data = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
let code = 'Blynk.virtualWrite(' + Vpin + ', ' + data + ');\n';
return code;
};
// 从app接收数据
export const blynk_iot_get_data = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let branch = generator.statementToCode(this, 'STACK');
if (generator.INFINITE_LOOP_TRAP) {
branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + this.id + '\'') + branch;
}
let args = [];
for (let x = 0; x < this.arguments_.length; x++) {
args[x] = this.argumentstype_[x] + ' ' + generator.variableDB_.getName(this.arguments_[x], Variables.NAME_TYPE);
}
let GetDataCode = "";
if (this.arguments_.length == 1) {
GetDataCode = generator.variableDB_.getName(this.arguments_[0], Variables.NAME_TYPE);
if (this.argumentstype_[0] == "int")
GetDataCode = " " + GetDataCode + " = param.asInt();\n"
else if (this.argumentstype_[0] == "String")
GetDataCode = " " + GetDataCode + " = param.asStr();\n"
else if (this.argumentstype_[0] == "long")
GetDataCode = " " + GetDataCode + " = param.asDouble();\n"
else if (this.argumentstype_[0] == "float")
GetDataCode = " " + GetDataCode + " = param.asFloat();\n"
else if (this.argumentstype_[0] == "boolean")
GetDataCode = " " + GetDataCode + " = param.asInt();\n"
else if (this.argumentstype_[0] == "byte")
GetDataCode = " " + GetDataCode + " = param.asStr();\n"
else if (this.argumentstype_[0] == "char")
GetDataCode = " " + GetDataCode + " = param.asStr();\n"
}
else {
for (let x = 0; x < this.arguments_.length; x++) {
args[x] = this.argumentstype_[x] + ' ' + generator.variableDB_.getName(this.arguments_[x], Variables.NAME_TYPE);
GetDataCode = GetDataCode + " " + generator.variableDB_.getName(this.arguments_[x], Variables.NAME_TYPE);
if (this.argumentstype_[x] == "int")
GetDataCode += " = param[" + x + "].asInt();\n"
else if (this.argumentstype_[x] == "String")
GetDataCode += " = param[" + x + "].asStr();\n"
else if (this.argumentstype_[x] == "long")
GetDataCode += " = param[" + x + "].asDouble();\n"
else if (this.argumentstype_[x] == "float")
GetDataCode += " = param[" + x + "].asFloat();\n"
else if (this.argumentstype_[x] == "boolean")
GetDataCode += " = param[" + x + "].asInt();\n"
else if (this.argumentstype_[x] == "byte")
GetDataCode += " = param[" + x + "].asStr();\n"
else if (this.argumentstype_[x] == "char")
GetDataCode += " = param[" + x + "].asStr();\n"
}
}
if (this.arguments_.length > 0)
generator.definitions_['var_declare_' + args] = args.join(';\n') + ";";
let code = 'BLYNK_WRITE(' + Vpin + ') {\n' + GetDataCode +
branch + '}\n';
// let code = 'BLYNK_WRITE(' + Vpin+ ') {\n'+letiable+" = param.as"+datatype+"();\n"+branch+'}\n';
code = generator.scrub_(this, code);
generator.definitions_[Vpin] = code;
return null;
};
// blynk 定时器
export const Blynk_iot_timer = function (_, generator) {
generator.definitions_['var_declare_BlynkTimer'] = 'BlynkTimer timer;';
let timerNo = this.getFieldValue('timerNo');
let time = generator.valueToCode(this, 'TIME', generator.ORDER_ATOMIC);
let funcName = 'myTimerEvent' + timerNo;
let branch = generator.statementToCode(this, 'DO');
let code = 'void' + ' ' + funcName + '() {\n'
+ branch
+ '}\n';
generator.definitions_[funcName] = code;
generator.setups_[funcName] = 'timer.setInterval(' + time + 'L, ' + funcName + ');\n';
return "timer.run();\n";
};
// blynk 连接状态函数
export const Blynk_iot_CONNECT_STATE = function (_, generator) {
let funcName = this.getFieldValue('state');
let branch = generator.statementToCode(this, 'DO');
let code = funcName + '() {\n' + branch + '}\n';
generator.definitions_[funcName] = code;
return "";
};
// blynk 同步所有管脚状态
export const Blynk_iot_BLYNK_syncAll = function () {
let code = 'Blynk.syncAll();\n';
return code;
};
// 物联网-发送数据到app
export const blynk_iot_syncVirtual = function () {
let Vpin = this.getFieldValue('Vpin');
let code = 'Blynk.syncVirtual(' + Vpin + ');\n';
return code;
};
//LED组件颜色&开关
export const blynk_iot_WidgetLED_COLOR = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let COLOR = generator.valueToCode(this, 'COLOR', generator.ORDER_ATOMIC);
COLOR = COLOR.replace(/#/g, "").replace(/\(/g, "").replace(/\)/g, "").replace(/0x/g, '');
let dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
generator.definitions_['var_declare_WidgetLED' + Vpin] = 'WidgetLED led' + Vpin + '(' + Vpin + ');';
let code = 'led' + Vpin + '.setColor("#' + COLOR + '");\n';
if (dropdown_stat == "HIGH")
code += 'led' + Vpin + '.on();\n';
else if (dropdown_stat == "LOW")
code += 'led' + Vpin + '.off();\n';
return code;
};
//LED组件颜色&亮度
export const blynk_iot_WidgetLED_VALUE = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let COLOR = generator.valueToCode(this, 'COLOR', generator.ORDER_ATOMIC);
COLOR = COLOR.replace(/#/g, "").replace(/\(/g, "").replace(/\)/g, "").replace(/0x/g, '');
let value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
generator.definitions_['var_declare_WidgetLED' + Vpin] = 'WidgetLED led' + Vpin + '(' + Vpin + ');';
let code = 'led' + Vpin + '.setColor("#' + COLOR + '");\n';
code += 'led' + Vpin + '.setValue(' + value_num + ');';
return code;
};
// 红外控制空调
export const blynk_iot_ir_send_ac = function (_, generator) {
let AC_TYPE = this.getFieldValue('AC_TYPE');
let AC_POWER = this.getFieldValue('AC_POWER');
let AC_MODE = this.getFieldValue('AC_MODE');
let AC_FAN = this.getFieldValue('AC_FAN');
let dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
let AC_TEMP = generator.valueToCode(this, 'AC_TEMP', generator.ORDER_ATOMIC);
generator.definitions_['include_Arduino'] = '#ifndef UNIT_TEST\n#include <generator.h>\n#endif';
generator.definitions_['include_IRremoteESP8266'] = '#include <IRremoteESP8266.h>';
generator.definitions_['include_IRsend'] = '#include <IRsend.h>';
generator.definitions_['include' + AC_TYPE] = '#include <ir_' + AC_TYPE + '.h>';
generator.definitions_['define_IR_LED' + dropdown_pin] = '#define IR_LED ' + dropdown_pin;
generator.definitions_['IR' + AC_TYPE + 'AC'] = 'IR' + AC_TYPE + 'AC ' + AC_TYPE + 'AC(IR_LED); ';
generator.setups_['setup' + AC_TYPE] = AC_TYPE + 'AC.begin();';
let code = AC_TYPE + 'AC.setPower(' + AC_POWER + ');\n';
code += AC_TYPE + 'AC.setFan(' + AC_FAN + ');\n';
code += AC_TYPE + 'AC.setMode(' + AC_MODE + ');\n';
code += AC_TYPE + 'AC.setTemp(' + AC_TEMP + ');\n';
code += AC_TYPE + 'AC.send();\n';
return code;
};
// 红外接收
export const blynk_iot_ir_recv_raw = function (_, generator) {
let dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
generator.definitions_['include_IRremote'] = '#ifndef UNIT_TEST\n'
+ '#include <generator.h>\n'
+ '#endif\n#include <IRremoteESP8266.h>\n#include <IRrecv.h>\n#include <IRutils.h>\n#if DECODE_AC\n#include <ir_Daikin.h>\n#include <ir_Fujitsu.h>\n#include <ir_Gree.h>\n#include <ir_Haier.h>\n#include <ir_Kelvinator.h>\n#include <ir_Midea.h>\n#include <ir_Toshiba.h>\n#endif \n';
generator.definitions_['define_RECV_PIN' + dropdown_pin] = '#define RECV_PIN ' + dropdown_pin + '\n';
// generator.definitions_['define_BAUD_RATE'] = '#define BAUD_RATE 115200\n';
generator.definitions_['var_declare_CAPTURE_BUFFER_SIZE'] = '#define CAPTURE_BUFFER_SIZE 1024\n#if DECODE_AC\n#define TIMEOUT 50U\n#else\n#define TIMEOUT 15U \n#endif\n#define MIN_UNKNOWN_SIZE 12\n#define IN_UNKNOWN_SIZE 12\nIRrecv irrecv(RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, true);\ndecode_results results;';
generator.setups_['ir_recv_begin'] = 'while(!Serial)\n'
+ ' delay(50);\n'
+ ' #if DECODE_HASH\n'
+ ' irrecv.setUnknownThreshold(MIN_UNKNOWN_SIZE);\n'
+ ' #endif \n'
+ ' irrecv.enableIRIn();';
let code = "if(irrecv.decode(&results)){\n"
+ ' uint32_t now = millis();\n'
+ ' dumpACInfo(&results);\n'
+ ' Serial.println(resultToSourceCode(&results));\n'
+ '}\n';
let funcode = 'void dumpACInfo(decode_results *results){\n'
+ ' String description="";\n'
+ ' #if DECODE_DAIKIN\n'
+ ' if(results->decode_type == DAIKIN){\n'
+ ' IRDaikinESP ac(0);\n'
+ ' ac.setRaw(results->state);\n'
+ ' description=ac.toString();\n'
+ ' }\n'
+ ' #endif\n'
+ ' #if DECODE_FUJITSU_AC\n'
+ ' if(results->decode_type==FUJITSU_AC){\n'
+ ' IRFujitsuAC ac(0);\n'
+ ' ac.setRaw(results->state, results->bits / 8);\n'
+ ' description = ac.toString();\n'
+ ' }\n'
+ ' #endif\n'
+ ' #if DECODE_KELVINATOR\n'
+ ' if(results->decode_type == KELVINATOR){\n'
+ ' IRKelvinatorAC ac(0);\n'
+ ' ac.setRaw(results->state);\n'
+ ' description = ac.toString();\n'
+ ' }\n'
+ ' #endif\n'
+ ' #if DECODE_TOSHIBA_AC\n'
+ ' if(results->decode_type == TOSHIBA_AC){\n'
+ ' IRToshibaAC ac(0);\n'
+ ' ac.setRaw(results->state);\n'
+ ' description = ac.toString();\n'
+ ' }\n'
+ ' #endif\n'
+ ' #if DECODE_GREE\n'
+ ' if (results->decode_type == GREE){\n'
+ ' IRGreeAC ac(0);\n'
+ ' ac.setRaw(results->state);\n'
+ ' description = ac.toString();\n'
+ ' }\n'
+ ' #endif\n'
+ ' #if DECODE_MIDEA\n'
+ ' if(results->decode_type == MIDEA){\n'
+ ' IRMideaAC ac(0);\n'
+ ' ac.setRaw(results->value);\n'
+ ' description=ac.toString();\n'
+ ' }\n'
+ ' #endif\n'
+ ' #if DECODE_HAIER_AC\n'
+ ' if(results->decode_type == HAIER_AC){\n'
+ ' IRHaierAC ac(0);\n'
+ ' ac.setRaw(results->state);\n'
+ ' description = ac.toString();\n'
+ ' }\n'
+ ' #endif\n'
+ ' if(description != "")\n'
+ ' Serial.println("Mesg Desc.: " + description);\n'
+ '}\n';
generator.definitions_['dumpACInfo'] = funcode;
return code;
};
// 红外发射
export const blynk_iot_ir_send = function (_, generator) {
let dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
let IR_CODE = this.getFieldValue('IR_CODE');
let IR_CODE_LENGTH = IR_CODE.split(',').length;
let random_num = Math.ceil(Math.random() * 100000);
generator.definitions_['define_IRremote'] = '#ifndef UNIT_TEST\n#include <generator.h>\n#endif\n#include <IRremoteESP8266.h>\n#include <IRsend.h>\n#define IR_LED ' + dropdown_pin;
generator.definitions_['var_declare_IRsend_irsend'] = 'IRsend irsend(IR_LED);\n';
generator.definitions_['var_declare_send' + random_num] = 'uint16_t rawData' + random_num + '[' + IR_CODE_LENGTH + '] = {' + IR_CODE + '};';
// generator.setups_['Serial.begin'] = 'irsend.begin();\n Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);\n';
generator.setups_['irsend_begin'] = 'irsend.begin();\n';
let code = 'irsend.sendRaw(rawData' + random_num + ', ' + IR_CODE_LENGTH + ', 38);\ndelay(2000);\n';
return code;
}
// 发送邮件
export const blynk_email = function (_, generator) {
let email_add = generator.valueToCode(this, 'email_add', generator.ORDER_ATOMIC);
let Subject = generator.valueToCode(this, 'Subject', generator.ORDER_ATOMIC);
let content = generator.valueToCode(this, 'content', generator.ORDER_ATOMIC);
generator.definitions_['define_BLYNK_MAX_SENDBYTES'] = '#define BLYNK_MAX_SENDBYTES 128 \n';
let code = 'Blynk.email(' + email_add + ', ' + Subject + ', ' + content + ');\n';
return code;
};
// 发送通知
export const blynk_notify = function (_, generator) {
let content = generator.valueToCode(this, 'content', generator.ORDER_ATOMIC);
let code = 'Blynk.notify(' + content + ');\n';
return code;
};
// 物联网-终端组件显示文本
export const blynk_terminal = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
generator.definitions_['var_declare_WidgetTerminal' + Vpin] = 'WidgetTerminal terminal' + Vpin + '(' + Vpin + ');\n';
let content = generator.valueToCode(this, 'content', generator.ORDER_ATOMIC);
let code = 'terminal' + Vpin + '.println(' + content + ');\nterminal' + Vpin + '.flush();\n';
return code;
};
// 从终端获取字符串
export const blynk_iot_terminal_get = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
generator.definitions_['var_declare_WidgetTerminal'] = 'WidgetTerminal terminal(' + Vpin + ');\n';
generator.definitions_['var_declare_action'] = 'String terminal_text ;';
let branch = generator.statementToCode(this, 'DO');
branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格s
let code = 'BLYNK_WRITE' + '(' + Vpin + '){\n'
+ ' terminal_text = param.asStr();\n'
+ ' ' + branch + '\n'
+ ' terminal.flush();\n'
+ '}\n'
generator.definitions_[Vpin] = code;
return null;
};
// 视频流
export const blynk_videourl = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let url = generator.valueToCode(this, 'url', generator.ORDER_ATOMIC);
let code = 'Blynk.setProperty(' + Vpin + ',"url",' + url + ');\n';
return code;
};
// 桥接授权码
export const blynk_bridge_auth = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC);
generator.definitions_['var_declare_WidgetBridge' + Vpin] = 'WidgetBridge bridge' + Vpin + '(' + Vpin + ');\n';
let code = 'bridge' + Vpin + '.setAuthToken(' + auth + ');\n';
return code;
};
// 桥接数字输出
export const blynk_bridge_digitalWrite = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
let dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
let code = 'bridge' + Vpin + '.digitalWrite(' + dropdown_pin + ', ' + dropdown_stat + ');\n';
return code;
};
// 桥接模拟输出
export const blynk_bridge_AnaloglWrite = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
let value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
let code = 'bridge' + Vpin + '.analogWrite(' + dropdown_pin + ', ' + value_num + ');\n';
return code;
};
// 桥接虚拟管脚
export const blynk_bridge_VPin = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let Vpin2 = this.getFieldValue('Vpin2');
let value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
let code = 'bridge' + Vpin + '.virtualWrite(' + Vpin2 + ', ' + value_num + ');\n';
return code;
};
// RTC组件初始化
export const blynk_WidgetRTC_init = function (_, generator) {
generator.definitions_['include_TimeLib'] = '#include <TimeLib.h>';
generator.definitions_['include_WidgetRTC'] = '#include <WidgetRTC.h>';
let value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
generator.definitions_['var_declare_WidgetRTC'] = 'WidgetRTC rtc;\n';
generator.setups_['setSyncInterval'] = 'setSyncInterval(' + value_num + '* 60);';
let code = 'rtc.begin();\n';
return code;
};
// RTC获取时间
export const blynk_WidgetRTC_get_time = function (_, generator) {
let timeType = this.getFieldValue('TIME_TYPE');
let code = timeType + '()';
return [code, generator.ORDER_ATOMIC];
};
// 播放音乐组件
export const blynk_iot_playmusic = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let branch = generator.statementToCode(this, 'DO');
if (generator.INFINITE_LOOP_TRAP) {
branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + this.id + '\'') + branch;
}
branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格
let code = 'BLYNK_WRITE(' + Vpin + '){\n'
+ ' action = param.asStr();\n'
+ ' ' + branch + '\n'
+ ' Blynk.setProperty(' + Vpin + ', "label", action);\n'
+ '}\n';
code = generator.scrub_(this, code);
generator.definitions_[Vpin] = code;
return "";
};
// 光线传感器
export const blynk_light = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let branch = generator.statementToCode(this, 'DO');
branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格
let code = 'BLYNK_WRITE' + '(' + Vpin + '){\n'
+ ' int lx = param.asInt();\n'
+ ' ' + branch + '\n'
+ '}\n';
generator.definitions_[Vpin] = code;
return "";
};
// 重力传感器
export const blynk_gravity = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let branch = generator.statementToCode(this, 'DO');
branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格
let code = 'BLYNK_WRITE' + '(' + Vpin + '){\n'
+ ' int x = param[0].asFloat();\n'
+ ' int y = param[1].asFloat();\n'
+ ' int z = param[2].asFloat();\n'
+ ' ' + branch + '\n'
+ '}\n';
generator.definitions_[Vpin] = code;
return "";
};
// 加速度传感器
export const blynk_acc = blynk_gravity;
// 时间输入
export const blynk_time_input_1 = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let branch = generator.statementToCode(this, 'DO');
branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格
let code = 'BLYNK_WRITE' + '(' + Vpin + '){\n'
+ ' long startTimeInSecs = param[0].asLong();\n'
+ ' long hour =startTimeInSecs/3600;\n'
+ ' long minute=(startTimeInSecs-3600*hour)/60;\n'
+ ' long second=(startTimeInSecs-3600*hour)%60;\n'
+ ' ' + branch + '\n'
+ '}\n';
generator.definitions_[Vpin] = code;
return "";
};
// 执行器-蜂鸣器频率选择列表
export const tone_notes = function (_, generator) {
let code = this.getFieldValue('STAT');
return [code, generator.ORDER_ATOMIC];
};
export const factory_declare2 = function (_, generator) {
let VALUE = this.getFieldValue('VALUE');
generator.definitions_['var_' + VALUE] = VALUE;
return '';
};
// 一键配网(无需安可信)
export const blynk_AP_config = function (_, generator) {
let server_add = generator.valueToCode(this, 'server_add', generator.ORDER_ATOMIC);
let auth_key = generator.valueToCode(this, 'auth_key', generator.ORDER_ATOMIC);
let board_type = JSFuncs.getPlatform();
generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial';
if (board_type.match(RegExp(/ESP8266/))) {
generator.definitions_['include_ESP8266WiFi'] = '#include <ESP8266WiFi.h>';
generator.definitions_['include_BlynkSimpleEsp8266'] = '#include <BlynkSimpleEsp8266.h>';
}
else if (board_type.match(RegExp(/ESP32/))) {
generator.definitions_['include_WiFi'] = '#include <WiFi.h>';
generator.definitions_['include_WiFiClient'] = '#include <WiFiClient.h>';
generator.definitions_['include_BlynkSimpleEsp32'] = '#include <BlynkSimpleEsp32.h>';
}
generator.definitions_['include_DNSServer'] = '#include <DNSServer.h>';
generator.definitions_['include_ESP8266WebServer'] = '#include <ESP8266WebServer.h>\n';
generator.definitions_['include_WiFiManager'] = '#include <WiFiManager.h>';
generator.definitions_['var_declare_WiFiServer'] = 'WiFiServer server(80);';
generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth_key + ';';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.setups_['setup_WiFiManager'] = 'WiFiManager wifiManager;';
generator.setups_['setup_wifiManagerautoConnect'] = 'wifiManager.autoConnect("Blynk");';
generator.setups_['setup_server.begin'] = 'Serial.println("Connected.");\n server.begin();';
if (isNaN(server_add.charAt(2))) {
generator.setups_['setup_Blynkconfig'] = 'Blynk.config(auth, ' + server_add + ', 8080);';
}
else {
server_add = server_add.replace(/"/g, "").replace(/\./g, ",");
generator.setups_['setup_Blynkconfig'] = 'Blynk.config(auth, ' + 'IPAddress(' + server_add + '), 8080);';
}
let code = 'Blynk.run();';
return code;
};
// 一键配网手动配置授权码(无需安可信)
export const blynk_AP_config_2 = function (_, generator) {
let server_add = generator.valueToCode(this, 'server_add', generator.ORDER_ATOMIC);
generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial';
generator.definitions_['include_FS'] = '#include <FS.h>';
generator.definitions_['include_ESP8266WiFi'] = '#include <ESP8266WiFi.h>';
generator.definitions_['include_BlynkSimpleEsp8266'] = '#include <BlynkSimpleEsp8266.h>';
generator.definitions_['include_DNSServer'] = '#include <DNSServer.h>';
generator.definitions_['include_ESP8266WebServer'] = '#include <ESP8266WebServer.h>';
generator.definitions_['include_WiFiManager'] = '#include <WiFiManager.h>';
generator.definitions_['include_ArduinoJson'] = '#include <ArduinoJson.h>';
generator.definitions_['var_declare_auth_key'] = 'char blynk_token[34] = "YOUR_BLYNK_TOKEN";';
generator.definitions_['var_declare_shouldSaveConfig'] = 'bool shouldSaveConfig = false;';
generator.definitions_['saveConfigCallback'] = 'void saveConfigCallback (){\n'
+ ' Serial.println("Should save config");\n'
+ ' shouldSaveConfig = true;\n'
+ '}';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.setups_['otasetup1'] = 'Serial.println("mounting FS...");\n'
+ ' if (SPIFFS.begin()){\n'
+ ' Serial.println("mounted file system");\n'
+ ' if (SPIFFS.exists("/config.json")) {\n'
+ ' Serial.println("reading config file");\n'
+ ' File configFile = SPIFFS.open("/config.json", "r");\n'
+ ' if (configFile) {\n'
+ ' Serial.println("opened config file");\n'
+ ' size_t size = configFile.size();\n'
+ ' std::unique_ptr<char[]> buf(new char[size]);\n'
+ ' configFile.readBytes(buf.get(), size);\n'
+ ' DynamicJsonBuffer jsonBuffer;\n'
+ ' JsonObject& json = jsonBuffer.parseObject(buf.get());\n'
+ ' json.printTo(Serial);\n'
+ ' if (json.success()){\n'
+ ' Serial.println("parsed json");\n'
+ ' strcpy(blynk_token, json["blynk_token"]);\n'
+ ' }\n'
+ ' else{\n'
+ ' Serial.println("failed to load json config");\n'
+ ' }\n'
+ ' configFile.close();\n'
+ ' }\n'
+ ' }\n'
+ ' }'
+ ' else{\n'
+ ' Serial.println("failed to mount FS");\n'
+ ' }\n'
+ ' WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 32);\n'
+ ' WiFiManager wifiManager;\n'
+ ' wifiManager.setSaveConfigCallback(saveConfigCallback);\n'
+ ' wifiManager.addParameter(&custom_blynk_token);\n'
+ ' wifiManager.setMinimumSignalQuality(10);\n'
+ ' if (!wifiManager.autoConnect()){\n'
+ ' Serial.println("failed to connect and hit timeout");\n'
+ ' delay(3000);\n'
+ ' ESP.reset();\n'
+ ' delay(5000);\n'
+ ' }\n'
+ ' Serial.println("connected...yeey :)");\n'
+ ' strcpy(blynk_token, custom_blynk_token.getValue());\n'
+ ' if(shouldSaveConfig){\n'
+ ' Serial.println("saving config");\n'
+ ' DynamicJsonBuffer jsonBuffer;\n'
+ ' JsonObject& json = jsonBuffer.createObject();\n'
+ ' json["blynk_token"] = blynk_token;\n'
+ ' File configFile = SPIFFS.open("/config.json", "w");\n'
+ ' if(!configFile){\n'
+ ' Serial.println("failed to open config file for writing");\n'
+ ' }\n'
+ ' json.printTo(Serial);\n'
+ ' json.printTo(configFile);\n'
+ ' configFile.close();\n'
+ ' }\n'
+ ' Serial.println("local ip");\n'
+ ' Serial.println(WiFi.localIP());\n';
if (isNaN(server_add.charAt(2))) {
generator.setups_['otasetup1'] += ' Blynk.config(blynk_token,' + server_add + ',8080);';
}
else {
server_add = server_add.replace(/"/g, "").replace(/\./g, ",");
generator.setups_['otasetup1'] += ' Blynk.config(blynk_token,' + 'IPAddress(' + server_add + '),8080);';
}
let code = 'Blynk.run();\n';
return code;
};
export const Blynk_connect_state = function (_, generator) {
let code = 'Blynk.connected()';
return [code, generator.ORDER_ATOMIC];
};
// Blynk终端清屏
export const blynk_terminal_clear = function () {
let code = 'terminal.clear();\n';
return code;
};
// Blynk LCD显示
export const blynk_lcd = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
let y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
let value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC);
generator.definitions_['include_lcd'] = 'WidgetLCD lcd(' + Vpin + ');\n';
let code = 'lcd.print(' + x + ', ' + y + ', ' + value + ');\n';
return code;
};
// Blynk LCD清屏
export const blynk_lcd_clear = function () {
let code = 'lcd.clear();\n';
return code;
};
// ESP32 blynk BLE连接方式
export const blynk_esp32_ble = function (_, generator) {
let auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC);
let name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial';
generator.definitions_['define_BLYNK_USE_DIRECT_CONNECT'] = '#define BLYNK_USE_DIRECT_CONNECT';
generator.definitions_['include_BlynkSimpleEsp32_BLE'] = '#include <BlynkSimpleEsp32_BLE.h>';
generator.definitions_['include_BLEDevice'] = '#include <BLEDevice.h>';
generator.definitions_['include_BLEServer'] = '#include <BLEServer.h>\n';
generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth + ';';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.setups_['setup_Blynk.begin'] = 'Serial.println("Waiting for connections...");\n'
+ ' Blynk.setDeviceName(' + name + ');\n'
+ ' Blynk.begin(auth);\n';
let code = 'Blynk.run();\n';
return code;
};
// ESP32 blynk Bluetooth连接方式
export const blynk_esp32_Bluetooth = function (_, generator) {
let auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC);
let name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial';
generator.definitions_['define_BLYNK_USE_DIRECT_CONNECT'] = '#define BLYNK_USE_DIRECT_CONNECT';
generator.definitions_['include_BlynkSimpleEsp32_BT'] = '#include <BlynkSimpleEsp32_BT.h>\n';
generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth + ';';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.setups_['setup_Blynk.begin'] = 'Serial.println("Waiting for connections...");\n'
+ ' Blynk.setDeviceName(' + name + ');\n'
+ ' Blynk.begin(auth);\n';
let code = 'Blynk.run();\n';
return code;
};
// Arduino blynk Bluetooth 连接方式
export const arduino_blynk_bluetooth = function (_, generator) {
let auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC);
let RX = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
let TX = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial';
generator.definitions_['include_SoftwareSerial'] = '#include <SoftwareSerial.h>';
generator.definitions_['include_BlynkSimpleSerialBLE'] = '#include <BlynkSimpleSerialBLE.h>';
generator.definitions_['define_auth'] = 'char auth[] = ' + auth + ';';
if (RX != 0 || TX != 1) {
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.definitions_['var_declare_SoftwareSerial'] = 'SoftwareSerial SerialBLE(' + RX + ', ' + TX + ');';
generator.setups_['setup_SerialBLE_begin'] = 'SerialBLE.begin(9600);';
generator.setups_['setup_Blynk.begin'] = 'Blynk.begin(SerialBLE, auth);';
}
else {
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.setups_['setup_Blynk.begin'] = 'Blynk.begin(Serial, auth);';
}
generator.setups_['setup_Serial.println'] = 'Serial.println("Waiting for connections...");';
let code = 'Blynk.run();\n';
return code;
};
// Blynk Table小部件添加数据
export const blynk_table = function (_, generator) {
let id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC);
let mingcheng = generator.valueToCode(this, 'mingcheng', generator.ORDER_ATOMIC);
let shujv = generator.valueToCode(this, 'shujv', generator.ORDER_ATOMIC);
let Vpin = this.getFieldValue('Vpin');
let code = 'Blynk.virtualWrite(' + Vpin + ', "add", ' + id + ',' + mingcheng + ', ' + shujv + ');\n';
return code;
};
// Blynk Table小部件更新数据
export const blynk_table_update = function (_, generator) {
let id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC);
let mingcheng = generator.valueToCode(this, 'mingcheng', generator.ORDER_ATOMIC);
let shujv = generator.valueToCode(this, 'shujv', generator.ORDER_ATOMIC);
let Vpin = this.getFieldValue('Vpin');
let code = 'Blynk.virtualWrite(' + Vpin + ', "update", ' + id + ',' + mingcheng + ', ' + shujv + ');\n';
return code;
};
// Blynk Table小部件高亮显示数据
export const blynk_table_highlight = function (_, generator) {
let id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC);
let Vpin = this.getFieldValue('Vpin');
let code = 'Blynk.virtualWrite(' + Vpin + ', "pick", ' + id + ');\n';
return code;
};
// Blynk Table小部件选择数据
export const blynk_table_select = function (_, generator) {
let id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC);
let Vpin = this.getFieldValue('Vpin');
let code = 'Blynk.virtualWrite(' + Vpin + ', "select", ' + id + ');\n';
return code;
};
// Blynk Table小部件取消选择数据
export const blynk_table_unselect = function (_, generator) {
let id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC);
let Vpin = this.getFieldValue('Vpin');
let code = 'Blynk.virtualWrite(' + Vpin + ', "deselect", ' + id + ');\n';
return code;
};
// Blynk Table小部件数据清除
export const blynk_table_cleardata = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
generator.definitions_["rowIndex_" + Vpin] = 'int rowIndex_' + Vpin + ' = 0;\n';
let code = 'Blynk.virtualWrite(' + Vpin + ', "clr");\nrowIndex_' + Vpin + ' = 0;\n';
return code;
};
// blynk服务器连接状态
export const blynk_connected = function (_, generator) {
let code = 'Blynk.connected()';
return [code, generator.ORDER_ATOMIC];
};
// ESP32 CAM相机
export const esp_camera = function (_, generator) {
let wifi_ssid = generator.valueToCode(this, 'wifi_ssid', generator.ORDER_ATOMIC);
let wifi_pass = generator.valueToCode(this, 'wifi_pass', generator.ORDER_ATOMIC);
let mode = this.getFieldValue('mode');
let code = "";
if (mode > 0) {
code = 'WiFi.begin(wif_ssid,wif_password);\n'
+ ' while (WiFi.status() != WL_CONNECTED){\n'
+ ' delay(500);\n'
+ ' Serial.print(".");\n'
+ ' }\n'
+ ' Serial.println("");\n'
+ ' Serial.println("WiFi connected");\n'
+ ' Serial.print("Camera Stream Ready! Go to: http://");\n'
+ ' Serial.print(WiFi.localIP());\n'
+ ' Serial.println("");\n';
} else {
code = 'Serial.print("Setting AP (Access Point)…");\n'
+ 'WiFi.softAP(wif_ssid,wif_password);\n'
+ 'IPAddress IP = WiFi.softAPIP();\n'
+ 'Serial.print("Camera Stream Ready! Connect to the ESP32 AP and go to: http://");\n'
+ 'Serial.println(IP);\n'
+ 'Serial.println("");\n';
}
generator.definitions_['esp_camera'] = '#include "esp_camera.h"\n#include <WiFi.h>\n#include "esp_timer.h"\n#include "img_converters.h"\n#include "generator.h"\n#include "fb_gfx.h"\n#include "soc/soc.h"\n#include "soc/rtc_cntl_reg.h"\n#include "dl_lib.h"\n#include "esp_http_server.h"\nconst char*wif_ssid = ' + wifi_ssid + ';\nconst char*wif_password = ' + wifi_pass + ';\n#define PART_BOUNDARY "123456789000000000000987654321"\n#define PWDN_GPIO_NUM 32\n#define RESET_GPIO_NUM -1\n#define XCLK_GPIO_NUM 0\n#define SIOD_GPIO_NUM 26\n#define SIOC_GPIO_NUM 27\n#define Y9_GPIO_NUM 35\n#define Y8_GPIO_NUM 34\n#define Y7_GPIO_NUM 39\n#define Y6_GPIO_NUM 36\n#define Y5_GPIO_NUM 21\n#define Y4_GPIO_NUM 19\n#define Y3_GPIO_NUM 18\n#define Y2_GPIO_NUM 5\n#define VSYNC_GPIO_NUM 25\n#define HREF_GPIO_NUM 23\n#define PCLK_GPIO_NUM 22\nstatic const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;\nstatic const char* _STREAM_BOUNDARY = "\\r\\n--" PART_BOUNDARY "\\r\\n";\nstatic const char* _STREAM_PART = "Content-Type: image/jpeg\\r\\nContent-Length: %u\\r\\n\\r\\n";\nhttpd_handle_t stream_httpd = NULL;\nstatic esp_err_t stream_handler(httpd_req_t *req){\n camera_fb_t * fb = NULL;\n esp_err_t res = ESP_OK;\n size_t _jpg_buf_len = 0;\n uint8_t * _jpg_buf = NULL;\n char * part_buf[64];\n res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);\n if(res != ESP_OK){\n return res;\n }\n while(true){\n fb = esp_camera_fb_get();\n if (!fb) {\n Serial.println("Camera capture failed");\n res = ESP_FAIL;\n } else {\n if(fb->width > 400){\n if(fb->format != PIXFORMAT_JPEG){\n bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);\n esp_camera_fb_return(fb);\n fb = NULL;\n if(!jpeg_converted){\n Serial.println("JPEG compression failed");\n res = ESP_FAIL;\n }\n } else {\n _jpg_buf_len = fb->len;\n _jpg_buf = fb->buf;\n }\n }\n }\n if(res == ESP_OK){\n size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);\n res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);\n }\n if(res == ESP_OK){\n res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);\n }\n if(res == ESP_OK){\n res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));\n }\n if(fb){\n esp_camera_fb_return(fb);\n fb = NULL;\n _jpg_buf = NULL;\n } else if(_jpg_buf){\n free(_jpg_buf);\n _jpg_buf = NULL;\n }\n if(res != ESP_OK){\n break;\n }\n }\n return res;\n}\nvoid startCameraServer(){\n httpd_config_t config = HTTPD_DEFAULT_CONFIG();\n config.server_port = 80;\n httpd_uri_t index_uri = {\n .uri = "/",\n .method = HTTP_GET,\n .handler = stream_handler,\n .user_ctx = NULL\n };\n if (httpd_start(&stream_httpd, &config) == ESP_OK) {\n httpd_register_uri_handler(stream_httpd, &index_uri);\n } \n}\n';
generator.setups_['setups_esp_camera'] = ' WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);\n Serial.begin(115200);\n Serial.setDebugOutput(false);\n camera_config_t config;\n config.ledc_channel = LEDC_CHANNEL_0;\n config.ledc_timer = LEDC_TIMER_0;\n config.pin_d0 = Y2_GPIO_NUM;\n config.pin_d1 = Y3_GPIO_NUM;\n config.pin_d2 = Y4_GPIO_NUM;\n config.pin_d3 = Y5_GPIO_NUM;\n config.pin_d4 = Y6_GPIO_NUM;\n config.pin_d5 = Y7_GPIO_NUM;\n config.pin_d6 = Y8_GPIO_NUM;\n config.pin_d7 = Y9_GPIO_NUM;\n config.pin_xclk = XCLK_GPIO_NUM;\n config.pin_pclk = PCLK_GPIO_NUM;\n config.pin_vsync = VSYNC_GPIO_NUM;\n config.pin_href = HREF_GPIO_NUM;\n config.pin_sscb_sda = SIOD_GPIO_NUM;\n config.pin_sscb_scl = SIOC_GPIO_NUM;\n config.pin_pwdn = PWDN_GPIO_NUM;\n config.pin_reset = RESET_GPIO_NUM;\n config.xclk_freq_hz = 20000000;\n config.pixel_format = PIXFORMAT_JPEG; \n if(psramFound()){\n config.frame_size = FRAMESIZE_UXGA;\n config.jpeg_quality = 10;\n config.fb_count = 2;\n } else {\n config.frame_size = FRAMESIZE_SVGA;\n config.jpeg_quality = 12;\n config.fb_count = 1;\n }\n esp_err_t err = esp_camera_init(&config);\n if (err != ESP_OK) {\n Serial.printf("Camera init failed with error 0x%x", err);\n return;\n }\n ' + code + ' startCameraServer();\n';
return 'delay(1);\n';
};
// ESP32 CAM相机 & blynk
export const esp_camera_blynk = function (_, generator) {
let wifi_ssid = generator.valueToCode(this, 'wifi_ssid', generator.ORDER_ATOMIC);
let wifi_pass = generator.valueToCode(this, 'wifi_pass', generator.ORDER_ATOMIC);
let server_add = generator.valueToCode(this, 'server', generator.ORDER_ATOMIC);
if (!isNaN(server_add.charAt(2))) {
server_add = server_add.replace(/"/g, "").replace(/\./g, ",");
server_add = 'IPAddress(' + server_add + ')';
}
let auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC);
generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial';
generator.definitions_['include_WiFi'] = '#include <WiFi.h>';
generator.definitions_['include_BlynkSimpleEsp32'] = '#include <BlynkSimpleEsp32.h>';
generator.definitions_['include_WidgetRTC'] = '#include <WidgetRTC.h>';
generator.definitions_['include_WiFiClient'] = '#include <WiFiClient.h>';
generator.definitions_['include_TimeLib'] = '#include <TimeLib.h>';
generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth + ';';
generator.definitions_['esp_camera'] = '#include "esp_camera.h"\n#include "esp_timer.h"\n#include "img_converters.h"\n#include "generator.h"\n#include "fb_gfx.h"\n#include "soc/soc.h"\n#include "soc/rtc_cntl_reg.h"\n#include "dl_lib.h"\n#include "esp_http_server.h"\nconst char*wif_ssid = ' + wifi_ssid + ';\nconst char*wif_password = ' + wifi_pass + ';\n#define PART_BOUNDARY "123456789000000000000987654321"\n#define PWDN_GPIO_NUM 32\n#define RESET_GPIO_NUM -1\n#define XCLK_GPIO_NUM 0\n#define SIOD_GPIO_NUM 26\n#define SIOC_GPIO_NUM 27\n#define Y9_GPIO_NUM 35\n#define Y8_GPIO_NUM 34\n#define Y7_GPIO_NUM 39\n#define Y6_GPIO_NUM 36\n#define Y5_GPIO_NUM 21\n#define Y4_GPIO_NUM 19\n#define Y3_GPIO_NUM 18\n#define Y2_GPIO_NUM 5\n#define VSYNC_GPIO_NUM 25\n#define HREF_GPIO_NUM 23\n#define PCLK_GPIO_NUM 22\nstatic const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;\nstatic const char* _STREAM_BOUNDARY = "\\r\\n--" PART_BOUNDARY "\\r\\n";\nstatic const char* _STREAM_PART = "Content-Type: image/jpeg\\r\\nContent-Length: %u\\r\\n\\r\\n";\nhttpd_handle_t stream_httpd = NULL;\nstatic esp_err_t stream_handler(httpd_req_t *req){\n camera_fb_t * fb = NULL;\n esp_err_t res = ESP_OK;\n size_t _jpg_buf_len = 0;\n uint8_t * _jpg_buf = NULL;\n char * part_buf[64];\n res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);\n if(res != ESP_OK){\n return res;\n }\n while(true){\n fb = esp_camera_fb_get();\n if (!fb) {\n Serial.println("Camera capture failed");\n res = ESP_FAIL;\n } else {\n if(fb->width > 400){\n if(fb->format != PIXFORMAT_JPEG){\n bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);\n esp_camera_fb_return(fb);\n fb = NULL;\n if(!jpeg_converted){\n Serial.println("JPEG compression failed");\n res = ESP_FAIL;\n }\n } else {\n _jpg_buf_len = fb->len;\n _jpg_buf = fb->buf;\n }\n }\n }\n if(res == ESP_OK){\n size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);\n res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);\n }\n if(res == ESP_OK){\n res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);\n }\n if(res == ESP_OK){\n res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));\n }\n if(fb){\n esp_camera_fb_return(fb);\n fb = NULL;\n _jpg_buf = NULL;\n } else if(_jpg_buf){\n free(_jpg_buf);\n _jpg_buf = NULL;\n }\n if(res != ESP_OK){\n break;\n }\n }\n return res;\n}\nvoid startCameraServer(){\n httpd_config_t config = HTTPD_DEFAULT_CONFIG();\n config.server_port = 80;\n httpd_uri_t index_uri = {\n .uri = "/",\n .method = HTTP_GET,\n .handler = stream_handler,\n .user_ctx = NULL\n };\n if (httpd_start(&stream_httpd, &config) == ESP_OK) {\n httpd_register_uri_handler(stream_httpd, &index_uri);\n } \n}\n';
generator.setups_['setups_esp_camera'] = 'WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);\n Serial.begin(115200);\n Serial.setDebugOutput(false);\n camera_config_t config;\n config.ledc_channel = LEDC_CHANNEL_0;\n config.ledc_timer = LEDC_TIMER_0;\n config.pin_d0 = Y2_GPIO_NUM;\n config.pin_d1 = Y3_GPIO_NUM;\n config.pin_d2 = Y4_GPIO_NUM;\n config.pin_d3 = Y5_GPIO_NUM;\n config.pin_d4 = Y6_GPIO_NUM;\n config.pin_d5 = Y7_GPIO_NUM;\n config.pin_d6 = Y8_GPIO_NUM;\n config.pin_d7 = Y9_GPIO_NUM;\n config.pin_xclk = XCLK_GPIO_NUM;\n config.pin_pclk = PCLK_GPIO_NUM;\n config.pin_vsync = VSYNC_GPIO_NUM;\n config.pin_href = HREF_GPIO_NUM;\n config.pin_sscb_sda = SIOD_GPIO_NUM;\n config.pin_sscb_scl = SIOC_GPIO_NUM;\n config.pin_pwdn = PWDN_GPIO_NUM;\n config.pin_reset = RESET_GPIO_NUM;\n config.xclk_freq_hz = 20000000;\n config.pixel_format = PIXFORMAT_JPEG; \n if(psramFound()){\n config.frame_size = FRAMESIZE_UXGA;\n config.jpeg_quality = 10;\n config.fb_count = 2;\n } else {\n config.frame_size = FRAMESIZE_SVGA;\n config.jpeg_quality = 12;\n config.fb_count = 1;\n }\n esp_err_t err = esp_camera_init(&config);\n if (err != ESP_OK) {\n Serial.printf("Camera init failed with error 0x%x", err);\n return;\n }\n WiFi.begin(wif_ssid,wif_password);\n while (WiFi.status() != WL_CONNECTED) {\n delay(500);\n Serial.print(".");\n }\n Serial.println("");\n Serial.println("WiFi connected");\n Serial.print("Camera Stream Ready! Go to: http://");\n Serial.print(WiFi.localIP());\n Serial.println("");\n startCameraServer();\n Blynk.config(auth,' + server_add + ',8080);\n';
return 'Blynk.run();\n';
};
export const take_a_photo1 = function (_, generator) {
generator.definitions_['take_a_photo'] = '#include "esp_camera.h"\n#include "esp_timer.h"\n#include "img_converters.h"\n#include "generator.h"\n#include "fb_gfx.h"\n#include "fd_forward.h"\n#include "fr_forward.h"\n#include "FS.h" \n#include "SD_MMC.h" \n#include "soc/soc.h"\n#include "soc/rtc_cntl_reg.h" \n#include "dl_lib.h"\n#include "driver/rtc_io.h"\n#include <EEPROM.h>\n#define EEPROM_SIZE 1\n#define PWDN_GPIO_NUM 32\n#define RESET_GPIO_NUM -1\n#define XCLK_GPIO_NUM 0\n#define SIOD_GPIO_NUM 26\n#define SIOC_GPIO_NUM 27\n#define Y9_GPIO_NUM 35\n#define Y8_GPIO_NUM 34\n#define Y7_GPIO_NUM 39\n#define Y6_GPIO_NUM 36\n#define Y5_GPIO_NUM 21\n#define Y4_GPIO_NUM 19\n#define Y3_GPIO_NUM 18\n#define Y2_GPIO_NUM 5\n#define VSYNC_GPIO_NUM 25\n#define HREF_GPIO_NUM 23\n#define PCLK_GPIO_NUM 22\nint pictureNumber = 0;\n';
let code = 'WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);\nSerial.begin(115200);\ncamera_config_t config;\nconfig.ledc_channel = LEDC_CHANNEL_0;\nconfig.ledc_timer = LEDC_TIMER_0;\nconfig.pin_d0 = Y2_GPIO_NUM;\nconfig.pin_d1 = Y3_GPIO_NUM;\nconfig.pin_d2 = Y4_GPIO_NUM;\nconfig.pin_d3 = Y5_GPIO_NUM;\nconfig.pin_d4 = Y6_GPIO_NUM;\nconfig.pin_d5 = Y7_GPIO_NUM;\nconfig.pin_d6 = Y8_GPIO_NUM;\nconfig.pin_d7 = Y9_GPIO_NUM;\nconfig.pin_xclk = XCLK_GPIO_NUM;\nconfig.pin_pclk = PCLK_GPIO_NUM;\nconfig.pin_vsync = VSYNC_GPIO_NUM;\nconfig.pin_href = HREF_GPIO_NUM;\nconfig.pin_sscb_sda = SIOD_GPIO_NUM;\nconfig.pin_sscb_scl = SIOC_GPIO_NUM;\nconfig.pin_pwdn = PWDN_GPIO_NUM;\nconfig.pin_reset = RESET_GPIO_NUM;\nconfig.xclk_freq_hz = 20000000;\nconfig.pixel_format = PIXFORMAT_JPEG; \nif(psramFound()){\n config.frame_size = FRAMESIZE_UXGA;\n config.jpeg_quality = 10;\n config.fb_count = 2;\n} else {\n config.frame_size = FRAMESIZE_SVGA;\n config.jpeg_quality = 12;\n config.fb_count = 1;\n}\nesp_err_t err = esp_camera_init(&config);\nif (err != ESP_OK) {\n Serial.printf("Camera init failed with error 0x%x", err);\n return;\n}\nif(!SD_MMC.begin()){\n Serial.println("SD Card Mount Failed");\n return;\n}\nuint8_t cardType = SD_MMC.cardType();\nif(cardType == CARD_NONE){\n Serial.println("No SD Card attached");\n return;\n}\ncamera_fb_t * fb = NULL;\nfb = esp_camera_fb_get();\nif(!fb) {\n Serial.println("Camera capture failed");\n return;\n}\nEEPROM.begin(EEPROM_SIZE);\npictureNumber = EEPROM.read(0) + 1;\nString path = "/picture" + String(pictureNumber) +".jpg";\nfs::FS &fs = SD_MMC; \nSerial.printf("Picture file name: %s\\n", path.c_str());\nFile file = fs.open(path.c_str(), FILE_WRITE);\nif(!file){\n Serial.println("Failed to open file in writing mode");\n} \nelse {\n file.write(fb->buf, fb->len);\n Serial.printf("Saved file to path: %s\\n", path.c_str());\n EEPROM.write(0, pictureNumber);\n EEPROM.commit();\n}\nfile.close();\nesp_camera_fb_return(fb); \npinMode(4, OUTPUT);\ndigitalWrite(4, LOW);\nrtc_gpio_hold_en(GPIO_NUM_4);\n';
return code;
};
export const blynk_table_click = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let branch = generator.statementToCode(this, 'function');
branch = branch.replace(/(^\s*)|(\s*$)/g, "");
generator.definitions_["blynk_table" + Vpin] = 'WidgetTable table_' + Vpin + ';\nBLYNK_ATTACH_WIDGET(table_' + Vpin + ', ' + Vpin + ');\n';
generator.setups_["setup_blynk_table_click" + Vpin] = 'table_' + Vpin + '.onSelectChange([](int index, bool selected) {\n ' + branch + '\n });\n';
let code = '';
return code;
};
export const blynk_table_order = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let branch = generator.statementToCode(this, 'function');
branch = branch.replace(/(^\s*)|(\s*$)/g, "");
generator.definitions_["blynk_table" + Vpin] = 'WidgetTable table_' + Vpin + ';\nBLYNK_ATTACH_WIDGET(table_' + Vpin + ', ' + Vpin + ');\n';
generator.setups_["setup_blynk_table_order" + Vpin] = 'table_' + Vpin + '.onOrderChange([](int indexFrom, int indexTo) {\n ' + branch + '\n });\n';
let code = '';
return code;
};
export const blynk_table_add_data = function (_, generator) {
let Vpin = this.getFieldValue('Vpin');
let data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
let name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
generator.definitions_["rowIndex_" + Vpin] = 'int rowIndex_' + Vpin + ' = 0;\n';
let code = 'table_' + Vpin + '.addRow(rowIndex_' + Vpin + ', ' + name + ', ' + data + ');\ntable_' + Vpin + '.pickRow(rowIndex_' + Vpin + ');\nrowIndex_' + Vpin + '++;\n';
return code;
};

View File

@@ -0,0 +1,696 @@
import { Profile } from 'mixly';
export const ir_recv = function (_, generator) {
/*var xmlDom = Blockly.Xml.workspaceToDom(Mixly.Editor.blockEditor);
var xmlText = Blockly.Xml.domToPrettyText(xmlDom);
if (xmlText.indexOf("type=\"controls_tone\"") === -1 && xmlText.indexOf("type=\"controls_notone\"") === -1) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.IR_AND_TONE_WARNING);
}*/
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var branch = generator.statementToCode(this, 'DO');
var branch2 = generator.statementToCode(this, 'DO2');
generator.definitions_['include_IRremote'] = '#include <IRremote.h>\n';
generator.definitions_['var_declare_irProtocolList'] =
`const String IR_PROTOCOL_TYPE[] = {
"UNKNOWN",
"PULSE_DISTANCE",
"PULSE_WIDTH",
"DENON",
"DISH",
"JVC",
"LG",
"LG2",
"NEC",
"PANASONIC",
"KASEIKYO",
"KASEIKYO_JVC",
"KASEIKYO_DENON",
"KASEIKYO_SHARP",
"KASEIKYO_MITSUBISHI",
"RC5",
"RC6",
"SAMSUNG",
"SHARP",
"SONY",
"ONKYO",
"APPLE",
"BOSEWAVE",
"LEGO_PF",
"MAGIQUEST",
"WHYNTER"
};`;
generator.definitions_['var_declare_irrecv_' + dropdown_pin] = `IRrecv irrecv_${dropdown_pin}(${dropdown_pin});\n`;
generator.setups_['setup_ir_recv_' + dropdown_pin] = `irrecv_${dropdown_pin}.enableIRIn();`;
var code =
`if (irrecv_${dropdown_pin}.decode()) {
struct IRData *pIrData = &irrecv_${dropdown_pin}.decodedIRData;
long ir_item = pIrData->decodedRawData;
String irProtocol = IR_PROTOCOL_TYPE[pIrData->protocol];
Serial.print("IR TYPE:" + irProtocol + "\\tVALUE:");
Serial.println(ir_item, HEX);
irrecv_${dropdown_pin}.resume();
${branch}
} else {
${branch2}
}\n`;
return code;
};
export const ir_recv_enable = function (_, generator) {
/*var xmlDom = Blockly.Xml.workspaceToDom(Mixly.Editor.blockEditor);
var xmlText = Blockly.Xml.domToPrettyText(xmlDom);
if (xmlText.indexOf("type=\"controls_tone\"") == -1 && xmlText.indexOf("type=\"controls_notone\"") == -1) {
this.setWarningText(null);
}
else {
this.setWarningText(Blockly.Msg.IR_AND_TONE_WARNING);
}*/
generator.definitions_['include_IRremote'] = '#include <IRremote.h>';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'irrecv_' + dropdown_pin + '.enableIRIn();\n';
return code;
}
export const ir_send_nec = function (_, generator) {
var pin = this.getFieldValue('PIN');
generator.definitions_['include_IRremote'] = '#include <IRremote.h>\n';
generator.definitions_['var_declare_ir_send_' + pin] = `IRsend irsend_${pin}(${pin});`;
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC) || '0';
var bits = generator.valueToCode(this, 'bits', generator.ORDER_ATOMIC) || '0';
var type = this.getFieldValue('TYPE');
var code = `irsend_${pin}.send${type}(${data},${bits});\n`;
return code;
}
export const ir_recv_raw = function (_, generator) {
/*var xmlDom = Blockly.Xml.workspaceToDom(Mixly.Editor.blockEditor);
var xmlText = Blockly.Xml.domToPrettyText(xmlDom);
if (xmlText.indexOf("type=\"controls_tone\"") == -1 && xmlText.indexOf("type=\"controls_notone\"") == -1) {
this.setWarningText(null);
}
else {
this.setWarningText(Blockly.Msg.IR_AND_TONE_WARNING);
}*/
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
generator.definitions_['include_IRremote'] = '#include <IRremote.h>\n';
generator.definitions_['var_declare_ir_recv' + dropdown_pin] = 'IRrecv irrecv_' + dropdown_pin + '(' + dropdown_pin + ');\ndecode_results results_' + dropdown_pin + ';\n';
if (!generator.setups_['setup_serial_Serial']) {
generator.setups_['setup_serial_Serial'] = 'Serial.begin(' + Profile.default.serial + ');';
}
generator.setups_['setup_ir_recv_' + dropdown_pin] = 'irrecv_' + dropdown_pin + '.enableIRIn();\n';
var code = "if (irrecv_" + dropdown_pin + ".decode(&results_" + dropdown_pin + ")) {\n"
code += ' ' + 'dumpRaw(&results_' + dropdown_pin + ');\n';
code += ' irrecv_' + dropdown_pin + '.resume();\n'
code += '}\n';
var funcode = 'void dumpRaw(decode_results *results) {\n'
+ ' int count = results->rawlen;\n'
+ ' Serial.print("RawData (");\n'
+ ' Serial.print(count, DEC);\n'
+ ' Serial.print("): ");\n'
+ ' for (int i = 0; i < count; i++) {\n'
+ ' Serial.print(results->rawbuf[i]*MICROS_PER_TICK, DEC);\n'
+ ' if(i!=count-1){\n'
+ ' Serial.print(",");\n'
+ ' }\n'
+ ' }\n'
+ ' Serial.println("");\n'
+ '}\n';
generator.definitions_['dumpRaw'] = funcode;
return code;
};
export const ir_send_raw = function (_, generator) {
var pin = this.getFieldValue('PIN');
generator.definitions_['include_IRremote'] = '#include <IRremote.h>\n';
generator.definitions_['var_declare_ir_send_' + pin] = `IRsend irsend_${pin}(${pin});`;
var length = generator.valueToCode(this, 'length', generator.ORDER_ATOMIC) || '0';
var freq = generator.valueToCode(this, 'freq', generator.ORDER_ATOMIC) || '0';
var text = this.getFieldValue('TEXT');
var code = 'unsigned int buf_raw[' + length + ']={' + text + '};\n'
code = code + `irsend_${pin}.sendRaw(buf_raw,${length},${freq});\n`;
return code;
}
export const i2c_master_writer = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.setups_['setup_wire_begin'] = 'Wire.begin();';
var device = generator.valueToCode(this, 'device', generator.ORDER_ATOMIC) || '0';
var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC) || '0';
var code = "Wire.beginTransmission(" + device + ");\n";
code += "Wire.write(" + value + ");\n";
code += "Wire.endTransmission();\n";
return code;
};
export const i2c_master_reader2 = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>\n';
//generator.setups_['setup_wire_begin'] ='Wire.begin();';
var code = "Wire.read()";
return [code, generator.ORDER_ATOMIC];
};
// YANG add slave write
export const i2c_slave_write = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.setups_['setup_wire_begin'] = 'Wire.begin();';
var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC) || '0';
var code = "Wire.write(" + value + ");\n";
return code;
};
export const RFID_init = function (_, generator) {
var sda = this.getFieldValue('SDA');
generator.definitions_['include_SPI'] = '#include <SPI.h>';
generator.definitions_['include_RFID'] = '#include <RFID.h>';
generator.definitions_['var_declare_RFID'] = 'RFID rfid(' + sda + ',5);';
generator.definitions_['var_declare__i and tmp'] = 'unsigned char i,tmp;';
generator.definitions_['var_declare__status'] = 'unsigned char status;';
generator.definitions_['var_declare__strmax'] = 'unsigned char str[MAX_LEN];';
generator.definitions_['var_declare__RC_size'] = 'unsigned char RC_size;';
generator.definitions_['var_declare__blockAddr'] = 'unsigned char blockAddr; //选择操作的块地址063';
generator.definitions_['define_1'] = '//4字节卡序列号第5字节为校验字节';
generator.definitions_['define_2'] = 'unsigned char serNum[5];';
generator.definitions_['define_3'] = '//写卡数据';
generator.definitions_['define_5'] = '//原扇区A密码16个扇区每个扇区密码6Byte';
generator.definitions_['define_6'] = 'unsigned char sectorKeyA[16][16] = {';
generator.definitions_['define_7'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},';
generator.definitions_['define_8'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},';
generator.definitions_['define_9'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};';
generator.definitions_['define_10'] = '//新扇区A密码16个扇区每个扇区密码6Byte';
generator.definitions_['define_11'] = 'unsigned char sectorNewKeyA[16][16] = {';
generator.definitions_['define_12'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},';
generator.definitions_['define_13'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},';
generator.definitions_['define_14'] = ' {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
generator.setups_['setup_output_2'] = 'SPI.begin();';
generator.setups_['setup_output_3'] = 'rfid.init();';
return "";
};
export const RFID_on = function (_, generator) {
// Do while/until loop.
var branch = generator.statementToCode(this, 'do_');
if (generator.INFINITE_LOOP_TRAP) {
branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g,
'\'' + this.id + '\'') + branch;
}
return 'if(rfid.isCard()){\n' + branch + '}\n';
};
export const RFID_readcardnum = function (_, generator) {
var funcName = 'RFID_readcardnum';
var code = 'String ' + funcName + '(){\n'
+ ' rfid.readCardSerial();\n'
+ ' String stringserNum = String(rfid.serNum[0], HEX)+String(rfid.serNum[1], HEX)+String(rfid.serNum[2], HEX)+String(rfid.serNum[3], HEX)+String(rfid.serNum[4], HEX);\n'
+ ' //选卡,返回卡容量(锁定卡片,防止多次读写)\n'
+ ' rfid.selectTag(rfid.serNum);\n'
+ ' return stringserNum;\n'//直接返回string
+ '}\n';
generator.definitions_[funcName] = code;
return [funcName + '()', generator.ORDER_ATOMIC];
};
/* export const RFID_serialprintcardnum = function() {
var funcName='RFID_serialprintcardnum';
var code='void'+ ' ' + funcName + '() {\n'
+"\n"+' //找卡 '
+"\n"+' //读取卡序列号 '
+"\n"+' if (rfid.readCardSerial()) '
+"\n"+' {'
+"\n"+' Serial.print("The card\'s number is : "); '
+"\n"+' Serial.print(rfid.serNum[0],HEX); '
+"\n"+' Serial.print(rfid.serNum[1],HEX); '
+"\n"+' Serial.print(rfid.serNum[2],HEX); '
+"\n"+' Serial.print(rfid.serNum[3],HEX); '
+"\n"+' Serial.print(rfid.serNum[4],HEX); '
+"\n"+' Serial.println(" "); '
+"\n"+' }'
+"\n"+' //选卡,返回卡容量(锁定卡片,防止多次读写)'
+"\n"+' rfid.selectTag(rfid.serNum);'
+ '\n}\n';
generator.definitions_[funcName] = code;
return funcName+'();\n';
}; */
export const RFID_writecarddata = function (_, generator) {
var address2 = generator.valueToCode(this, 'address1', generator.ORDER_ATOMIC);
var data2 = this.getFieldValue('data1');
var funcName = 'RFID_writecarddata';
var code = 'void' + ' ' + funcName + '(int ad2){\n'
+ ' rfid.readCardSerial();\n'
+ ' //选卡,返回卡容量(锁定卡片,防止多次读写)\n'
+ ' rfid.selectTag(rfid.serNum);\n'
+ ' //写数据卡\n'
+ ' blockAddr = ad2;\n'
+ ' if(rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK){\n'
+ ' //写数据\n'
+ ' status = rfid.write(blockAddr, sectorKeyA[blockAddr/4]);\n'
+ ' Serial.print("set the new card password, and can modify the data of the Sector: ");\n'
+ ' Serial.println(blockAddr/4,DEC);\n'
+ ' blockAddr=blockAddr-3;\n'
+ ' status=rfid.write(blockAddr,(unsigned char*)' + data2 + ');\n'
+ ' if(status == MI_OK){\n'
+ ' Serial.println("Write card OK!");\n'
+ ' }\n'
+ ' }\n'
+ '}\n';
generator.definitions_[funcName] = code;
return funcName + '(' + address2 + ');\n';
}
export const RFID_readcarddata = function (_, generator) {
var address3 = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
var funcName = 'RFID_readcarddata'
var code = 'String' + ' ' + funcName + '(int ad3){\n'
+ ' //读卡\n'
+ ' blockAddr =ad3;\n'
+ ' status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);\n'
+ ' if(status == MI_OK){ //认证\n'
+ ' //读数据\n'
+ ' if(rfid.read(blockAddr, str) == MI_OK)\n'
+ ' {\n'
+ ' Serial.print("Read from the card ,the data is : ");\n'
+ ' Serial.println((char *)str);\n'
+ ' }\n'
+ ' }\n'
+ ' rfid.halt();\n'
+ ' String stringstr((char*)str);\n'//str是一个char数组必须先转换成char*才能继续转换成string
+ ' return stringstr;\n'
+ '}\n';
generator.definitions_[funcName] = code;
return [funcName + '(' + address3 + ')', generator.ORDER_ATOMIC];
};
/* export const RFID_serialprintcarddata = function() {
var address3 = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
var funcName='RFID_serialprintcarddata';
var code='void'+ ' ' + funcName + '(int ad3) {\n'
+"\n"+'//读卡 '
+"\n"+' blockAddr =ad3; '
+"\n"+' status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);'
+"\n"+' if (status == MI_OK) //认证'
+"\n"+' {'
+"\n"+' //读数据'
+"\n"+' if( rfid.read(blockAddr, str) == MI_OK)'
+"\n"+' {'
+"\n"+' Serial.print("Read from the card ,the data is : ");'
+"\n"+' Serial.println((char *)str);'
+"\n"+' } '
+"\n"+' } '
+"\n"+' rfid.halt();'
+ '\n}\n';
generator.definitions_[funcName] = code;
return funcName+'('+address3+');\n';
}; */
export const RFID_off = function (_, generator) {
var funcName = 'RFID_off';
var code = 'void' + ' ' + funcName + '() {\n'
+ "\n" + ' rfid.halt(); '
+ '\n}\n';
generator.definitions_[funcName] = code;
return funcName + '();\n';
};
export const RFID_in = function (_, generator) {
// Do while/until loop.
var funcName = 'RFID_readcardnum';
var code = 'String' + ' ' + funcName + '() {\n'
+ "\n" + ' rfid.readCardSerial(); '
+ "\n" + ' String stringserNum=String(rfid.serNum[0], HEX)+String(rfid.serNum[1], HEX)+String(rfid.serNum[2], HEX)+String(rfid.serNum[3], HEX)+String(rfid.serNum[4], HEX);'
+ "\n" + ' //选卡,返回卡容量(锁定卡片,防止多次读写)'
+ "\n" + ' rfid.selectTag(rfid.serNum);'
+ "\n" + ' return stringserNum; '//直接返回string
+ '\n}\n';
generator.definitions_[funcName] = code;
var argument0 = generator.valueToCode(this, 'uid_',
generator.ORDER_NONE) || 'false';
var branch = generator.statementToCode(this, 'do_');
if (generator.INFINITE_LOOP_TRAP) {
branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g,
'\'' + this.id + '\'') + branch;
}
/*
fixed bug caused by parameter of strcmp() must be const char*
author:zyc
date:2018-12-7
*/
if (argument0 != 'false') {
if (argument0.indexOf('"') === 0)
return 'if (' + 'strcmp(RFID_readcardnum().c_str(),' + argument0 + ')==0' + ') {\n' + branch + '}\n';
return 'if (' + 'strcmp(RFID_readcardnum().c_str(),' + argument0 + '.c_str())==0' + ') {\n' + branch + '}\n';
}
return '';
};
// 初始化RFID
export const MFRC522_init = function (_, generator) {
var text_rfid_name = this.getFieldValue('rfid_name');
var value_PIN_SDA = generator.valueToCode(this, 'PIN_SDA', generator.ORDER_ATOMIC);
var value_PIN_RST = generator.valueToCode(this, 'PIN_RST', generator.ORDER_ATOMIC);
generator.definitions_['include_SPI'] = '#include <SPI.h>';
generator.definitions_['include_MFRC522'] = '#include <MFRC522.h>';
generator.definitions_['var_declare_' + text_rfid_name] = 'MFRC522 ' + text_rfid_name + '(' + value_PIN_SDA + ', ' + value_PIN_RST + ');';
generator.setups_['setup_spi'] = 'SPI.begin();';
generator.setups_['setup_mfc522_' + text_rfid_name] = text_rfid_name + '.PCD_Init();';
var code = '';
return code;
};
// RFID侦测到信号
export const MFRC522_IsNewCard = function (_, generator) {
var text_rfid_name = this.getFieldValue('rfid_name');
var statements_DO = generator.statementToCode(this, 'DO');
generator.definitions_['function_MFRC522_IsNewCard'] = 'boolean MFRC522_IsNewCard(MFRC522 *_name){\n'
+ ' if(!_name->PICC_IsNewCardPresent())\n'
+ ' return false;\n'
+ ' if(!_name->PICC_ReadCardSerial())\n'
+ ' return false;\n'
+ ' return true;\n'
+ '}\n';
var code = 'if(MFRC522_IsNewCard(&' + text_rfid_name + ')){\n'
+ (statements_DO != '' ? statements_DO : '')
+ ' ' + text_rfid_name + '.PICC_HaltA();\n'
+ ' ' + text_rfid_name + '.PCD_StopCrypto1();\n'
+ '}\n';
return code;
};
// RFID读取卡号
export const MFRC522_ReadCardUID = function (_, generator) {
var text_rfid_name = this.getFieldValue('rfid_name');
generator.definitions_['function_MFRC522_ReadCardUID'] = 'String MFRC522_ReadCardUID(MFRC522 *_name){\n'
+ ' String _CardUID = "";\n'
+ ' for (byte _i = 0; _i < _name->uid.size; _i++){\n'
+ ' if(_name->uid.uidByte[_i] < 0x10)\n'
+ ' _CardUID += "0";\n'
+ ' _CardUID += String(_name->uid.uidByte[_i], HEX);\n'
+ ' }\n'
+ ' return _CardUID;\n'
+ '}\n';
var code = 'MFRC522_ReadCardUID(&' + text_rfid_name + ')';
return [code, generator.ORDER_ATOMIC];
};
// RFID写卡
export const MFRC522_WriteCard = function (_, generator) {
var text_rfid_name = this.getFieldValue('rfid_name');
var value_block = generator.valueToCode(this, 'block', generator.ORDER_ATOMIC);
var value_buffer = generator.valueToCode(this, 'buffer', generator.ORDER_ATOMIC);
var value_length = generator.valueToCode(this, 'length', generator.ORDER_ATOMIC);
generator.definitions_['function_MFRC522_WriteCard'] = 'boolean MFRC522_WriteCard(MFRC522 *_name, byte _block, byte *_buffer, byte _length){\n'
+ ' MFRC522::MIFARE_Key _key;\n'
+ ' for(byte i = 0; i < 6; i++)\n'
+ ' _key.keyByte[i] = 0xFF;\n'
+ ' MFRC522::StatusCode _status;\n'
+ ' _status = _name->PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, _block, &_key, &(_name->uid));\n'
+ ' if(_status != MFRC522::STATUS_OK){\n'
+ ' Serial.print(F("PCD_Authenticate() failed: "));\n'
+ ' Serial.println(_name->GetStatusCodeName(_status));\n'
+ ' return false;\n'
+ ' }\n'
+ ' else{\n'
+ ' Serial.println(F("PCD_Authenticate() success;"));\n'
+ ' }\n'
+ ' _status = _name->MIFARE_Write(_block, _buffer, _length);\n'
+ ' if(_status != MFRC522::STATUS_OK){\n'
+ ' Serial.print(F("MIFARE_Write() failed: "));\n'
+ ' Serial.println(_name->GetStatusCodeName(_status));\n'
+ ' return false;\n'
+ ' }\n'
+ ' else{\n'
+ ' Serial.println(F("MIFARE_Write() success;"));\n'
+ ' }\n'
+ ' return true;\n'
+ '}\n'
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
var code = 'MFRC522_WriteCard(&' + text_rfid_name + ', ' + value_block + ', ' + value_buffer + ', ' + value_length + ');\n';
return code;
};
// RFID读卡
export const MFRC522_ReadCard = function (_, generator) {
var text_rfid_name = this.getFieldValue('rfid_name');
var value_block = generator.valueToCode(this, 'block', generator.ORDER_ATOMIC);
var value_buffer = generator.valueToCode(this, 'buffer', generator.ORDER_ATOMIC);
var value_length = generator.valueToCode(this, 'length', generator.ORDER_ATOMIC);
generator.definitions_['function_MFRC522_ReadCard'] = 'boolean MFRC522_ReadCard(MFRC522 *_name, byte _block, byte *_buffer, byte _length){\n'
+ ' MFRC522::MIFARE_Key _key;\n'
+ ' for(byte i = 0; i < 6; i++)\n'
+ ' _key.keyByte[i] = 0xFF;\n'
+ ' MFRC522::StatusCode _status;\n'
+ ' _status = _name->PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, _block, &_key, &(_name->uid));\n'
+ ' if(_status != MFRC522::STATUS_OK){\n'
+ ' Serial.print(F("PCD_Authenticate() failed: "));\n'
+ ' Serial.println(_name->GetStatusCodeName(_status));\n'
+ ' return false;\n'
+ ' }\n'
+ ' else{\n'
+ ' Serial.println(F("PCD_Authenticate() success;"));\n'
+ ' }\n'
+ ' if(_length < 18){\n'
+ ' byte _Read_buffer[18];\n'
+ ' byte _Read_buffer_length = 18;\n'
+ ' _status = _name->MIFARE_Read(_block, _Read_buffer, &_Read_buffer_length);\n'
+ ' if(_status != MFRC522::STATUS_OK){\n'
+ ' Serial.print(F("MIFARE_Read() failed: "));\n'
+ ' Serial.println(_name->GetStatusCodeName(_status));\n'
+ ' return false;\n'
+ ' }\n'
+ ' else{\n'
+ ' Serial.println(F("MIFARE_Read() success;"));\n'
+ ' }\n'
+ ' for(byte _i = 0; _i < _length; _i++)\n'
+ ' _buffer[_i] = _Read_buffer[_i];\n'
+ ' }\n'
+ ' else{\n'
+ ' _status = _name->MIFARE_Read(_block, _buffer, &_length);\n'
+ ' if(_status != MFRC522::STATUS_OK){\n'
+ ' Serial.print(F("MIFARE_Read() failed: "));\n'
+ ' Serial.println(_name->GetStatusCodeName(_status));\n'
+ ' return false;\n'
+ ' }\n'
+ ' else{\n'
+ ' Serial.println(F("MIFARE_Read() success;"));\n'
+ ' }\n'
+ ' }\n'
+ ' return true;\n'
+ '}\n'
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
var code = 'MFRC522_ReadCard(&' + text_rfid_name + ', ' + value_block + ', ' + value_buffer + ', ' + value_length + ');\n';
return code;
};
// IIC主机初始化
export const i2c_master_Init = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.setups_['setup_wire_begin'] = 'Wire.begin();';
var code = '';
return code;
};
// IIC从机初始化
export const i2c_slave_Init = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
var value_i2c_address = generator.valueToCode(this, 'i2c_address', generator.ORDER_ATOMIC);
generator.setups_['setup_i2c'] = 'Wire.begin(' + value_i2c_address + ');';
var code = '';
return code;
};
// IIC发送数据
export const i2c_begin_end_transmission = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
var value_i2c_address = generator.valueToCode(this, 'i2c_address', generator.ORDER_ATOMIC);
var statements_transmission_data = generator.statementToCode(this, 'transmission_data');
var code = 'Wire.beginTransmission(' + value_i2c_address + ');\n'
+ statements_transmission_data
+ 'Wire.endTransmission();\n';
return code;
};
// IIC写入数据
export const i2c_write = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
var value_i2c_write_data = generator.valueToCode(this, 'i2c_write_data', generator.ORDER_ATOMIC);
var code = 'Wire.write(' + value_i2c_write_data + ');\n';
return code;
};
export const i2c_slave_write_array = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.setups_['setup_wire_begin'] = 'Wire.begin();';
var array = generator.valueToCode(this, 'array', generator.ORDER_ATOMIC);
var length = generator.valueToCode(this, 'length', generator.ORDER_ATOMIC) || '1';
var code = "Wire.write(" + array + "," + length + ");\n";
return code;
};
export const i2c_available = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>\n';
var workspace = this.workspace;
var blocks = workspace.getAllBlocks();
var y = 0;
for (y = 0; y < blocks.length; y++) {
if (blocks[y].type == 'i2c_slave_Init')
break;
}
if (y == blocks.length)
generator.setups_['setup_wire_begin'] = 'Wire.begin();';
var code = "Wire.available()";
return [code, generator.ORDER_ATOMIC];
};
// 从机接收字节数
export const i2c_howmany = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>\n';
generator.setups_['setup_wire_begin'] = 'Wire.begin();';
var code = "howMany";
return [code, generator.ORDER_ATOMIC];
};
// IIC读取数据
export const i2c_read = function (_, generator) {
var code = "Wire.read()";
return [code, generator.ORDER_ATOMIC];
};
// SPI
export const spi_transfer = function (_, generator) {
generator.definitions_['include_SPI'] = '#include <SPI.h>';
generator.setups_['setup_spi'] = 'SPI.begin();';
var pin = generator.valueToCode(this, 'pin', generator.ORDER_ATOMIC);
var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC);
generator.setups_['setup_output_' + pin] = 'pinMode(' + pin + ', OUTPUT);';
var code = "digitalWrite(" + pin + ", LOW);\n";
code += "SPI.transfer(" + value + ");\n";
code += "digitalWrite(" + pin + ", HIGH);\n";
return code;
};
// SPI 初始化从机
export const spi_begin_slave = function (_, generator) {
generator.definitions_['include_SPI'] = '#include <SPI.h>';
generator.setups_['setup_spi'] = 'pinMode(12, OUTPUT);'
+ '\n SPCR |= _BV(SPE);';
var code = '';
return code;
};
// 寄存器读写
export const i2c_master_writerReg = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.setups_['setup_wire_begin'] = 'Wire.begin();';
var device = generator.valueToCode(this, 'device', generator.ORDER_ATOMIC) || '0';
var regadd = generator.valueToCode(this, 'regadd', generator.ORDER_ATOMIC) || '0';
var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC) || '0';
var code = "Wire.beginTransmission(" + device + ");\n";
code += "Wire.write(" + regadd + ");\n";
code += "Wire.write(" + value + ");\n";
code += "Wire.endTransmission();\n";
return code;
};
export const i2c_master_readerReg = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>\n';
generator.setups_['setup_wire_begin'] = 'Wire.begin();';
var device = generator.valueToCode(this, 'device', generator.ORDER_ATOMIC) || '0';
var regadd = generator.valueToCode(this, 'regadd', generator.ORDER_ATOMIC) || '0';
var bytes = generator.valueToCode(this, 'bytes', generator.ORDER_ATOMIC) || '0';
var code = "Wire.beginTransmission(" + device + ");\n";
code += "Wire.write(" + regadd + ");\n";
code += "Wire.requestFrom(" + device + ", " + bytes + ");\n";
code += "Wire.endTransmission();\n";
return code;
};
export const i2c_slave_onreceive = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>\n';
var value_onReceive_length = generator.valueToCode(this, 'onReceive_length', generator.ORDER_ATOMIC);
var statements_i2c_onReceive_data = generator.statementToCode(this, 'DO');
generator.definitions_['function_receiveEvent'] = 'void receiveEvent(int ' + value_onReceive_length + ')'
+ '\n{'
+ ' ' + statements_i2c_onReceive_data
+ '\n}\n'
generator.setups_['setup_i2c_receiveEvent'] = 'Wire.onReceive(receiveEvent);';
var code = '';
return code;
}
export const i2c_slave_onrequest = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>\n';
generator.setups_['setup_i2c_slave'] = 'Wire.setClock(400000);';
generator.setups_['setup_i2c_onRequest'] = 'Wire.onRequest(i2cRequestEvent);';
var funcName = 'i2cRequestEvent';
var branch = generator.statementToCode(this, 'DO');
var code2 = 'void' + ' ' + funcName + '() {\n' + branch + '}\n';
generator.definitions_[funcName] = code2;
return '';
}
export const i2c_master_reader = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>\n';
var device = generator.valueToCode(this, 'device', generator.ORDER_ATOMIC) || '0';
var bytes = generator.valueToCode(this, 'bytes', generator.ORDER_ATOMIC) || '0';
var code = "Wire.requestFrom(" + device + ", " + bytes + ");\n";
return code;
};
export const spi_begin_master = function (_, generator) {
var value_spi_slave_pin = generator.valueToCode(this, 'spi_slave_pin', generator.ORDER_ATOMIC);
generator.definitions_['include_SPI'] = '#include <SPI.h>';
generator.setups_['setup_spi'] = 'SPI.begin();';
generator.setups_['setup_spi_divider'] = 'SPI.setClockDivider(SPI_CLOCK_DIV8);';
generator.setups_['setup_spi_pin_' + value_spi_slave_pin] = 'digitalWrite(' + value_spi_slave_pin + ', HIGH);';
var code = '';
return code;
};
export const spi_transfer_Init = function (_, generator) {
var value_slave_pin = generator.valueToCode(this, 'slave_pin', generator.ORDER_ATOMIC);
var statements_transfer_data = generator.statementToCode(this, 'transfer_data');
var code = 'digitalWrite(' + value_slave_pin + ', LOW);\n'
+ statements_transfer_data
+ 'digitalWrite(' + value_slave_pin + ', HIGH);\n';
return code;
};
export const spi_transfer_1 = function (_, generator) {
var value_transfer_data = generator.valueToCode(this, 'transfer_data', generator.ORDER_ATOMIC);
var code = 'SPI.transfer(' + value_transfer_data + ');\n';
return code;
};
export const spi_transfer_2 = function (_, generator) {
var value_transfer_data = generator.valueToCode(this, 'transfer_data', generator.ORDER_ATOMIC);
var code = 'SPI.transfer(' + value_transfer_data + ')';
return [code, generator.ORDER_ATOMIC];
};
export const spi_slave_interrupt = function (_, generator) {
var statements_slave_interrupt_data = generator.statementToCode(this, 'slave_interrupt_data');
generator.definitions_['function_ISR'] = 'ISR(SPI_STC_vect)'
+ '\n{'
+ '\n' + statements_slave_interrupt_data
+ '\n}\n'
generator.setups_['setup_spi_interrupt'] = 'SPI.attachInterrupt();';
var code = '';
return code;
};
export const spi_slave_receive = function (_, generator) {
generator.definitions_['function_SPI_SlaveReceive'] = 'char SPI_SlaveReceive()'
+ '\n{'
+ '\n while(!(SPSR&(1<<SPIF)));'
+ '\n return SPDR;'
+ '\n}\n'
var code = 'SPI_SlaveReceive()';
return [code, generator.ORDER_ATOMIC];
};

View File

@@ -0,0 +1,238 @@
import { JSFuncs } from 'mixly';
import { Variables } from 'blockly/core';
export const base_setup = function (_, generator) {
var branch = generator.statementToCode(this, 'DO');
branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格
if (branch) {
generator.setups_['setup_setup'] = branch;
}
return '';
};
export const controls_if = function (_, generator) {
// If/elseif/else condition.
var n = 0;
var argument = generator.valueToCode(this, 'IF' + n,
generator.ORDER_NONE) || 'false';
var branch = generator.statementToCode(this, 'DO' + n);
var code = 'if (' + argument + ') {\n' + branch + '\n}';
for (n = 1; n <= this.elseifCount_; n++) {
argument = generator.valueToCode(this, 'IF' + n,
generator.ORDER_NONE) || 'false';
branch = generator.statementToCode(this, 'DO' + n);
code += ' else if (' + argument + ') {\n' + branch + '}';
}
if (this.elseCount_) {
branch = generator.statementToCode(this, 'ELSE');
code += ' else {\n' + branch + '\n}';
}
return code + '\n';
};
export const controls_switch_case = function (_, generator) {
var n = 0;
var argument = generator.valueToCode(this, 'IF' + n,
generator.ORDER_NONE) || 'NULL';
var branch = '';
var code = 'switch (' + argument + ') {\n';
for (n = 1; n <= this.elseifCount_; n++) {
argument = generator.valueToCode(this, 'IF' + n,
generator.ORDER_NONE) || 'NULL';
branch = generator.statementToCode(this, 'DO' + n);
code += ' case ' + argument + ': \n' + branch + ' break;\n';
}
if (this.elseCount_) {
branch = generator.statementToCode(this, 'ELSE');
code += ' default:\n' + branch + ' break;\n';
}
code += '}';
return code + '\n';
};
export const controls_for = function (_, generator) {
// For loop.
var variable0 = generator.variableDB_.getName(
this.getFieldValue('VAR'), Variables.NAME_TYPE);
var argument0 = generator.valueToCode(this, 'FROM',
generator.ORDER_ASSIGNMENT) || '0';
var argument1 = generator.valueToCode(this, 'TO',
generator.ORDER_ASSIGNMENT) || '0';
var step = generator.valueToCode(this, 'STEP',
generator.ORDER_ASSIGNMENT) || '1';
var branch = generator.statementToCode(this, 'DO');
if (generator.INFINITE_LOOP_TRAP) {
branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g,
'\'' + this.id + '\'') + branch;
}
var code;
var down = 0;
if (argument0.match(/^-?\d+(\.\d+)?$/) &&
argument1.match(/^-?\d+(\.\d+)?$/)) {
//起止数是常量
down = (argument1 - argument0 < 0);
code = 'for (int ' + variable0 + ' = ' + argument0 + '; ' +
variable0 + (down ? ' >= ' : ' <= ') + argument1 + '; ' +
variable0 + ' = ' + variable0 + ' + (' + step + ')) {\n' +
branch + '}\n';
} else {
//起止数有变量
if (step.match(/^-?\d+(\.\d+)?$/)) {
//步长是常量
down = step < 0;
code = 'for (int ' + variable0 + ' = (' + argument0 + '); ' +
variable0 + (down ? ' >= ' : ' <= ') + '(' + argument1 + '); ' +
variable0 + ' = ' + variable0 + ' + (' + step + ')) {\n' +
branch + '}\n';
} else {
//步长是变量
code = 'for (int ' + variable0 + ' = (' + argument0 + '); ' +
'(' + argument1 + '>=' + argument0 + ')?(' + variable0 + '<=' + argument1 + '):(' + variable0 + '>=' + argument1 + '); ' +
variable0 + ' = ' + variable0 + ' + (' + step + ')) {\n' +
branch + '}\n';
}
}
return code;
};
export const controls_whileUntil = function (_, generator) {
// Do while/until loop.
var argument0 = generator.valueToCode(this, 'BOOL',
generator.ORDER_NONE) || 'false';
var branch = generator.statementToCode(this, 'DO');
if (generator.INFINITE_LOOP_TRAP) {
branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g,
'\'' + this.id + '\'') + branch;
}
if (this.getFieldValue('MODE') == 'UNTIL') {
if (!argument0.match(/^\w+$/)) {
argument0 = '(' + argument0 + ')';
}
argument0 = '!' + argument0;
}
return 'while (' + argument0 + ') {\n' + branch + '}\n';
};
export const controls_flow_statements = function () {
// Flow statements: continue, break.
switch (this.getFieldValue('FLOW')) {
case 'BREAK':
return 'break;\n';
case 'CONTINUE':
return 'continue;\n';
}
throw 'Unknown flow statement.';
};
export const controls_delay = function (_, generator) {
var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '1000'
var unit = this.getFieldValue('UNIT');
var code = unit + '(' + delay_time + ');\n';
return code;
};
export const controls_millis = function (_, generator) {
var unit = this.getFieldValue('UNIT');
var code = unit + "()";
return [code, generator.ORDER_ATOMIC];
};
export const controls_mstimer2 = function (_, generator) {
generator.definitions_['include_MsTimer2'] = '#include <MsTimer2.h>';
var time = generator.valueToCode(this, 'TIME', generator.ORDER_ATOMIC);
var funcName = 'msTimer2_func';
var branch = generator.statementToCode(this, 'DO');
var code = 'void' + ' ' + funcName + '() {\n' + branch + '}\n';
generator.definitions_[funcName] = code;
return 'MsTimer2::set(' + time + ', ' + funcName + ');\n';
};
export const controls_mstimer2_start = function (_, generator) {
generator.definitions_['include_MsTimer2'] = '#include <MsTimer2.h>';
return 'MsTimer2::start();\n';
};
export const controls_mstimer2_stop = function (_, generator) {
generator.definitions_['include_MsTimer2'] = '#include <MsTimer2.h>';
return 'MsTimer2::stop();\n';
};
export const controls_end_program = function () {
var board_type = JSFuncs.getPlatform();
if (board_type.match(RegExp(/ESP8266/)))
return 'while(true) delay(1000);\n';
return 'while(true);\n';
};
export const controls_soft_reset = function (_, generator) {
var funcName = 'resetFunc';
var code = 'void(* resetFunc) (void) = 0;\n';
generator.definitions_[funcName] = code;
return 'resetFunc();\n';
};
export const controls_interrupts = function () {
return 'interrupts();\n';
};
export const controls_nointerrupts = function () {
return 'noInterrupts();\n';
};
export const base_delay = controls_delay;
// 简单定时器
export const simple_timer = function (_, generator) {
var NO = this.getFieldValue('NO');
var timein = generator.valueToCode(this, 'timein', generator.ORDER_ATOMIC);
var funcName = 'Simple_timer_' + NO;
var branch = generator.statementToCode(this, 'zxhs');
branch = branch.replace(/(^\s*)|(\s*$)/g, "");
var code = 'void' + ' ' + funcName + '() {\n ' + branch + '\n}\n';
generator.definitions_[funcName] = code;
generator.definitions_['include_SimpleTimer'] = '#include <SimpleTimer.h>\n';
generator.definitions_['var_declare_SimpleTimer'] = 'SimpleTimer timer;';
generator.setups_[funcName] = 'timer.setInterval(' + timein + 'L, ' + funcName + ');\n';
return 'timer.run();\n';
};
// do-while循环
export const do_while = function (_, generator) {
var statements_input_data = generator.statementToCode(this, 'input_data');
var value_select_data = generator.valueToCode(this, 'select_data', generator.ORDER_ATOMIC);
var dropdown_type = this.getFieldValue('type');
if (dropdown_type == 'false') {
var code = 'do{\n'
+ statements_input_data
+ '}while(!(' + value_select_data + '));\n';
}
else {
var code = 'do{\n'
+ statements_input_data
+ '}while(' + value_select_data + ');\n';
}
return code;
};
// 注册超级延时函数
export const super_delay_function1 = function (_, generator) {
var number = this.getFieldValue('number');
var funcName = 'super_delay_function' + number;
var branch = generator.statementToCode(this, 'delay_function');
branch = branch.replace(/(^\s*)|(\s*$)/g, "");
var code = 'void' + ' ' + funcName + '() {\n ' + branch + '\n}\n';
generator.definitions_[funcName] = code;
generator.definitions_['include_SimpleTimer'] = '#include <SimpleTimer.h>\n';
generator.definitions_['var_declare_SimpleTimer'] = 'SimpleTimer timer;';
return 'timer.run();\n';
};
// 执行超级延时函数
export const execute_super_delay_function1 = function (_, generator) {
var number = this.getFieldValue('number');
var time_interval = generator.valueToCode(this, 'time_interval', generator.ORDER_ATOMIC);
var frequency = generator.valueToCode(this, 'frequency', generator.ORDER_ATOMIC);
var code = 'timer.setTimer(' + time_interval + ', super_delay_function' + number + ', ' + frequency + ');\n';
return code;
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,117 @@
export const factory_include = function (_, generator) {
var INCLUDE = this.getFieldValue('INCLUDE');
generator.definitions_['include_' + INCLUDE] = '#include <' + INCLUDE + '.h>';
return '';
}
export const factory_function_noreturn = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || 'NULL';
}
return NAME + '(' + code.join(', ') + ');\n';
}
export const factory_function_return = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || 'NULL';
}
return [NAME + '(' + code.join(', ') + ')', generator.ORDER_ATOMIC];
}
export const factory_declare = function (_, generator) {
var TYPE = this.getFieldValue('TYPE');
var NAME = this.getFieldValue('NAME');
generator.definitions_['var_' + TYPE + '_' + NAME] = TYPE + ' ' + NAME + ';';
return '';
}
export const factory_declare2 = function (_, generator) {
var VALUE = this.getFieldValue('VALUE');
generator.definitions_['var_' + VALUE] = VALUE;
return '';
}
export const factory_define = function (_, generator) {
var TYPE = this.getFieldValue('TYPE');
if (TYPE.substr(0, 1) == '#')
TYPE = TYPE.substr(1);
var NAME = this.getFieldValue('NAME');
generator.definitions_["define_" + TYPE + '_' + NAME] = '#' + TYPE + ' ' + NAME;
return '';
}
export const factory_static_method_noreturn = function (_, generator) {
var TYPE = this.getFieldValue('TYPE');
var NAME = this.getFieldValue('NAME');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || 'NULL';
}
return TYPE + '::' + NAME + '(' + code.join(', ') + ');\n';
}
export const factory_static_method_return = function (_, generator) {
var TYPE = this.getFieldValue('TYPE');
var NAME = this.getFieldValue('NAME');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || 'NULL';
}
return [TYPE + '::' + NAME + '(' + code.join(', ') + ')', generator.ORDER_ATOMIC];
}
export const factory_callMethod_noreturn = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var METHOD = this.getFieldValue('METHOD');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || 'NULL';
}
return NAME + '.' + METHOD + '(' + code.join(', ') + ');\n';
}
export const factory_callMethod_return = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var METHOD = this.getFieldValue('METHOD');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || 'NULL';
}
return [NAME + '.' + METHOD + '(' + code.join(', ') + ')', generator.ORDER_ATOMIC];
}
export const factory_block = function () {
var VALUE = this.getFieldValue('VALUE');
//if(!(VALUE.charAt(VALUE.length-1)==";")){
//VALUE=VALUE+';';
//}
return VALUE + '\n';
}
export const factory_block_return = function (_, generator) {
var VALUE = this.getFieldValue('VALUE');
return [VALUE, generator.ORDER_ATOMIC];
}
export const factory_block_with_textarea = function () {
var VALUE = this.getFieldValue('VALUE');
//if(!(VALUE.charAt(VALUE.length-1)==";")){
//VALUE=VALUE+';';
//}
return VALUE + '\n';
}
export const factory_block_return_with_textarea = function (_, generator) {
var VALUE = this.getFieldValue('VALUE');
return [VALUE, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,265 @@
import { Profile } from 'mixly';
export const inout_highlow = function (_, generator) {
// Boolean values HIGH and LOW.
var code = (this.getFieldValue('BOOL') == 'HIGH') ? 'HIGH' : 'LOW';
return [code, generator.ORDER_ATOMIC];
}
export const inout_pinMode = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('MODE');
//
var code = 'pinMode(' + dropdown_pin + ', ' + dropdown_mode + ');\n';
return code;
}
export const inout_digital_write2 = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = "";
var isVar = true;
for (var pin of Profile.default.digital) {
if (pin[0] === dropdown_pin) {
isVar = false;
break;
}
}
if (isVar) {
code = code + 'pinMode(' + dropdown_pin + ', OUTPUT);\n';
} else {
if (generator.setups_['setup_input_' + dropdown_pin]) {
delete generator.setups_['setup_input_' + dropdown_pin];
}
generator.setups_['setup_output_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', OUTPUT);';
}
code += 'digitalWrite(' + dropdown_pin + ',' + dropdown_stat + ');\n'
return code;
}
export const inout_digital_read = function (_, generator) {
var dropdown_pin = this.getFieldValue('PIN');
generator.setups_['setup_input_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', INPUT);';
var code = 'digitalRead(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const inout_digital_read2 = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = "";
if (window.isNaN(dropdown_pin) && !(new RegExp("^A([0-9]|10|11|12|13|14|15)$").test(dropdown_pin))) {
var funcName = 'mixly_digitalRead';
var code2 = 'boolean' + ' ' + funcName + '(uint8_t pin) {\n'
+ ' pinMode(pin, INPUT);\n'
+ ' boolean _return = digitalRead(pin);\n'
+ ' pinMode(pin, OUTPUT);\n'
+ ' return _return;\n'
+ '}\n';
generator.definitions_[funcName] = code2;
code = 'mixly_digitalRead(' + dropdown_pin + ')';
} else {
if (generator.setups_['setup_output_' + dropdown_pin]) {
//存在pinMode已设为output则不再设为input
} else {
generator.setups_['setup_input_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', INPUT);';
}
if (generator.setups_['setup_setup']) { //解决pullup重复问题
if (generator.setups_['setup_setup'].indexOf('pinMode(' + dropdown_pin) > -1) {
delete generator.setups_['setup_input_' + dropdown_pin];
}
}
code = 'digitalRead(' + dropdown_pin + ')';
}
return [code, generator.ORDER_ATOMIC];
}
export const inout_analog_write = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
//var dropdown_stat = this.getFieldValue('STAT');
var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
const { pwm } = Profile.default;
if (typeof pwm === 'object') {
for (let i of pwm)
if (dropdown_pin === i[1]) {
generator.setups_['setup_output' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', OUTPUT);';
break;
}
}
var code = 'analogWrite(' + dropdown_pin + ', ' + value_num + ');\n';
return code;
}
export const inout_analog_read = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
const { analog } = Profile.default;
if (typeof analog === 'object') {
for (let i of analog)
if (dropdown_pin === i[1]) {
//generator.setups_['setup_output' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', INPUT);';
break;
}
}
var code = 'analogRead(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const inout_buildin_led = function (_, generator) {
var dropdown_stat = this.getFieldValue('STAT');
generator.setups_['setup_output_13'] = 'pinMode(13, OUTPUT);';
var code = 'digitalWrite(13, ' + dropdown_stat + ');\n'
return code;
}
export const OneButton_interrupt = function (_, generator) {
generator.definitions_['include_OneButton'] = '#include <OneButton.h>';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('mode');
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
generator.definitions_['var_declare_button' + dropdown_pin] = 'OneButton button' + dropdown_pin + '(' + dropdown_pin + ',' + ((dropdown_stat == 'HIGH') ? 'false' : 'true') + ');';
generator.setups_['setup_onebutton_' + dropdown_pin + dropdown_mode] = 'button' + dropdown_pin + '.' + dropdown_mode + '(' + dropdown_mode + dropdown_pin + ');';
var code = 'button' + dropdown_pin + '.tick();';
var funcName = dropdown_mode + dropdown_pin;
var branch = generator.statementToCode(this, 'DO');
var code2 = 'void' + ' ' + funcName + '() {\n' + branch + '}\n';
generator.definitions_[funcName] = code2;
return code;
}
export const controls_attachInterrupt = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('mode');
generator.setups_['setup_input_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', INPUT_PULLUP);';
//var interrupt_pin=digitalPinToInterrupt(dropdown_pin).toString();
var interrupt_pin = 'digitalPinToInterrupt(' + dropdown_pin + ')';
var code = 'attachInterrupt' + '(' + interrupt_pin + ',' + 'attachInterrupt_fun_' + dropdown_mode + '_' + dropdown_pin + ',' + dropdown_mode + ');\n'
var funcName = 'attachInterrupt_fun_' + dropdown_mode + '_' + dropdown_pin;
var branch = generator.statementToCode(this, 'DO');
var code2 = 'void' + ' ' + funcName + '() {\n' + branch + '}\n';
generator.definitions_[funcName] = code2;
return code;
}
export const controls_detachInterrupt = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
generator.setups_['setup_input_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', INPUT);';
//var interrupt_pin=digitalPinToInterrupt(dropdown_pin).toString();
var interrupt_pin = 'digitalPinToInterrupt(' + dropdown_pin + ')';
var code = 'detachInterrupt' + '(' + interrupt_pin + ');\n'
return code;
}
export const controls_attachPinInterrupt = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('mode');
generator.definitions_['include_PinChangeInterrupt'] = '#include <PinChangeInterrupt.h>';
generator.setups_['setup_input_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', INPUT);';
//var interrupt_pin=digitalPinToInterrupt(dropdown_pin).toString();
var code = 'attachPCINT(digitalPinToPCINT(' + dropdown_pin + '),' + 'attachPinInterrupt_fun_' + dropdown_mode + '_' + dropdown_pin + ',' + dropdown_mode + ');\n'
var funcName = 'attachPinInterrupt_fun_' + dropdown_mode + '_' + dropdown_pin;
var branch = generator.statementToCode(this, 'DO');
var code2 = 'void' + ' ' + funcName + '() {\n' + branch + '}\n';
generator.definitions_[funcName] = code2;
return code;
}
export const controls_detachPinInterrupt = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
generator.setups_['setup_input_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', INPUT);';
//var interrupt_pin=digitalPinToInterrupt(dropdown_pin).toString();
var code = 'detachPCINT(digitalPinToPCINT(' + dropdown_pin + '));\n'
return code;
}
export const inout_pulseIn = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = this.getFieldValue('STAT');
generator.setups_['setup_input_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', INPUT);';
var code = 'pulseIn(' + dropdown_pin + ', ' + dropdown_stat + ')';
return [code, generator.ORDER_ATOMIC];
}
export const inout_pulseIn2 = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = this.getFieldValue('STAT');
var timeout = generator.valueToCode(this, 'TIMEOUT', generator.ORDER_ATOMIC) || '0';
generator.setups_['setup_input_' + dropdown_pin] = 'pinMode(' + dropdown_pin + ', INPUT);';
var code = 'pulseIn(' + dropdown_pin + ', ' + dropdown_stat + ', ' + timeout + ')';
return [code, generator.ORDER_ATOMIC];
}
export const inout_shiftout = function (_, generator) {
var dropdown_pin1 = generator.valueToCode(this, 'PIN1', generator.ORDER_ATOMIC);
var dropdown_pin2 = generator.valueToCode(this, 'PIN2', generator.ORDER_ATOMIC);
var dropdown_order = this.getFieldValue('ORDER');
var value = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC) || '0';
generator.setups_['setup_output_' + dropdown_pin1] = 'pinMode(' + dropdown_pin1 + ', OUTPUT);';
generator.setups_['setup_output_' + dropdown_pin2] = 'pinMode(' + dropdown_pin2 + ', OUTPUT);';
var code = 'shiftOut(' + dropdown_pin1 + ', ' + dropdown_pin2 + ', ' + dropdown_order + ', ' + value + ');\n'
return code;
}
export const ESP32touchButton = function (_, generator) {
generator.definitions_['include_ESP32touchButton'] = '#include <ESP32touchButton.h>';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('mode');
generator.definitions_['var_declare_button' + dropdown_pin] = 'ESP32touchButton button' + dropdown_pin + '(' + dropdown_pin + ',true);';
generator.setups_['setup_onebutton_' + dropdown_pin + dropdown_mode] = 'button' + dropdown_pin + '.' + dropdown_mode + '(' + dropdown_mode + dropdown_pin + ');';
var code = 'button' + dropdown_pin + '.tick();';
var funcName = dropdown_mode + dropdown_pin;
var branch = generator.statementToCode(this, 'DO');
var code2 = 'void' + ' ' + funcName + '() {\n' + branch + '}\n';
generator.definitions_[funcName] = code2;
return code;
}
export const inout_soft_analog_write = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
generator.definitions_['include_SoftPWM'] = '#include <SoftPWM.h>';
generator.setups_['setup_soft_analog_write'] = 'SoftPWMBegin();';
var code = 'SoftPWMSet(' + dropdown_pin + ', ' + value_num + ');\n';
return code;
}
export const inout_cancel_soft_analog_write = function (_, generator) {
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
generator.definitions_['include_SoftPWM'] = '#include <SoftPWM.h>';
generator.setups_['setup_soft_analog_write'] = 'SoftPWMBegin();';
var code = 'SoftPWMEnd(' + dropdown_pin + ');\n';
return code;
}
// ADS1015模数转换模块 设置范围以及精度
export const ADS1015_setGain = function (_, generator) {
var GAIN = this.getFieldValue('ADS1015_setGain');
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['include_Adafruit_ADS1015'] = '#include <Adafruit_ADS1015.h>';
generator.definitions_['var_declare_Adafruit_ADS1015_ads'] = 'Adafruit_ADS1015 ads;\n';
generator.setups_['setup_ads.begin()'] = 'ads.begin(); \n';
generator.setups_['setup_ads.setGain'] = 'ads.setGain(' + GAIN + ');';
var code = '';
return code;
}
// ADS1015模数转换模块 采集数值
export const ADS1015_Get_Value = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['include_Adafruit_ADS1015'] = '#include <Adafruit_ADS1015.h>';
generator.definitions_['var_declare_Adafruit_ADS1015_ads'] = 'Adafruit_ADS1015 ads;\n';
generator.setups_['setup_ads.begin()'] = 'ads.begin();';
var dropdown_type = this.getFieldValue('ADS1015_AIN');
var code = dropdown_type;
return [code, generator.ORDER_ATOMIC];
}
// PCF8591T模数转换模块 采集数值
export const PCF8591T = function (_, generator) {
//generator.definitions_['include_Wire'] = '#include "generator.h"';
generator.definitions_['include_PCF8591_h'] = '#include <PCF8591.h>';
generator.definitions_['var_declare_PCF8591'] = 'PCF8591 pcf8591(0x48);';
generator.setups_['setup_pcf8591.begin()'] = 'pcf8591.begin(); \n';
var dropdown_type = this.getFieldValue('PCF8591T_AIN');
var code = dropdown_type;
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,288 @@
import { Variables } from 'blockly/core';
export const lists_create_with = function (_, generator) {
// Create a list with any number of elements of any type.
var dropdown_type = this.getFieldValue('TYPE');
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
var size = window.parseFloat(this.getFieldValue('SIZE'));
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '0';
}
generator.definitions_['var_declare' + varName] = dropdown_type + ' ' + varName + '[' + size + ']' + '=' + '{' + code.join(', ') + '};\n';
return '';
}
export const lists_create_with_text = function (_, generator) {
var dropdown_type = this.getFieldValue('TYPE');
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
var size = window.parseFloat(this.getFieldValue('SIZE'));
var text = this.getFieldValue('TEXT');
generator.definitions_['var_declare' + varName] = dropdown_type + ' ' + varName + '[' + size + ']' + '=' + '{' + text + '};\n';
return '';
}
export const lists_create_with2 = function (_, generator) {
// Create a list with any number of elements of any type.
var dropdown_type = this.getFieldValue('TYPE');
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
//var size=window.parseFloat(this.getFieldValue('SIZE'));
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '0';
}
generator.definitions_['var_declare' + varName] = dropdown_type + ' ' + varName + '[]' + '=' + '{' + code.join(', ') + '};\n';
return '';
}
export const lists_create_with_text2 = function (_, generator) {
var dropdown_type = this.getFieldValue('TYPE');
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
var size = window.parseFloat(this.getFieldValue('SIZE')) || '';
var text = this.getFieldValue('TEXT');
generator.definitions_['var_declare' + varName] = dropdown_type + ' ' + varName + '[' + size + ']' + '=' + '{' + text + '};\n';
return '';
}
export const lists_getIndex = function (_, generator) {
// Indexing into a list is the same as indexing into a string.
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
var argument0 = generator.valueToCode(this, 'AT',
generator.ORDER_ADDITIVE) || '1';
if (argument0.match(/^\d+$/)) {
// If the index is a naked number, decrement it right now.
argument0 = parseInt(argument0, 10) - 1;
} else {
// If the index is dynamic, decrement it in code.
argument0 += ' - 1';
}
var code = varName + '[(int)(' + argument0 + ')]';
return [code, generator.ORDER_ATOMIC];
}
export const lists_setIndex = function (_, generator) {
// Set element at index.
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
var argument0 = generator.valueToCode(this, 'AT',
generator.ORDER_ADDITIVE) || '1';
var argument2 = generator.valueToCode(this, 'TO',
generator.ORDER_ASSIGNMENT) || '0';
// Blockly uses one-based indicies.
if (argument0.match(/^\d+$/)) {
// If the index is a naked number, decrement it right now.
argument0 = parseInt(argument0, 10) - 1;
} else {
// If the index is dynamic, decrement it in code.
argument0 += ' - 1';
}
return varName + '[(int)(' + argument0 + ')] = ' + argument2 + ';\n';
}
export const listsGetValueByIndex = function (_, generator) {
// Indexing into a list is the same as indexing into a string.
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
var argument0 = generator.valueToCode(this, 'AT',
generator.ORDER_ADDITIVE) || '0';
var code = varName + '[' + argument0 + ']';
return [code, generator.ORDER_ATOMIC];
}
export const listsSetValueByIndex = function (_, generator) {
// Set element at index.
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
var argument0 = generator.valueToCode(this, 'AT',
generator.ORDER_ADDITIVE) || '0';
var argument2 = generator.valueToCode(this, 'TO',
generator.ORDER_ASSIGNMENT) || '0';
return varName + '[' + argument0 + '] = ' + argument2 + ';\n';
}
export const lists_length = function (_, generator) {
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
var code = 'sizeof(' + varName + ')/sizeof(' + varName + '[0])';
return [code, generator.ORDER_ATOMIC];
}
// 创建二维数组
export const create_array2_with_text = function (_, generator) {
var TYPE = this.getFieldValue('TYPE');
var line = generator.valueToCode(this, 'line', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'list', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
var String = generator.valueToCode(this, 'String', generator.ORDER_ATOMIC);
generator.definitions_['var_declare_array' + name] = '' + TYPE + ' ' + name + '[' + line + '][' + list + ']={' + String + '};\n ';
return '';
}
// 二维数组赋值
export const array2_assignment = function (_, generator) {
var line = generator.valueToCode(this, 'line', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'list', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
var assignment = generator.valueToCode(this, 'assignment', generator.ORDER_ATOMIC);
var code = '' + name + '[' + line + '-1][' + list + '-1]=' + assignment + ';\n'
return code;
}
// 获取二维数组值
export const get_array2_value = function (_, generator) {
var line = generator.valueToCode(this, 'line', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'list', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
var code = '' + name + '[' + line + '-1][' + list + '-1]'
return [code, generator.ORDER_ATOMIC];
}
// 二维数组赋值
export const lists2SetValueByIndex = function (_, generator) {
var line = generator.valueToCode(this, 'line', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'list', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
var assignment = generator.valueToCode(this, 'assignment', generator.ORDER_ATOMIC);
var code = name + '[' + line + '][' + list + '] = ' + assignment + ';\n'
return code;
}
// 二维数组取值
export const lists2GetValueByIndex = function (_, generator) {
var line = generator.valueToCode(this, 'line', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'list', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
var code = name + '[' + line + '][' + list + ']';
return [code, generator.ORDER_ATOMIC];
}
export const lists_array2_setup = function (_, generator) {
var dropdown_lists_create_type = this.getFieldValue('lists_create_type');
var text_lists_create_name = this.getFieldValue('lists_create_name');
var statements_lists_with_2_1_data = generator.statementToCode(this, 'lists_with_2_1_data');
if (statements_lists_with_2_1_data) {
var num_x = 0;
var num_y_data = '';
var num_y = 0;
var data = '';
var choice = false;
var statements_lists_with_2_1_data1 = '';
statements_lists_with_2_1_data = statements_lists_with_2_1_data.substring(2, statements_lists_with_2_1_data.length - 1);
for (var i of statements_lists_with_2_1_data) {
if (i == '→') {
statements_lists_with_2_1_data1 += '\n ';
choice = true;
continue;
}
if (choice) {
if (i == '{') {
if (num_y < num_y_data - 0)
num_y = num_y_data - 0;
num_y_data = '';
choice = false;
}
else {
num_y_data = num_y_data + i;
continue;
}
}
data = data + i;
if (data == '},{')
num_x++;
if (data.length == 3) {
data = data.substring(1, 2) + i;
}
statements_lists_with_2_1_data1 = statements_lists_with_2_1_data1 + i;
}
num_x++;
generator.definitions_['var_declare' + text_lists_create_name] = dropdown_lists_create_type + ' ' + text_lists_create_name + '[' + num_x + '][' + num_y + '] = {' + statements_lists_with_2_1_data1 + '\n};';
}
else {
if (dropdown_lists_create_type == 'String')
generator.definitions_['var_declare' + text_lists_create_name] = dropdown_lists_create_type + ' ' + text_lists_create_name + '[2][2] = {{"0","0"},{"0","0"}};';
else
generator.definitions_['var_declare' + text_lists_create_name] = dropdown_lists_create_type + ' ' + text_lists_create_name + '[2][2] = {{0,0},{0,0}};';
}
var code = '';
return code;
}
export const lists_array2_setup_get_data = function (_, generator) {
// Create a list with any number of elements of any type.
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '0';
}
var code1 = '';
var surround_parent = this.getSurroundParent();
if (surround_parent && surround_parent.type == 'lists_array2_setup') {
for (var n = 0; n < this.itemCount_; n++) {
code1 = code1 + ', ' + code[n];
}
code1 = code1.substring(2);
code1 = '→' + this.itemCount_ + '{' + code1 + '},';
}
else if (surround_parent && surround_parent.type == 'part_lists_create_with_2_1') {
for (var n = 0; n < this.itemCount_; n++) {
code1 = code1 + ', ' + code[n];
}
code1 = code1.substring(2);
code1 = '→' + this.itemCount_ + '{' + code1 + '},';
}
else if (surround_parent && surround_parent.type == 'lists_create_with_2_1_new_2019_10_18') {
for (var n = 0; n < this.itemCount_; n++) {
code1 = code1 + ', ' + code[n];
}
code1 = code1.substring(2);
code1 = '→' + this.itemCount_ + '{' + code1 + '},';
}
else if (surround_parent && surround_parent.type == 'part_lists_create_with_2_1_new_2019_10_18') {
for (var n = 0; n < this.itemCount_; n++) {
code1 = code1 + ', ' + code[n];
}
code1 = code1.substring(2);
code1 = '→' + this.itemCount_ + '{' + code1 + '},';
}
else {
code1 = '';
}
return code1;
}
// 一维数组循环
export const loop_array = function (_, generator) {
var type = this.getFieldValue('TYPE');
var mode = this.getFieldValue('mode');
var name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
if (mode == 0) {
generator.definitions_['loop_array1'] = 'void array_left_loop() {\n ' + type + ' item =0;\n item = ' + name + '[(int)(0)];\n for (int i = (2); i <= (sizeof(' + name + ')/sizeof(' + name + '[0])); i = i + (1)) {\n ' + name + '[(int)((i - 1) - 1)] = ' + name + '[(int)(i - 1)];\n }\n ' + name + '[(int)(sizeof(' + name + ')/sizeof(' + name + '[0]) - 1)] = item;\n}\n';
var code = 'array_left_loop();\n';
}
if (mode == 1) {
generator.definitions_['loop_array'] = 'void array_right_loop() {\n ' + type + ' item =0;\n item = ' + name + '[(int)(sizeof(' + name + ')/sizeof(' + name + '[0]) - 1)];\n for (int i = (sizeof(' + name + ')/sizeof(' + name + '[0])); i >= (1); i = i + (-1)) {\n ' + name + '[(int)((i + 1) - 1)] = ' + name + '[(int)(i - 1)];\n }\n ' + name + '[(int)(0)] = item;\n}\n';
var code = 'array_right_loop();\n';
}
return code;
}
// 获取二维数组的行数与列数
export const lists_array2_get_length = function (_, generator) {
var text_list_name = this.getFieldValue('list_name');
var dropdown_type = this.getFieldValue('type');
var code = '';
if (dropdown_type == 'col')
code = '(sizeof(' + text_list_name + '[0]) / sizeof(' + text_list_name + '[0][0]))';
else
code = '(sizeof(' + text_list_name + ') / sizeof(' + text_list_name + '[0]))';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,58 @@
export const logic_compare = function (_, generator) {
// Comparison operator.
var mode = this.getFieldValue('OP');
var operator = logic_compare.OPERATORS[mode];
var order = (operator == '==' || operator == '!=') ?
generator.ORDER_EQUALITY : generator.ORDER_RELATIONAL;
var argument0 = generator.valueToCode(this, 'A', order) || '0';
var argument1 = generator.valueToCode(this, 'B', order) || '0';
var code = argument0 + ' ' + operator + ' ' + argument1;
return [code, order];
}
logic_compare.OPERATORS = {
EQ: '==',
NEQ: '!=',
LT: '<',
LTE: '<=',
GT: '>',
GTE: '>='
};
export const logic_operation = function (_, generator) {
// Operations 'and', 'or'.
var operator = (this.getFieldValue('OP') == 'AND') ? '&&' : '||';
var order = (operator == '&&') ? generator.ORDER_LOGICAL_AND :
generator.ORDER_LOGICAL_OR;
var argument0 = generator.valueToCode(this, 'A', order) || 'false';
var argument1 = generator.valueToCode(this, 'B', order) || 'false';
var code = argument0 + ' ' + operator + ' ' + argument1;
return [code, order];
}
export const logic_negate = function (_, generator) {
// Negation.
var order = generator.ORDER_UNARY_PREFIX;
var argument0 = generator.valueToCode(this, 'BOOL', order) || 'false';
var code = '!' + argument0;
return [code, order];
}
export const logic_boolean = function (_, generator) {
// Boolean values true and false.
var code = (this.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false';
return [code, generator.ORDER_ATOMIC];
}
export const logic_null = function (_, generator) {
var code = 'NULL';
return [code, generator.ORDER_ATOMIC];
}
export const logic_true_or_false = function (_, generator) {
var a = generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) || 'false';
var b = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) || 'false';
var c = generator.valueToCode(this, 'C', generator.ORDER_ATOMIC) || 'false';
var code = '(' + a + '?' + b + ':' + c + ')';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,239 @@
export const math_number = function (_, generator) {
// Numeric value.
var code = (this.getFieldValue('NUM'));
// -4.abs() returns -4 in Dart due to strange order of operation choices.
// -4 is actually an operator and a number. Reflect this in the order.
var order = code < 0 ?
generator.ORDER_UNARY_PREFIX : generator.ORDER_ATOMIC;
return [code, order];
}
export const math_arithmetic = function (_, generator) {
// Basic arithmetic operators, and power.
const OPERATORS = {
ADD: [' + ', generator.ORDER_ADDITIVE],
MINUS: [' - ', generator.ORDER_ADDITIVE],
MULTIPLY: [' * ', generator.ORDER_MULTIPLICATIVE],
DIVIDE: [' / ', generator.ORDER_MULTIPLICATIVE],
QUYU: [' % ', generator.ORDER_MULTIPLICATIVE],//增加取余操作
POWER: [null, generator.ORDER_NONE] // Handle power separately.
};
var mode = this.getFieldValue('OP');
var tuple = OPERATORS[mode];
var operator = tuple[0];
var order = tuple[1];
var argument0 = generator.valueToCode(this, 'A', order) || '0';
var argument1 = generator.valueToCode(this, 'B', order) || '0';
var code;
if (!operator) {
code = 'pow(' + argument0 + ', ' + argument1 + ')';
return [code, generator.ORDER_UNARY_POSTFIX];
}
if (operator == ' % ') {
//取余必须是整数
argument0 = '(long) (' + argument0 + ')';
argument1 = '(long) (' + argument1 + ')';
}
code = argument0 + operator + argument1;
return [code, order];
}
export const math_bit = function (_, generator) {
var operator = this.getFieldValue('OP');
var order = generator.ORDER_ATOMIC;
var argument0 = generator.valueToCode(this, 'A', order) || '0';
var argument1 = generator.valueToCode(this, 'B', order) || '0';
var code = '(' + argument0 + operator + argument1 + ')';
return [code, order];
}
export const math_single = function (_, generator) {
// Math operators with single operand.
var operator = this.getFieldValue('OP');
var code;
var arg;
if (operator == 'NEG') {
// Negation is a special case given its different operator precedents.
arg = generator.valueToCode(this, 'NUM',
generator.ORDER_UNARY_PREFIX) || '0';
if (arg[0] == '-') {
// --3 is not legal in Dart.
arg = ' ' + arg;
}
code = '-' + arg;
return [code, generator.ORDER_UNARY_PREFIX];
}
if (operator == 'ABS' || operator.substring(0, 5) == 'ROUND') {
arg = generator.valueToCode(this, 'NUM',
generator.ORDER_UNARY_POSTFIX) || '0';
} else if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') {
arg = generator.valueToCode(this, 'NUM',
generator.ORDER_MULTIPLICATIVE) || '0';
} else {
arg = generator.valueToCode(this, 'NUM',
generator.ORDER_NONE) || '0';
}
// First, handle cases which generate values that don't need parentheses.
switch (operator) {
case 'ABS':
code = arg + '.abs()';
break;
case 'ROOT':
code = 'sqrt(' + arg + ')';
break;
case 'LN':
code = 'log(' + arg + ')';
break;
case 'EXP':
code = 'exp(' + arg + ')';
break;
case 'POW10':
code = 'pow(10,' + arg + ')';
break;
case '++':
code = '(++' + arg + ')';
break;
case '--':
code = '(--' + arg + ')';
break;
case '~':
code = '~(' + arg + ')';
break;
case 'ROUND':
code = arg + '.round()';
break;
case 'ROUNDUP':
code = arg + '.ceil()';
break;
case 'ROUNDDOWN':
code = arg + '.floor()';
break;
case 'SIN':
code = 'sin(' + arg + ' / 180.0 * 3.14159)';
break;
case 'COS':
code = 'cos(' + arg + ' / 180.0 * 3.14159)';
break;
case 'TAN':
code = 'tan(' + arg + ' / 180.0 * 3.14159)';
break;
}
if (code) {
return [code, generator.ORDER_UNARY_POSTFIX];
}
// Second, handle cases which generate values that may need parentheses.
switch (operator) {
case 'LOG10':
code = 'log(' + arg + ') / log(10)';
break;
case 'ASIN':
code = 'asin(' + arg + ') / 3.14159 * 180';
break;
case 'ACOS':
code = 'acos(' + arg + ') / 3.14159 * 180';
break;
case 'ATAN':
code = 'atan(' + arg + ') / 3.14159 * 180';
break;
default:
throw 'Unknown math operator: ' + operator;
}
return [code, generator.ORDER_MULTIPLICATIVE];
}
export const math_trig = math_single;
export const math_to_int = function (_, generator) {
var argument0 = generator.valueToCode(this, 'A', generator.ORDER_NONE) || '0';
var operator = this.getFieldValue('OP');
var code = operator + '(' + argument0 + ')';
return [code, generator.ORDER_ATOMIC];
}
// 变量定义
export const arduino_variate_type = function (_, generator) {
var dropdown_variate_type = this.getFieldValue('variate_type');
var code = dropdown_variate_type;
return [code, generator.ORDER_ATOMIC];
}
// 获取某个变量在内存中所占用的字节数
export const math_SizeOf = function (_, generator) {
this.setTooltip("以字节形式返回某个操作数的储存大小");
var value_data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var code = 'sizeof(' + value_data + ')';
return [code, generator.ORDER_ATOMIC];
}
export const math_max_min = function (_, generator) {
var a = generator.valueToCode(this, 'A', generator.ORDER_NONE) || '0';
var b = generator.valueToCode(this, 'B', generator.ORDER_NONE) || '0';
var operator = this.getFieldValue('OP');
var code = operator + '(' + a + ', ' + b + ')';
return [code, generator.ORDER_ATOMIC];
}
export const math_random_seed = function (_, generator) {
// Random integer between [X] and [Y].
var a = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0';
//generator.setups_['setup_randomSeed'] ='randomSeed(' + a + ');'+'\n';
return 'randomSeed(' + a + ');' + '\n';
}
export const math_random_int = function (_, generator) {
// Random integer between [X] and [Y].
var argument0 = generator.valueToCode(this, 'FROM',
generator.ORDER_NONE) || '0';
var argument1 = generator.valueToCode(this, 'TO',
generator.ORDER_NONE) || '0';
var code = 'random(' + argument0 + ', ' + argument1 + ')';
return [code, generator.ORDER_UNARY_POSTFIX];
}
export const base_map = function (_, generator) {
var dropdown_maptype = this.getFieldValue('maptype');
var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_NONE);
var value_fl = generator.valueToCode(this, 'fromLow', generator.ORDER_ATOMIC);
var value_fh = generator.valueToCode(this, 'fromHigh', generator.ORDER_ATOMIC);
var value_tl = generator.valueToCode(this, 'toLow', generator.ORDER_ATOMIC);
var value_th = generator.valueToCode(this, 'toHigh', generator.ORDER_ATOMIC);
if (dropdown_maptype == 'map_float') {
generator.definitions_['function_mapfloat'] = 'float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)'
+ '\n{'
+ '\n return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;'
+ '\n}';
var code = 'mapfloat(' + value_num + ', ' + value_fl + ', ' + value_fh + ', ' + value_tl + ', ' + value_th + ')';
}
else {
var code = 'map(' + value_num + ', ' + value_fl + ', ' + value_fh + ', ' + value_tl + ', ' + value_th + ')';
}
return [code, generator.ORDER_NONE];
}
export const math_constrain = function (_, generator) {
// Constrain a number between two limits.
var argument0 = generator.valueToCode(this, 'VALUE',
generator.ORDER_NONE) || '0';
var argument1 = generator.valueToCode(this, 'LOW',
generator.ORDER_NONE) || '0';
var argument2 = generator.valueToCode(this, 'HIGH',
generator.ORDER_NONE) || '0';
var code = 'constrain(' + argument0 + ', ' + argument1 + ', ' +
argument2 + ')';
return [code, generator.ORDER_UNARY_POSTFIX];
}
export const variables_operation = function (_, generator) {
var type = this.getFieldValue('type');
var variables = generator.valueToCode(this, 'variables', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var code = '' + variables + ' = ' + variables + ' ' + type + ' ' + data + ';\n';
return code;
}
export const math_auto_add_or_minus = function (_, generator) {
var value_math_auto_add_minus_output = generator.valueToCode(this, 'math_auto_add_minus_output', generator.ORDER_ATOMIC);
var dropdown_math_auto_add_minus_type = this.getFieldValue('math_auto_add_minus_type');
var code = value_math_auto_add_minus_output + dropdown_math_auto_add_minus_type + ';\n';
return code;
}

View File

@@ -0,0 +1,13 @@
export const pins_digital = function (_, generator) {
var code = this.getFieldValue('PIN');
return [code, generator.ORDER_ATOMIC];
}
export const pins_analog = pins_digital;
export const pins_pwm = pins_digital;
export const pins_interrupt = pins_digital;
export const pins_MOSI = pins_digital;
export const pins_MISO = pins_digital;
export const pins_SCK = pins_digital;
export const pins_SCL = pins_digital;
export const pins_SDA = pins_digital;

View File

@@ -0,0 +1,107 @@
import { Variables, Procedures } from 'blockly/core';
export const procedures_defreturn = function (_, generator) {
// Define a procedure with a return value.
var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'),
Procedures.NAME_TYPE);
var branch = generator.statementToCode(this, 'STACK');
if (generator.INFINITE_LOOP_TRAP) {
branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g,
'\'' + this.id + '\'') + branch;
}
var returnValue = generator.valueToCode(this, 'RETURN',
generator.ORDER_NONE) || '';
var type = this.getFieldValue('TYPE');
if (returnValue) {
returnValue = ' return ' + returnValue + ';\n';
}
var returnType = type ? type : 'void';
var args = [];
for (var x = 0; x < this.arguments_.length; x++) {
args[x] = this.argumentstype_[x] + ' ' + generator.variableDB_.getName(this.arguments_[x],
Variables.NAME_TYPE);
}
var code = returnType + ' ' + funcName + '(' + args.join(', ') + ') {\n' +
branch + returnValue + '}\n';
code = generator.scrub_(this, code);
generator.definitions_[funcName] = code;
return null;
}
export const procedures_defnoreturn = function (_, generator) {
// Define a procedure with a return value.
var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'),
Procedures.NAME_TYPE);
var branch = generator.statementToCode(this, 'STACK');
if (generator.INFINITE_LOOP_TRAP) {
branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g,
'\'' + this.id + '\'') + branch;
}
var returnType = 'void';
var args = [];
for (var x = 0; x < this.arguments_.length; x++) {
args[x] = this.argumentstype_[x] + ' ' + generator.variableDB_.getName(this.arguments_[x],
Variables.NAME_TYPE);
}
var code = returnType + ' ' + funcName + '(' + args.join(', ') + ') {\n' +
branch + '}\n';
code = generator.scrub_(this, code);
generator.definitions_[funcName] = code;
return null;
}
export const procedures_callreturn = function (_, generator) {
// Call a procedure with a return value.
var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'),
Procedures.NAME_TYPE);
var args = [];
for (var x = 0; x < this.arguments_.length; x++) {
args[x] = generator.valueToCode(this, 'ARG' + x,
generator.ORDER_NONE) || 'null';
}
var code = funcName + '(' + args.join(', ') + ')';
return [code, generator.ORDER_UNARY_POSTFIX];
}
export const procedures_callnoreturn = function (_, generator) {
// Call a procedure with no return value.
var funcName = generator.variableDB_.getName(this.getFieldValue('NAME'),
Procedures.NAME_TYPE);
var args = [];
for (var x = 0; x < this.arguments_.length; x++) {
args[x] = generator.valueToCode(this, 'ARG' + x,
generator.ORDER_NONE) || 'null';
}
var code = funcName + '(' + args.join(', ') + ');\n';
return code;
}
export const procedures_ifreturn = function (_, generator) {
// Conditionally return value from a procedure.
var condition = generator.valueToCode(this, 'CONDITION',
generator.ORDER_NONE) || 'false';
var code = 'if (' + condition + ') {\n';
if (this.hasReturnValue_) {
var value = generator.valueToCode(this, 'VALUE',
generator.ORDER_NONE) || '';
code += ' return ' + value + ';\n';
} else {
code += ' return;\n';
}
code += '}\n';
return code;
}
export const procedures_return = function (_, generator) {
// Conditionally return value from a procedure.
var code = ""
if (this.hasReturnValue_) {
var value = generator.valueToCode(this, 'VALUE',
generator.ORDER_NONE) || 'None';
code += 'return ' + value + ';\n';
} else {
code += 'return;\n';
}
code += '\n';
return code;
}

View File

@@ -0,0 +1,30 @@
export const SCoopTask = function (_, generator) {
var _tasknum = this.getFieldValue('_tasknum');
var statements_setup = generator.statementToCode(this, 'setup');
var statements_loop = generator.statementToCode(this, 'loop');
var taskcode = 'defineTask(scoopTask' + _tasknum + ')\n'
+ 'void scoopTask' + _tasknum + '::setup()\n'
+ '{\n'
+ statements_setup
+ '}\n'
+ 'void scoopTask' + _tasknum + '::loop()\n'
+ '{\n'
+ statements_loop
+ '}\n';
generator.definitions_['include_Scoop'] = '#include "SCoop.h"';
generator.setups_['scoop_start'] = 'mySCoop.start();';
generator.definitions_['scoop_task' + _tasknum] = taskcode;
var code = "";
return code;
}
export const SCoop_yield = function () {
var code = 'yield();\n';
return code;
}
export const SCoop_sleep = function (_, generator) {
var value_sleeplength = generator.valueToCode(this, 'sleeplength', generator.ORDER_ATOMIC);
var code = 'sleep(' + value_sleeplength + ');\n'
return code;
}

View File

@@ -0,0 +1,736 @@
import { Profile, JSFuncs } from 'mixly';
export const gps_init = function (_, generator) {
generator.definitions_['include_TinyGPS++'] = '#include <TinyGPS++.h>';
generator.definitions_['include_SoftwareSerial'] = '#include <SoftwareSerial.h>';
var rx = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
var tx = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
var bt = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC)
generator.definitions_['var_declare_TinyGPSPlus_gps'] = 'TinyGPSPlus gps;';
generator.definitions_['var_declare_SoftwareSerial_gps_ss'] = 'SoftwareSerial gps_ss(' + rx + ', ' + tx + ');';
generator.setups_['setup_gps_ss_begin'] = 'gps_ss.begin(' + bt + ');';
return '';
}
export const gps_data_available = function (_, generator) {
var code = 'gps_ss.available()';
return [code, generator.ORDER_ATOMIC];
}
export const gps_data_encode = function (_, generator) {
var code = 'gps.encode(gps_ss.read())';
return [code, generator.ORDER_ATOMIC];
}
export const gps_xxx_isValid = function (_, generator) {
var WHAT = this.getFieldValue('WHAT');
var code = 'gps.' + WHAT + '.isValid()';
return [code, generator.ORDER_ATOMIC];
}
export const gps_getData_xxx = function (_, generator) {
var WHAT = this.getFieldValue('WHAT');
var code = 'gps.' + WHAT + '()';
return [code, generator.ORDER_ATOMIC];
}
export const chaoshengbo2 = function (_, generator) {
var Trig = this.getFieldValue('Trig');
var Echo = this.getFieldValue('Echo');
generator.setups_['setup_output_' + Trig] = 'pinMode(' + Trig + ', OUTPUT);';
generator.setups_['setup_output_' + Echo] = 'pinMode(' + Echo + ', INPUT);';
var funcName = 'checkdistance_' + Trig + '_' + Echo;
var code = 'float' + ' ' + funcName + '() {\n'
+ ' digitalWrite(' + Trig + ', LOW);\n' + ' delayMicroseconds(2);\n'
+ ' digitalWrite(' + Trig + ', HIGH);\n' + ' delayMicroseconds(10);\n'
+ ' digitalWrite(' + Trig + ', LOW);\n'
+ ' float distance = pulseIn(' + Echo + ', HIGH) / 58.00;\n'
+ ' delay(10);\n' + ' return distance;\n'
+ '}\n';
generator.definitions_[funcName] = code;
return [funcName + '()', generator.ORDER_ATOMIC];
}
export const DHT = function (_, generator) {
var sensor_type = this.getFieldValue('TYPE');
var dropdown_pin = this.getFieldValue('PIN');
var what = this.getFieldValue('WHAT');
generator.definitions_['include_DHT'] = '#include <DHT.h>';
generator.definitions_['var_declare_dht' + dropdown_pin] = 'DHT dht' + dropdown_pin + '(' + dropdown_pin + ', ' + sensor_type + ');'
generator.setups_['DHT_SETUP' + dropdown_pin] = ' dht' + dropdown_pin + '.begin();';
var code;
if (what == "temperature")
code = 'dht' + dropdown_pin + '.readTemperature()'
else
code = 'dht' + dropdown_pin + '.readHumidity()'
return [code, generator.ORDER_ATOMIC];
}
// LM35 Temperature
export const LM35 = function (_, generator) {
var board_type = JSFuncs.getPlatform();
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'analogRead(' + dropdown_pin + ')*0.488';
if (board_type.match(RegExp(/ESP8266/))) {
var code = 'analogRead(' + dropdown_pin + ')*0.322';
}
else if (board_type.match(RegExp(/ESP32/))) {
var code = 'analogRead(' + dropdown_pin + ')*0.161';
}
return [code, generator.ORDER_ATOMIC];
}
export const ds18b20 = function (_, generator) {
var dropdown_pin = this.getFieldValue('PIN');
var unit = this.getFieldValue('UNIT');
generator.definitions_['include_OneWire'] = '#include <OneWire.h>';
generator.definitions_['include_DallasTemperature'] = '#include <DallasTemperature.h>';
generator.definitions_['var_declare_OneWire_DallasTemperature_sensors_' + dropdown_pin] = 'OneWire oneWire_' + dropdown_pin + '(' + dropdown_pin + ');\nDallasTemperature sensors_' + dropdown_pin + '(&oneWire_' + dropdown_pin + ');';
generator.definitions_['var_declare_DeviceAddress_insideThermometer'] = 'DeviceAddress insideThermometer;';
generator.setups_['setup_sensors_' + dropdown_pin + '_getAddress'] = 'sensors_' + dropdown_pin + '.getAddress(insideThermometer, 0);';
generator.setups_['setup_sensors_' + dropdown_pin + '_setResolution'] = 'sensors_' + dropdown_pin + '.setResolution(insideThermometer, 9);';
var funcName = 'ds18b20_' + dropdown_pin + '_getTemp';
var code = 'float' + ' ' + funcName + '(int w) {\n'
+ ' sensors_' + dropdown_pin + '.requestTemperatures();\n'
+ ' if(w==0) {\n return sensors_' + dropdown_pin + '.getTempC(insideThermometer);\n }\n'
+ ' else {\n return sensors_' + dropdown_pin + '.getTempF(insideThermometer);\n }\n'
+ '}\n';
generator.definitions_[funcName] = code;
return ['ds18b20_' + dropdown_pin + '_getTemp(' + unit + ')', generator.ORDER_ATOMIC];
}
// 初始化MLX90614红外测温传感器
export const mlx90614_init = function (_, generator) {
var value_mlx90614_address = generator.valueToCode(this, 'mlx90614_address', generator.ORDER_ATOMIC);
var text_mlx90614_name = 'MLX';
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['include_Adafruit_MLX90614'] = '#include <Adafruit_MLX90614.h>';
generator.definitions_['var_declare_MLX90614_' + text_mlx90614_name] = 'Adafruit_MLX90614 ' + text_mlx90614_name + ' = Adafruit_MLX90614(' + value_mlx90614_address + ');';
generator.setups_['setup_MLX90614_' + text_mlx90614_name] = '' + text_mlx90614_name + '.begin();';
var code = '';
return code;
}
// MLX90614获取数据
export const mlx90614_get_data = function (_, generator) {
var text_mlx90614_name = 'MLX';
var dropdown_mlx90614_data = this.getFieldValue('mlx90614_data');
var code = '' + text_mlx90614_name + '.' + dropdown_mlx90614_data + '()';
return [code, generator.ORDER_ATOMIC];
}
export const weightSensor = function (_, generator) {
var DOUT = this.getFieldValue('DOUT');
var SCK = this.getFieldValue('SCK');
var scale = generator.valueToCode(this, 'scale', generator.ORDER_ATOMIC);
generator.definitions_['include_Hx711'] = '#include <Hx711.h>';
generator.definitions_['var_declare_Hx711' + DOUT + SCK] = 'Hx711 scale' + DOUT + '_' + SCK + "(" + DOUT + "," + SCK + ");";
generator.setups_['setup_HX711' + DOUT + SCK] = 'scale' + DOUT + '_' + SCK + '.setOffset(scale' + DOUT + '_' + SCK + '.getAverageValue(30));';
generator.setups_['setup_' + 'scale' + DOUT + '_' + SCK + ' .setScale'] = 'scale' + DOUT + '_' + SCK + '.setScale(' + scale + ');';
var code = 'scale' + DOUT + '_' + SCK + '.getWeight(10)';
return [code, generator.ORDER_ATOMIC];
}
// DS1302
export const DS1302_init = function (_, generator) {
var dropdown_rst = generator.valueToCode(this, 'RST', generator.ORDER_ATOMIC);
var dropdown_dat = generator.valueToCode(this, 'DAT', generator.ORDER_ATOMIC);
var dropdown_clk = generator.valueToCode(this, 'CLK', generator.ORDER_ATOMIC);
generator.definitions_['include_ThreeWire'] = '#include <ThreeWire.h>';
generator.definitions_['include_RtcDS1302'] = '#include <RtcDS1302.h>';
//generator.definitions_['var_declare_RtcDateTime_dt'] = 'const RtcDateTime dt;';
generator.definitions_['var_declare_ThreeWire'] = 'ThreeWire ' + 'myWire(' + dropdown_dat + ',' + dropdown_clk + ',' + dropdown_rst + ');';
generator.definitions_['var_declare_RtcDS1302'] = 'RtcDS1302<ThreeWire> Rtc(myWire);';
generator.setups_['setup_Rtc.Begin'] = 'Rtc.Begin();\n Rtc.SetIsRunning(true);';
return "";
}
export const DS1307_init = function (_, generator) {
var SDA = generator.valueToCode(this, 'SDA', generator.ORDER_ATOMIC);
var SCL = generator.valueToCode(this, 'SCL', generator.ORDER_ATOMIC);
var RTCType = this.getFieldValue('RTCType');
generator.definitions_['include_' + RTCType] = '#include <' + RTCType + '.h>';
//generator.definitions_['var_declare_RtcDateTime_dt'] = 'const RtcDateTime dt;';
if (SDA != Profile.default.SDA[0][1] || SCL != Profile.default.SCL[0][1]) {
generator.definitions_['include_SoftwareWire'] = '#include <SoftwareWire.h>';
generator.definitions_['var_declare_SoftwareWire'] = 'SoftwareWire myWire(' + SDA + ',' + SCL + ');';
generator.definitions_['var_declare_' + RTCType] = RTCType + '<SoftwareWire> Rtc(myWire);';
}
else {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['var_declare_' + RTCType] = RTCType + '<TwoWire> Rtc(Wire);';
}
generator.setups_['setup_Rtc.Begin'] = 'Rtc.Begin();\n Rtc.SetIsRunning(true);';
return "";
}
export const RTC_get_time = function (_, generator) {
var timeType = this.getFieldValue('TIME_TYPE');
var code = 'Rtc.GetDateTime().' + timeType + '()';
return [code, generator.ORDER_ATOMIC];
}
export const RTC_date = function (_, generator) {
var year = generator.valueToCode(this, "year", generator.ORDER_ATOMIC);
var month = generator.valueToCode(this, "month", generator.ORDER_ATOMIC);
var day = generator.valueToCode(this, "day", generator.ORDER_ATOMIC);
switch (month) {
case '1':
month = 'Jan';
break;
case '2':
month = 'Feb';
break;
case '3':
month = 'Mar';
break;
case '4':
month = 'Apr';
break;
case '5':
month = 'May';
break;
case '6':
month = 'Jun';
break;
case '7':
month = 'Jul';
break;
case '8':
month = 'Aug';
break;
case '9':
month = 'Sep';
break;
case '10':
month = 'Oct';
break;
case '11':
month = 'Nov';
break;
case '12':
month = 'Dec';
break;
default:
month = 'Jan';
}
if (day.length == 1)
day = '0' + day;
var code = '"' + month + '/' + day + '/' + year + '"';
return [code, generator.ORDER_ATOMIC];
}
export const RTC_time = function (_, generator) {
var hour = generator.valueToCode(this, "hour", generator.ORDER_ATOMIC);
var minute = generator.valueToCode(this, "minute", generator.ORDER_ATOMIC);
var second = generator.valueToCode(this, "second", generator.ORDER_ATOMIC);
if (hour.length == 1)
hour = '0' + hour;
if (minute.length == 1)
minute = '0' + minute;
if (second.length == 1)
second = '0' + second;
var code = '"' + hour + ':' + minute + ':' + second + '"';
return [code, generator.ORDER_ATOMIC];
}
// 设置时间
export const RTC_set_time = function (_, generator) {
var value_date = generator.valueToCode(this, 'date', generator.ORDER_ATOMIC);
var value_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var code = '';
code = 'Rtc.SetDateTime(RtcDateTime(' + value_date + ', ' + value_time + '));\n';
return code;
}
// 获取烧录时间和日期
export const get_system_date_time = function (_, generator) {
var dropdown_type = this.getFieldValue('type');
var code = '__' + dropdown_type + '__';
return [code, generator.ORDER_ATOMIC];
}
export const RTC_set_date = function () {
const now = new Date();
const year = now.getFullYear(); // 年
const month = now.getMonth() + 1; // 月
const day = now.getDate(); // 日
var RTCName = "myRTC";
var code = RTCName + '.setDate(' + year + ',' + month + ',' + day + ');\n';
code += RTCName + '.setDOW(' + year + ',' + month + ',' + day + ');\n';
return code;
}
// 传感器_sht20
export const SHT20 = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['include_DFRobot_SHT20'] = '#include <DFRobot_SHT20.h>';
generator.definitions_['var_declare_DFRobot_SHT20'] = 'DFRobot_SHT20 sht20;\n';
generator.setups_['setup_sht20initSHT20'] = 'sht20.initSHT20();';
generator.setups_['setup_sht20.checkSHT20'] = 'sht20.checkSHT20(); \n';
var dropdown_type = this.getFieldValue('SHT20_TYPE');
var code = dropdown_type;
return [code, generator.ORDER_ATOMIC];
}
// 传感器_重力感应块
export const ADXL345 = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['include_I2Cdev'] = '#include <I2Cdev.h>';
generator.definitions_['include_ADXL345'] = '#include <ADXL345.h>';
generator.definitions_['var_declare_ADXL345'] = 'ADXL345 accel;\n';
generator.setups_['setup_Wire.begin'] = 'Wire.begin();';
generator.setups_['setup_accel.begin'] = 'accel.initialize(); \n';
var dropdown_type = this.getFieldValue('ADXL345_PIN');
var code = dropdown_type;
return [code, generator.ORDER_ATOMIC];
}
// 传感器_重力感应块
export const LIS3DHTR = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['include_LIS3DHTR'] = '#include <LIS3DHTR.h>';
generator.definitions_['include_define_Wire'] = '#define WIRE Wire';
generator.definitions_['var_declare_LIS3DHTR'] = 'LIS3DHTR<TwoWire> LIS;\n';
generator.setups_['setup_LIS.begin'] = 'LIS.begin(WIRE,0x19);\n';
generator.setups_['setup_LIS.openTemp'] = 'LIS.openTemp();';
generator.setups_['setup_LIS.setFullScaleRange'] = 'LIS.setFullScaleRange(LIS3DHTR_RANGE_2G);';
generator.setups_['setup_LIS.setOutputDataRate'] = 'LIS.setOutputDataRate(LIS3DHTR_DATARATE_50HZ);';
var dropdown_type = this.getFieldValue('LIS3DHTR_GETDATA');
var code = dropdown_type;
return [code, generator.ORDER_ATOMIC];
}
// 传感器_重力感应块
export const ADXL345_setOffset = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['include_I2Cdev'] = '#include <I2Cdev.h>';
generator.definitions_['include_ADXL345'] = '#include <ADXL345.h>';
generator.definitions_['var_declare_ADXL345'] = 'ADXL345 accel;\n';
generator.setups_['setup_Wire.begin'] = 'Wire.begin();';
generator.setups_['setup_accel.begin'] = 'accel.initialize(); \n';
var dropdown_type = this.getFieldValue('MIXEPI_ADXL345_OFFSET');
var offset_value = generator.valueToCode(this, 'OFFSET', generator.ORDER_ATOMIC);
var code;
if (dropdown_type == "setOffsetX") {
code = 'accel.setOffsetX(round(' + offset_value + '*4/15.9));\n';
} else if (dropdown_type == "setOffsetY") {
code = 'accel.setOffsetY(round(' + offset_value + '*4/15.9));\n';
} else if (dropdown_type == "setOffsetZ") {
code = 'accel.setOffsetZ(round(' + offset_value + '*4/15.9));\n';
}
return code;
}
// 传感器-MPU6050-获取数据
export const MPU6050 = function (_, generator) {
generator.definitions_['include_MPU6050_tockn'] = '#include <MPU6050_tockn.h>';
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['var_declare_mpu6050'] = 'MPU6050 mpu6050(Wire);';
generator.setups_['setup_ngyro'] = 'Wire.begin();\n mpu6050.begin();\n mpu6050.calcGyroOffsets(true);';
var MPU6050_TYPE = this.getFieldValue('MPU6050_TYPE');
var code = 'mpu6050.' + MPU6050_TYPE;
return [code, generator.ORDER_ATOMIC];
}
// 传感器-MPU6050-更新数据
export const MPU6050_update = function () {
var code = 'mpu6050.update();\n';
return code;
}
//旋转编码器写
export const encoder_write = function (_, generator) {
var Encoder_NO = this.getFieldValue('Encoder_NO');
var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC);
var code = 'encoder_' + Encoder_NO + '.write(' + value + ');\n ';
return code;
}
//旋转编码器读值
export const encoder_read = function (_, generator) {
var Encoder_NO = this.getFieldValue('Encoder_NO');
var code = 'encoder_' + Encoder_NO + '.read()';
return [code, generator.ORDER_ATOMIC];
}
//旋转编码管脚定义
export const encoder_init = function (_, generator) {
var CLK = this.getFieldValue('CLK');
var DT = this.getFieldValue('DT');
var Encoder_NO = this.getFieldValue('Encoder_NO');
generator.definitions_['include_Encoder'] = '#include <Encoder.h>\n';
generator.definitions_['var_declare_Encoder_' + Encoder_NO] = 'Encoder encoder_' + Encoder_NO + '(' + CLK + ',' + DT + ');\n ';
var code = '';
return code;
}
//旋转编码器写
export const encoder_write1 = function (_, generator) {
var Encoder_NO = this.getFieldValue('Encoder_NO');
var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC);
var code = 'encoder_counter_' + Encoder_NO + ' = ' + value + ';\n ';
return code;
}
//旋转编码器读值
export const encoder_read1 = function (_, generator) {
var Encoder_NO = this.getFieldValue('Encoder_NO');
var code = 'encoder_counter_' + Encoder_NO + '';
return [code, generator.ORDER_ATOMIC];
}
//旋转编码管脚定义
export const encoder_init1 = function (_, generator) {
var CLK = this.getFieldValue('CLK');
var DT = this.getFieldValue('DT');
var Encoder_NO = this.getFieldValue('Encoder_NO');
generator.definitions_['var_declare_Encoder_' + Encoder_NO + ''] = 'int encoder_counter_' + Encoder_NO + ' = 0;\n'
+ 'int encoder_aState_' + Encoder_NO + ';\n'
+ 'int encoder_aLastState_' + Encoder_NO + ';\n'
generator.setups_['setups_encoder_' + Encoder_NO + ''] = ' pinMode (' + CLK + ', INPUT);\n'
+ ' pinMode (' + DT + ', INPUT);\n'
+ ' encoder_aLastState_' + Encoder_NO + ' = digitalRead(' + CLK + ');\n'
var code = ' encoder_aState_' + Encoder_NO + ' = digitalRead(' + CLK + ');\n'
+ ' if (encoder_aState_' + Encoder_NO + ' != encoder_aLastState_' + Encoder_NO + ') {\n'
+ ' if (digitalRead(' + DT + ') != encoder_aState_' + Encoder_NO + ') {\n'
+ ' encoder_counter_' + Encoder_NO + ' ++;\n'
+ ' } else {\n'
+ ' encoder_counter_' + Encoder_NO + ' --;\n'
+ ' }\n'
+ ' }\n'
+ ' encoder_aLastState_' + Encoder_NO + ' = encoder_aState_' + Encoder_NO + ';\n';
return code;
}
// 旋转编码器初始化
export const sensor_encoder_init = function (_, generator) {
var dropdownType = this.getFieldValue('TYPE');
var mode = this.getFieldValue('mode');
var valueClk = generator.valueToCode(this, 'CLK', generator.ORDER_ATOMIC);
var valueDt = generator.valueToCode(this, 'DT', generator.ORDER_ATOMIC);
generator.definitions_['include_ESPRotary'] = '#include <ESPRotary.h>';
generator.definitions_['var_declare_encoder' + dropdownType] = `ESPRotary encoder${dropdownType};`;
generator.setups_['setup_encoder' + dropdownType] = `encoder${dropdownType}.begin(${valueDt}, ${valueClk});\n encoder${dropdownType}.setStepsPerClick(${mode});`;
generator.loops_begin_['loop_encoder' + dropdownType] = `encoder${dropdownType}.loop();\n`;
return '';
}
// 旋转编码器读取
export const sensor_encoder_get = function (_, generator) {
var dropdownType = this.getFieldValue('TYPE');
var dropdownOperateType = this.getFieldValue('OPERATE_TYPE');
var code = `encoder${dropdownType}.${dropdownOperateType}()`;
return [code, generator.ORDER_ATOMIC];
}
// 旋转编码器设置
export const sensor_encoder_set = function (_, generator) {
var dropdownType = this.getFieldValue('TYPE');
var valueData = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC);
var dropdownOperateType = this.getFieldValue('OPERATE_TYPE');
var code = `encoder${dropdownType}.${dropdownOperateType}(${valueData});\n`;
return code;
}
// 旋转编码器事件
export const sensor_encoder_handle = function (_, generator) {
var dropdownType = this.getFieldValue('TYPE');
var dropdownOperateType = this.getFieldValue('OPERATE_TYPE');
var statementsDo = generator.statementToCode(this, 'DO');
var cbFuncName = 'encoder' + dropdownType;
switch (dropdownOperateType) {
case 'setChangedHandler':
cbFuncName += 'OnChanged';
break;
case 'setRightRotationHandler':
cbFuncName += 'OnRightRotation';
break;
case 'setLeftRotationHandler':
cbFuncName += 'OnLeftRotation';
break;
case 'setUpperOverflowHandler':
cbFuncName += 'OnUpperOverflow';
break;
case 'setLowerOverflowHandler':
default:
cbFuncName += 'OnLowerOverflow';
}
generator.definitions_['function_' + cbFuncName] = `void ${cbFuncName}(ESPRotary& encoder${dropdownType}) {\n`
+ ` ${statementsDo}`
+ `}\n`;
generator.setups_['setup_' + cbFuncName] = `encoder${dropdownType}.${dropdownOperateType}(${cbFuncName});`;
var code = '';
return code;
}
//BME280读取
export const BME280_READ = function (_, generator) {
var TYPE = this.getFieldValue('TYPE');
var address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['include_SPI'] = '#include <SPI.h>';
generator.definitions_['include_Adafruit_Sensor'] = '#include <Adafruit_Sensor.h>';
if (TYPE == "bme") {
generator.definitions_['include_Adafruit_BME280'] = '#include <Adafruit_BME280.h>';
generator.definitions_['var_declare_Adafruit_BME280'] = 'Adafruit_BME280 bme;';
}
else {
generator.definitions_['include_Adafruit_BMP280'] = '#include <Adafruit_BMP280.h>';
generator.definitions_['var_declare_Adafruit_BMP280'] = 'Adafruit_BMP280 bmp;';
}
generator.setups_['setup_status'] = 'unsigned status;\n status = ' + TYPE + '.begin(' + address + ');';
generator.definitions_['include_SEALEVELPRESSURE_HPA'] = '#define SEALEVELPRESSURE_HPA (1013.25)';
var code = this.getFieldValue('BME_TYPE');
return [TYPE + "." + code, generator.ORDER_ATOMIC];
}
export const PS2_init = function (_, generator) {
generator.definitions_['include_PS2X_lib'] = '#include <PS2X_lib.h>';
generator.definitions_['var_declare_PS2X'] = 'PS2X ps2x;';
var PS2_DAT = this.getFieldValue('PS2_DAT');
var PS2_CMD = this.getFieldValue('PS2_CMD');
var PS2_SEL = this.getFieldValue('PS2_SEL');
var PS2_CLK = this.getFieldValue('PS2_CLK');
var rumble = this.getFieldValue('rumble');
generator.setups_['setup_ps2x_config_gamepad'] = 'ps2x.config_gamepad(' + PS2_CLK + ',' + PS2_CMD + ',' + PS2_SEL + ',' + PS2_DAT + ', true, ' + rumble + ');\n delay(300);\n';
return "";
}
export const PS2_update = function () {
var code = 'ps2x.read_gamepad(false, 0);\ndelay(30);\n';
return code;
}
export const PS2_Button = function (_, generator) {
var bt = this.getFieldValue('psbt');
var btstate = this.getFieldValue('btstate');
var code = "ps2x." + btstate + "(" + bt + ")";
return [code, generator.ORDER_ATOMIC];
}
export const PS2_stk = function (_, generator) {
var stk = this.getFieldValue('psstk');
var code = "ps2x.Analog(" + stk + ")";
return [code, generator.ORDER_ATOMIC];
}
// 改用DF TCS34725 颜色识别传感器库
export const TCS34725_Get_RGB = function (_, generator) {
generator.definitions_['include_DFRobot_TCS34725'] = '#include <DFRobot_TCS34725.h>';
generator.definitions_['var_declare_TCS34725'] = 'DFRobot_TCS34725 tcs34725;\n';
// generator.setups_['setup_DFRobot_TCS34725' ] = 'if (tcs34725.begin()) {\n Serial.println("Found sensor");\n} \nelse { \nSerial.println("No TCS34725 found ... check your connections");\nwhile (1);\n}';
generator.setups_['setup_DFRobot_TCS34725'] = 'tcs34725.begin();';
var RGB = this.getFieldValue('DF_TCS34725_COLOR');
return [RGB, generator.ORDER_ATOMIC];
}
// 初始化TCS230颜色传感器
export const tcs230_init = function (_, generator) {
var value_tcs230_s0 = generator.valueToCode(this, 'tcs230_s0', generator.ORDER_ATOMIC);
var value_tcs230_s1 = generator.valueToCode(this, 'tcs230_s1', generator.ORDER_ATOMIC);
var value_tcs230_s2 = generator.valueToCode(this, 'tcs230_s2', generator.ORDER_ATOMIC);
var value_tcs230_s3 = generator.valueToCode(this, 'tcs230_s3', generator.ORDER_ATOMIC);
var value_tcs230_led = generator.valueToCode(this, 'tcs230_led', generator.ORDER_ATOMIC);
var value_tcs230_out = generator.valueToCode(this, 'tcs230_out', generator.ORDER_ATOMIC);
generator.definitions_['define_tcs230_pin'] = '#define tcs230_S0 ' + value_tcs230_s0 + ''
+ '\n#define tcs230_S1 ' + value_tcs230_s1 + ''
+ '\n#define tcs230_S2 ' + value_tcs230_s2 + ''
+ '\n#define tcs230_S3 ' + value_tcs230_s3 + ''
+ '\n#define tcs230_sensorOut ' + value_tcs230_out + ''
+ '\n#define tcs230_LED ' + value_tcs230_led + '';
generator.definitions_['function_tcs230_Getcolor'] = '//TCS230颜色传感器获取RGB值'
+ '\nint tcs230_Getcolor(char data)'
+ '\n{'
+ '\n int frequency = 0;'
+ '\n switch(data)'
+ '\n {'
+ '\n case \'R\':'
+ '\n {'
+ '\n digitalWrite(tcs230_S2,LOW);'
+ '\n digitalWrite(tcs230_S3,LOW);'
+ '\n frequency = pulseIn(tcs230_sensorOut, LOW);'
+ '\n frequency = map(frequency, 25, 72, 255, 0);'
+ '\n break;'
+ '\n }'
+ '\n case \'G\':'
+ '\n {'
+ '\n digitalWrite(tcs230_S2,HIGH);'
+ '\n digitalWrite(tcs230_S3,HIGH);'
+ '\n frequency = pulseIn(tcs230_sensorOut, LOW);'
+ '\n frequency = map(frequency, 30, 90, 255, 0);'
+ '\n break;'
+ '\n }'
+ '\n case \'B\':'
+ '\n {'
+ '\n digitalWrite(tcs230_S2,LOW);'
+ '\n digitalWrite(tcs230_S3,HIGH);'
+ '\n frequency = pulseIn(tcs230_sensorOut, LOW);'
+ '\n frequency = map(frequency, 25, 70, 255, 0);'
+ '\n break;'
+ '\n }'
+ '\n default:'
+ '\n return -1;'
+ '\n }'
+ '\n if (frequency < 0)'
+ '\n frequency = 0;'
+ '\n if (frequency > 255)'
+ '\n frequency = 255;'
+ '\n return frequency;'
+ '\n}\n';
generator.setups_['setup_tcs230_pin'] = 'pinMode(tcs230_S0, OUTPUT);'
+ '\n pinMode(tcs230_S1, OUTPUT);'
+ '\n pinMode(tcs230_S2, OUTPUT);'
+ '\n pinMode(tcs230_S3, OUTPUT);'
+ '\n pinMode(tcs230_LED, OUTPUT);'
+ '\n pinMode(tcs230_sensorOut, INPUT);'
+ '\n digitalWrite(tcs230_S0,HIGH);'
+ '\n digitalWrite(tcs230_S1,LOW);'
+ '\n digitalWrite(tcs230_LED,HIGH);';
var code = '';
return code;
}
// TCS230颜色传感器 获取RGB值
export const tcs230_Get_RGB = function (_, generator) {
var dropdown_tcs230_color = this.getFieldValue('tcs230_color');
var code = 'tcs230_Getcolor(\'' + dropdown_tcs230_color + '\')';
return [code, generator.ORDER_ATOMIC];
}
export const Arduino_keypad_4_4_start = function (_, generator) {
var text_keypad_name = this.getFieldValue('keypad_name');
var text_keypad_row = generator.valueToCode(this, 'keypad_row', generator.ORDER_ATOMIC);
var text_keypad_col = generator.valueToCode(this, 'keypad_col', generator.ORDER_ATOMIC);
var text_keypad_type = generator.valueToCode(this, 'keypad_type', generator.ORDER_ATOMIC);
generator.definitions_['include_Keypad'] = '#include <Keypad.h>';
generator.definitions_['var_keypadstart1' + text_keypad_name] = 'const byte ' + text_keypad_name + '_ROWS = 4;';
generator.definitions_['var_keypadstart2' + text_keypad_name] = 'const byte ' + text_keypad_name + '_COLS = 4;';
generator.definitions_['var_keypadstart3' + text_keypad_name] = 'char ' + text_keypad_name + '_hexaKeys[' + text_keypad_name + '_ROWS][' + text_keypad_name + '_COLS] = {' + '\n' + text_keypad_type + '\n};';
generator.definitions_['var_keypadstart4' + text_keypad_name] = 'byte ' + text_keypad_name + '_rowPins[' + text_keypad_name + '_ROWS] = ' + text_keypad_row;
generator.definitions_['var_keypadstart5' + text_keypad_name] = 'byte ' + text_keypad_name + '_colPins[' + text_keypad_name + '_COLS] = ' + text_keypad_col;
generator.definitions_['var_keypadstart6' + text_keypad_name] = 'Keypad ' + text_keypad_name + ' = Keypad(makeKeymap(' + text_keypad_name + '_hexaKeys), ' + text_keypad_name + '_rowPins, ' + text_keypad_name + '_colPins, ' + text_keypad_name + '_ROWS, ' + text_keypad_name + '_COLS);';
generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);';
var code = '';
return code;
}
export const keypad_row_data = function (_, generator) {
var pin_keypad_row_1 = generator.valueToCode(this, 'keypad_row_1', generator.ORDER_ATOMIC);
var pin_keypad_row_2 = generator.valueToCode(this, 'keypad_row_2', generator.ORDER_ATOMIC);
var pin_keypad_row_3 = generator.valueToCode(this, 'keypad_row_3', generator.ORDER_ATOMIC);
var pin_keypad_row_4 = generator.valueToCode(this, 'keypad_row_4', generator.ORDER_ATOMIC);
var code = '{' + pin_keypad_row_1 + ', ' + pin_keypad_row_2 + ', ' + pin_keypad_row_3 + ', ' + pin_keypad_row_4 + '};';
return [code, generator.ORDER_ATOMIC];
}
export const keypad_col_data = function (_, generator) {
var pin_keypad_col_1 = generator.valueToCode(this, 'keypad_col_1', generator.ORDER_ATOMIC);
var pin_keypad_col_2 = generator.valueToCode(this, 'keypad_col_2', generator.ORDER_ATOMIC);
var pin_keypad_col_3 = generator.valueToCode(this, 'keypad_col_3', generator.ORDER_ATOMIC);
var pin_keypad_col_4 = generator.valueToCode(this, 'keypad_col_4', generator.ORDER_ATOMIC);
var code = '{' + pin_keypad_col_1 + ', ' + pin_keypad_col_2 + ', ' + pin_keypad_col_3 + ', ' + pin_keypad_col_4 + '};';
return [code, generator.ORDER_ATOMIC];
}
export const keypad_type_data = function (_, generator) {
var text_keypad_1_1 = this.getFieldValue('keypad_1_1');
var text_keypad_1_2 = this.getFieldValue('keypad_1_2');
var text_keypad_1_3 = this.getFieldValue('keypad_1_3');
var text_keypad_1_4 = this.getFieldValue('keypad_1_4');
var text_keypad_2_1 = this.getFieldValue('keypad_2_1');
var text_keypad_2_2 = this.getFieldValue('keypad_2_2');
var text_keypad_2_3 = this.getFieldValue('keypad_2_3');
var text_keypad_2_4 = this.getFieldValue('keypad_2_4');
var text_keypad_3_1 = this.getFieldValue('keypad_3_1');
var text_keypad_3_2 = this.getFieldValue('keypad_3_2');
var text_keypad_3_3 = this.getFieldValue('keypad_3_3');
var text_keypad_3_4 = this.getFieldValue('keypad_3_4');
var text_keypad_4_1 = this.getFieldValue('keypad_4_1');
var text_keypad_4_2 = this.getFieldValue('keypad_4_2');
var text_keypad_4_3 = this.getFieldValue('keypad_4_3');
var text_keypad_4_4 = this.getFieldValue('keypad_4_4');
var code =
' {\'' + text_keypad_1_1 + '\',\'' + text_keypad_1_2 + '\',\'' + text_keypad_1_3 + '\',\'' + text_keypad_1_4 + '\'},' +
'\n {\'' + text_keypad_2_1 + '\',\'' + text_keypad_2_2 + '\',\'' + text_keypad_2_3 + '\',\'' + text_keypad_2_4 + '\'},' +
'\n {\'' + text_keypad_3_1 + '\',\'' + text_keypad_3_2 + '\',\'' + text_keypad_3_3 + '\',\'' + text_keypad_3_4 + '\'},' +
'\n {\'' + text_keypad_4_1 + '\',\'' + text_keypad_4_2 + '\',\'' + text_keypad_4_3 + '\',\'' + text_keypad_4_4 + '\'}';
return [code, generator.ORDER_ATOMIC];
}
export const get_keypad_num = function (_, generator) {
var text_keypad_name = this.getFieldValue('keypad_name');
var code = '' + text_keypad_name + '.getKey()';
return [code, generator.ORDER_ATOMIC];
}
export const arduino_keypad_event = function (_, generator) {
var text_keypad_name = this.getFieldValue('keypad_name');
var value_keypad_event_input = generator.valueToCode(this, 'keypad_event_input', generator.ORDER_ATOMIC);
var text_keypad_start_event_delay = this.getFieldValue('keypad_start_event_delay');
var statements_keypad_event_data = generator.statementToCode(this, 'keypad_event_data');
generator.definitions_['define_variate_' + value_keypad_event_input] = 'volatile char ' + value_keypad_event_input + ';';
generator.definitions_['var_keypadstart7_event' + text_keypad_name] = 'void keypadEvent_' + text_keypad_name + '(KeypadEvent ' + value_keypad_event_input + ') {' +
'\n' + statements_keypad_event_data +
'\n}';
generator.setups_['setup_keypad_event_and_delay' + text_keypad_name] = text_keypad_name + '.addEventListener(keypadEvent_' + text_keypad_name + ');' +
'\n ' + text_keypad_name + '.setHoldTime(' + text_keypad_start_event_delay + ');';
var code = '';
return code;
}
//传感器_重力感应块_获取9轴数据
export const mixgo_MPU9250 = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['include_FaBo9Axis_MPU9250'] = '#include <FaBo9Axis_MPU9250.h>';
generator.definitions_['var_declare_FaBo9Axis'] = 'FaBo9Axis fabo_9axis;\n float ax,ay,az,gx,gy,gz,mx,my,mz;';
generator.setups_['setup_fabo_9axis'] = 'fabo_9axis.begin();';
var dropdown_type = this.getFieldValue('MixGo_MPU9250_GETAB');
var code = '';
if (dropdown_type == "a") code += 'fabo_9axis.readAccelX()';
if (dropdown_type == "b") code += 'fabo_9axis.readAccelY()';
if (dropdown_type == "c") code += 'fabo_9axis.readAccelZ()';
if (dropdown_type == "d") code += 'fabo_9axis.readGyroX()';
if (dropdown_type == "e") code += 'fabo_9axis.readGyroY()';
if (dropdown_type == "f") code += 'fabo_9axis.readGyroZ()';
if (dropdown_type == "g") code += 'fabo_9axis.readMagnetX()';
if (dropdown_type == "h") code += 'fabo_9axis.readMagnetY()';
if (dropdown_type == "i") code += 'fabo_9axis.readMagnetZ()';
return [code, generator.ORDER_ATOMIC];
}
export const NTC_TEMP = function (_, generator) {
var PIN = this.getFieldValue('PIN');
var NominalResistance = generator.valueToCode(this, 'NominalResistance', generator.ORDER_ATOMIC);
var betaCoefficient = generator.valueToCode(this, 'betaCoefficient', generator.ORDER_ATOMIC);
var seriesResistor = generator.valueToCode(this, 'seriesResistor', generator.ORDER_ATOMIC);
generator.definitions_['include_thermistor'] = '#include <thermistor.h>';
generator.definitions_['var_declare_thermistor' + PIN] = 'THERMISTOR thermistor' + PIN + '(' + PIN + ',' + NominalResistance + "," + betaCoefficient + "," + seriesResistor + ");";
var code = 'thermistor' + PIN + '.read()';
return [code, generator.ORDER_ATOMIC];
}
// AHT20/21温湿度传感器
export const AHT20_21 = function (_, generator) {
generator.definitions_['include_Wire'] = '#include <Wire.h>';
generator.definitions_['include_RL_AHT21'] = '#include <RL_AHT21.h>';
generator.definitions_['var_declare_AHT21'] = 'AHT21Class AHT21;\n';
generator.setups_['setup_Wire.begin'] = 'Wire.begin();';
generator.setups_['setup_AHT21.begin'] = 'AHT21.begin();\n';
var dropdown_type = this.getFieldValue('AHT21_TYPE');
var code = dropdown_type;
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,110 @@
import { Profile } from 'mixly';
export const serial_begin = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || Profile.default.serial;
generator.setups_['setup_serial_' + serial_select] = serial_select + '.begin(' + content + ');';
return '';
}
export const serial_write = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '""'
if (!generator.setups_['setup_serial_' + serial_select]) {
generator.setups_['setup_serial_' + serial_select] = serial_select + '.begin(' + Profile.default.serial + ');';
}
var code = serial_select + '.write(' + content + ');\n';
return code;
}
export const serial_print = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
var new_line = this.getFieldValue('new_line');
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '""'
if (!generator.setups_['setup_serial_' + serial_select]) {
generator.setups_['setup_serial_' + serial_select] = serial_select + '.begin(' + Profile.default.serial + ');';
}
var code = serial_select + '.' + new_line + '(' + content + ');\n';
return code;
}
export const serial_println = serial_print;
export const serial_print_num = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
var Decimal = this.getFieldValue('STAT');
var new_line = this.getFieldValue('new_line');
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '0'
if (!generator.setups_['setup_serial_' + serial_select]) {
generator.setups_['setup_serial_' + serial_select] = serial_select + '.begin(' + Profile.default.serial + ');';
}
var code = serial_select + '.' + new_line + '(' + content + ',' + Decimal + ');\n';
return code;
}
export const serial_print_hex = serial_print_num;
export const serial_available = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
if (!generator.setups_['setup_serial_' + serial_select]) {
generator.setups_['setup_serial_' + serial_select] = serial_select + '.begin(' + Profile.default.serial + ');';
}
var code = serial_select + ".available()";
return [code, generator.ORDER_ATOMIC];
}
export const serial_readstr = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
if (!generator.setups_['setup_serial_' + serial_select]) {
generator.setups_['setup_serial_' + serial_select] = serial_select + '.begin(' + Profile.default.serial + ');';
}
var code = serial_select + ".readString()";
return [code, generator.ORDER_ATOMIC];
}
export const serial_readstr_until = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC);
if (!generator.setups_['setup_serial_' + serial_select]) {
generator.setups_['setup_serial_' + serial_select] = serial_select + '.begin(' + Profile.default.serial + ');';
}
var code = serial_select + ".readStringUntil(" + content + ")";
return [code, generator.ORDER_ATOMIC];
}
export const serial_parseInt_Float = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
if (!generator.setups_['setup_serial_' + serial_select]) {
generator.setups_['setup_serial_' + serial_select] = serial_select + '.begin(' + Profile.default.serial + ');';
}
var dropdown_stat = this.getFieldValue('STAT');
var code = serial_select + '.' + dropdown_stat + '()';
return [code, generator.ORDER_ATOMIC];
}
export const serial_flush = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
if (!generator.setups_['setup_serial_' + serial_select]) {
generator.setups_['setup_serial_' + serial_select] = serial_select + '.begin(' + Profile.default.serial + ');';
}
var code = serial_select + '.flush();\n';
return code;
}
export const serial_softserial = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
var dropdown_pin1 = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
var dropdown_pin2 = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
generator.definitions_['include_SoftwareSerial'] = '#include <SoftwareSerial.h>';
generator.definitions_['var_declare_' + serial_select] = 'SoftwareSerial ' + serial_select + '(' + dropdown_pin1 + ',' + dropdown_pin2 + ');';
return '';
}
export const serial_event = function (_, generator) {
var serial_select = this.getFieldValue('serial_select');
var funcName = 'attachPinInterrupt_fun_' + serial_select;
var branch = generator.statementToCode(this, 'DO');
var code2 = 'void ' + serial_select.replace('Serial', 'serialEvent') + '() {\n' + branch + '}\n';
generator.definitions_[funcName] = code2;
return "";
}

View File

@@ -0,0 +1,262 @@
import { JSFuncs } from 'mixly';
var pin_cs;
export const store_sd_init = function (_, generator) {
var board_type = JSFuncs.getPlatform();
pin_cs = generator.valueToCode(this, 'PIN_CS', generator.ORDER_ATOMIC);
if (board_type.match(RegExp(/ESP32/))) {
generator.definitions_['include_mySD'] = '#include <mySD.h>';
} else {
generator.definitions_['include_SD'] = '#include <SD.h>';
}
generator.definitions_['include_SPI'] = '#include <SPI.h>';
generator.setups_['setup_sd_write_begin'] = 'SD.begin(' + pin_cs + ');';
var code = '';
return code;
}
export const store_sd_write = function (_, generator) {
var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC) || '""';
//file=file.replace(/String/,"");
var data = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC) || '""';
//data=data.replace(/String/,"");
var newline = generator.valueToCode(this, 'NEWLINE', generator.ORDER_ATOMIC) || 'false';
generator.definitions_['var_declare_File_datafile'] = 'File datafile;';
var code = 'datafile = SD.open(' + file + ', FILE_WRITE);\n';
code += 'if(datafile){\n';
code += ' datafile.print(' + data + ');\n';
if (newline == 'true') {
code += ' datafile.println("");\n';
}
code += ' datafile.close();\n';
code += '}\n';
return code;
}
export const sd_card_type = function (_, generator) {
generator.definitions_['var_declare_Sd2Card_card'] = 'Sd2Card card;';
generator.setups_['setup_card_init'] = 'card.init(SPI_HALF_SPEED, ' + pin_cs + ');';
var code = 'card.type()';
return [code, generator.ORDER_ATOMIC];
}
export const sd_card_root_files = function (_, generator) {
generator.definitions_['var_declare_Sd2Card_card'] = 'Sd2Card card;';
generator.definitions_['var_declare_SdFile'] = 'SdFile root;';
generator.definitions_['var_declare_SdVolume'] = 'SdVolume volume;';
generator.setups_['setup_card_init'] = 'card.init(SPI_HALF_SPEED, ' + pin_cs + ');';
generator.setups_['setup_volume_init'] = 'volume.init(card);';
var code = 'root.openRoot(volume);\nroot.ls(LS_R | LS_DATE | LS_SIZE);';
return code;
}
export const sd_volume = function (_, generator) {
generator.definitions_['var_declare_Sd2Card_card'] = 'Sd2Card card;';
generator.setups_['setup_card_init'] = 'card.init(SPI_HALF_SPEED, ' + pin_cs + ');';
generator.definitions_['var_declare_SdVolume'] = 'SdVolume volume;';
generator.setups_['setup_volume_init'] = 'volume.init(card);';
var volume_TYPE = this.getFieldValue('volume_TYPE');
var code = volume_TYPE;
return [code, generator.ORDER_ATOMIC];
}
export const sd_exist = function (_, generator) {
var text_FileName = generator.valueToCode(this, 'FileName', generator.ORDER_ATOMIC);
var code = 'SD.exists(' + text_FileName + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sd_read = function (_, generator) {
var text_FileName = generator.valueToCode(this, 'FileName', generator.ORDER_ATOMIC);
generator.definitions_['var_declare_File_datafile'] = 'File datafile;';
generator.definitions_['var_declare_File_datafile_SD_card_reading'] = 'String SD_card_reading(String path) {\n'
+ 'datafile = SD.open(path.c_str());\n'
+ ' String sd_data = "";\n'
+ ' while (datafile.available()) {\n'
+ ' sd_data = String(sd_data) + String(char(datafile.read()));\n'
+ ' }\n'
+ ' return sd_data;\n'
+ '}';
var code = 'SD_card_reading(' + text_FileName + ')'
return [code, generator.ORDER_ATOMIC];
}
export const sd_DelFile = function (_, generator) {
var text_FileName = generator.valueToCode(this, 'FileName', generator.ORDER_ATOMIC);
var code = 'SD.remove(' + text_FileName + ');';
return code;
}
export const store_eeprom_write_long = function (_, generator) {
var address = generator.valueToCode(this, 'ADDRESS', generator.ORDER_ATOMIC) || '0';
var data = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC) || '0';
generator.definitions_['include_EEPROM'] = '#include <EEPROM.h>';
var funcName = 'eepromWriteLong';
var code2 = 'void ' + funcName + '(int address, unsigned long value){\n'
+ ' union u_tag {\n'
+ ' byte b[4];\n'
+ ' unsigned long ULtime;\n'
+ ' }\n'
+ ' time;\n'
+ ' time.ULtime=value;\n'
+ ' EEPROM.write(address, time.b[0]);\n'
+ ' EEPROM.write(address+1, time.b[1]);\n'
+ ' if(time.b[2] != EEPROM.read(address+2))\n'
+ ' EEPROM.write(address+2, time.b[2]);\n'
+ ' if(time.b[3] != EEPROM.read(address+3))\n'
+ ' EEPROM.write(address+3, time.b[3]);\n'
+ '}\n';
generator.definitions_[funcName] = code2;
return 'eepromWriteLong(' + address + ', ' + data + ');\n';
}
export const store_eeprom_read_long = function (_, generator) {
var address = generator.valueToCode(this, 'ADDRESS', generator.ORDER_ATOMIC) || '0';
generator.definitions_['include_EEPROM'] = '#include <EEPROM.h>';
var code = 'eepromReadLong(' + address + ')';
var funcName = 'eepromReadLong';
var code2 = 'unsigned long ' + funcName + '(int address) {\n'
+ ' union u_tag {\n'
+ ' byte b[4];\n'
+ ' unsigned long ULtime;\n'
+ ' }\n'
+ ' time;\n'
+ ' time.b[0] = EEPROM.read(address);\n'
+ ' time.b[1] = EEPROM.read(address+1);\n'
+ ' time.b[2] = EEPROM.read(address+2);\n'
+ ' time.b[3] = EEPROM.read(address+3);\n'
+ ' return time.ULtime;\n'
+ '}\n';
generator.definitions_[funcName] = code2;
return [code, generator.ORDER_ATOMIC];
}
export const store_eeprom_write_byte = function (_, generator) {
var address = generator.valueToCode(this, 'ADDRESS', generator.ORDER_ATOMIC) || '0';
var data = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC) || '0';
generator.definitions_['include_EEPROM'] = '#include <EEPROM.h>';
return 'EEPROM.write(' + address + ', ' + data + ');\n';
}
export const store_eeprom_read_byte = function (_, generator) {
var address = generator.valueToCode(this, 'ADDRESS', generator.ORDER_ATOMIC) || '0';
generator.definitions_['include_EEPROM'] = '#include <EEPROM.h>';
var code = 'EEPROM.read(' + address + ')';
return [code, generator.ORDER_ATOMIC];
}
export const store_eeprom_put = function (_, generator) {
var address = generator.valueToCode(this, 'ADDRESS', generator.ORDER_ATOMIC) || '0';
var data = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC) || '0';
generator.definitions_['include_EEPROM'] = '#include <EEPROM.h>';
return 'EEPROM.put(' + address + ', ' + data + ');\n';
};
export const store_eeprom_get = function (_, generator) {
var address = generator.valueToCode(this, 'ADDRESS', generator.ORDER_ATOMIC) || '0';
var data = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC) || '0';
generator.definitions_['include_EEPROM'] = '#include <EEPROM.h>';
return 'EEPROM.get(' + address + ', ' + data + ');\n';
}
//ESP32简化SPIFFS
export const simple_spiffs_store_spiffs_write = function (_, generator) {
var MODE = this.getFieldValue('MODE');
var file = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC) || '""';
//file=file.replace(/String/,"");
var data = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC) || '""';
//data=data.replace(/String/,"");
var newline = generator.valueToCode(this, 'NEWLINE', generator.ORDER_ATOMIC) || 'false';
generator.definitions_['include_ESP_FS'] = '#include "FS.h"';
generator.definitions_['include_ESP_SPIFFS'] = '#include "SPIFFS.h"';
if (MODE == 1) {
generator.definitions_['var_simple_spiffs_store_spiffs_write' + MODE] = 'void writeFile(fs::FS &fs, const char * path, const char * message) {\n'
+ ' File file = fs.open(path, FILE_WRITE);\n'
+ ' if (!file) {\n'
+ ' Serial.println("- failed to open file for writing");\n'
+ ' return;\n'
+ ' }\n'
+ ' if (file.print(message)) {\n'
+ ' Serial.println("- file written");\n'
+ ' } else {\n'
+ ' Serial.println("- write failed");\n'
+ ' }\n'
+ ' file.close();\n'
+ '}';
if (newline == 'true') {
var code = 'writeFile(SPIFFS, ' + file + ', String(String(' + data + ') + String("\\r\\n")).c_str());\n';
} else {
var code = 'writeFile(SPIFFS, ' + file + ', String(' + data + ').c_str());\n';
}
}
if (MODE == 2) {
generator.definitions_['var_simple_spiffs_store_spiffs_write' + MODE] = 'void appendFile(fs::FS &fs, const char * path, const char * message) {\n'
+ ' File file = fs.open(path, FILE_APPEND);\n'
+ ' if (!file) {\n'
+ ' Serial.println("- failed to open file for appending");\n'
+ ' return;\n'
+ ' }\n'
+ ' if (file.print(message)) {\n'
+ ' Serial.println("- message appended");\n'
+ ' } else {\n'
+ ' Serial.println("- append failed");\n'
+ ' }\n'
+ ' file.close();\n'
+ '}';
if (newline == 'true') {
var code = 'appendFile(SPIFFS, ' + file + ', String(String(' + data + ') + String("\\r\\n")).c_str());\n';
} else {
var code = 'appendFile(SPIFFS, ' + file + ', String(' + data + ').c_str());\n';
}
}
return code;
}
export const simple_spiffs_read = function (_, generator) {
var text_FileName = generator.valueToCode(this, 'FileName', generator.ORDER_ATOMIC);
generator.definitions_['include_ESP_FS'] = '#include "FS.h"';
generator.definitions_['include_ESP_SPIFFS'] = '#include "SPIFFS.h"';
generator.definitions_['var_simple_spiffs_read'] = 'String readFile(fs::FS &fs, const char * path) {\n'
+ ' File file = fs.open(path);\n'
+ ' if (!file || file.isDirectory()) {\n'
+ ' Serial.println("- failed to open file for reading");\n'
+ ' file.close();\n'
+ ' return "SPIFFS_error";\n'
+ ' } else {\n'
+ ' Serial.println("- read from file:");\n'
+ ' String SPIFFS_data = "";\n'
+ ' while (file.available()) {\n'
+ ' SPIFFS_data = String(SPIFFS_data) + String(char(file.read()));\n'
+ ' }\n'
+ ' file.close();\n'
+ ' return SPIFFS_data;\n'
+ ' }\n'
+ '}';
generator.setups_['setup_ESP_SPIFFS'] = ' if (!SPIFFS.begin(true)) {\n'
+ ' Serial.println("SPIFFS Mount Failed");\n'
+ ' return;\n'
+ ' }';
var code = 'readFile(SPIFFS, ' + text_FileName + ')'
return [code, generator.ORDER_ATOMIC];
}
export const simple_spiffs_DelFile = function (_, generator) {
generator.definitions_['include_ESP_FS'] = '#include "FS.h"';
generator.definitions_['include_ESP_SPIFFS'] = '#include "SPIFFS.h"';
generator.definitions_['var_simple_spiffs_DelFile'] = 'void deleteFile(fs::FS &fs, const char * path) {\n'
+ ' if (fs.remove(path)) {\n'
+ ' Serial.println("- file deleted");\n'
+ ' } else {\n'
+ ' Serial.println("- delete failed");\n'
+ ' }\n'
+ '}';
generator.setups_['setup_ESP_SPIFFS'] = ' if (!SPIFFS.begin(true)) {\n'
+ ' Serial.println("SPIFFS Mount Failed");\n'
+ ' return;\n'
+ ' }';
var text_FileName = generator.valueToCode(this, 'FileName', generator.ORDER_ATOMIC);
var code = 'deleteFile(SPIFFS, ' + text_FileName + ');\n';
return code;
}

View File

@@ -0,0 +1,152 @@
export const text = function (_, generator) {
// Text value.
//var code = 'String('+generator.quote_(this.getFieldValue('TEXT'))+')';
var code = generator.quote_(this.getFieldValue('TEXT'));
return [code, generator.ORDER_ATOMIC];
}
export const text_char = function (_, generator) {
var code = '\'' + this.getFieldValue('TEXT') + '\'';
return [code, generator.ORDER_ATOMIC];
}
export const text_join = function (_, generator) {
// Text value.
var a = 'String(' + generator.valueToCode(this, 'A', generator.ORDER_ATOMIC) + ')';
var b = 'String(' + generator.valueToCode(this, 'B', generator.ORDER_ATOMIC) + ')';
return [a + ' + ' + b, generator.ORDER_ATOMIC];
}
export const text_to_number = function (_, generator) {
var towhat = this.getFieldValue('TOWHAT');
var str = 'String(' + generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) + ')';
return [str + '.' + towhat + '()', generator.ORDER_ATOMIC];
}
export const ascii_to_char = function (_, generator) {
var asciivalue = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'
return ['char(' + asciivalue + ')', generator.ORDER_ATOMIC];
}
export const char_to_ascii = function (_, generator) {
var charvalue = '\'' + this.getFieldValue('TEXT') + '\'';
return ['toascii(' + charvalue + ')', generator.ORDER_ATOMIC];
}
export const number_to_text = function (_, generator) {
var towhat = this.getFieldValue('TOWHAT');
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '0'
return ['String(' + str + ", " + towhat + ")", generator.ORDER_ATOMIC];
}
export const text_length = function (_, generator) {
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""';
return ['String(' + str + ')' + '.length()', generator.ORDER_ATOMIC];
}
export const text_char_at = function (_, generator) {
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""';
var at = generator.valueToCode(this, 'AT', generator.ORDER_ATOMIC) || '0';
return ['String(' + str + ')' + '.charAt(' + at + ')', generator.ORDER_ATOMIC];
}
export const text_equals_starts_ends = function (_, generator) {
var str1 = 'String(' + (generator.valueToCode(this, 'STR1', generator.ORDER_ATOMIC) || '""') + ')';
var str2 = 'String(' + (generator.valueToCode(this, 'STR2', generator.ORDER_ATOMIC) || '""') + ')';
var dowhat = this.getFieldValue('DOWHAT');
return [str1 + '.' + dowhat + '(' + str2 + ')', generator.ORDER_ATOMIC];
}
export const text_compareTo = function (_, generator) {
var str1 = 'String(' + (generator.valueToCode(this, 'STR1', generator.ORDER_ATOMIC) || '""') + ')';
var str2 = 'String(' + (generator.valueToCode(this, 'STR2', generator.ORDER_ATOMIC) || '""') + ')';
return [str1 + '.compareTo(' + str2 + ')', generator.ORDER_ATOMIC];
}
// 小数获取有效位
export const decimal_places = function (_, generator) {
var numeral = generator.valueToCode(this, 'numeral', generator.ORDER_ATOMIC);
var decimal_places = generator.valueToCode(this, 'decimal_places', generator.ORDER_ATOMIC);
var code = 'String(' + numeral + ', ' + decimal_places + ')';
return [code, generator.ORDER_ATOMIC];
}
// 截取字符串
export const substring = function (_, generator) {
var name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
var Start = generator.valueToCode(this, 'Start', generator.ORDER_ATOMIC);
var end = generator.valueToCode(this, 'end', generator.ORDER_ATOMIC);
var code = 'String(' + name + ').substring(' + Start + ',' + end + ')';
return [code, generator.ORDER_ATOMIC];
}
// 字符串转化为大小写
export const letter_conversion = function (_, generator) {
var type = this.getFieldValue('type');
var String = generator.valueToCode(this, 'String', generator.ORDER_ATOMIC);
var code = '' + String + '' + type + ';\n';
return code;
}
// 字符串变量替换
export const data_replacement = function (_, generator) {
var String = generator.valueToCode(this, 'String', generator.ORDER_ATOMIC);
var replace = generator.valueToCode(this, 'replace', generator.ORDER_ATOMIC);
var source_data = generator.valueToCode(this, 'source_data', generator.ORDER_ATOMIC);
var code = '' + String + '.replace(' + source_data + ', ' + replace + ');\n';
return code;
}
// 消除非可视字符
export const eliminate = function (_, generator) {
var String = generator.valueToCode(this, 'String', generator.ORDER_ATOMIC);
var code = '' + String + '.trim();\n';
return code;
}
// 检测是否以特定字符串开头或结尾
export const first_and_last = function (_, generator) {
var type = this.getFieldValue('type');
var String = generator.valueToCode(this, 'String', generator.ORDER_ATOMIC);
var String1 = generator.valueToCode(this, 'String1', generator.ORDER_ATOMIC);
var code = 'String(' + String + ')' + type + '(' + String1 + ')';
return [code, generator.ORDER_ATOMIC];
}
// 数据类型转换
export const type_conversion = function (_, generator) {
var variable = generator.valueToCode(this, 'variable', generator.ORDER_ATOMIC);
var type = this.getFieldValue('type');
var code = '' + type + '(' + variable + ')';
return [code, generator.ORDER_ATOMIC];
}
export const String_indexOf = function (_, generator) {
var str1 = generator.valueToCode(this, 'str1', generator.ORDER_ATOMIC);
var str2 = generator.valueToCode(this, 'str2', generator.ORDER_ATOMIC);
var code = 'String(' + str1 + ').indexOf(String(' + str2 + '))';
return [code, generator.ORDER_ATOMIC];
}
export const text_join2 = function (_, generator) {
// Create a list with any number of elements of any type.
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '0';
}
var code1 = '';
for (var n = 0; n < this.itemCount_; n++) {
code1 = code1 + ' + ' + 'String(' + code[n] + ')';
}
code1 = code1.substring(3);
return [code1, generator.ORDER_ATOMIC];
}
// 字符串转长整数
export const String_to_Long_Integer = function(_, generator) {
var data= generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var type= this.getFieldValue('type');
var code = 'strtol(String(' +data+ ').c_str(), NULL, ' +type+ ')';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,605 @@
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 esp8266_pin = nano_pin;
export const wemos_d1_mini_pin = nano_pin;
export const stm32f103c8t6_pin = nano_pin;
export const esp32s2_pin = nano_pin;
export const esp32c3_pin = nano_pin;
export const esp32s3_pin = nano_pin;
export const core_esp32c3_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];
}

View File

@@ -0,0 +1,61 @@
import { Variables } from 'blockly/core';
export const variables_get = function (_, generator) {
// Variable getter.
var code = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
return [code, generator.ORDER_ATOMIC];
}
export const variables_declare = function (_, generator) {
var dropdown_type = this.getFieldValue('TYPE');
var dropdown_variables_type = this.getFieldValue('variables_type');
var argument0;
var code = '';
//TODO: settype to variable
if (dropdown_variables_type == 'global_variate') {
if (dropdown_type == 'String') {
argument0 = generator.valueToCode(this, 'VALUE', generator.ORDER_ASSIGNMENT) || '""';
} else {
argument0 = generator.valueToCode(this, 'VALUE', generator.ORDER_ASSIGNMENT) || '0';
}
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
if (dropdown_type == 'String' || dropdown_type == 'char*')
generator.definitions_['var_declare' + varName] = dropdown_type + ' ' + varName + ';';
else
generator.definitions_['var_declare' + varName] = 'volatile ' + dropdown_type + ' ' + varName + ';';
generator.setups_['setup_var' + varName] = varName + ' = ' + argument0 + ';';
}
else {
if (dropdown_type == 'String') {
argument0 = generator.valueToCode(this, 'VALUE', generator.ORDER_ASSIGNMENT) || '""';
} else {
argument0 = generator.valueToCode(this, 'VALUE', generator.ORDER_ASSIGNMENT) || '0';
}
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
code = dropdown_type + ' ' + varName + ' = ' + argument0 + ';\n';
}
//generator.variableTypes_[varName] = dropdown_type;//处理变量类型
return code;
}
export const variables_set = function (_, generator) {
// Variable setter.
var argument0 = generator.valueToCode(this, 'VALUE',
generator.ORDER_ASSIGNMENT) || '0';
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Variables.NAME_TYPE);
return varName + ' = ' + argument0 + ';\n';
}
export const variables_change = function (_, generator) {
// Variable setter.
var operator = this.getFieldValue('OP');
var varName = generator.valueToCode(this, 'MYVALUE', generator.ORDER_ASSIGNMENT);
//修复强制类型转换不正确的bug
var code = '((' + operator + ')(' + varName + '))';
return [code, generator.ORDER_ATOMIC];
}