初始化提交
This commit is contained in:
165
boards/default_src/arduino/arduino_generator.js
Normal file
165
boards/default_src/arduino/arduino_generator.js
Normal file
@@ -0,0 +1,165 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
import Names from './others/names';
|
||||
|
||||
export class ArduinoGenerator extends Blockly.Generator {
|
||||
constructor(name) {
|
||||
super(name ?? 'Arduino')
|
||||
this.ORDER_ATOMIC = 0 // 0 "" ...
|
||||
this.ORDER_UNARY_POSTFIX = 1 // expr++ expr-- () [] .
|
||||
this.ORDER_UNARY_PREFIX = 2 // -expr !expr ~expr ++expr --expr
|
||||
this.ORDER_MULTIPLICATIVE = 3 // * / % ~/
|
||||
this.ORDER_ADDITIVE = 4 // + -
|
||||
this.ORDER_SHIFT = 5 // << >>
|
||||
this.ORDER_RELATIONAL = 6 // is is! >= > <= <
|
||||
this.ORDER_EQUALITY = 7 // == != === !==
|
||||
this.ORDER_BITWISE_AND = 8 // &
|
||||
this.ORDER_BITWISE_XOR = 9 // ^
|
||||
this.ORDER_BITWISE_OR = 10 // |
|
||||
this.ORDER_LOGICAL_AND = 11 // &&
|
||||
this.ORDER_LOGICAL_OR = 12 // ||
|
||||
this.ORDER_CONDITIONAL = 13 // expr ? expr : expr
|
||||
this.ORDER_ASSIGNMENT = 14 // = *= /= ~/= %= += -= <<= >>= &= ^= |=
|
||||
this.ORDER_NONE = 99 // (...)
|
||||
this.INDENT = ' '
|
||||
this.isInitialized = false
|
||||
this.PASS = ''
|
||||
|
||||
this.addReservedWords(
|
||||
'setup,loop,if,else,for,switch,case,while,do,break,continue,return,goto,define,include,HIGH,LOW,INPUT,OUTPUT,INPUT_PULLUP,true,false,interger,constants,floating,point,void,bookean,char,unsigned,byte,int,short,word,long,float,double,string,String,array,static,volatile,const,sizeof'
|
||||
)
|
||||
}
|
||||
|
||||
init() {
|
||||
super.init();
|
||||
// Create a dictionary of definitions to be printed before setups.
|
||||
this.definitions_ = Object.create(null)
|
||||
// Create a dictionary of setups to be printed before the code.
|
||||
this.setups_ = Object.create(null)
|
||||
this.setups_begin_ = Object.create(null)
|
||||
this.setups_end_ = Object.create(null)
|
||||
this.libs_ = Object.create(null)
|
||||
this.loops_begin_ = Object.create(null)
|
||||
this.loops_end_ = Object.create(null)
|
||||
//this.variableTypes_ = Object.create(null);//处理变量类型
|
||||
|
||||
if (!this.variableDB_) {
|
||||
this.variableDB_ = new Names(
|
||||
this.RESERVED_WORDS_
|
||||
)
|
||||
} else {
|
||||
this.variableDB_.reset()
|
||||
}
|
||||
this.isInitialized = true;
|
||||
}
|
||||
|
||||
finish(code) {
|
||||
// Indent every line.
|
||||
code = ' ' + code.replace(/\n/g, '\n ');
|
||||
code = code.replace(/\n\s+$/, '\n');
|
||||
// Convert the definitions dictionary into a list.
|
||||
var imports = [];
|
||||
var define = [];
|
||||
var definitions_var = []; //变量定义
|
||||
var definitions_fun = []; //函数定义
|
||||
//var sorted_keys=Object.keys(this.definitions_).sort();
|
||||
var sorted_keys = Object.keys(this.definitions_);
|
||||
if (sorted_keys.length) {
|
||||
for (var idx in sorted_keys) {
|
||||
var name = sorted_keys[idx];
|
||||
var def = this.definitions_[name];
|
||||
if (name.match(/^define/)) {
|
||||
define.push(def);
|
||||
} else if (name.match(/^include/)) {
|
||||
imports.push(def);
|
||||
} else if (def.match(/^WiFiClient/)) {
|
||||
imports.push(def);
|
||||
} else if (name.match(/^var_declare/)) {
|
||||
definitions_var.push(def);
|
||||
} else {
|
||||
definitions_fun.push(def);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Convert the setups dictionary into a list.
|
||||
var setups = [];
|
||||
for (let name in this.setups_) {
|
||||
setups.push(this.setups_[name]);
|
||||
}
|
||||
var setupsBegin = [], setupsEnd = [];
|
||||
for (let name in this.setups_begin_) {
|
||||
setupsBegin.push(this.setups_begin_[name]);
|
||||
}
|
||||
for (let name in this.setups_end_) {
|
||||
setupsEnd.push(this.setups_end_[name]);
|
||||
}
|
||||
|
||||
for (let name in this.libs_) {
|
||||
imports.push(`#include "${name}.h"`);
|
||||
}
|
||||
|
||||
var loopsBegin = [], loopsEnd = [];
|
||||
for (let name in this.loops_begin_) {
|
||||
loopsBegin.push(this.loops_begin_[name]);
|
||||
}
|
||||
for (let name in this.loops_end_) {
|
||||
loopsEnd.push(this.loops_end_[name]);
|
||||
}
|
||||
code = 'void loop(){\n'
|
||||
+ (loopsBegin.length ? (' ' + loopsBegin.join('\n ')) : '')
|
||||
+ code
|
||||
+ (loopsEnd.length ? (' ' + loopsEnd.join('\n ')) : '')
|
||||
+ '\n}';
|
||||
var allDefs = define.join('\n') + '\n' + imports.join('\n') + '\n\n'
|
||||
+ definitions_var.join('\n')
|
||||
+ '\n\n' + definitions_fun.join('\n')
|
||||
+ '\n\nvoid setup(){\n '
|
||||
+ setupsBegin.join('\n ') + ((setupsBegin.length && (setupsEnd.length || setups.length)) ? '\n ' : '')
|
||||
+ setups.join('\n ') + ((setupsEnd.length && setups.length) ? '\n ' : '')
|
||||
+ setupsEnd.join('\n ') + '\n}' + '\n\n';
|
||||
return allDefs.replace(/\n\n+/g, '\n\n').replace(/\n*$/, '\n\n') + code;
|
||||
}
|
||||
|
||||
scrubNakedValue(line) {
|
||||
return line + ';\n'
|
||||
}
|
||||
|
||||
quote_(string) {
|
||||
// TODO: This is a quick hack. Replace with goog.string.quote
|
||||
//return goog.string.quote(string);
|
||||
return "\"" + string + "\"";
|
||||
}
|
||||
|
||||
scrub_(block, code) {
|
||||
if (code === null) {
|
||||
// Block has handled code generation itself.
|
||||
return '';
|
||||
}
|
||||
var commentCode = '';
|
||||
// Only collect comments for blocks that aren't inline.
|
||||
if (!block.outputConnection || !block.outputConnection.targetConnection) {
|
||||
// Collect comment for this block.
|
||||
let comment = block.getCommentText();
|
||||
if (comment) {
|
||||
commentCode += this.prefixLines(comment, '// ') + '\n';
|
||||
}
|
||||
// Collect comments for all value arguments.
|
||||
// Don't collect comments for nested statements.
|
||||
for (var x = 0; x < block.inputList.length; x++) {
|
||||
if (block.inputList[x].type == Blockly.INPUT_VALUE) {
|
||||
var childBlock = block.inputList[x].connection.targetBlock();
|
||||
if (childBlock) {
|
||||
let comment = this.allNestedComments(childBlock);
|
||||
if (comment) {
|
||||
commentCode += this.prefixLines(comment, '// ');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var nextBlock = block.nextConnection && block.nextConnection.targetBlock();
|
||||
var nextCode = this.blockToCode(nextBlock);
|
||||
return commentCode + code + nextCode;
|
||||
}
|
||||
}
|
||||
|
||||
export const Arduino = new ArduinoGenerator();
|
||||
1395
boards/default_src/arduino/blocks/ethernet.js
Normal file
1395
boards/default_src/arduino/blocks/ethernet.js
Normal file
File diff suppressed because it is too large
Load Diff
23
boards/default_src/arduino/blocks/text.js
Normal file
23
boards/default_src/arduino/blocks/text.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const TEXTS_HUE = 160;
|
||||
|
||||
export const text_base64_url_codec = {
|
||||
init: function () {
|
||||
this.appendValueInput("VALUE")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.LEFT)
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
["Base64", "BASE64"],
|
||||
["URL", "URL"]
|
||||
]), "TYPE")
|
||||
.appendField(new Blockly.FieldDropdown([
|
||||
["编码", "ENCODE"],
|
||||
["解码", "DECODE"]
|
||||
]), "OPTION");
|
||||
this.setOutput(true, null);
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
20
boards/default_src/arduino/export.js
Normal file
20
boards/default_src/arduino/export.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import * as ArduinoEthernetBlocks from './blocks/ethernet';
|
||||
import * as ArduinoTextBlocks from './blocks/text';
|
||||
import * as ArduinoEthernetGenerators from './generators/ethernet';
|
||||
import * as ArduinoTextGenerators from './generators/text';
|
||||
import Names from './others/names';
|
||||
import Procedures from './others/procedures';
|
||||
import Variables from './others/variables';
|
||||
import { ArduinoGenerator, Arduino } from './arduino_generator';
|
||||
|
||||
export {
|
||||
ArduinoEthernetBlocks,
|
||||
ArduinoTextBlocks,
|
||||
ArduinoEthernetGenerators,
|
||||
ArduinoTextGenerators,
|
||||
Names,
|
||||
Procedures,
|
||||
Variables,
|
||||
ArduinoGenerator,
|
||||
Arduino
|
||||
};
|
||||
1380
boards/default_src/arduino/generators/ethernet.js
Normal file
1380
boards/default_src/arduino/generators/ethernet.js
Normal file
File diff suppressed because it is too large
Load Diff
37
boards/default_src/arduino/generators/text.js
Normal file
37
boards/default_src/arduino/generators/text.js
Normal file
@@ -0,0 +1,37 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
export const text_base64_url_codec = function () {
|
||||
const FIELD_TYPE = this.getFieldValue("TYPE");
|
||||
const FIELD_OPTION = this.getFieldValue("OPTION");
|
||||
const VALUE_INPUT_VALUE = Blockly.Arduino.valueToCode(this, "VALUE", Blockly.Arduino.ORDER_ATOMIC);
|
||||
let code = '';
|
||||
if (FIELD_TYPE === 'BASE64') {
|
||||
Blockly.Arduino.definitions_['include_rBase64'] = '#include <rBase64.h>';
|
||||
if (FIELD_OPTION === 'ENCODE') {
|
||||
code = 'rbase64.encode(' + VALUE_INPUT_VALUE + ')';
|
||||
} else {
|
||||
code = 'rbase64.decode(' + VALUE_INPUT_VALUE + ')';
|
||||
}
|
||||
} else {
|
||||
Blockly.Arduino.definitions_['include_URLCode'] = '#include <URLCode.h>';
|
||||
Blockly.Arduino.definitions_['var_declare_urlCode'] = 'URLCode urlCode;';
|
||||
if (FIELD_OPTION === 'ENCODE') {
|
||||
Blockly.Arduino.definitions_['function_urlEncode']
|
||||
= 'String urlEncode(String urlStr) {\n'
|
||||
+ ' urlCode.strcode = urlStr;\n'
|
||||
+ ' urlCode.urlencode();\n'
|
||||
+ ' return urlCode.urlcode;\n'
|
||||
+ '}\n';
|
||||
code = 'urlEncode(' + VALUE_INPUT_VALUE + ')';
|
||||
} else {
|
||||
Blockly.Arduino.definitions_['function_urlDecode']
|
||||
= 'String urlDecode(String urlStr) {\n'
|
||||
+ ' urlCode.urlcode = urlStr;\n'
|
||||
+ ' urlCode.urldecode();\n'
|
||||
+ ' return urlCode.strcode;\n'
|
||||
+ '}\n';
|
||||
code = 'urlDecode(' + VALUE_INPUT_VALUE + ')';
|
||||
}
|
||||
}
|
||||
return [code, Blockly.Arduino.ORDER_ATOMIC];
|
||||
};
|
||||
0
boards/default_src/arduino/index.js
Normal file
0
boards/default_src/arduino/index.js
Normal file
199
boards/default_src/arduino/others/names.js
Normal file
199
boards/default_src/arduino/others/names.js
Normal file
@@ -0,0 +1,199 @@
|
||||
/**
|
||||
* @license
|
||||
* Visual Blocks Editor
|
||||
*
|
||||
* Copyright 2012 Google Inc.
|
||||
* https://developers.google.com/blockly/
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview Utility functions for handling variables and procedure names.
|
||||
* @author fraser@google.com (Neil Fraser)
|
||||
*/
|
||||
|
||||
import { Variables } from 'blockly/core';
|
||||
|
||||
/**
|
||||
* Class for a database of entity names (variables, functions, etc).
|
||||
* @param {string} reservedWords A comma-separated string of words that are
|
||||
* illegal for use as names in a language (e.g. 'new,if,this,...').
|
||||
* @param {string=} opt_variablePrefix Some languages need a '$' or a namespace
|
||||
* before all variable names.
|
||||
* @constructor
|
||||
*/
|
||||
const Names = function (reservedWords, opt_variablePrefix) {
|
||||
this.variablePrefix_ = opt_variablePrefix || '';
|
||||
this.reservedDict_ = Object.create(null);
|
||||
if (reservedWords) {
|
||||
var splitWords = reservedWords.split(',');
|
||||
for (var i = 0; i < splitWords.length; i++) {
|
||||
this.reservedDict_[splitWords[i]] = true;
|
||||
}
|
||||
}
|
||||
this.reset();
|
||||
};
|
||||
|
||||
/**
|
||||
* Constant to separate developer variable names from user-defined variable
|
||||
* names when running generators.
|
||||
* A developer variable will be declared as a global in the generated code, but
|
||||
* will never be shown to the user in the workspace or stored in the variable
|
||||
* map.
|
||||
*/
|
||||
Names.DEVELOPER_VARIABLE_TYPE = 'DEVELOPER_VARIABLE';
|
||||
|
||||
/**
|
||||
* When JavaScript (or most other languages) is generated, variable 'foo' and
|
||||
* procedure 'foo' would collide. However, Blockly has no such problems since
|
||||
* variable get 'foo' and procedure call 'foo' are unambiguous.
|
||||
* Therefore, Blockly keeps a separate type name to disambiguate.
|
||||
* getName('foo', 'variable') -> 'foo'
|
||||
* getName('foo', 'procedure') -> 'foo2'
|
||||
*/
|
||||
|
||||
/**
|
||||
* Empty the database and start from scratch. The reserved words are kept.
|
||||
*/
|
||||
Names.prototype.reset = function () {
|
||||
this.db_ = Object.create(null);
|
||||
this.dbReverse_ = Object.create(null);
|
||||
this.variableMap_ = null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the variable map that maps from variable name to variable object.
|
||||
* @param {!Blockly.VariableMap} map The map to track.
|
||||
* @package
|
||||
*/
|
||||
Names.prototype.setVariableMap = function (map) {
|
||||
this.variableMap_ = map;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the name for a user-defined variable, based on its ID.
|
||||
* This should only be used for variables of type Variables.NAME_TYPE.
|
||||
* @param {string} id The ID to look up in the variable map.
|
||||
* @return {?string} The name of the referenced variable, or null if there was
|
||||
* no variable map or the variable was not found in the map.
|
||||
* @private
|
||||
*/
|
||||
Names.prototype.getNameForUserVariable_ = function (id) {
|
||||
if (!this.variableMap_) {
|
||||
/*
|
||||
console.log('Deprecated call to Names.prototype.getName without ' +
|
||||
'defining a variable map. To fix, add the folowing code in your ' +
|
||||
'generator\'s init() function:\n' +
|
||||
'Blockly.YourGeneratorName.variableDB_.setVariableMap(' +
|
||||
'workspace.getVariableMap());');
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
var variable = this.variableMap_.getVariableById(id);
|
||||
if (variable) {
|
||||
return variable.name;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert a Blockly entity name to a legal exportable entity name.
|
||||
* @param {string} name The Blockly entity name (no constraints).
|
||||
* @param {string} type The type of entity in Blockly
|
||||
* ('VARIABLE', 'PROCEDURE', 'BUILTIN', etc...).
|
||||
* @return {string} An entity name that is legal in the exported language.
|
||||
*/
|
||||
Names.prototype.getName = function (name, type) {
|
||||
if (type == Variables.NAME_TYPE) {
|
||||
var varName = this.getNameForUserVariable_(name);
|
||||
if (varName) {
|
||||
name = varName;
|
||||
}
|
||||
}
|
||||
var normalized = name.toLowerCase() + '_' + type;
|
||||
|
||||
var isVarType = type == Variables.NAME_TYPE ||
|
||||
type == Names.DEVELOPER_VARIABLE_TYPE;
|
||||
|
||||
var prefix = isVarType ? this.variablePrefix_ : '';
|
||||
if (normalized in this.db_) {
|
||||
return prefix + this.db_[normalized];
|
||||
}
|
||||
var safeName = this.getDistinctName(name, type);
|
||||
this.db_[normalized] = safeName.substr(prefix.length);
|
||||
return safeName;
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert a Blockly entity name to a legal exportable entity name.
|
||||
* Ensure that this is a new name not overlapping any previously defined name.
|
||||
* Also check against list of reserved words for the current language and
|
||||
* ensure name doesn't collide.
|
||||
* @param {string} name The Blockly entity name (no constraints).
|
||||
* @param {string} type The type of entity in Blockly
|
||||
* ('VARIABLE', 'PROCEDURE', 'BUILTIN', etc...).
|
||||
* @return {string} An entity name that is legal in the exported language.
|
||||
*/
|
||||
Names.prototype.getDistinctName = function (name, type) {
|
||||
var safeName = this.safeName_(name);
|
||||
var i = '';
|
||||
while (this.dbReverse_[safeName + i] ||
|
||||
(safeName + i) in this.reservedDict_) {
|
||||
// Collision with existing name. Create a unique name.
|
||||
i = i ? i + 1 : 2;
|
||||
}
|
||||
safeName += i;
|
||||
this.dbReverse_[safeName] = true;
|
||||
var isVarType = type == Variables.NAME_TYPE ||
|
||||
type == Names.DEVELOPER_VARIABLE_TYPE;
|
||||
var prefix = isVarType ? this.variablePrefix_ : '';
|
||||
return prefix + safeName;
|
||||
};
|
||||
|
||||
/**
|
||||
* Given a proposed entity name, generate a name that conforms to the
|
||||
* [_A-Za-z][_A-Za-z0-9]* format that most languages consider legal for
|
||||
* variables.
|
||||
* @param {string} name Potentially illegal entity name.
|
||||
* @return {string} Safe entity name.
|
||||
* @private
|
||||
*/
|
||||
Names.prototype.safeName_ = function (name) {
|
||||
if (!name) {
|
||||
name = 'unnamed';
|
||||
} else {
|
||||
// Unfortunately names in non-latin characters will look like
|
||||
// _E9_9F_B3_E4_B9_90 which is pretty meaningless.
|
||||
// https://github.com/google/blockly/issues/1654
|
||||
name = encodeURI(name.replace(/ /g, '_')).replace(/[^,\w]/g, '_');
|
||||
// Most languages don't allow names with leading numbers.
|
||||
if ('0123456789'.indexOf(name[0]) != -1) {
|
||||
name = 'my_' + name;
|
||||
}
|
||||
}
|
||||
return name;
|
||||
};
|
||||
|
||||
/**
|
||||
* Do the given two entity names refer to the same entity?
|
||||
* Blockly names are case-insensitive.
|
||||
* @param {string} name1 First name.
|
||||
* @param {string} name2 Second name.
|
||||
* @return {boolean} True if names are the same.
|
||||
*/
|
||||
Names.equals = function (name1, name2) {
|
||||
return name1.toLowerCase() == name2.toLowerCase();
|
||||
};
|
||||
|
||||
export default Names;
|
||||
332
boards/default_src/arduino/others/procedures.js
Normal file
332
boards/default_src/arduino/others/procedures.js
Normal file
@@ -0,0 +1,332 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2012 Google LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview Utility functions for handling procedures.
|
||||
* @author fraser@google.com (Neil Fraser)
|
||||
*/
|
||||
|
||||
/**
|
||||
* @name Blockly.Procedures
|
||||
* @namespace
|
||||
*/
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const Procedures = {};
|
||||
|
||||
/**
|
||||
* Constant to separate procedure names from variables and generated functions
|
||||
* when running generators.
|
||||
* @deprecated Use Blockly.PROCEDURE_CATEGORY_NAME
|
||||
*/
|
||||
Procedures.NAME_TYPE = Blockly.PROCEDURE_CATEGORY_NAME;
|
||||
|
||||
/**
|
||||
* Find all user-created procedure definitions in a workspace.
|
||||
* @param {!Blockly.Workspace} root Root workspace.
|
||||
* @return {!Array.<!Array.<!Array>>} Pair of arrays, the
|
||||
* first contains procedures without return variables, the second with.
|
||||
* Each procedure is defined by a three-element list of name, parameter
|
||||
* list, and return value boolean.
|
||||
*/
|
||||
Procedures.allProcedures = function (root) {
|
||||
var blocks = root.getAllBlocks(false);
|
||||
var proceduresReturn = [];
|
||||
var proceduresNoReturn = [];
|
||||
for (var i = 0; i < blocks.length; i++) {
|
||||
if (blocks[i].getProcedureDef) {
|
||||
var tuple = blocks[i].getProcedureDef();
|
||||
if (tuple) {
|
||||
if (tuple[2]) {
|
||||
proceduresReturn.push(tuple);
|
||||
} else {
|
||||
proceduresNoReturn.push(tuple);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
proceduresNoReturn.sort(Procedures.procTupleComparator_);
|
||||
proceduresReturn.sort(Procedures.procTupleComparator_);
|
||||
return [proceduresNoReturn, proceduresReturn];
|
||||
};
|
||||
|
||||
/**
|
||||
* Comparison function for case-insensitive sorting of the first element of
|
||||
* a tuple.
|
||||
* @param {!Array} ta First tuple.
|
||||
* @param {!Array} tb Second tuple.
|
||||
* @return {number} -1, 0, or 1 to signify greater than, equality, or less than.
|
||||
* @private
|
||||
*/
|
||||
Procedures.procTupleComparator_ = function (ta, tb) {
|
||||
return ta[0].toLowerCase().localeCompare(tb[0].toLowerCase());
|
||||
};
|
||||
|
||||
/**
|
||||
* Ensure two identically-named procedures don't exist.
|
||||
* Take the proposed procedure name, and return a legal name i.e. one that
|
||||
* is not empty and doesn't collide with other procedures.
|
||||
* @param {string} name Proposed procedure name.
|
||||
* @param {!Blockly.Block} block Block to disambiguate.
|
||||
* @return {string} Non-colliding name.
|
||||
*/
|
||||
Procedures.findLegalName = function (name, block) {
|
||||
if (block.isInFlyout) {
|
||||
// Flyouts can have multiple procedures called 'do something'.
|
||||
return name;
|
||||
}
|
||||
name = name || Blockly.Msg['UNNAMED_KEY'] || 'unnamed';
|
||||
while (!Procedures.isLegalName_(name, block.workspace, block)) {
|
||||
// Collision with another procedure.
|
||||
var r = name.match(/^(.*?)(\d+)$/);
|
||||
if (!r) {
|
||||
name += '2';
|
||||
} else {
|
||||
name = r[1] + (parseInt(r[2], 10) + 1);
|
||||
}
|
||||
}
|
||||
return name;
|
||||
};
|
||||
|
||||
/**
|
||||
* Does this procedure have a legal name? Illegal names include names of
|
||||
* procedures already defined.
|
||||
* @param {string} name The questionable name.
|
||||
* @param {!Blockly.Workspace} workspace The workspace to scan for collisions.
|
||||
* @param {Blockly.Block=} opt_exclude Optional block to exclude from
|
||||
* comparisons (one doesn't want to collide with oneself).
|
||||
* @return {boolean} True if the name is legal.
|
||||
* @private
|
||||
*/
|
||||
Procedures.isLegalName_ = function (name, workspace, opt_exclude) {
|
||||
return !Procedures.isNameUsed(name, workspace, opt_exclude);
|
||||
};
|
||||
|
||||
/**
|
||||
* Return if the given name is already a procedure name.
|
||||
* @param {string} name The questionable name.
|
||||
* @param {!Blockly.Workspace} workspace The workspace to scan for collisions.
|
||||
* @param {Blockly.Block=} opt_exclude Optional block to exclude from
|
||||
* comparisons (one doesn't want to collide with oneself).
|
||||
* @return {boolean} True if the name is used, otherwise return false.
|
||||
*/
|
||||
Procedures.isNameUsed = function (name, workspace, opt_exclude) {
|
||||
var blocks = workspace.getAllBlocks(false);
|
||||
// Iterate through every block and check the name.
|
||||
for (var i = 0; i < blocks.length; i++) {
|
||||
if (blocks[i] == opt_exclude) {
|
||||
continue;
|
||||
}
|
||||
if (blocks[i].getProcedureDef) {
|
||||
var procName = blocks[i].getProcedureDef();
|
||||
if (Blockly.Names.equals(procName[0], name)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* Rename a procedure. Called by the editable field.
|
||||
* @param {string} name The proposed new name.
|
||||
* @return {string} The accepted name.
|
||||
* @this {Blockly.Field}
|
||||
*/
|
||||
Procedures.rename = function (name) {
|
||||
// Strip leading and trailing whitespace. Beyond this, all names are legal.
|
||||
name = name.trim();
|
||||
|
||||
var legalName = Procedures.findLegalName(name, this.getSourceBlock());
|
||||
var oldName = this.getValue();
|
||||
if (oldName != name && oldName != legalName) {
|
||||
// Rename any callers.
|
||||
var blocks = this.getSourceBlock().workspace.getAllBlocks(false);
|
||||
for (var i = 0; i < blocks.length; i++) {
|
||||
if (blocks[i].renameProcedure) {
|
||||
blocks[i].renameProcedure(oldName, legalName);
|
||||
}
|
||||
}
|
||||
}
|
||||
return legalName;
|
||||
};
|
||||
|
||||
/**
|
||||
* Construct the blocks required by the flyout for the procedure category.
|
||||
* @param {!Blockly.Workspace} workspace The workspace containing procedures.
|
||||
* @return {!Array.<!Element>} Array of XML block elements.
|
||||
*/
|
||||
Procedures.flyoutCategory = function (workspace) {
|
||||
var xmlList = [];
|
||||
if (Blockly.Blocks['procedures_defnoreturn']) {
|
||||
// <block type="procedures_defnoreturn" gap="16">
|
||||
// <field name="NAME">do something</field>
|
||||
// </block>
|
||||
var block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', 'procedures_defnoreturn');
|
||||
block.setAttribute('gap', 16);
|
||||
var nameField = Blockly.utils.xml.createElement('field');
|
||||
nameField.setAttribute('name', 'NAME');
|
||||
nameField.appendChild(Blockly.utils.xml.createTextNode(
|
||||
Blockly.Msg['PROCEDURES_DEFNORETURN_PROCEDURE']));
|
||||
block.appendChild(nameField);
|
||||
xmlList.push(block);
|
||||
}
|
||||
if (Blockly.Blocks['procedures_defreturn']) {
|
||||
// <block type="procedures_defreturn" gap="16">
|
||||
// <field name="NAME">do something</field>
|
||||
// </block>
|
||||
let block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', 'procedures_defreturn');
|
||||
block.setAttribute('gap', 16);
|
||||
let nameField = Blockly.utils.xml.createElement('field');
|
||||
nameField.setAttribute('name', 'NAME');
|
||||
nameField.appendChild(Blockly.utils.xml.createTextNode(
|
||||
Blockly.Msg['PROCEDURES_DEFRETURN_PROCEDURE']));
|
||||
block.appendChild(nameField);
|
||||
xmlList.push(block);
|
||||
}
|
||||
if (Blockly.Blocks['procedures_return']) {
|
||||
// <block type="procedures_return" gap="16"></block>
|
||||
let block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', 'procedures_return');
|
||||
block.setAttribute('gap', 16);
|
||||
xmlList.push(block);
|
||||
}
|
||||
if (Blockly.Blocks['procedures_ifreturn']) {
|
||||
// <block type="procedures_ifreturn" gap="16"></block>
|
||||
let block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', 'procedures_ifreturn');
|
||||
block.setAttribute('gap', 16);
|
||||
xmlList.push(block);
|
||||
}
|
||||
if (xmlList.length) {
|
||||
// Add slightly larger gap between system blocks and user calls.
|
||||
xmlList[xmlList.length - 1].setAttribute('gap', 24);
|
||||
}
|
||||
|
||||
function populateProcedures(procedureList, templateName) {
|
||||
for (var i = 0; i < procedureList.length; i++) {
|
||||
var name = procedureList[i][0];
|
||||
var args = procedureList[i][1];
|
||||
// <block type="procedures_callnoreturn" gap="16">
|
||||
// <mutation name="do something">
|
||||
// <arg name="x"></arg>
|
||||
// </mutation>
|
||||
// </block>
|
||||
var block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', templateName);
|
||||
block.setAttribute('gap', 16);
|
||||
var mutation = Blockly.utils.xml.createElement('mutation');
|
||||
mutation.setAttribute('name', name);
|
||||
block.appendChild(mutation);
|
||||
for (var j = 0; j < args.length; j++) {
|
||||
var arg = Blockly.utils.xml.createElement('arg');
|
||||
arg.setAttribute('name', args[j]);
|
||||
mutation.appendChild(arg);
|
||||
}
|
||||
xmlList.push(block);
|
||||
}
|
||||
}
|
||||
|
||||
var tuple = Procedures.allProcedures(workspace);
|
||||
populateProcedures(tuple[0], 'procedures_callnoreturn');
|
||||
populateProcedures(tuple[1], 'procedures_callreturn');
|
||||
return xmlList;
|
||||
};
|
||||
|
||||
/**
|
||||
* Find all the callers of a named procedure.
|
||||
* @param {string} name Name of procedure.
|
||||
* @param {!Blockly.Workspace} workspace The workspace to find callers in.
|
||||
* @return {!Array.<!Blockly.Block>} Array of caller blocks.
|
||||
*/
|
||||
Procedures.getCallers = function (name, workspace) {
|
||||
var callers = [];
|
||||
var blocks = workspace.getAllBlocks(false);
|
||||
// Iterate through every block and check the name.
|
||||
for (var i = 0; i < blocks.length; i++) {
|
||||
if (blocks[i].getProcedureCall) {
|
||||
var procName = blocks[i].getProcedureCall();
|
||||
// Procedure name may be null if the block is only half-built.
|
||||
if (procName && Blockly.Names.equals(procName, name)) {
|
||||
callers.push(blocks[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return callers;
|
||||
};
|
||||
|
||||
/**
|
||||
* When a procedure definition changes its parameters, find and edit all its
|
||||
* callers.
|
||||
* @param {!Blockly.Block} defBlock Procedure definition block.
|
||||
*/
|
||||
Procedures.mutateCallers = function (defBlock) {
|
||||
const oldRecordUndo = Blockly.Events.getRecordUndo();
|
||||
const procedureBlock = defBlock;
|
||||
const name = procedureBlock.getProcedureDef()[0];
|
||||
const xmlElement = defBlock.mutationToDom(true);
|
||||
const callers = Procedures.getCallers(name, defBlock.workspace);
|
||||
for (let i = 0, caller; (caller = callers[i]); i++) {
|
||||
const oldMutationDom = caller.mutationToDom();
|
||||
const oldMutation = oldMutationDom && Blockly.utils.xml.domToText(oldMutationDom);
|
||||
if (caller.domToMutation) {
|
||||
caller.domToMutation(xmlElement);
|
||||
}
|
||||
const newMutationDom = caller.mutationToDom();
|
||||
const newMutation = newMutationDom && Blockly.utils.xml.domToText(newMutationDom);
|
||||
if (oldMutation !== newMutation) {
|
||||
// Fire a mutation on every caller block. But don't record this as an
|
||||
// undo action since it is deterministically tied to the procedure's
|
||||
// definition mutation.
|
||||
Blockly.Events.setRecordUndo(false);
|
||||
Blockly.Events.fire(
|
||||
new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))(
|
||||
caller,
|
||||
'mutation',
|
||||
null,
|
||||
oldMutation,
|
||||
newMutation,
|
||||
),
|
||||
);
|
||||
Blockly.Events.setRecordUndo(oldRecordUndo);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Find the definition block for the named procedure.
|
||||
* @param {string} name Name of procedure.
|
||||
* @param {!Blockly.Workspace} workspace The workspace to search.
|
||||
* @return {Blockly.Block} The procedure definition block, or null not found.
|
||||
*/
|
||||
Procedures.getDefinition = function (name, workspace) {
|
||||
// Assume that a procedure definition is a top block.
|
||||
var blocks = workspace.getTopBlocks(false);
|
||||
for (var i = 0; i < blocks.length; i++) {
|
||||
if (blocks[i].getProcedureDef) {
|
||||
var tuple = blocks[i].getProcedureDef();
|
||||
if (tuple && Blockly.Names.equals(tuple[0], name)) {
|
||||
return blocks[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
export default Procedures;
|
||||
220
boards/default_src/arduino/others/variables.js
Normal file
220
boards/default_src/arduino/others/variables.js
Normal file
@@ -0,0 +1,220 @@
|
||||
/**
|
||||
* @license
|
||||
* Visual Blocks Editor
|
||||
*
|
||||
* Copyright 2012 Google Inc.
|
||||
* https://developers.google.com/blockly/
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @fileoverview Utility functions for handling variables.
|
||||
* @author fraser@google.com (Neil Fraser)
|
||||
*/
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const Variables = {};
|
||||
|
||||
/**
|
||||
* Category to separate variable names from procedures and generated functions.
|
||||
*/
|
||||
Variables.NAME_TYPE = 'VARIABLE';
|
||||
|
||||
/**
|
||||
* Find all user-created variables.
|
||||
* @param {!Blockly.Block|!Blockly.Workspace} root Root block or workspace.
|
||||
* @return {!Array.<string>} Array of variable names.
|
||||
*/
|
||||
Variables.allVariables = function (root) {
|
||||
var blocks;
|
||||
if (root.getDescendants) {
|
||||
// Root is Block.
|
||||
blocks = root.getDescendants();
|
||||
} else if (root.getAllBlocks) {
|
||||
// Root is Workspace.
|
||||
blocks = root.getAllBlocks();
|
||||
} else {
|
||||
throw 'Not Block or Workspace: ' + root;
|
||||
}
|
||||
var variableHash = Object.create(null);
|
||||
// Iterate through every block and add each variable to the hash.
|
||||
for (var x = 0; x < blocks.length; x++) {
|
||||
var blockVariables = blocks[x].getVars();
|
||||
for (var y = 0; y < blockVariables.length; y++) {
|
||||
var varName = blockVariables[y];
|
||||
// Variable name may be null if the block is only half-built.
|
||||
if (varName) {
|
||||
variableHash[varName.toLowerCase()] = varName;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Flatten the hash into a list.
|
||||
var variableList = [];
|
||||
for (var name in variableHash) {
|
||||
variableList.push(variableHash[name]);
|
||||
}
|
||||
return variableList;
|
||||
};
|
||||
|
||||
/**
|
||||
* Find all instances of the specified variable and rename them.
|
||||
* @param {string} oldName Variable to rename.
|
||||
* @param {string} newName New variable name.
|
||||
* @param {!Blockly.Workspace} workspace Workspace rename variables in.
|
||||
*/
|
||||
Variables.renameVariable = function (oldName, newName, workspace) {
|
||||
Blockly.Events.setGroup(true);
|
||||
var blocks = workspace.getAllBlocks();
|
||||
// Iterate through every block.
|
||||
for (var i = 0; i < blocks.length; i++) {
|
||||
blocks[i].renameVar(oldName, newName);
|
||||
}
|
||||
Blockly.Events.setGroup(false);
|
||||
};
|
||||
|
||||
/**
|
||||
* Construct the blocks required by the flyout for the variable category.
|
||||
* @param {!Blockly.Workspace} workspace The workspace contianing variables.
|
||||
* @return {!Array.<!Element>} Array of XML block elements.
|
||||
*/
|
||||
Variables.flyoutCategory = function (workspace) {
|
||||
var variableList = Variables.allVariables(workspace);
|
||||
//variableList.sort(goog.string.caseInsensitiveCompare);
|
||||
|
||||
// In addition to the user's variables, we also want to display the default
|
||||
// variable name at the top. We also don't want this duplicated if the
|
||||
// user has created a variable of the same name.
|
||||
|
||||
//在变量分类里添加默认变量取值与赋值模块时使用
|
||||
//goog.array.remove(variableList, Blockly.Msg.VARIABLES_DEFAULT_NAME);
|
||||
//variableList.unshift(Blockly.Msg.VARIABLES_DEFAULT_NAME);
|
||||
|
||||
var xmlList = [];
|
||||
|
||||
|
||||
if (Blockly.Blocks['variables_declare']) {
|
||||
//增加variables_declare模块
|
||||
let block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', 'variables_declare');
|
||||
xmlList.push(block);
|
||||
}
|
||||
|
||||
//在变量分类里添加默认变量取值与赋值模块时使用
|
||||
/*
|
||||
if (Blockly.Blocks['variables_set']) {
|
||||
//增加variables_declare模块
|
||||
var block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', 'variables_set');
|
||||
xmlList.push(block);
|
||||
}
|
||||
if (Blockly.Blocks['variables_get']) {
|
||||
//增加variables_declare模块
|
||||
var block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', 'variables_get');
|
||||
xmlList.push(block);
|
||||
}
|
||||
*/
|
||||
|
||||
//change tyep
|
||||
if (Blockly.Blocks['variables_change']) {
|
||||
//增加variables_declare模块
|
||||
let block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', 'variables_change');
|
||||
xmlList.push(block);
|
||||
}
|
||||
for (var i = 0; i < variableList.length; i++) {
|
||||
//if(i==0&&!(Blockly.Arduino.definitions_['var_declare'+'item'])){
|
||||
// continue;
|
||||
//}
|
||||
|
||||
if (Blockly.Blocks['variables_set']) {
|
||||
let block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', 'variables_set');
|
||||
if (Blockly.Blocks['variables_get']) {
|
||||
block.setAttribute('gap', 8);
|
||||
}
|
||||
let field = Blockly.utils.xml.createElement('field', null, variableList[i]);
|
||||
field.setAttribute('name', 'VAR');
|
||||
let name = Blockly.utils.xml.createTextNode(variableList[i]);
|
||||
field.appendChild(name);
|
||||
block.appendChild(field);
|
||||
xmlList.push(block);
|
||||
}
|
||||
if (Blockly.Blocks['variables_get']) {
|
||||
var block = Blockly.utils.xml.createElement('block');
|
||||
block.setAttribute('type', 'variables_get');
|
||||
if (Blockly.Blocks['variables_set']) {
|
||||
block.setAttribute('gap', 24);
|
||||
}
|
||||
let field = Blockly.utils.xml.createElement('field', null, variableList[i]);
|
||||
field.setAttribute('name', 'VAR');
|
||||
let name = Blockly.utils.xml.createTextNode(variableList[i]);
|
||||
field.appendChild(name);
|
||||
block.appendChild(field);
|
||||
xmlList.push(block);
|
||||
}
|
||||
}
|
||||
return xmlList;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return a new variable name that is not yet being used. This will try to
|
||||
* generate single letter variable names in the range 'i' to 'z' to start with.
|
||||
* If no unique name is located it will try 'i' to 'z', 'a' to 'h',
|
||||
* then 'i2' to 'z2' etc. Skip 'l'.
|
||||
* @param {!Blockly.Workspace} workspace The workspace to be unique in.
|
||||
* @return {string} New variable name.
|
||||
*/
|
||||
Variables.generateUniqueName = function (workspace) {
|
||||
var variableList = Variables.allVariables(workspace);
|
||||
var newName = '';
|
||||
if (variableList.length) {
|
||||
var nameSuffix = 1;
|
||||
var letters = 'ijkmnopqrstuvwxyzabcdefgh'; // No 'l'.
|
||||
var letterIndex = 0;
|
||||
var potName = letters.charAt(letterIndex);
|
||||
while (!newName) {
|
||||
var inUse = false;
|
||||
for (var i = 0; i < variableList.length; i++) {
|
||||
if (variableList[i].toLowerCase() == potName) {
|
||||
// This potential name is already used.
|
||||
inUse = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (inUse) {
|
||||
// Try the next potential name.
|
||||
letterIndex++;
|
||||
if (letterIndex == letters.length) {
|
||||
// Reached the end of the character sequence so back to 'i'.
|
||||
// a new suffix.
|
||||
letterIndex = 0;
|
||||
nameSuffix++;
|
||||
}
|
||||
potName = letters.charAt(letterIndex);
|
||||
if (nameSuffix > 1) {
|
||||
potName += nameSuffix;
|
||||
}
|
||||
} else {
|
||||
// We can use the current potential name.
|
||||
newName = potName;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
newName = 'i';
|
||||
}
|
||||
return newName;
|
||||
};
|
||||
|
||||
export default Variables;
|
||||
29
boards/default_src/arduino/package.json
Normal file
29
boards/default_src/arduino/package.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "@mixly/arduino",
|
||||
"version": "1.4.0",
|
||||
"description": "适用于mixly的arduino模块",
|
||||
"scripts": {
|
||||
"build:dev": "webpack --config=webpack.dev.js",
|
||||
"build:prod": "webpack --config=webpack.prod.js"
|
||||
},
|
||||
"main": "./export.js",
|
||||
"author": "Mixly Team",
|
||||
"keywords": [
|
||||
"mixly",
|
||||
"mixly-plugin",
|
||||
"arduino"
|
||||
],
|
||||
"homepage": "https://gitee.com/mixly2/mixly2.0_src/tree/develop/boards/default_src/arduino",
|
||||
"bugs": {
|
||||
"url": "https://gitee.com/mixly2/mixly2.0_src/issues"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://gitee.com/mixly2/mixly2.0_src.git",
|
||||
"directory": "default_src/arduino"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"license": "Apache 2.0"
|
||||
}
|
||||
0
boards/default_src/arduino/template.xml
Normal file
0
boards/default_src/arduino/template.xml
Normal file
21
boards/default_src/arduino/webpack.dev.js
Normal file
21
boards/default_src/arduino/webpack.dev.js
Normal file
@@ -0,0 +1,21 @@
|
||||
const path = require("path");
|
||||
const common = require("../../../webpack.common");
|
||||
const { merge } = require("webpack-merge");
|
||||
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
||||
const ESLintPlugin = require('eslint-webpack-plugin');
|
||||
|
||||
module.exports = merge(common, {
|
||||
mode: "development",
|
||||
devtool: 'source-map',
|
||||
plugins: [
|
||||
new ESLintPlugin({
|
||||
context: process.cwd(),
|
||||
}),
|
||||
new HtmlWebpackPlugin({
|
||||
inject: false,
|
||||
template: path.resolve(process.cwd(), 'template.xml'),
|
||||
filename: 'index.xml',
|
||||
minify: false
|
||||
}),
|
||||
]
|
||||
});
|
||||
27
boards/default_src/arduino/webpack.prod.js
Normal file
27
boards/default_src/arduino/webpack.prod.js
Normal file
@@ -0,0 +1,27 @@
|
||||
const path = require("path");
|
||||
const common = require("../../../webpack.common");
|
||||
const { merge } = require("webpack-merge");
|
||||
const TerserPlugin = require("terser-webpack-plugin");
|
||||
var HtmlWebpackPlugin = require("html-webpack-plugin");
|
||||
|
||||
module.exports = merge(common, {
|
||||
mode: "production",
|
||||
optimization: {
|
||||
minimize: true,
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
extractComments: false,
|
||||
}),
|
||||
new HtmlWebpackPlugin({
|
||||
inject: false,
|
||||
template: path.resolve(process.cwd(), 'template.xml'),
|
||||
filename: 'index.xml',
|
||||
minify: {
|
||||
removeAttributeQuotes: true,
|
||||
collapseWhitespace: true,
|
||||
removeComments: true,
|
||||
}
|
||||
})
|
||||
]
|
||||
}
|
||||
});
|
||||
3
boards/default_src/arduino_avr/.npmignore
Normal file
3
boards/default_src/arduino_avr/.npmignore
Normal file
@@ -0,0 +1,3 @@
|
||||
node_modules
|
||||
build
|
||||
origin
|
||||
1247
boards/default_src/arduino_avr/blocks/actuator.js
Normal file
1247
boards/default_src/arduino_avr/blocks/actuator.js
Normal file
File diff suppressed because it is too large
Load Diff
1374
boards/default_src/arduino_avr/blocks/blynk.js
Normal file
1374
boards/default_src/arduino_avr/blocks/blynk.js
Normal file
File diff suppressed because it is too large
Load Diff
740
boards/default_src/arduino_avr/blocks/communicate.js
Normal file
740
boards/default_src/arduino_avr/blocks/communicate.js
Normal file
@@ -0,0 +1,740 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
import { Profile } from 'mixly';
|
||||
|
||||
const COMMUNICATE_HUE = 140;
|
||||
|
||||
//红外接收模块
|
||||
export const ir_recv = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(new Blockly.FieldTextInput('ir_item'), 'VAR')
|
||||
.appendField(Blockly.Msg.MIXLY_IR_RECEIVE)
|
||||
.setCheck(Number);
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.MIXLY_IR_RECEIVE_YES);
|
||||
this.appendStatementInput('DO2')
|
||||
.appendField(Blockly.Msg.MIXLY_IR_RECEIVE_NO);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_IR_RECIEVE_TOOLTIP);
|
||||
},
|
||||
getVars: function () {
|
||||
return [this.getFieldValue('VAR')];
|
||||
},
|
||||
renameVar: function (oldName, newName) {
|
||||
if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {
|
||||
this.setTitleValue(newName, 'VAR');
|
||||
}
|
||||
}
|
||||
};
|
||||
//红外发射模块(NEC)
|
||||
export const ir_send_nec = {
|
||||
init: function () {
|
||||
var TYPE = [['RC5', 'RC5'], ['RC6', 'RC6'], ['NEC', 'NEC'], ['Sony', 'Sony'], ['Panasonic', 'Panasonic'], ['JVC', 'JVC'], ['SAMSUNG', 'SAMSUNG'], ['Whynter', 'Whynter'], ['AiwaRCT501', 'AiwaRCT501'], ['LG', 'LG'], ['Sanyo', 'Sanyo'], ['Mitsubishi', 'Mitsubishi'], ['DISH', 'DISH'], ['SharpRaw', 'SharpRaw'], ['Denon', 'Denon']];
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_IR_SEND_NEC1)
|
||||
.appendField(new Blockly.FieldDropdown(TYPE), 'TYPE')
|
||||
.appendField(Blockly.Msg.MIXLY_IR_SEND_NEC2)
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.digital), "PIN");
|
||||
this.appendValueInput('data')
|
||||
.setCheck(Number)
|
||||
.appendField(' ' + Blockly.Msg.MIXLY_DATA);
|
||||
this.appendValueInput('bits')
|
||||
.setCheck(Number)
|
||||
.appendField(' ' + Blockly.Msg.MIXLY_BITS);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_IR_SEND_NEC_TOOLTIP);
|
||||
}
|
||||
}
|
||||
|
||||
//红外接收使能
|
||||
export const ir_recv_enable = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_IR_RECEIVE_ENABLE);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_IR_ENABLE);
|
||||
}
|
||||
};
|
||||
|
||||
//红外接收模块(raw)
|
||||
export const ir_recv_raw = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_IR_RECEIVE_RAW)
|
||||
.setCheck(Number);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_IR_RECIEVE_RAW_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
//红外发射模块(raw)
|
||||
export const ir_send_raw = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_IR_SEND_RAW)
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.digital), "PIN");
|
||||
this.appendDummyInput("")
|
||||
.appendField(' ' + Blockly.Msg.MIXLY_I2C_SLAVE_WRITE_ARRAY_ARRAYNAME)
|
||||
.appendField(new Blockly.FieldTextInput('0,0,0'), 'TEXT');
|
||||
this.appendValueInput('length')
|
||||
.setCheck(Number)
|
||||
.appendField(' ' + Blockly.Msg.MIXLY_LIST_LENGTH);
|
||||
this.appendValueInput('freq')
|
||||
.setCheck(Number)
|
||||
.appendField(' ' + Blockly.Msg.MIXLY_FREQUENCY);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_IR_SEND_RAW_TOOLTIP);
|
||||
}
|
||||
};
|
||||
// IIC通信
|
||||
|
||||
// IIC初始化主机
|
||||
export const i2c_master_Init = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP + 'I2C' + Blockly.Msg.MIXLY_MASTER);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
// IIC初始化从机
|
||||
export const i2c_slave_Init = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP + 'I2C' + Blockly.Msg.MIXLY_SALVE + Blockly.Msg.MIXLY_LCD_ADDRESS);
|
||||
this.appendValueInput("i2c_address")
|
||||
.setCheck(null);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_I2C_MASTER_INITHelp);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//IIC主机发送数据
|
||||
export const i2c_begin_end_transmission = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField("I2C" + Blockly.Msg.MIXLY_MASTER + Blockly.Msg.MIXLY_SEND_DATA);
|
||||
this.appendValueInput("i2c_address")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_LCD_ADDRESS);
|
||||
this.appendStatementInput("transmission_data")
|
||||
.setCheck(null);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//IIC写入主从机数据
|
||||
export const i2c_write = {
|
||||
init: function () {
|
||||
this.appendValueInput("i2c_write_data")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("I2C" + Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_SEND);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
}
|
||||
};
|
||||
|
||||
// IIC写入数线数据
|
||||
export const i2c_slave_write_array = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput('array')
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_SLAVE_WRITE_ARRAY)
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_SLAVE_WRITE_ARRAY_ARRAYNAME);
|
||||
this.appendValueInput('length')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_LIST_LEN);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_I2C_SLAVE_WRITE_ARRAY);
|
||||
}
|
||||
};
|
||||
// IIC从机读取字节数
|
||||
export const i2c_howmany = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_HOWMANY);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_I2C_HOWMANY);
|
||||
}
|
||||
};
|
||||
|
||||
// IIC主机或从机读取成功吗?
|
||||
export const i2c_available = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_AVAILABLE);
|
||||
this.setOutput(true, Boolean);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_I2C_AVAILABLE);
|
||||
}
|
||||
};
|
||||
|
||||
// IIC主机或从机读取的数据
|
||||
export const i2c_read = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_MASTER_READ2);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_I2C_MASTER_READ2);
|
||||
}
|
||||
};
|
||||
|
||||
//写入寄存器地址
|
||||
export const i2c_master_writerReg = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput('device')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_MASTER_WRITE);
|
||||
this.appendValueInput('regadd')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_REGADD);
|
||||
this.appendValueInput('value')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
//读取寄存器地址
|
||||
export const i2c_master_readerReg = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput('device')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_MASTER_READ);
|
||||
this.appendValueInput('regadd')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_REGADD);
|
||||
this.appendValueInput('bytes')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_BYTES);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const i2c_slave_onrequest = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_SLAVE_ONREQUEST);
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.MIXLY_DO);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_I2C_SLAVE_ONREQUEST);
|
||||
}
|
||||
};
|
||||
|
||||
export const i2c_master_writer = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput('device')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_MASTER_WRITE);
|
||||
this.appendValueInput('value')
|
||||
.setCheck([String, Number])
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.HTML_VALUE);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_I2C_MASTER_WRITE);
|
||||
}
|
||||
};
|
||||
export const i2c_master_reader = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput('device')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_MASTER_READ);
|
||||
this.appendValueInput('bytes')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_BYTES);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_I2C_MASTER_READ);
|
||||
}
|
||||
};
|
||||
export const i2c_master_reader2 = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_MASTER_READ2);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_I2C_MASTER_READ2);
|
||||
}
|
||||
};
|
||||
|
||||
export const i2c_slave_onreceive = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_SLAVE_ONRECEIVE);
|
||||
this.appendValueInput("onReceive_length")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_BYTES);
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.MIXLY_DO);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_I2C_SLAVE_ONRECEIVE);
|
||||
}
|
||||
};
|
||||
|
||||
export const i2c_slave_write = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput('value')
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_SLAVE_WRITE)
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.HTML_VALUE);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_I2C_SLAVE_WRITE);
|
||||
}
|
||||
};
|
||||
|
||||
//SPI
|
||||
export const spi_transfer = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput('pin')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.TO_SPI_SLAVE_PIN);
|
||||
this.appendValueInput('value')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.SPI_TRANSFER);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SPI_TRANSFER.replace('%1', Blockly.Arduino.valueToCode(this, 'pin', Blockly.Arduino.ORDER_ATOMIC)));
|
||||
}
|
||||
}
|
||||
|
||||
//RFID
|
||||
export const RFID_init = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_RFID_INITIAL);
|
||||
this.appendDummyInput("")
|
||||
.appendField("SDA")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.digital), "SDA");
|
||||
this.appendDummyInput("")
|
||||
.appendField("SCK")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.SCK), "SCK");
|
||||
this.appendDummyInput("")
|
||||
.appendField("MOSI")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.MOSI), "MOSI");
|
||||
this.appendDummyInput("")
|
||||
.appendField("MISO")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.MISO), "MISO");
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_RFID_INIT);
|
||||
// this.setFieldValue("10", "SDA");
|
||||
}
|
||||
};
|
||||
|
||||
export const RFID_on = {
|
||||
init: function () {
|
||||
this.appendDummyInput("")
|
||||
.appendField("RFID")
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_RFID_ON_DETECTED);
|
||||
this.appendStatementInput("do_");
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_RFID_ON);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//读卡号
|
||||
export const RFID_readcardnum = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_RFID_READ_CARDNUM)
|
||||
this.setOutput(true, String);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_RFID_READ);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
//串口打印卡号
|
||||
/* export const RFID_serialprintcardnum = {
|
||||
init: function() {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField('打印RFID卡号');
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
}
|
||||
}; */
|
||||
|
||||
|
||||
export const RFID_in = {
|
||||
init: function () {
|
||||
this.appendValueInput("uid_")
|
||||
.appendField(Blockly.Msg.CONTROLS_IF_MSG_IF)
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_RFID_READ_CARDNUM_IS);
|
||||
this.appendStatementInput("do_")
|
||||
.appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip('');
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_RFID_IN);
|
||||
}
|
||||
};
|
||||
|
||||
//写数据块
|
||||
export const RFID_writecarddata = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput("address1")
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_RFID_WRITE)
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_DATA_BLOCK)
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_WRITE_NUM)
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'data1')
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_RFID_WRITEBLOCK);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//读数据块的内容
|
||||
export const RFID_readcarddata = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput("address")
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_RFID_READ)
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_DATA_BLOCK)
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_DATA_FROM)
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_RFID_READBLOCK);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
/* //串口打印数据内容
|
||||
export const RFID_serialprintcarddata = {
|
||||
init: function() {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendValueInput("address")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField("打印RFID数据块");
|
||||
this.appendDummyInput("")
|
||||
.appendField("内容")
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
}
|
||||
}; */
|
||||
|
||||
//关闭RFID
|
||||
export const RFID_off = {
|
||||
init: function () {
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_RFID_OFF);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_RFID_OFF);
|
||||
}
|
||||
};
|
||||
|
||||
//初始化RFID
|
||||
export const MFRC522_init = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP + " RFID")
|
||||
.appendField(new Blockly.FieldTextInput("rfid"), "rfid_name");
|
||||
this.appendValueInput("PIN_SDA")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(" SDA");
|
||||
this.appendValueInput("PIN_SCK")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("SCK");
|
||||
this.appendValueInput("PIN_MOSI")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("MOSI");
|
||||
this.appendValueInput("PIN_MISO")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("MISO");
|
||||
this.appendValueInput("PIN_RST")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("RST");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//RFID侦测到信号
|
||||
export const MFRC522_IsNewCard = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField("RFID")
|
||||
.appendField(new Blockly.FieldTextInput("rfid"), "rfid_name")
|
||||
.appendField(" " + Blockly.Msg.MIXLY_COMMUNICATION_RFID_ON_DETECTED);
|
||||
this.appendStatementInput("DO")
|
||||
.setCheck(null);
|
||||
this.setInputsInline(false);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//RFID读取卡号
|
||||
export const MFRC522_ReadCardUID = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField("RFID")
|
||||
.appendField(new Blockly.FieldTextInput("rfid"), "rfid_name")
|
||||
.appendField(" " + Blockly.Msg.MIXLY_RFID_READ_CARD_UID);
|
||||
this.setInputsInline(false);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//RFID写卡
|
||||
export const MFRC522_WriteCard = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField("RFID")
|
||||
.appendField(new Blockly.FieldTextInput("rfid"), "rfid_name")
|
||||
.appendField(" " + Blockly.Msg.MIXLY_RFID_WRITE_CARD);
|
||||
this.appendValueInput("block")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_DATA_BLOCK);
|
||||
this.appendValueInput("buffer")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_RFID_BYTE_ARRAY);
|
||||
this.appendValueInput("length")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_SLAVE_WRITE_ARRAY_ARRAYLENGTH);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//RFID读卡
|
||||
export const MFRC522_ReadCard = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField("RFID")
|
||||
.appendField(new Blockly.FieldTextInput("rfid"), "rfid_name")
|
||||
.appendField(" " + Blockly.Msg.MIXLY_RFID_READ_CARD);
|
||||
this.appendValueInput("block")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_COMMUNICATION_DATA_BLOCK);
|
||||
this.appendValueInput("buffer")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.SAVETO + " " + Blockly.Msg.MIXLY_RFID_BYTE_ARRAY);
|
||||
this.appendValueInput("length")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_I2C_SLAVE_WRITE_ARRAY_ARRAYLENGTH);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//SPI 初始化从机
|
||||
export const spi_begin_slave = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP + "SPI" + Blockly.Msg.MIXLY_DEVICE + Blockly.Msg.MIXLY_AS + Blockly.Msg.MIXLY_SALVE);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const spi_begin_master = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP + "SPI" + Blockly.Msg.MIXLY_DEVICE + Blockly.Msg.MIXLY_AS + Blockly.Msg.MIXLY_MASTER);
|
||||
this.appendValueInput("spi_slave_pin")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_SALVE + Blockly.Msg.MIXLY_PIN);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const spi_transfer_Init = {
|
||||
init: function () {
|
||||
this.appendValueInput("slave_pin")
|
||||
.setCheck(null)
|
||||
.appendField("SPI" + Blockly.Msg.MIXLY_SEND_DATA + Blockly.Msg.MIXLY_SALVE + Blockly.Msg.MIXLY_PIN);
|
||||
this.appendStatementInput("transfer_data")
|
||||
.setCheck(null);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const spi_transfer_1 = {
|
||||
init: function () {
|
||||
this.appendValueInput("transfer_data")
|
||||
.setCheck(null)
|
||||
|
||||
.appendField("SPI" + Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_SEND);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const spi_transfer_2 = {
|
||||
init: function () {
|
||||
this.appendValueInput("transfer_data")
|
||||
.setCheck(null)
|
||||
.appendField("SPI" + Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_SEND);
|
||||
this.appendDummyInput()
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_RETURN_DATA);
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const spi_slave_interrupt = {
|
||||
init: function () {
|
||||
this.appendValueInput("slave_interrupt_input")
|
||||
.setCheck(null)
|
||||
.appendField("SPI " + Blockly.Msg.MIXLY_STM32_I2C_SLAVE_RECEIVE_EVENT + " " + Blockly.Msg.MIXLY_STM32_SPI_GET_REGISTER_DATA);
|
||||
this.appendStatementInput("slave_interrupt_data")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_MSTIMER2_DO);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const spi_slave_receive = {
|
||||
init: function () {
|
||||
this.appendValueInput("slave_receive_data")
|
||||
.setCheck(null)
|
||||
.appendField("SPI " + Blockly.Msg.MIXLY_SALVE + " " + Blockly.Msg.MIXLY_STM32_SPI_GET_REGISTER_DATA);
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(COMMUNICATE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
1034
boards/default_src/arduino_avr/blocks/control.js
Normal file
1034
boards/default_src/arduino_avr/blocks/control.js
Normal file
File diff suppressed because it is too large
Load Diff
2719
boards/default_src/arduino_avr/blocks/display.js
Normal file
2719
boards/default_src/arduino_avr/blocks/display.js
Normal file
File diff suppressed because one or more lines are too long
861
boards/default_src/arduino_avr/blocks/ethernet.js
Normal file
861
boards/default_src/arduino_avr/blocks/ethernet.js
Normal file
@@ -0,0 +1,861 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const ETHERNET_HUE = 0;
|
||||
|
||||
export const ethernet_init_begin = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_BEGIN)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_ETHERNET, 'Ethernet'], [Blockly.Msg.MIXLY_ETHERNET2, 'Ethernet2']]), "Ethernet");
|
||||
this.appendValueInput('MAC')
|
||||
.setCheck(Array)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_MAC_ADDRESS);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_INIT);
|
||||
}
|
||||
};
|
||||
|
||||
export const ethernet_mac_address = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldTextInput('DE'), 'VAR1')
|
||||
.appendField('-')
|
||||
.appendField(new Blockly.FieldTextInput('AD'), 'VAR2')
|
||||
.appendField('-')
|
||||
.appendField(new Blockly.FieldTextInput('BE'), 'VAR3')
|
||||
.appendField('-')
|
||||
.appendField(new Blockly.FieldTextInput('EF'), 'VAR4')
|
||||
.appendField('-')
|
||||
.appendField(new Blockly.FieldTextInput('FE'), 'VAR5')
|
||||
.appendField('-')
|
||||
.appendField(new Blockly.FieldTextInput('ED'), 'VAR6');
|
||||
this.setOutput(true, Array);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_MACADDRESS);
|
||||
}
|
||||
}
|
||||
|
||||
export const ethernet_init_local_ip = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_LOCALIP);
|
||||
this.setOutput(true, 'IPAddress');
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_LOCALIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const ethernet_client_connect_server = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_CONNECT_SERVER)
|
||||
.appendField(this.newQuote_(true))
|
||||
.appendField(new Blockly.FieldTextInput('mixly.org'), 'SERVER')
|
||||
.appendField(this.newQuote_(false));
|
||||
this.appendValueInput('PORT')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_PORT);
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_CONNECT);
|
||||
},
|
||||
newQuote_: function (open) {
|
||||
if (open == this.RTL) {
|
||||
var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==';
|
||||
} else {
|
||||
var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC';
|
||||
}
|
||||
return new Blockly.FieldImage(file, 12, 12, '"');
|
||||
}
|
||||
}
|
||||
|
||||
export const ethernet_client_stop = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_STOP);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_STOP);
|
||||
}
|
||||
};
|
||||
|
||||
export const ethernet_client_connected = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_CONNECTED);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_CONNECTED);
|
||||
}
|
||||
};
|
||||
|
||||
export const ethernet_client_available = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_AVAILABLE);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_CLIENT_AVAILABLE);
|
||||
}
|
||||
};
|
||||
|
||||
export const ethernet_client_print = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendValueInput('TEXT')
|
||||
.setCheck(String)
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_PRINT);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_CLIENT_PRINT);
|
||||
}
|
||||
};
|
||||
|
||||
export const ethernet_client_println = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendValueInput('TEXT')
|
||||
.setCheck(String)
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_PRINTLN);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_CLIENT_PRINTLN);
|
||||
}
|
||||
};
|
||||
|
||||
export const ethernet_client_read = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_READ);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_CLIENT_READ);
|
||||
}
|
||||
};
|
||||
|
||||
export const ethernet_client_get_request = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_GET_REQUEST);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_URL)
|
||||
.appendField(this.newQuote_(true))
|
||||
.appendField(new Blockly.FieldTextInput(''), 'URL')
|
||||
.appendField(this.newQuote_(false));
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_SERVER)
|
||||
.appendField(this.newQuote_(true))
|
||||
.appendField(new Blockly.FieldTextInput(''), 'SERVER')
|
||||
.appendField(this.newQuote_(false));
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_ETHERNET_GET_REQUEST);
|
||||
},
|
||||
newQuote_: function (open) {
|
||||
if (open == this.RTL) {
|
||||
var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==';
|
||||
} else {
|
||||
var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC';
|
||||
}
|
||||
return new Blockly.FieldImage(file, 12, 12, '"');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export const NTP_server = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.NTP_SERVER);
|
||||
this.appendValueInput("server_add")
|
||||
.appendField(Blockly.Msg.blynk_SERVER_ADD)
|
||||
.setCheck(String);
|
||||
this.appendValueInput("timeZone")
|
||||
.appendField(Blockly.Msg.MIXLY_TimeZone)
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("Interval")
|
||||
.appendField(Blockly.Msg.blynk_WidgetRTC_setSyncInterval)
|
||||
.setCheck(Number);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
//传感器-实时时钟块_时间变量
|
||||
var NTP_TIME_TYPE = [
|
||||
[Blockly.Msg.MIXLY_YEAR, "NTP.getDateYear()"],
|
||||
[Blockly.Msg.MIXLY_MONTH, "NTP.getDateMonth()"],
|
||||
[Blockly.Msg.MIXLY_DAY, "NTP.getDateDay()"],
|
||||
[Blockly.Msg.MIXLY_HOUR, "NTP.getTimeHour24()"],
|
||||
[Blockly.Msg.MIXLY_MINUTE, "NTP.getTimeMinute()"],
|
||||
[Blockly.Msg.MIXLY_SECOND, "NTP.getTimeSecond()"],
|
||||
[Blockly.Msg.MIXLY_WEEK, "NTP.getDateWeekday()"]
|
||||
];
|
||||
//传感器-实时时钟块_获取时间
|
||||
export const NTP_server_get_time = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.NTP_server_get_time);
|
||||
this.appendDummyInput("")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(new Blockly.FieldDropdown(NTP_TIME_TYPE), "TIME_TYPE");
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
|
||||
export const MQTT_server = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/blynk/iot.png'), 20, 20))
|
||||
.appendField(Blockly.Msg.MQTT_SERVER);
|
||||
this.appendValueInput("server_add")
|
||||
.appendField(Blockly.Msg.MQTT_SERVER_ADD)
|
||||
.setCheck(String);
|
||||
this.appendValueInput("server_port")
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_PORT)
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("IOT_ID")
|
||||
.appendField(Blockly.Msg.MIXLY_EMQX_USERNAME)
|
||||
.setCheck(String);
|
||||
this.appendValueInput("IOT_PWD", String)
|
||||
.appendField(Blockly.Msg.HTML_PASSWORD)
|
||||
.setCheck([String, Number]);
|
||||
this.appendValueInput("Client_ID")
|
||||
.appendField(Blockly.Msg.MQTT_Client_ID)
|
||||
.setCheck(String);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
//WIFI信息
|
||||
export const WIFI_info = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/blynk/iot.png'), 20, 20))
|
||||
.appendField(Blockly.Msg.MIXLY_NETWORK_INIT);
|
||||
this.appendValueInput("SSID")
|
||||
.appendField(Blockly.Msg.HTML_NAME);
|
||||
this.appendValueInput("PWD")
|
||||
.appendField(Blockly.Msg.HTML_PASSWORD);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(" ");
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const network_connect = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_ESP32_NETWORK_CONNECT);
|
||||
this.appendValueInput('id')
|
||||
.setCheck(String)
|
||||
.appendField(Blockly.Msg.HTML_NAME);
|
||||
this.appendValueInput('password')
|
||||
.setCheck(String)
|
||||
.appendField(Blockly.Msg.HTML_PASSWORD);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_CONNECT_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const network_wifi_connect = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_NETWORK_WIFI_CONNECT);
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_WIFI_CONNECT_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const network_get_connect = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_GET + Blockly.Msg.MIXLY_DEVICE)
|
||||
.appendField(new Blockly.FieldDropdown([["MAC", "MAC"], ["IP", "IP"]]), "mode")
|
||||
.appendField(Blockly.Msg.MQTT_SERVER_ADD);
|
||||
this.setOutput(true);
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const MQTT_connect = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MQTT_connect);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip();
|
||||
}
|
||||
};
|
||||
var Topic_validator = function (newValue) {
|
||||
return newValue.replace(/\//g, '');
|
||||
};
|
||||
|
||||
//MQTT-发送消息到topic
|
||||
export const MQTT_publish = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/blynk/iot.png'), 20, 20))
|
||||
.appendField(Blockly.Msg.MQTT_publish);
|
||||
this.appendValueInput("data");
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.LANG_MATH_RANDOM_INT_INPUT_TO);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MQTT_Topic)
|
||||
.appendField(new Blockly.FieldTextInput('Topic', Topic_validator), "Topic");
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(" ");
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const MQTT_subscribe_value = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MQTT_Topic)
|
||||
.appendField(new Blockly.FieldTextInput('Topic_0', Topic_validator), "Topic_0");
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.HTML_VALUE)
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, String);
|
||||
}
|
||||
};
|
||||
export const MQTT_add_subscribe_topic = {
|
||||
/**
|
||||
* Mutator bolck for else-if condition.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MQTT_Topic);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP);
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
export const MQTT_subscribe = {
|
||||
/**
|
||||
* Block for if/elseif/else condition.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT)
|
||||
.appendField(Blockly.Msg.MQTT_Topic + Blockly.Msg.MQTT_subscribe2)
|
||||
.appendField(new Blockly.FieldTextInput('Topic_0', Topic_validator), "Topic_0");
|
||||
this.appendStatementInput('DO0')
|
||||
.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);
|
||||
this.setPreviousStatement(false);
|
||||
this.setNextStatement(false);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['MQTT_add_subscribe_topic'], this));
|
||||
// Assign 'this' to a variable for use in the tooltip closure below.
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
if (!thisBlock.elseifCount_) {
|
||||
return Blockly.Msg.CONTROLS_IF_TOOLTIP_1;
|
||||
} else if (thisBlock.elseifCount_) {
|
||||
return Blockly.Msg.CONTROLS_IF_TOOLTIP_3;
|
||||
}
|
||||
});
|
||||
this.elseifCount_ = 0;
|
||||
},
|
||||
/**
|
||||
* Create XML to represent the number of else-if and else inputs.
|
||||
* @return {Element} XML storage element.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
mutationToDom: function () {
|
||||
if (!this.elseifCount_ && !this.elseCount_) {
|
||||
return null;
|
||||
}
|
||||
var container = document.createElement('mutation');
|
||||
if (this.elseifCount_) {
|
||||
container.setAttribute('elseif', this.elseifCount_);
|
||||
}
|
||||
return container;
|
||||
},
|
||||
/**
|
||||
* Parse XML to restore the else-if and else inputs.
|
||||
* @param {!Element} xmlElement XML storage element.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
domToMutation: function (xmlElement) {
|
||||
var containerBlock = this;
|
||||
var statementConnections = [];
|
||||
for (var i = this.elseifCount_; i > 0; i--) {
|
||||
this.removeInput('DummyInput' + i);
|
||||
if (containerBlock.getInputTargetBlock('DO' + i) && containerBlock.getInputTargetBlock('DO' + i).previousConnection)
|
||||
statementConnections[i] = (containerBlock.getInputTargetBlock('DO' + i).previousConnection);
|
||||
else
|
||||
statementConnections[i] = null;
|
||||
this.removeInput('DO' + i);
|
||||
}
|
||||
this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10);
|
||||
//this.compose(containerBlock);
|
||||
for (var i = 1; i <= this.elseifCount_; i++) {
|
||||
this.appendDummyInput('DummyInput' + i)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT)
|
||||
.appendField(Blockly.Msg.MQTT_Topic + Blockly.Msg.MQTT_subscribe2)
|
||||
.appendField(new Blockly.FieldTextInput('Topic_' + i, Topic_validator), "Topic_" + i);
|
||||
this.appendStatementInput('DO' + i)
|
||||
.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);
|
||||
}
|
||||
for (var i = statementConnections.length - 2; i > 0; i--) {
|
||||
if (statementConnections[i])
|
||||
statementConnections[i] && statementConnections[i].reconnect(this, 'DO' + i);
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Populate the mutator's dialog with this block's components.
|
||||
* @param {!Blockly.Workspace} workspace Mutator's workspace.
|
||||
* @return {!Blockly.Block} Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
decompose: function (workspace) {
|
||||
var containerBlock = workspace.newBlock('mqtt_topics_set');
|
||||
containerBlock.initSvg();
|
||||
var connection = containerBlock.getInput('STACK').connection;
|
||||
for (var i = 1; i <= this.elseifCount_; i++) {
|
||||
var elseifBlock = workspace.newBlock('MQTT_add_subscribe_topic');
|
||||
elseifBlock.initSvg();
|
||||
connection.connect(elseifBlock.previousConnection);
|
||||
connection = elseifBlock.nextConnection;
|
||||
}
|
||||
return containerBlock;
|
||||
},
|
||||
/**
|
||||
* Reconfigure this block based on the mutator dialog's components.
|
||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
compose: function (containerBlock) {
|
||||
// Disconnect all the elseif input blocks and remove the inputs.
|
||||
for (var i = this.elseifCount_; i > 0; i--) {
|
||||
this.removeInput('DummyInput' + i);
|
||||
this.removeInput('DO' + i);
|
||||
}
|
||||
this.elseifCount_ = 0;
|
||||
// Rebuild the block's optional inputs.
|
||||
var clauseBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
var statementConnections = [null];
|
||||
while (clauseBlock) {
|
||||
switch (clauseBlock.type) {
|
||||
case 'MQTT_add_subscribe_topic':
|
||||
this.elseifCount_++;
|
||||
statementConnections.push(clauseBlock.statementConnection_);
|
||||
break;
|
||||
default:
|
||||
throw Error('Unknown block type: ' + clauseBlock.type);
|
||||
}
|
||||
clauseBlock = clauseBlock.nextConnection &&
|
||||
clauseBlock.nextConnection.targetBlock();
|
||||
}
|
||||
|
||||
this.updateShape_();
|
||||
// Reconnect any child blocks.
|
||||
this.reconnectChildBlocks_(statementConnections);
|
||||
|
||||
},
|
||||
/**
|
||||
* Store pointers to any connected child blocks.
|
||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
saveConnections: function (containerBlock) {
|
||||
var clauseBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
var i = 1;
|
||||
while (clauseBlock) {
|
||||
switch (clauseBlock.type) {
|
||||
case 'MQTT_add_subscribe_topic':
|
||||
var inputDo = this.getInput('DO' + i);
|
||||
clauseBlock.statementConnection_ =
|
||||
inputDo && inputDo.connection.targetConnection;
|
||||
i++;
|
||||
break;
|
||||
default:
|
||||
throw 'Unknown block type.';
|
||||
}
|
||||
clauseBlock = clauseBlock.nextConnection &&
|
||||
clauseBlock.nextConnection.targetBlock();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Reconstructs the block with all child blocks attached.
|
||||
*/
|
||||
rebuildShape_: function () {
|
||||
var statementConnections = [null];
|
||||
|
||||
var i = 1;
|
||||
while (this.getInput('DummyInput' + i)) {
|
||||
var inputDo = this.getInput('DO' + i);
|
||||
statementConnections.push(inputDo.connection.targetConnection);
|
||||
i++;
|
||||
}
|
||||
this.updateShape_();
|
||||
this.reconnectChildBlocks_(statementConnections);
|
||||
},
|
||||
/**
|
||||
* Modify this block to have the correct number of inputs.
|
||||
* @this Blockly.Block
|
||||
* @private
|
||||
*/
|
||||
updateShape_: function () {
|
||||
var i = 1;
|
||||
while (this.getInput('DummyInput' + i)) {
|
||||
this.removeInput('DummyInput' + i);
|
||||
this.removeInput('DO' + i);
|
||||
i++;
|
||||
}
|
||||
// Rebuild block.
|
||||
for (var i = 1; i <= this.elseifCount_; i++) {
|
||||
this.appendDummyInput("DummyInput" + i)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT)
|
||||
.appendField(Blockly.Msg.MQTT_Topic + Blockly.Msg.MQTT_subscribe2)
|
||||
.appendField(new Blockly.FieldTextInput('Topic_' + i, Topic_validator), "Topic_" + i);
|
||||
this.appendStatementInput('DO' + i)
|
||||
.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Reconnects child blocks.
|
||||
* @param {!Array<?Blockly.RenderedConnection>} valueConnections List of value
|
||||
* connectsions for if input.
|
||||
* @param {!Array<?Blockly.RenderedConnection>} statementConnections List of
|
||||
* statement connections for do input.
|
||||
* @param {?Blockly.RenderedConnection} elseStatementConnection Statement
|
||||
* connection for else input.
|
||||
*/
|
||||
reconnectChildBlocks_: function (statementConnections) {
|
||||
for (var i = 1; i <= this.elseifCount_; i++) {
|
||||
//valueConnections[i] && valueConnections[i].reconnect(this, 'IF' + i);
|
||||
statementConnections[i] && statementConnections[i].reconnect(this, 'DO' + i);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const mqtt_topics_set = {
|
||||
/**
|
||||
* Mutator block for if container.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_EMQX_SUBSCRIBE + Blockly.Msg.MQTT_Topic);
|
||||
this.appendStatementInput('STACK');
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
//GET请求
|
||||
export const http_get = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_GET_REQUEST);
|
||||
this.appendValueInput("api")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.blynk_SERVER_ADD);
|
||||
this.appendStatementInput("success")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_SUCCESS);
|
||||
this.appendStatementInput("failure")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_FAILED);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.setTooltip("");
|
||||
}
|
||||
};
|
||||
|
||||
//自动配网
|
||||
export const WIFI_smartConfig = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.blynk_smartconfig)
|
||||
.appendField(new Blockly.FieldDropdown([["SmartConfig", 'SmartConfig'], ["AP", 'AP']]), "MODE");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);//可上下连接
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MQTT_TEST_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const WIFI_ap_or_sta = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/blynk/wifi_udp.png'), 25, 25, "*"))
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP + " UDP WIFI");
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE + ":")
|
||||
.appendField(new Blockly.FieldDropdown([["STA", "STA"], ["AP", "AP"]]), "mode");
|
||||
this.appendValueInput("SSID")
|
||||
.setCheck(null)
|
||||
.appendField("WIFI " + Blockly.Msg.HTML_NAME);
|
||||
this.appendValueInput("PSK")
|
||||
.setCheck(null)
|
||||
.appendField("WIFI " + Blockly.Msg.HTML_PASSWORD);
|
||||
this.appendValueInput("IP1")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_WIFI_LINK_DEVICE + " IP1");
|
||||
this.appendValueInput("IP2")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_WIFI_LINK_DEVICE + " IP2");
|
||||
this.appendValueInput("IP")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_ESP32_BLUETOOTH_FLAG + " IP");
|
||||
this.appendValueInput("duankou")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_PORT);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const WIFI_ap_and_sta = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/blynk/wifi_udp.png'), 25, 25, "*"))
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP + " UDP WIFI");
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE + ": AP+STA");
|
||||
this.appendValueInput("SSID1")
|
||||
.setCheck(null)
|
||||
.appendField("WIFI " + Blockly.Msg.HTML_NAME + "(STA)");
|
||||
this.appendValueInput("SSID2")
|
||||
.setCheck(null)
|
||||
.appendField("WIFI " + Blockly.Msg.HTML_NAME + "(AP)");
|
||||
this.appendValueInput("PSK1")
|
||||
.setCheck(null)
|
||||
.appendField("WIFI " + Blockly.Msg.HTML_PASSWORD + "(STA)");
|
||||
this.appendValueInput("PSK2")
|
||||
.setCheck(null)
|
||||
.appendField("WIFI " + Blockly.Msg.HTML_PASSWORD + "(AP)");
|
||||
this.appendValueInput("IP1")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_WIFI_LINK_DEVICE + " IP1");
|
||||
this.appendValueInput("IP2")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_WIFI_LINK_DEVICE + " IP2");
|
||||
this.appendValueInput("IP")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_ESP32_BLUETOOTH_FLAG + " IP");
|
||||
this.appendValueInput("duankou")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_ETHERNET_CLINET_PORT);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const WIFI_incomingPacket = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/blynk/wifi_udp.png'), 25, 25, "*"))
|
||||
.appendField(Blockly.Msg.CONTROLS_IF_MSG_IF + " WIFI UDP " + Blockly.Msg.MIXLY_STM32_SPI_DATA_RECEIVED + "?")
|
||||
this.appendValueInput("input_data")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS);
|
||||
this.appendDummyInput()
|
||||
.appendField("(" + Blockly.Msg.LANG_MATH_STRING + ")");
|
||||
this.appendStatementInput("do")
|
||||
.setCheck(null);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const WIFI_send_data = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/blynk/wifi_udp.png'), 25, 25, "*"))
|
||||
.appendField("WIFI UDP " + Blockly.Msg.MIXLY_SEND_DATA);
|
||||
this.appendValueInput("data")
|
||||
.setCheck(null);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//天气GET
|
||||
export const WeatherGet = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.WeatherGet)
|
||||
.appendField(new Blockly.FieldTextInput('北京'), 'data')
|
||||
.appendField("1", "check");
|
||||
this.setOutput(true, Boolean);
|
||||
this.setTooltip("输入正确的城市名(不用带“市”字)如:深圳 北京 广州,如果错误会显示'error'刷新成功则返回true\n天气接口优化注意:\n1. 接口每 8 小时更新一次,机制是 CDN 缓存 8 小时更新一次。注意:自己做缓存。\n2. 接口采用城市 ID 来精准查询请求,省份不能直接查询天气。\n3.每分钟阈值为 300 次,如果超过会禁用一天。请谨慎使用。");
|
||||
}
|
||||
};
|
||||
|
||||
//获取当天天气
|
||||
export const WeatherGetToday = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.WeatherGetToday)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_Humidity, "0"], ['PM2.5', "1"], ['PM1.0', "2"], [Blockly.Msg.TodayQuality, "3"], [Blockly.Msg.MIXLY_TEMPERATURE, "4"]]), "type");
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip("返回对应数据 字符串型。");
|
||||
}
|
||||
};
|
||||
|
||||
//获取当天天气
|
||||
export const WeatherGetForecast = {
|
||||
init: function () {
|
||||
this.setColour(ETHERNET_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.WeatherGetForecast)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_GPS_DATE, "ForecastDate"], [Blockly.Msg.ForecastHigh, "ForecastHigh"], [Blockly.Msg.ForecastLow, "ForecastLow"], [Blockly.Msg.ForecastYmd, "ForecastYmd"], [Blockly.Msg.MIXLY_WEEK, "ForecastWeek"], [Blockly.Msg.ForecastAqi, "ForecastAqi"], [Blockly.Msg.ForecastFx, "ForecastFx"], [Blockly.Msg.ForecastFl, "ForecastFl"], [Blockly.Msg.ForecastType, "ForecastType"]]), "type");
|
||||
this.appendValueInput('date', Number)
|
||||
.appendField(Blockly.Msg.MIXLY_GPS_DATE + '(0~14)');
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip("返回预报天气内容0表示当天,最大为14,字符串型。");
|
||||
this.setInputsInline(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const mixio_mqtt_subscribe = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_CREATE_MQTT_CLIENT_AND_CONNECT);
|
||||
this.appendValueInput("server")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.blynk_SERVER_ADD);
|
||||
this.appendValueInput("port")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_EMQX_PORT);
|
||||
this.appendValueInput("mqtt_username")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_WIFI_USERNAME);
|
||||
this.appendValueInput("mqtt_password")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_WIFI_PASSWORD);
|
||||
this.appendValueInput("project")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_EMQX_PROJECT);
|
||||
//this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(170);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const mixio_mqtt_subscribe_key = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.USE_MIXLY_KEY)
|
||||
.appendField(new Blockly.FieldTextInput("1RFOH08C"), "key")
|
||||
.appendField(Blockly.Msg.CONNECT_TO_MIXIO)
|
||||
.appendField(Blockly.Msg.blynk_SERVER_ADD)
|
||||
.appendField(new Blockly.FieldTextInput("mixio.mixly.cn"), "server");
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(170);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const mixio_mqtt_publish = {
|
||||
init: function () {
|
||||
this.appendValueInput("data")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MQTT_SEND_MESSAGE);
|
||||
this.appendValueInput("topic")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.TO_TOPIC);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown([["MixIO", "1"], ["Mixly Key", "2"]]), "mode");
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(170);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const mixio_mqtt_received_the_news = {
|
||||
init: function () {
|
||||
this.appendValueInput("topic")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.WHEN_THE_SUBJECT_IS_RECEIVED);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_MSG)
|
||||
.appendField(new Blockly.FieldDropdown([["MixIO", "1"], ["Mixly Key", "2"]]), "mode");
|
||||
this.appendStatementInput("function")
|
||||
.setCheck(null);
|
||||
this.setPreviousStatement(false, null);
|
||||
this.setNextStatement(false, null);
|
||||
this.setColour(170);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//OTA
|
||||
export const asyncelegantota = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/blocks_icons/loop.png'), 15, 15, { alt: "*", flipRtl: "FALSE" }))
|
||||
.appendField("ElegantOTA");
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(120);
|
||||
this.setTooltip("http://ip/update");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
321
boards/default_src/arduino_avr/blocks/factory.js
Normal file
321
boards/default_src/arduino_avr/blocks/factory.js
Normal file
@@ -0,0 +1,321 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const FACTORY_HUE = "#777777";
|
||||
|
||||
export const factory_include = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField("#include <")
|
||||
.appendField(new Blockly.FieldTextInput('Test'), 'INCLUDE')
|
||||
.appendField(".h>");
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const factory_function_noreturn = {
|
||||
init: function () {
|
||||
//console.log('init');
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldTextInput('function'), 'NAME');
|
||||
this.itemCount_ = 1;
|
||||
this.arguments_ = ['x'];//add
|
||||
this.updateShape_();
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
|
||||
},
|
||||
mutationToDom: function () {
|
||||
//console.log('mutationToDom');
|
||||
var container = document.createElement('mutation');
|
||||
container.setAttribute('items', this.itemCount_);
|
||||
//add
|
||||
for (var i = 0; i < this.arguments_.length; i++) {
|
||||
var parameter = document.createElement('arg');
|
||||
parameter.setAttribute('name', this.arguments_[i]);
|
||||
container.appendChild(parameter);
|
||||
}
|
||||
return container;
|
||||
},
|
||||
domToMutation: function (xmlElement) {
|
||||
//console.log('domToMutation');
|
||||
this.arguments_ = [];//add
|
||||
//add
|
||||
for (var i = 0; xmlElement.childNodes[i]; i++) {
|
||||
let childNode = xmlElement.childNodes[i];
|
||||
if (childNode.nodeName.toLowerCase() == 'arg') {
|
||||
this.arguments_.push(childNode.getAttribute('name'));
|
||||
}
|
||||
}
|
||||
this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);
|
||||
this.updateShape_();
|
||||
},
|
||||
decompose: function (workspace) {
|
||||
//console.log('decompose');
|
||||
var containerBlock =
|
||||
workspace.newBlock('factory_create_with_container');
|
||||
containerBlock.initSvg();
|
||||
var connection = containerBlock.getInput('STACK').connection;
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
var itemBlock = workspace.newBlock('factory_create_with_item');
|
||||
itemBlock.initSvg();
|
||||
itemBlock.setFieldValue(this.arguments_[i], 'NAME');//add
|
||||
connection.connect(itemBlock.previousConnection);
|
||||
connection = itemBlock.nextConnection;
|
||||
}
|
||||
return containerBlock;
|
||||
},
|
||||
compose: function (containerBlock) {
|
||||
//console.log('compose');
|
||||
this.arguments_ = [];//add
|
||||
var itemBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
// Count number of inputs.
|
||||
var connections = [];
|
||||
var i = 0;
|
||||
while (itemBlock) {
|
||||
this.arguments_.push(itemBlock.getFieldValue('NAME'));//add
|
||||
connections[i] = itemBlock.valueConnection_;
|
||||
itemBlock = itemBlock.nextConnection &&
|
||||
itemBlock.nextConnection.targetBlock();
|
||||
i++;
|
||||
}
|
||||
this.itemCount_ = i;
|
||||
this.updateShape_();
|
||||
// Reconnect any child blocks.
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
if (connections[i]) {
|
||||
this.getInput('ADD' + i).connection.connect(connections[i]);
|
||||
}
|
||||
}
|
||||
},
|
||||
saveConnections: function (containerBlock) {
|
||||
//console.log('saveConnections');
|
||||
var itemBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
var i = 0;
|
||||
while (itemBlock) {
|
||||
var input = this.getInput('ADD' + i);
|
||||
itemBlock.valueConnection_ = input && input.connection.targetConnection;
|
||||
i++;
|
||||
itemBlock = itemBlock.nextConnection &&
|
||||
itemBlock.nextConnection.targetBlock();
|
||||
}
|
||||
},
|
||||
updateShape_: function () {
|
||||
//console.log('updateShape_');
|
||||
// Delete everything.
|
||||
if (this.getInput('EMPTY')) {
|
||||
this.removeInput('EMPTY');
|
||||
} else {
|
||||
var i = 0;
|
||||
while (this.getInput('ADD' + i)) {
|
||||
this.removeInput('ADD' + i);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
// Rebuild block.
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
this.appendValueInput('ADD' + i)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(this.arguments_[i]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const factory_create_with_container = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_PARAMS);
|
||||
this.appendStatementInput('STACK');
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
export const factory_create_with_item = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE + ':')
|
||||
.appendField(new Blockly.FieldTextInput('x'), 'NAME');
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
export const factory_function_return = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldTextInput('function'), 'NAME');
|
||||
this.itemCount_ = 1;
|
||||
this.arguments_ = ['x'];//add
|
||||
this.updateShape_();
|
||||
this.setOutput(true);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
|
||||
},
|
||||
mutationToDom: factory_function_noreturn.mutationToDom,
|
||||
domToMutation: factory_function_noreturn.domToMutation,
|
||||
decompose: factory_function_noreturn.decompose,
|
||||
compose: factory_function_noreturn.compose,
|
||||
saveConnections: factory_function_noreturn.saveConnections,
|
||||
updateShape_: factory_function_noreturn.updateShape_
|
||||
};
|
||||
|
||||
export const factory_declare = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldTextInput('Test'), 'TYPE')
|
||||
.appendField(" ")
|
||||
.appendField(new Blockly.FieldTextInput('test'), 'NAME')
|
||||
.appendField(";");
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
}
|
||||
}
|
||||
export const factory_declare2 = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldMultilineInput('//define user code;'), 'VALUE');
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
}
|
||||
};
|
||||
export const factory_define = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldTextInput('#define'), 'TYPE')
|
||||
.appendField(" ")
|
||||
.appendField(new Blockly.FieldTextInput('MYDEFINE 11'), 'NAME')
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
}
|
||||
}
|
||||
export const factory_static_method_noreturn = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldTextInput('Test'), 'TYPE')
|
||||
.appendField("::")
|
||||
.appendField(new Blockly.FieldTextInput('staticMethod'), 'NAME');
|
||||
this.itemCount_ = 1;
|
||||
this.arguments_ = ['x'];//add
|
||||
this.updateShape_();
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
|
||||
},
|
||||
mutationToDom: factory_function_noreturn.mutationToDom,
|
||||
domToMutation: factory_function_noreturn.domToMutation,
|
||||
decompose: factory_function_noreturn.decompose,
|
||||
compose: factory_function_noreturn.compose,
|
||||
saveConnections: factory_function_noreturn.saveConnections,
|
||||
updateShape_: factory_function_noreturn.updateShape_
|
||||
}
|
||||
|
||||
export const factory_static_method_return = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldTextInput('Test'), 'TYPE')
|
||||
.appendField("::")
|
||||
.appendField(new Blockly.FieldTextInput('staticMethod'), 'NAME');
|
||||
this.itemCount_ = 1;
|
||||
this.arguments_ = ['x'];//add
|
||||
this.updateShape_();
|
||||
this.setOutput(true);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
|
||||
},
|
||||
mutationToDom: factory_function_noreturn.mutationToDom,
|
||||
domToMutation: factory_function_noreturn.domToMutation,
|
||||
decompose: factory_function_noreturn.decompose,
|
||||
compose: factory_function_noreturn.compose,
|
||||
saveConnections: factory_function_noreturn.saveConnections,
|
||||
updateShape_: factory_function_noreturn.updateShape_
|
||||
}
|
||||
|
||||
export const factory_callMethod_noreturn = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldTextInput('test'), 'NAME')
|
||||
.appendField('.')
|
||||
.appendField(new Blockly.FieldTextInput('callMetod'), 'METHOD');
|
||||
this.itemCount_ = 1;
|
||||
this.arguments_ = ['x'];//add
|
||||
this.updateShape_();
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
|
||||
},
|
||||
mutationToDom: factory_function_noreturn.mutationToDom,
|
||||
domToMutation: factory_function_noreturn.domToMutation,
|
||||
decompose: factory_function_noreturn.decompose,
|
||||
compose: factory_function_noreturn.compose,
|
||||
saveConnections: factory_function_noreturn.saveConnections,
|
||||
updateShape_: factory_function_noreturn.updateShape_
|
||||
};
|
||||
|
||||
export const factory_callMethod_return = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldTextInput('test'), 'NAME')
|
||||
.appendField('.')
|
||||
.appendField(new Blockly.FieldTextInput('callMetod'), 'METHOD');
|
||||
this.itemCount_ = 1;
|
||||
this.arguments_ = ['x'];//add
|
||||
this.updateShape_();
|
||||
this.setOutput(true);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
|
||||
},
|
||||
mutationToDom: factory_function_noreturn.mutationToDom,
|
||||
domToMutation: factory_function_noreturn.domToMutation,
|
||||
decompose: factory_function_noreturn.decompose,
|
||||
compose: factory_function_noreturn.compose,
|
||||
saveConnections: factory_function_noreturn.saveConnections,
|
||||
updateShape_: factory_function_noreturn.updateShape_
|
||||
};
|
||||
|
||||
export const factory_block = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldTextInput('Serial.println("hello");'), 'VALUE');
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const factory_block_return = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldTextInput('test'), 'VALUE');
|
||||
this.setOutput(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const factory_block_with_textarea = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldMultilineInput('Serial.println("Hello");\nSerial.println("Mixly");'), 'VALUE');
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const factory_block_return_with_textarea = {
|
||||
init: function () {
|
||||
this.setColour(FACTORY_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldMultilineInput('Hello\nMixly'), 'VALUE');
|
||||
this.setOutput(true);
|
||||
}
|
||||
};
|
||||
420
boards/default_src/arduino_avr/blocks/inout.js
Normal file
420
boards/default_src/arduino_avr/blocks/inout.js
Normal file
@@ -0,0 +1,420 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
import { Profile } from 'mixly';
|
||||
|
||||
const BASE_HUE = 20;//'#ae3838';//40;
|
||||
|
||||
export const inout_highlow = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_HIGH, "HIGH"], [Blockly.Msg.MIXLY_LOW, "LOW"]]), 'BOOL')
|
||||
this.setOutput(true, Boolean);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_HIGHLOW);
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_pinMode = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_PINMODE)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_STAT)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_PINMODEIN, "INPUT"], [Blockly.Msg.MIXLY_PINMODEOUT, "OUTPUT"], [Blockly.Msg.MIXLY_PINMODEPULLUP, "INPUT_PULLUP"]]), "MODE")
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_pinMode);
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '管脚模式']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const inout_digital_write2 = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_DIGITALWRITE_PIN)
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("STAT")
|
||||
.appendField(Blockly.Msg.MIXLY_STAT)
|
||||
.setCheck([Number, Boolean]);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.LANG_INOUT_DIGITAL_WRITE_TOOLTIP);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id2");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '数字输出']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_digital_read = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_DIGITALREAD_PIN)
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.digital), "PIN");
|
||||
this.setOutput(true, [Boolean, Number]);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_DIGITAL_READ);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id7");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '数字输入']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_digital_read2 = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_DIGITALREAD_PIN)
|
||||
.setCheck(Number);
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, [Boolean, Number]);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_DIGITAL_READ);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id19");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '数字输入']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_analog_write = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_ANALOGWRITE_PIN)
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("NUM", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_VALUE2)
|
||||
.setCheck(Number);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ANALOG_WRITE);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id13");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '模拟输出']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_analog_read = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_ANALOGREAD_PIN)
|
||||
.setCheck(Number);
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ANALOG_READ);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id13");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '模拟输入']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_buildin_led = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_BUILDIN_LED)
|
||||
.appendField(Blockly.Msg.MIXLY_STAT)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_ON, "HIGH"], [Blockly.Msg.MIXLY_OFF, "LOW"]]), "STAT");
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip('light or off the build-in LED');
|
||||
}
|
||||
};
|
||||
|
||||
export const OneButton_interrupt = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.ONEBUTTON + " " + Blockly.Msg.MIXLY_PIN)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_CLICK, "attachClick"], [Blockly.Msg.MIXLY_DOUBLE_CLICK, "attachDoubleClick"], [Blockly.Msg.MIXLY_LONG_PRESS_START, "attachLongPressStart"], [Blockly.Msg.MIXLY_DURING_LONG_PRESS, "attachDuringLongPress"], [Blockly.Msg.MIXLY_LONG_PRESS_END, "attachLongPressStop"]]), "mode");
|
||||
this.appendValueInput("STAT")
|
||||
.appendField(Blockly.Msg.MIXLY_ELECLEVEL);
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.MIXLY_DO);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ATTACHINTERRUPT);
|
||||
this.setHelpUrl();
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '多功能按键']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const controls_attachInterrupt = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_ATTACHINTERRUPT_PIN)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MODE)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_RISING, "RISING"], [Blockly.Msg.MIXLY_FALLING, "FALLING"], [Blockly.Msg.MIXLY_CHANGE, "CHANGE"]]), "mode");
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.MIXLY_DO);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ATTACHINTERRUPT);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id25");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '硬件中断'],
|
||||
scrollPos: '硬件中断'
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const controls_detachInterrupt = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_DETACHINTERRUPT_PIN)
|
||||
.setCheck(Number);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_DETACHINTERRUPT);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id30");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '硬件中断'],
|
||||
scrollPos: '取消硬件中断'
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const controls_attachPinInterrupt = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_ATTACHPININTERRUPT_PIN)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MODE)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_RISING, "RISING"], [Blockly.Msg.MIXLY_FALLING, "FALLING"], [Blockly.Msg.MIXLY_CHANGE, "CHANGE"]]), "mode");
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.MIXLY_DO);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ATTACHINTERRUPT);
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '软件中断'],
|
||||
scrollPos: '软件中断'
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const controls_detachPinInterrupt = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_DETACHPININTERRUPT_PIN)
|
||||
.setCheck(Number);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_DETACHINTERRUPT);
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '软件中断'],
|
||||
scrollPos: '取消软件中断'
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_pulseIn = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_PULSEIN)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_PULSEIN_STAT)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_HIGH, "HIGH"], [Blockly.Msg.MIXLY_LOW, "LOW"]]), "STAT");
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_pulseIn);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id33");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '脉冲长度']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_pulseIn2 = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_PULSEIN)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_PULSEIN_STAT)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_HIGH, "HIGH"], [Blockly.Msg.MIXLY_LOW, "LOW"]]), "STAT");
|
||||
this.appendValueInput("TIMEOUT", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_PULSEIN_TIMEOUT)
|
||||
.setCheck(Number);
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_pulseIn2);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#id33");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', '脉冲长度']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_shiftout = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField("ShiftOut");
|
||||
this.appendValueInput("PIN1", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_DATAPIN)
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("PIN2", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_CLOCKPIN)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_BITORDER)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MSBFIRST, "MSBFIRST"], [Blockly.Msg.MIXLY_LSBFIRST, "LSBFIRST"]]), "ORDER");
|
||||
this.appendValueInput("DATA", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_DATA)
|
||||
.setCheck(Number);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_shiftout);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/02.Input-Output.html#shiftout");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '输入输出', 'ShiftOut']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const ESP32touchButton = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField("ESP32" + Blockly.Msg.MIXLY_ESP32_TOUCH + Blockly.Msg.ONEBUTTON + " " + Blockly.Msg.MIXLY_PIN)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MODE)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_CLICK, "attachClick"], [Blockly.Msg.MIXLY_DOUBLE_CLICK, "attachDoubleClick"], [Blockly.Msg.MIXLY_LONG_PRESS_START, "attachLongPressStart"], [Blockly.Msg.MIXLY_DURING_LONG_PRESS, "attachDuringLongPress"], [Blockly.Msg.MIXLY_LONG_PRESS_END, "attachLongPressStop"]]), "mode");
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.MIXLY_DO);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_soft_analog_write = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_SOFT_ANALOGWRITE_PIN)
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("NUM", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_VALUE2)
|
||||
.setCheck(Number);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ANALOG_WRITE);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const inout_cancel_soft_analog_write = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendValueInput("PIN", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_CANCEL_SOFT_ANALOGWRITE_PIN)
|
||||
.setCheck(Number);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CANCEL_SOFT_ANALOGWRITE_PIN);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//ADS1015模拟数字转换模块-获取数据
|
||||
var ADS1015_setGain_type = [
|
||||
["±6.144V 3mv/bit", "GAIN_TWOTHIRDS"],
|
||||
["±4.096V 2mv/bit", "GAIN_ONE"],
|
||||
["±2.048V 1mv/bit", "GAIN_TWO"],
|
||||
["±1.024V 0.5mv/bit", "GAIN_FOUR"],
|
||||
["±0.512V 0.25mv/bit", "GAIN_EIGHT"],
|
||||
["±0.256V 0.125mv/bit", "GAIN_SIXTEEN"],
|
||||
];
|
||||
|
||||
//ADS1015模拟数字转换模块-增益设置
|
||||
export const ADS1015_setGain = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendDummyInput("").appendField(Blockly.Msg.MIXLY_SETTING).appendField(Blockly.Msg.ADS1015_setGain);
|
||||
this.appendDummyInput("").setAlign(Blockly.inputs.Align.RIGHT).appendField(new Blockly.FieldDropdown(ADS1015_setGain_type), "ADS1015_setGain");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
}
|
||||
};
|
||||
|
||||
//ADS1015模拟数字转换模块 数值获取
|
||||
export const ADS1015_Get_Value = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendDummyInput("").appendField("ADS1015" + Blockly.Msg.ADS1015_Get_Value);
|
||||
this.appendDummyInput("").appendField(new Blockly.FieldDropdown([["AIN0", "ads.readADC_SingleEnded(0)"], ["AIN1", "ads.readADC_SingleEnded(1)"], ["AIN2", "ads.readADC_SingleEnded(2)"], ["AIN3", "ads.readADC_SingleEnded(3)"]]), "ADS1015_AIN");
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true);
|
||||
}
|
||||
};
|
||||
//PCF8591T模拟数字转换模块 数值获取
|
||||
export const PCF8591T = {
|
||||
init: function () {
|
||||
this.setColour(BASE_HUE);
|
||||
this.appendDummyInput("").appendField("PCF8591T" + Blockly.Msg.ADS1015_Get_Value);
|
||||
this.appendDummyInput("").appendField(new Blockly.FieldDropdown([["AIN0", "pcf8591.analogRead(AIN0)"], ["AIN1", "pcf8591.analogRead(AIN1)"], ["AIN2", "pcf8591.analogRead(AIN2)"], ["AIN3", "pcf8591.analogRead(AIN3)"]]), "PCF8591T_AIN");
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true);
|
||||
}
|
||||
};
|
||||
749
boards/default_src/arduino_avr/blocks/lists.js
Normal file
749
boards/default_src/arduino_avr/blocks/lists.js
Normal file
@@ -0,0 +1,749 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const LISTS_HUE = 260;
|
||||
|
||||
const DATATYPES = [
|
||||
[Blockly.Msg.LANG_MATH_INT, 'int'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_INT, 'unsigned int'],
|
||||
[Blockly.Msg.LANG_MATH_WORD, 'word'],
|
||||
[Blockly.Msg.LANG_MATH_LONG, 'long'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_LONG, 'unsigned long'],
|
||||
[Blockly.Msg.LANG_MATH_FLOAT, 'float'],
|
||||
[Blockly.Msg.LANG_MATH_DOUBLE, 'double'],
|
||||
[Blockly.Msg.LANG_MATH_BOOLEAN, 'boolean'],
|
||||
[Blockly.Msg.LANG_MATH_BYTE, 'byte'],
|
||||
[Blockly.Msg.LANG_MATH_CHAR, 'char'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_CHAR, 'unsigned char'],
|
||||
[Blockly.Msg.LANG_MATH_STRING, 'String']
|
||||
];
|
||||
|
||||
export const lists_create_with = {
|
||||
/**
|
||||
* Block for creating a list with any number of elements of any type.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(DATATYPES), "TYPE")
|
||||
.appendField(' ')
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')
|
||||
.appendField('[')
|
||||
.appendField(new Blockly.FieldTextInput('3', Blockly.FieldTextInput.math_number_validator), 'SIZE')
|
||||
.appendField(']');
|
||||
this.itemCount_ = 3;
|
||||
this.updateShape_();
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['lists_create_with_item'], this));
|
||||
this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP);
|
||||
},
|
||||
/**
|
||||
* Create XML to represent list inputs.
|
||||
* @return {Element} XML storage element.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
mutationToDom: function () {
|
||||
var container = document.createElement('mutation');
|
||||
container.setAttribute('items', this.itemCount_);
|
||||
return container;
|
||||
},
|
||||
/**
|
||||
* Parse XML to restore the list inputs.
|
||||
* @param {!Element} xmlElement XML storage element.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
domToMutation: function (xmlElement) {
|
||||
this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);
|
||||
this.updateShape_();
|
||||
},
|
||||
/**
|
||||
* Populate the mutator's dialog with this block's components.
|
||||
* @param {!Blockly.Workspace} workspace Mutator's workspace.
|
||||
* @return {!Blockly.Block} Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
decompose: function (workspace) {
|
||||
var containerBlock =
|
||||
workspace.newBlock('lists_create_with_container');
|
||||
containerBlock.initSvg();
|
||||
var connection = containerBlock.getInput('STACK').connection;
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
var itemBlock = workspace.newBlock('lists_create_with_item');
|
||||
itemBlock.initSvg();
|
||||
connection.connect(itemBlock.previousConnection);
|
||||
connection = itemBlock.nextConnection;
|
||||
}
|
||||
return containerBlock;
|
||||
},
|
||||
/**
|
||||
* Reconfigure this block based on the mutator dialog's components.
|
||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
compose: function (containerBlock) {
|
||||
var itemBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
// Count number of inputs.
|
||||
var connections = [];
|
||||
var i = 0;
|
||||
while (itemBlock) {
|
||||
connections[i] = itemBlock.valueConnection_;
|
||||
itemBlock = itemBlock.nextConnection &&
|
||||
itemBlock.nextConnection.targetBlock();
|
||||
i++;
|
||||
}
|
||||
this.itemCount_ = i;
|
||||
this.updateShape_();
|
||||
// Reconnect any child blocks.
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
if (connections[i]) {
|
||||
this.getInput('ADD' + i).connection.connect(connections[i]);
|
||||
}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Store pointers to any connected child blocks.
|
||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
saveConnections: function (containerBlock) {
|
||||
var itemBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
var i = 0;
|
||||
while (itemBlock) {
|
||||
var input = this.getInput('ADD' + i);
|
||||
itemBlock.valueConnection_ = input && input.connection.targetConnection;
|
||||
i++;
|
||||
itemBlock = itemBlock.nextConnection &&
|
||||
itemBlock.nextConnection.targetBlock();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Modify this block to have the correct number of inputs.
|
||||
* @private
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
updateShape_: function () {
|
||||
// Delete everything.
|
||||
if (this.getInput('EMPTY')) {
|
||||
this.removeInput('EMPTY');
|
||||
} else {
|
||||
var i = 0;
|
||||
while (this.getInput('ADD' + i)) {
|
||||
this.removeInput('ADD' + i);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
// Rebuild block.
|
||||
if (this.itemCount_ == 0) {
|
||||
this.appendDummyInput('EMPTY')
|
||||
.appendField(Blockly.Msg.LISTS_CREATE_EMPTY_TITLE);
|
||||
} else {
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
var input = this.appendValueInput('ADD' + i);
|
||||
if (i == 0) {
|
||||
input.appendField(Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const lists_create_with_text = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(DATATYPES), "TYPE")
|
||||
.appendField(' ')
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')
|
||||
.appendField('[')
|
||||
.appendField(new Blockly.FieldTextInput('3', Blockly.FieldTextInput.math_number_validator), 'SIZE')
|
||||
.appendField(']')
|
||||
.appendField(Blockly.Msg.MIXLY_MAKELISTFROM)
|
||||
.appendField(this.newQuote_(true))
|
||||
.appendField(new Blockly.FieldTextInput('0,0,0'), 'TEXT')
|
||||
.appendField(this.newQuote_(false))
|
||||
.appendField(Blockly.Msg.MIXLY_SPLITBYDOU);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_LISTS_CREATE_WITH_TEXT);
|
||||
},
|
||||
newQuote_: function (open) {
|
||||
if (open == this.RTL) {
|
||||
var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==';
|
||||
} else {
|
||||
var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC';
|
||||
}
|
||||
return new Blockly.FieldImage(file, 12, 12, '"');
|
||||
}
|
||||
}
|
||||
|
||||
export const lists_create_with2 = {
|
||||
/**
|
||||
* Block for creating a list with any number of elements of any type.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(DATATYPES), "TYPE")
|
||||
.appendField(' ')
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')
|
||||
.appendField('[')
|
||||
//.appendField(new Blockly.FieldTextInput('3',Blockly.FieldTextInput.math_number_validator), 'SIZE')
|
||||
.appendField(']');
|
||||
this.itemCount_ = 3;
|
||||
this.updateShape_();
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['lists_create_with_item'], this));
|
||||
this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP);
|
||||
},
|
||||
/**
|
||||
* Create XML to represent list inputs.
|
||||
* @return {Element} XML storage element.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
mutationToDom: function () {
|
||||
var container = document.createElement('mutation');
|
||||
container.setAttribute('items', this.itemCount_);
|
||||
return container;
|
||||
},
|
||||
/**
|
||||
* Parse XML to restore the list inputs.
|
||||
* @param {!Element} xmlElement XML storage element.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
domToMutation: function (xmlElement) {
|
||||
this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);
|
||||
this.updateShape_();
|
||||
},
|
||||
/**
|
||||
* Populate the mutator's dialog with this block's components.
|
||||
* @param {!Blockly.Workspace} workspace Mutator's workspace.
|
||||
* @return {!Blockly.Block} Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
decompose: function (workspace) {
|
||||
var containerBlock =
|
||||
workspace.newBlock('lists_create_with_container');
|
||||
containerBlock.initSvg();
|
||||
var connection = containerBlock.getInput('STACK').connection;
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
var itemBlock = workspace.newBlock('lists_create_with_item');
|
||||
itemBlock.initSvg();
|
||||
connection.connect(itemBlock.previousConnection);
|
||||
connection = itemBlock.nextConnection;
|
||||
}
|
||||
return containerBlock;
|
||||
},
|
||||
/**
|
||||
* Reconfigure this block based on the mutator dialog's components.
|
||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
compose: function (containerBlock) {
|
||||
var itemBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
// Count number of inputs.
|
||||
var connections = [];
|
||||
var i = 0;
|
||||
while (itemBlock) {
|
||||
connections[i] = itemBlock.valueConnection_;
|
||||
itemBlock = itemBlock.nextConnection &&
|
||||
itemBlock.nextConnection.targetBlock();
|
||||
i++;
|
||||
}
|
||||
this.itemCount_ = i;
|
||||
this.updateShape_();
|
||||
// Reconnect any child blocks.
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
if (connections[i]) {
|
||||
this.getInput('ADD' + i).connection.connect(connections[i]);
|
||||
}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Store pointers to any connected child blocks.
|
||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
saveConnections: function (containerBlock) {
|
||||
var itemBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
var i = 0;
|
||||
while (itemBlock) {
|
||||
var input = this.getInput('ADD' + i);
|
||||
itemBlock.valueConnection_ = input && input.connection.targetConnection;
|
||||
i++;
|
||||
itemBlock = itemBlock.nextConnection &&
|
||||
itemBlock.nextConnection.targetBlock();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Modify this block to have the correct number of inputs.
|
||||
* @private
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
updateShape_: function () {
|
||||
// Delete everything.
|
||||
if (this.getInput('EMPTY')) {
|
||||
this.removeInput('EMPTY');
|
||||
} else {
|
||||
var i = 0;
|
||||
while (this.getInput('ADD' + i)) {
|
||||
this.removeInput('ADD' + i);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
// Rebuild block.
|
||||
if (this.itemCount_ == 0) {
|
||||
this.appendDummyInput('EMPTY')
|
||||
.appendField(Blockly.Msg.LISTS_CREATE_EMPTY_TITLE);
|
||||
} else {
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
var input = this.appendValueInput('ADD' + i);
|
||||
if (i == 0) {
|
||||
input.appendField(Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const lists_create_with_text2 = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(DATATYPES), "TYPE")
|
||||
.appendField(' ')
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')
|
||||
.appendField('[')
|
||||
.appendField(new Blockly.FieldTextInput("3"), "SIZE")
|
||||
.appendField(']')
|
||||
.appendField(Blockly.Msg.MIXLY_MAKELISTFROM)
|
||||
.appendField(this.newQuote_(true))
|
||||
.appendField(new Blockly.FieldTextInput('0,0,0'), 'TEXT')
|
||||
.appendField(this.newQuote_(false))
|
||||
.appendField(Blockly.Msg.MIXLY_SPLITBYDOU);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_LISTS_CREATE_WITH_TEXT);
|
||||
},
|
||||
newQuote_: function (open) {
|
||||
if (open == this.RTL) {
|
||||
var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==';
|
||||
} else {
|
||||
var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC';
|
||||
}
|
||||
return new Blockly.FieldImage(file, 12, 12, '"');
|
||||
}
|
||||
}
|
||||
|
||||
export const lists_create_with_container = {
|
||||
/**
|
||||
* Mutator block for list container.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD);
|
||||
this.appendStatementInput('STACK');
|
||||
this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP);
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
export const lists_create_with_item = {
|
||||
/**
|
||||
* Mutator bolck for adding items.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP);
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
export const lists_getIndex = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.setOutput(true, Number);
|
||||
this.appendValueInput('AT')
|
||||
.setCheck(Number)
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')
|
||||
.appendField(Blockly.Msg.LANG_LISTS_GET_INDEX1);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.LANG_LISTS_GET_INDEX2);
|
||||
this.appendDummyInput()
|
||||
.appendField('(' + Blockly.Msg.MIXLY_DEPRECATED + ')');
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.LANG_LISTS_GET_INDEX_TOOLTIP);
|
||||
this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT);
|
||||
}
|
||||
};
|
||||
|
||||
export const lists_setIndex = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendValueInput('AT')
|
||||
.setCheck(Number)
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')
|
||||
.appendField(Blockly.Msg.LANG_LISTS_SET_INDEX1);
|
||||
this.appendValueInput('TO')
|
||||
.appendField(Blockly.Msg.LANG_LISTS_SET_INDEX2);
|
||||
this.appendDummyInput()
|
||||
.appendField('(' + Blockly.Msg.MIXLY_DEPRECATED + ')');
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.LANG_LISTS_SET_INDEX_TOOLTIP);
|
||||
this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT);
|
||||
}
|
||||
};
|
||||
|
||||
export const listsGetValueByIndex = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.setOutput(true, Number);
|
||||
this.appendValueInput('AT')
|
||||
.setCheck(Number)
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')
|
||||
.appendField(Blockly.Msg.LANG_LISTS_GET_INDEX1);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.LANG_LISTS_GET_INDEX2);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.LANG_LISTS_GET_VALUE_BY_INDEX_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const listsSetValueByIndex = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendValueInput('AT')
|
||||
.setCheck(Number)
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')
|
||||
.appendField(Blockly.Msg.LANG_LISTS_SET_INDEX1);
|
||||
this.appendValueInput('TO')
|
||||
.appendField(Blockly.Msg.LANG_LISTS_SET_INDEX2);
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.LANG_LISTS_SET_VALUE_BY_INDEX_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const lists_length = {
|
||||
/**
|
||||
* Block for list length.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_LENGTH)
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR');
|
||||
this.setTooltip(Blockly.Msg.LISTS_LENGTH_TOOLTIP);
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
|
||||
//创建二维数组
|
||||
export const create_array2_with_text = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendValueInput("name")
|
||||
.setCheck(null)
|
||||
.appendField(new Blockly.FieldDropdown(DATATYPES), "TYPE")
|
||||
.appendField(Blockly.Msg.MIXLY_ARRAY2);
|
||||
this.appendValueInput("line")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.array2_rows);
|
||||
this.appendValueInput("list")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.array2_cols);
|
||||
this.appendValueInput("String")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_MAKELISTFROM);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ESP32_SET);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//二维数组赋值
|
||||
export const array2_assignment = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendValueInput("name")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.array2_assignment);
|
||||
this.appendValueInput("line")
|
||||
.appendField(Blockly.Msg.DATAFRAME_RAW)
|
||||
this.appendValueInput("list")
|
||||
.appendField(Blockly.Msg.DATAFRAME_COLUMN);
|
||||
this.appendValueInput("assignment")
|
||||
.appendField(Blockly.Msg.MIXLY_VALUE2);
|
||||
this.appendDummyInput()
|
||||
.appendField('(' + Blockly.Msg.MIXLY_DEPRECATED + ')');
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setHelpUrl("");
|
||||
this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT);
|
||||
}
|
||||
};
|
||||
|
||||
//获取二维数组值
|
||||
export const get_array2_value = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendValueInput("name")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.get_array2_value);
|
||||
this.appendValueInput("line")
|
||||
.appendField(Blockly.Msg.DATAFRAME_RAW);
|
||||
this.appendValueInput("list")
|
||||
.appendField(Blockly.Msg.DATAFRAME_COLUMN);
|
||||
this.appendDummyInput()
|
||||
.appendField('(' + Blockly.Msg.MIXLY_DEPRECATED + ')');
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, null);
|
||||
this.setHelpUrl("");
|
||||
this.setWarningText(Blockly.Msg.MIXLY_DEPRECATED_WARNING_TEXT);
|
||||
}
|
||||
};
|
||||
|
||||
//二维数组赋值
|
||||
export const lists2SetValueByIndex = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendValueInput("name")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.array2_assignment);
|
||||
this.appendValueInput("line")
|
||||
.appendField(Blockly.Msg.DATAFRAME_RAW)
|
||||
this.appendValueInput("list")
|
||||
.appendField(Blockly.Msg.DATAFRAME_COLUMN);
|
||||
this.appendValueInput("assignment")
|
||||
.appendField(Blockly.Msg.MIXLY_VALUE2);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setHelpUrl("");
|
||||
this.setTooltip(Blockly.Msg.LANG_LISTS_SET_VALUE_BY_INDEX_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
//二维数组取值
|
||||
export const lists2GetValueByIndex = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendValueInput("name")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.get_array2_value);
|
||||
this.appendValueInput("line")
|
||||
.appendField(Blockly.Msg.DATAFRAME_RAW);
|
||||
this.appendValueInput("list")
|
||||
.appendField(Blockly.Msg.DATAFRAME_COLUMN);
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, null);
|
||||
this.setHelpUrl("");
|
||||
this.setTooltip(Blockly.Msg.LANG_LISTS_GET_VALUE_BY_INDEX_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const lists_array2_setup = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_ARRAY2);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown(DATATYPES), "lists_create_type")
|
||||
.appendField(new Blockly.FieldTextInput("mylist"), "lists_create_name")
|
||||
.appendField("[ ][ ]");
|
||||
this.appendStatementInput("lists_with_2_1_data")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.VARIABLES_SET_TITLE);
|
||||
this.setInputsInline(false);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(LISTS_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
export const lists_array2_setup_get_data = {
|
||||
/**
|
||||
* Block for creating a list with any number of elements of any type.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendDummyInput("");
|
||||
this.itemCount_ = 3;
|
||||
this.updateShape_();
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['lists_create_with_item'], this));
|
||||
this.setTooltip("");
|
||||
},
|
||||
/**
|
||||
* Create XML to represent list inputs.
|
||||
* @return {Element} XML storage element.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
mutationToDom: function () {
|
||||
var container = document.createElement('mutation');
|
||||
container.setAttribute('items', this.itemCount_);
|
||||
return container;
|
||||
},
|
||||
/**
|
||||
* Parse XML to restore the list inputs.
|
||||
* @param {!Element} xmlElement XML storage element.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
domToMutation: function (xmlElement) {
|
||||
this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);
|
||||
this.updateShape_();
|
||||
},
|
||||
/**
|
||||
* Populate the mutator's dialog with this block's components.
|
||||
* @param {!Blockly.Workspace} workspace Mutator's workspace.
|
||||
* @return {!Blockly.Block} Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
decompose: function (workspace) {
|
||||
var containerBlock =
|
||||
workspace.newBlock('lists_create_with_container');
|
||||
containerBlock.initSvg();
|
||||
var connection = containerBlock.getInput('STACK').connection;
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
var itemBlock = workspace.newBlock('lists_create_with_item');
|
||||
itemBlock.initSvg();
|
||||
connection.connect(itemBlock.previousConnection);
|
||||
connection = itemBlock.nextConnection;
|
||||
}
|
||||
return containerBlock;
|
||||
},
|
||||
/**
|
||||
* Reconfigure this block based on the mutator dialog's components.
|
||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
compose: function (containerBlock) {
|
||||
var itemBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
// Count number of inputs.
|
||||
var connections = [];
|
||||
var i = 0;
|
||||
while (itemBlock) {
|
||||
connections[i] = itemBlock.valueConnection_;
|
||||
itemBlock = itemBlock.nextConnection &&
|
||||
itemBlock.nextConnection.targetBlock();
|
||||
i++;
|
||||
}
|
||||
this.itemCount_ = i;
|
||||
this.updateShape_();
|
||||
// Reconnect any child blocks.
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
if (connections[i]) {
|
||||
this.getInput('ADD' + i).connection.connect(connections[i]);
|
||||
}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Store pointers to any connected child blocks.
|
||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
saveConnections: function (containerBlock) {
|
||||
var itemBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
var i = 0;
|
||||
while (itemBlock) {
|
||||
var input = this.getInput('ADD' + i);
|
||||
itemBlock.valueConnection_ = input && input.connection.targetConnection;
|
||||
i++;
|
||||
itemBlock = itemBlock.nextConnection &&
|
||||
itemBlock.nextConnection.targetBlock();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Modify this block to have the correct number of inputs.
|
||||
* @private
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
updateShape_: function () {
|
||||
// Delete everything.
|
||||
if (this.getInput('EMPTY')) {
|
||||
this.removeInput('EMPTY');
|
||||
} else {
|
||||
var i = 0;
|
||||
while (this.getInput('ADD' + i)) {
|
||||
this.removeInput('ADD' + i);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
// Rebuild block.
|
||||
if (this.itemCount_ == 0) {
|
||||
this.appendDummyInput('EMPTY')
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("");
|
||||
} else {
|
||||
for (var i = 0; i <= this.itemCount_; i++) {
|
||||
|
||||
if (i > 0 && i < this.itemCount_) {
|
||||
var input = this.appendValueInput('ADD' + i);
|
||||
input.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
input.appendField(",");
|
||||
}
|
||||
if (i == 0) {
|
||||
var input = this.appendValueInput('ADD' + i);
|
||||
input.setAlign(Blockly.inputs.Align.RIGHT);
|
||||
input.appendField("{");
|
||||
}
|
||||
else if (i == this.itemCount_) {
|
||||
var input = this.appendDummyInput('ADD' + i);
|
||||
input.setAlign(Blockly.inputs.Align.RIGHT);
|
||||
input.appendField("}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//一维数组循环
|
||||
export const loop_array = {
|
||||
init: function () {
|
||||
this.appendValueInput("name")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_GET_TYPE).appendField(new Blockly.FieldDropdown(DATATYPES), "TYPE")
|
||||
.appendField(Blockly.Msg.MIXLY_LIST_NAME);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.LEFT_CYCLE, "0"], [Blockly.Msg.RIGHT_CYCLE, "1"]]), "mode");
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(LISTS_HUE);
|
||||
this.setTooltip(Blockly.Msg.LEFT_CYCLE + Blockly.Msg.LEFT_CYCLE1 + Blockly.Msg.RIGHT_CYCLE + Blockly.Msg.RIGHT_CYCLE1);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//获取二维数组的行数与列数
|
||||
export const lists_array2_get_length = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_ARRAY2)
|
||||
.appendField(new Blockly.FieldTextInput("mylist"), "list_name")
|
||||
.appendField(" " + Blockly.Msg.MIXLY_GET)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.array2_rows, "row"], [Blockly.Msg.array2_cols, "col"]]), "type");
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(LISTS_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
149
boards/default_src/arduino_avr/blocks/logic.js
Normal file
149
boards/default_src/arduino_avr/blocks/logic.js
Normal file
@@ -0,0 +1,149 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const LOGIC_HUE = 210;
|
||||
|
||||
export const logic_compare = {
|
||||
/**
|
||||
* Block for comparison operator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
var OPERATORS = Blockly.RTL ? [
|
||||
['=', 'EQ'],
|
||||
['\u2260', 'NEQ'],
|
||||
['>', 'LT'],
|
||||
['\u2265', 'LTE'],
|
||||
['<', 'GT'],
|
||||
['\u2264', 'GTE']
|
||||
] : [
|
||||
['=', 'EQ'],
|
||||
['\u2260', 'NEQ'],
|
||||
['<', 'LT'],
|
||||
['\u2264', 'LTE'],
|
||||
['>', 'GT'],
|
||||
['\u2265', 'GTE']
|
||||
];
|
||||
//this.setHelpUrl(Blockly.Msg.LOGIC_COMPARE_HELPURL);
|
||||
this.setColour(LOGIC_HUE);
|
||||
this.setOutput(true, Boolean);
|
||||
this.appendValueInput('A');
|
||||
this.appendValueInput('B')
|
||||
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
|
||||
this.setInputsInline(true);
|
||||
// Assign 'this' to a variable for use in the tooltip closure below.
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var op = thisBlock.getFieldValue('OP');
|
||||
var TOOLTIPS = {
|
||||
'EQ': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ,
|
||||
'NEQ': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ,
|
||||
'LT': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT,
|
||||
'LTE': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE,
|
||||
'GT': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT,
|
||||
'GTE': Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE
|
||||
};
|
||||
return TOOLTIPS[op];
|
||||
});
|
||||
this.prevBlocks_ = [null, null];
|
||||
}
|
||||
};
|
||||
|
||||
export const logic_operation = {
|
||||
/**
|
||||
* Block for logical operations: 'and', 'or'.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
var OPERATORS = [
|
||||
[Blockly.Msg.LOGIC_OPERATION_AND, 'AND'],
|
||||
[Blockly.Msg.LOGIC_OPERATION_OR, 'OR']
|
||||
];
|
||||
//this.setHelpUrl(Blockly.Msg.LOGIC_OPERATION_HELPURL);
|
||||
this.setColour(LOGIC_HUE);
|
||||
this.setOutput(true, Boolean);
|
||||
this.appendValueInput('A')
|
||||
.setCheck([Boolean, Number]);
|
||||
this.appendValueInput('B')
|
||||
.setCheck([Boolean, Number])
|
||||
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
|
||||
this.setInputsInline(true);
|
||||
// Assign 'this' to a variable for use in the tooltip closure below.
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var op = thisBlock.getFieldValue('OP');
|
||||
var TOOLTIPS = {
|
||||
'AND': Blockly.Msg.LOGIC_OPERATION_TOOLTIP_AND,
|
||||
'OR': Blockly.Msg.LOGIC_OPERATION_TOOLTIP_OR
|
||||
};
|
||||
return TOOLTIPS[op];
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const logic_negate = {
|
||||
/**
|
||||
* Block for negation.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
//this.setHelpUrl(Blockly.Msg.LOGIC_NEGATE_HELPURL);
|
||||
this.setColour(LOGIC_HUE);
|
||||
this.setOutput(true, Boolean);
|
||||
this.appendValueInput('BOOL')
|
||||
.setCheck([Number, Boolean])
|
||||
.appendField(Blockly.Msg.LOGIC_NEGATE_TITLE);
|
||||
//this.interpolateMsg(Blockly.Msg.LOGIC_NEGATE_TITLE,
|
||||
// ['BOOL', Boolean, Blockly.inputs.Align.RIGHT],
|
||||
// Blockly.inputs.Align.RIGHT);
|
||||
this.setTooltip(Blockly.Msg.LOGIC_NEGATE_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const logic_boolean = {
|
||||
/**
|
||||
* Block for boolean data type: true and false.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
var BOOLEANS = [
|
||||
[Blockly.Msg.LOGIC_BOOLEAN_TRUE, 'TRUE'],
|
||||
[Blockly.Msg.LOGIC_BOOLEAN_FALSE, 'FALSE']
|
||||
];
|
||||
//this.setHelpUrl(Blockly.Msg.LOGIC_BOOLEAN_HELPURL);
|
||||
this.setColour(LOGIC_HUE);
|
||||
this.setOutput(true, Boolean);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown(BOOLEANS), 'BOOL');
|
||||
this.setTooltip(Blockly.Msg.LOGIC_BOOLEAN_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const logic_null = {
|
||||
/**
|
||||
* Block for null data type.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
//this.setHelpUrl(Blockly.Msg.LOGIC_NULL_HELPURL);
|
||||
this.setColour(LOGIC_HUE);
|
||||
this.setOutput(true);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.LOGIC_NULL);
|
||||
this.setTooltip(Blockly.Msg.LOGIC_NULL_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const logic_true_or_false = {
|
||||
init: function () {
|
||||
this.setColour(LOGIC_HUE);
|
||||
this.appendValueInput('A');
|
||||
this.appendValueInput('B')
|
||||
.appendField(Blockly.Msg.LOGIC_TERNARY_IF_TRUE);
|
||||
this.appendValueInput('C')
|
||||
.appendField(Blockly.Msg.LOGIC_TERNARY_IF_FALSE);
|
||||
this.setOutput(true);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_LOGIT_TRUEORFALSE);
|
||||
}
|
||||
};
|
||||
360
boards/default_src/arduino_avr/blocks/math.js
Normal file
360
boards/default_src/arduino_avr/blocks/math.js
Normal file
@@ -0,0 +1,360 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const MATH_HUE = 230;
|
||||
|
||||
Blockly.FieldTextInput.math_number_validator = function (text) {
|
||||
//return window.isNaN(text) ? null : String(text);
|
||||
return String(text);//不再校验
|
||||
};
|
||||
|
||||
export const math_number = {
|
||||
/**
|
||||
* Block for numeric value.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(MATH_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldTextInput('0',
|
||||
Blockly.FieldTextInput.math_number_validator), 'NUM');
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MATH_NUMBER_TOOLTIP);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#id2");
|
||||
}
|
||||
};
|
||||
|
||||
export const math_arithmetic = {
|
||||
/**
|
||||
* Block for basic arithmetic operator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
var OPERATORS = [
|
||||
[Blockly.Msg.MATH_ADDITION_SYMBOL, 'ADD'],
|
||||
[Blockly.Msg.MATH_SUBTRACTION_SYMBOL, 'MINUS'],
|
||||
[Blockly.Msg.MATH_MULTIPLICATION_SYMBOL, 'MULTIPLY'],
|
||||
[Blockly.Msg.MATH_DIVISION_SYMBOL, 'DIVIDE'],
|
||||
[Blockly.Msg.MATH_QUYU_SYMBOL, 'QUYU'],
|
||||
[Blockly.Msg.MATH_POWER_SYMBOL, 'POWER']
|
||||
];
|
||||
//this.setHelpUrl(Blockly.Msg.MATH_ARITHMETIC_HELPURL);
|
||||
this.setColour(MATH_HUE);
|
||||
this.setOutput(true, Number);
|
||||
this.appendValueInput('A')
|
||||
.setCheck(null);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#id4");
|
||||
this.appendValueInput('B')
|
||||
.setCheck(null)
|
||||
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
|
||||
this.setInputsInline(true);
|
||||
// Assign 'this' to a variable for use in the tooltip closure below.
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('OP');
|
||||
var TOOLTIPS = {
|
||||
'ADD': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD,
|
||||
'MINUS': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS,
|
||||
'MULTIPLY': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY,
|
||||
'DIVIDE': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,
|
||||
'QUYU': Blockly.Msg.MATH_MODULO_TOOLTIP,
|
||||
'POWER': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER
|
||||
};
|
||||
return TOOLTIPS[mode];
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const math_bit = {
|
||||
init: function () {
|
||||
var OPERATORS = [
|
||||
['&', '&'],
|
||||
['|', '|'],
|
||||
['xor', '^'],
|
||||
['>>', '>>'],
|
||||
['<<', '<<']
|
||||
];
|
||||
this.setColour(MATH_HUE);
|
||||
this.setOutput(true, Number);
|
||||
this.appendValueInput('A')
|
||||
.setCheck(Number);
|
||||
this.appendValueInput('B')
|
||||
.setCheck(Number)
|
||||
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#id8");
|
||||
}
|
||||
};
|
||||
|
||||
export const math_trig = {
|
||||
/**
|
||||
* Block for trigonometry operators.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
var OPERATORS = [
|
||||
['sin', 'SIN'],
|
||||
['cos', 'COS'],
|
||||
['tan', 'TAN'],
|
||||
['asin', 'ASIN'],
|
||||
['acos', 'ACOS'],
|
||||
['atan', 'ATAN'],
|
||||
['ln', 'LN'],
|
||||
['log10', 'LOG10'],
|
||||
['e^', 'EXP'],
|
||||
['10^', 'POW10'],
|
||||
['++', '++'],
|
||||
['--', '--'],
|
||||
['~', '~'],
|
||||
];
|
||||
//this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL);
|
||||
this.setColour(MATH_HUE);
|
||||
this.setOutput(true, Number);
|
||||
this.appendValueInput('NUM')
|
||||
.setCheck(Number)
|
||||
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
|
||||
// Assign 'this' to a variable for use in the tooltip closure below.
|
||||
var thisBlock = this;
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#id17");
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('OP');
|
||||
var TOOLTIPS = {
|
||||
'SIN': Blockly.Msg.MATH_TRIG_TOOLTIP_SIN,
|
||||
'COS': Blockly.Msg.MATH_TRIG_TOOLTIP_COS,
|
||||
'TAN': Blockly.Msg.MATH_TRIG_TOOLTIP_TAN,
|
||||
'ASIN': Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN,
|
||||
'ACOS': Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS,
|
||||
'ATAN': Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN
|
||||
};
|
||||
return TOOLTIPS[mode];
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
//取整等
|
||||
export const math_to_int = {
|
||||
init: function () {
|
||||
var OPERATORS = [
|
||||
[Blockly.Msg.LANG_MATH_TO_ROUND, 'round'],
|
||||
[Blockly.Msg.LANG_MATH_TO_CEIL, 'ceil'],
|
||||
[Blockly.Msg.LANG_MATH_TO_FLOOR, 'floor'],
|
||||
[Blockly.Msg.MATH_ABS, 'abs'],
|
||||
[Blockly.Msg.MATH_SQ, 'sq'],
|
||||
[Blockly.Msg.MATH_SQRT, 'sqrt']
|
||||
];
|
||||
this.setColour(MATH_HUE);
|
||||
this.appendValueInput('A')
|
||||
.setCheck(Number)
|
||||
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
|
||||
this.setOutput(true, Number);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#id18");
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('OP');
|
||||
var TOOLTIPS = {
|
||||
'sqrt': Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT,
|
||||
'abs': Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS,
|
||||
'sq': Blockly.Msg.MATH_SINGLE_TOOLTIP_SQ,
|
||||
'log': Blockly.Msg.MATH_SINGLE_TOOLTIP_LN,
|
||||
'round': Blockly.Msg.MATH_SINGLE_TOOLTIP_ROUND,
|
||||
'ceil': Blockly.Msg.MATH_SINGLE_TOOLTIP_CEIL,
|
||||
'floor': Blockly.Msg.MATH_SINGLE_TOOLTIP_FLOOR
|
||||
};
|
||||
return TOOLTIPS[mode];
|
||||
});
|
||||
}
|
||||
};
|
||||
//变量定义
|
||||
export const arduino_variate_type = {
|
||||
init: function () {
|
||||
var DATATYPES = [
|
||||
[Blockly.Msg.LANG_MATH_INT, 'int'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_INT, 'unsigned int'],
|
||||
[Blockly.Msg.LANG_MATH_WORD, 'word'],
|
||||
[Blockly.Msg.LANG_MATH_LONG, 'long'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_LONG, 'unsigned long'],
|
||||
[Blockly.Msg.LANG_MATH_FLOAT, 'float'],
|
||||
[Blockly.Msg.LANG_MATH_DOUBLE, 'double'],
|
||||
[Blockly.Msg.LANG_MATH_BOOLEAN, 'boolean'],
|
||||
[Blockly.Msg.LANG_MATH_BYTE, 'byte'],
|
||||
[Blockly.Msg.LANG_MATH_CHAR, 'char'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_CHAR, 'unsigned char'],
|
||||
[Blockly.Msg.LANG_MATH_STRING, 'String'],
|
||||
["uint8_t", "uint8_t"],
|
||||
["uint16_t", "uint16_t"],
|
||||
["uint32_t", "uint32_t"],
|
||||
["uint64_t", "uint64_t"]
|
||||
];
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown(DATATYPES), "variate_type");
|
||||
this.setOutput(true, null);
|
||||
this.setColour(MATH_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
//获取某个变量在内存中所占用的字节数
|
||||
export const math_SizeOf = {
|
||||
init: function () {
|
||||
this.appendValueInput("data")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_GET + " " + Blockly.Msg.MIXLY_I2C_BYTES);
|
||||
this.setInputsInline(false);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(MATH_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
//最大最小值
|
||||
export const math_max_min = {
|
||||
init: function () {
|
||||
var OPERATORS = [
|
||||
[Blockly.Msg.MIXLY_MAX, 'max'],
|
||||
[Blockly.Msg.MIXLY_MIN, 'min'],
|
||||
];
|
||||
this.setColour(MATH_HUE);
|
||||
this.appendValueInput('A')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP')
|
||||
.appendField('(');
|
||||
this.appendValueInput('B')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(',');
|
||||
this.appendDummyInput('')
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(')');
|
||||
this.setInputsInline(true);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#min-max");
|
||||
this.setOutput(true, Number);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('OP');
|
||||
var TOOLTIPS = {
|
||||
'max': Blockly.Msg.MIXLY_TOOLTIP_MATH_MAX,
|
||||
'min': Blockly.Msg.MIXLY_TOOLTIP_MATH_MIN
|
||||
};
|
||||
return TOOLTIPS[mode];
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const math_random_seed = {
|
||||
init: function () {
|
||||
this.setColour(MATH_HUE);
|
||||
// this.appendDummyInput()
|
||||
// .appendField(Blockly.Msg.LANG_MATH_RANDOM_SEED);
|
||||
this.appendValueInput('NUM')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.LANG_MATH_RANDOM_SEED);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_MATH_RANDOM_SEED);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#randomseed");
|
||||
}
|
||||
};
|
||||
|
||||
export const math_random_int = {
|
||||
/**
|
||||
* Block for random integer between [X] and [Y].
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(MATH_HUE);
|
||||
this.setOutput(true, Number);
|
||||
this.appendValueInput('FROM')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.LANG_MATH_RANDOM_INT_INPUT_FROM);
|
||||
this.appendValueInput('TO')
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.LANG_MATH_RANDOM_INT_INPUT_TO);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MATH_RANDOM_INT_TOOLTIP);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#random");
|
||||
}
|
||||
};
|
||||
|
||||
export const math_constrain = {
|
||||
/**
|
||||
* Block for constraining a number between two limits.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(MATH_HUE);
|
||||
this.setOutput(true, Number);
|
||||
this.appendValueInput('VALUE')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.LANG_MATH_CONSTRAIN_INPUT_CONSTRAIN);
|
||||
this.appendValueInput('LOW')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.LANG_MATH_CONSTRAIN_INPUT_LOW);
|
||||
this.appendValueInput('HIGH')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.LANG_MATH_CONSTRAIN_INPUT_HIGH);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MATH_CONSTRAIN_TOOLTIP);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#constrain");
|
||||
}
|
||||
};
|
||||
|
||||
export const base_map = {
|
||||
init: function () {
|
||||
this.setColour(MATH_HUE);
|
||||
this.appendValueInput("NUM", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_MAP)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.LANG_MATH_INT, "map_int"], [Blockly.Msg.LANG_MATH_FLOAT, "map_float"]]), "maptype")
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("fromLow", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_MAP_FROM)
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("fromHigh", Number)
|
||||
.appendField(",")
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("toLow", Number)
|
||||
.appendField(Blockly.Msg.MIXLY_MAP_TO)
|
||||
.setCheck(Number);
|
||||
this.appendValueInput("toHigh", Number)
|
||||
.appendField(",")
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField("]");
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_MATH_MAP);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/04.Mathematics.html#map");
|
||||
}
|
||||
};
|
||||
|
||||
export const variables_operation = {
|
||||
init: function () {
|
||||
this.setColour(MATH_HUE);
|
||||
this.appendValueInput("variables")
|
||||
.setCheck(null);
|
||||
this.appendValueInput("data")
|
||||
.setCheck(null)
|
||||
.appendField(new Blockly.FieldDropdown([["+=", "+"], ["-=", "-"], ["*=", "*"], ["/=", "/"]]), "type");
|
||||
this.appendDummyInput();
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const math_auto_add_or_minus = {
|
||||
init: function () {
|
||||
this.appendValueInput("math_auto_add_minus_output")
|
||||
.setCheck(null);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown([["++", "++"], ["--", "--"]]), "math_auto_add_minus_type");
|
||||
this.setInputsInline(true);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(MATH_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
80
boards/default_src/arduino_avr/blocks/pins.js
Normal file
80
boards/default_src/arduino_avr/blocks/pins.js
Normal file
@@ -0,0 +1,80 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
import { Profile } from 'mixly';
|
||||
|
||||
const PINS_HUE = 230;
|
||||
|
||||
export const pins_digital = {
|
||||
init: function () {
|
||||
this.setColour(PINS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.digital), 'PIN');
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
|
||||
export const pins_analog = {
|
||||
init: function () {
|
||||
this.setColour(PINS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.analog), 'PIN');
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
|
||||
export const pins_pwm = {
|
||||
init: function () {
|
||||
this.setColour(PINS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.pwm), 'PIN');
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
|
||||
export const pins_interrupt = {
|
||||
init: function () {
|
||||
this.setColour(PINS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.interrupt), 'PIN');
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
export const pins_MOSI = {
|
||||
init: function () {
|
||||
this.setColour(PINS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.MOSI), 'PIN');
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
export const pins_MISO = {
|
||||
init: function () {
|
||||
this.setColour(PINS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.MISO), 'PIN');
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
export const pins_SCK = {
|
||||
init: function () {
|
||||
this.setColour(PINS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.SCK), 'PIN');
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
export const pins_SCL = {
|
||||
init: function () {
|
||||
this.setColour(PINS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.SCL), 'PIN');
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
export const pins_SDA = {
|
||||
init: function () {
|
||||
this.setColour(PINS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.SDA), 'PIN');
|
||||
this.setOutput(true, Number);
|
||||
}
|
||||
};
|
||||
1237
boards/default_src/arduino_avr/blocks/procedures.js
Normal file
1237
boards/default_src/arduino_avr/blocks/procedures.js
Normal file
File diff suppressed because it is too large
Load Diff
63
boards/default_src/arduino_avr/blocks/scoop.js
Normal file
63
boards/default_src/arduino_avr/blocks/scoop.js
Normal file
@@ -0,0 +1,63 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const SCOOP_HUE = 120;
|
||||
|
||||
export const SCoopTask = {
|
||||
init: function () {
|
||||
var _tasknum = [["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"], ["6", "6"], ["7", "7"], ["8", "8"]];
|
||||
this.appendDummyInput()
|
||||
.appendField("Scoop Task")
|
||||
.appendField(new Blockly.FieldDropdown(_tasknum), "_tasknum");
|
||||
this.appendStatementInput("setup")
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP)
|
||||
.setCheck(null);
|
||||
this.appendStatementInput("loop")
|
||||
.appendField(Blockly.Msg.MIXLY_CONTROL_SCoop_loop)
|
||||
.setCheck(null);
|
||||
this.setColour(SCOOP_HUE);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SCOOP);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#scoop-task");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '控制', 'SCoop Task']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
export const SCoop_yield = {
|
||||
init: function () {
|
||||
this.setColour(SCOOP_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_CONTROL_SCoop_yield);
|
||||
this.setPreviousStatement(false, null);
|
||||
this.setNextStatement(false, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SCOOP_YIELD);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#scoop-task");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '控制', 'SCoop Task']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
export const SCoop_sleep = {
|
||||
init: function () {
|
||||
this.setColour(SCOOP_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_CONTROL_SCoop_sleep);
|
||||
this.appendValueInput("sleeplength", Number)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_MILLIS);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SCOOP_SLEEP);
|
||||
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#scoop-task");
|
||||
this.wiki = {
|
||||
'zh-hans': {
|
||||
page: ['Arduino AVR', '控制', 'SCoop Task']
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
1101
boards/default_src/arduino_avr/blocks/sensor.js
Normal file
1101
boards/default_src/arduino_avr/blocks/sensor.js
Normal file
File diff suppressed because it is too large
Load Diff
179
boards/default_src/arduino_avr/blocks/serial.js
Normal file
179
boards/default_src/arduino_avr/blocks/serial.js
Normal file
@@ -0,0 +1,179 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
import { Profile } from 'mixly';
|
||||
|
||||
const SERIAL_HUE = 65;
|
||||
|
||||
export const serial_begin = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendValueInput("CONTENT", Number)
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_BEGIN)
|
||||
.setCheck(Number);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SERIAL_BEGIN);
|
||||
}
|
||||
};
|
||||
|
||||
export const serial_write = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendValueInput("CONTENT", String)
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_WRITE);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.TEXT_WRITE_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const serial_print = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendValueInput("CONTENT", String)
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINT)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_PRINT_INLINE, "print"], [Blockly.Msg.TEXT_PRINT_Huanhang_TOOLTIP, "println"]]), "new_line");
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const serial_println = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendValueInput("CONTENT", String)
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINT)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.TEXT_PRINT_Huanhang_TOOLTIP, "println"], [Blockly.Msg.MIXLY_PRINT_INLINE, "print"]]), "new_line");
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const serial_print_num = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINT)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_PRINT_INLINE, "print"], [Blockly.Msg.TEXT_PRINT_Huanhang_TOOLTIP, "println"]]), "new_line")
|
||||
.appendField(Blockly.Msg.MIXLY_NUMBER);
|
||||
this.appendValueInput("CONTENT", Number)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MATH_HEX, "HEX"], [Blockly.Msg.MATH_BIN, "BIN"], [Blockly.Msg.MATH_OCT, "OCT"], [Blockly.Msg.MATH_DEC, "DEC"]]), "STAT")
|
||||
.setCheck(Number);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.TEXT_PRINT_HEX_TOOLTIP);
|
||||
}
|
||||
};
|
||||
|
||||
export const serial_print_hex = serial_print_num;
|
||||
|
||||
export const serial_available = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_AVAILABLE);
|
||||
this.setOutput(true, Boolean);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_SERIAL_AVAILABLE);
|
||||
}
|
||||
};
|
||||
|
||||
export const serial_readstr = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_READSTR);
|
||||
this.setOutput(true, String);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_SERIAL_READ_STR);
|
||||
}
|
||||
};
|
||||
|
||||
export const serial_readstr_until = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendValueInput("CONTENT", Number)
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_READSTR_UNTIL)
|
||||
.setCheck(Number);
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, String);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SERIAL_READSTRUNITL.replace('%1', Blockly.Arduino.valueToCode(this, 'CONTENT', Blockly.Arduino.ORDER_ATOMIC)));
|
||||
}
|
||||
};
|
||||
|
||||
export const serial_parseInt_Float = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
//.appendField(Blockly.Msg.MIXLY_SERIAL_READ)
|
||||
.appendField(new Blockly.FieldDropdown([["read", "read"], ["peek", "peek"], ["parseInt", "parseInt"], ["parseFloat", "parseFloat"]]), "STAT");
|
||||
this.setOutput(true, Number);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var op = thisBlock.getFieldValue('STAT');
|
||||
var TOOLTIPS = {
|
||||
'parseInt': Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_SERIAL_READ_INT,
|
||||
'parseFloat': Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_SERIAL_READ_FLOAT
|
||||
};
|
||||
return TOOLTIPS[op];
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const serial_flush = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_FLUSH);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SERIAL_FLUSH);
|
||||
}
|
||||
};
|
||||
export const serial_softserial = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP)
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select");
|
||||
this.appendValueInput("RX", Number)
|
||||
.setCheck(Number)
|
||||
.appendField("RX#")
|
||||
.setAlign(Blockly.inputs.Align.RIGHT);
|
||||
this.appendValueInput("TX", Number)
|
||||
.appendField("TX#")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SOFTSERIAL.replace('%1', Blockly.Arduino.valueToCode(this, 'RX', Blockly.Arduino.ORDER_ATOMIC))
|
||||
.replace('%2', Blockly.Arduino.valueToCode(this, 'TX', Blockly.Arduino.ORDER_ATOMIC)));
|
||||
}
|
||||
};
|
||||
|
||||
export const serial_event = {
|
||||
init: function () {
|
||||
this.setColour(SERIAL_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown(Profile.default.serial_select), "serial_select")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_EVENT);
|
||||
this.appendStatementInput('DO')
|
||||
.appendField(Blockly.Msg.MIXLY_DO);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_SERIALEVENT);
|
||||
}
|
||||
};
|
||||
313
boards/default_src/arduino_avr/blocks/storage.js
Normal file
313
boards/default_src/arduino_avr/blocks/storage.js
Normal file
@@ -0,0 +1,313 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const STORAGE_HUE = 0;
|
||||
|
||||
export const store_sd_init = {
|
||||
init: function () {
|
||||
this.appendDummyInput("")
|
||||
.appendField("SD")
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP);
|
||||
this.appendValueInput("PIN_MOSI")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("MOSI")
|
||||
.appendField(Blockly.Msg.MIXLY_PIN);
|
||||
this.appendValueInput("PIN_MISO")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("MISO")
|
||||
.appendField(Blockly.Msg.MIXLY_PIN);
|
||||
this.appendValueInput("PIN_SCK")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("CLK")
|
||||
.appendField(Blockly.Msg.MIXLY_PIN);
|
||||
this.appendValueInput("PIN_CS")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("CS")
|
||||
.appendField(Blockly.Msg.MIXLY_PIN);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.setInputsInline(false);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl('');
|
||||
}
|
||||
};
|
||||
|
||||
export const store_sd_init_32 = {
|
||||
init: function () {
|
||||
this.appendDummyInput("")
|
||||
.appendField("SD")
|
||||
.appendField(Blockly.Msg.MIXLY_SETUP);
|
||||
this.appendValueInput("PIN_MOSI")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("MOSI")
|
||||
.appendField(Blockly.Msg.MIXLY_PIN);
|
||||
this.appendValueInput("PIN_MISO")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("MISO")
|
||||
.appendField(Blockly.Msg.MIXLY_PIN);
|
||||
this.appendValueInput("PIN_SCK")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("CLK")
|
||||
.appendField(Blockly.Msg.MIXLY_PIN);
|
||||
this.appendValueInput("PIN_CS")
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField("CS")
|
||||
.appendField(Blockly.Msg.MIXLY_PIN);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.setInputsInline(false);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl('');
|
||||
}
|
||||
};
|
||||
|
||||
export const sd_card_type = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField("SD" + Blockly.Msg.MIXLY_TYPE);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const sd_card_root_files = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_SD_LIST_FILES);
|
||||
this.setOutput(false, null);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
var volume_TYPE = [
|
||||
[Blockly.Msg.MIXLY_SD_clusterCount, 'volume.clusterCount()'],
|
||||
[Blockly.Msg.MIXLY_SD_blocksPerCluster, 'volume.blocksPerCluster()'],
|
||||
[Blockly.Msg.MIXLY_SD_TOTAL_blocks, 'volume.blocksPerCluster() * volume.clusterCount()'],
|
||||
["FAT" + Blockly.Msg.MIXLY_TYPE, 'volume.fatType()'],
|
||||
[Blockly.Msg.MIXLY_volume + "(KB)", 'volume.blocksPerCluster()*volume.clusterCount()/2'],
|
||||
[Blockly.Msg.MIXLY_volume + "(MB)", 'volume.blocksPerCluster()*volume.clusterCount()/2/1024'],
|
||||
[Blockly.Msg.MIXLY_volume + "(GB)", 'volume.blocksPerCluster()*volume.clusterCount()/2/1024/1024.0'],
|
||||
];
|
||||
|
||||
export const sd_volume = {
|
||||
init: function () {
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField("SD")
|
||||
.appendField(new Blockly.FieldDropdown(volume_TYPE), 'volume_TYPE');
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip();
|
||||
}
|
||||
};
|
||||
|
||||
export const sd_exist = {
|
||||
init: function () {
|
||||
this.appendValueInput("FileName");
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_SD_FILE_Exist);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const sd_DelFile = {
|
||||
init: function () {
|
||||
this.appendValueInput("FileName")
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_DELETE_VAR);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const sd_read = {
|
||||
init: function () {
|
||||
this.appendValueInput("FileName")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_READ);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const store_sd_write = {
|
||||
init: function () {
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.appendValueInput("FILE")
|
||||
.appendField(Blockly.Msg.MIXLY_WRITE_SD_FILE);
|
||||
this.appendValueInput("DATA", String)
|
||||
.setCheck([String, Number])
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_SD_DATA);
|
||||
this.appendValueInput("NEWLINE", Boolean)
|
||||
.setCheck(Boolean)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_SD_NEWLINE);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_STORE_SDWRITE);
|
||||
}
|
||||
};
|
||||
|
||||
export const store_eeprom_write_long = {
|
||||
init: function () {
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.appendValueInput("ADDRESS", Number)
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_EEPROM_WRITE_LONG);
|
||||
this.appendValueInput("DATA", Number)
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_DATA);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_STORE_EEPROM_WRITELONG);
|
||||
}
|
||||
};
|
||||
|
||||
export const store_eeprom_read_long = {
|
||||
init: function () {
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.appendValueInput("ADDRESS", Number)
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_EEPROM_READ_LONG);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_STORE_EEPROM_READLONG);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const store_eeprom_write_byte = {
|
||||
init: function () {
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.appendValueInput("ADDRESS", Number)
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_EEPROM_WRITE_BYTE);
|
||||
this.appendValueInput("DATA", Number)
|
||||
.setCheck(Number)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_DATA);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_STORE_EEPROM_WRITEBYTE);
|
||||
}
|
||||
};
|
||||
|
||||
export const store_eeprom_read_byte = {
|
||||
init: function () {
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.appendValueInput("ADDRESS", Number)
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_EEPROM_READ_BYTE);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_STORE_EEPROM_READBYTE);
|
||||
}
|
||||
};
|
||||
|
||||
export const store_eeprom_put = {
|
||||
init: function () {
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.appendValueInput("ADDRESS")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_ESP32_WRITE)
|
||||
//.appendField(new Blockly.FieldDropdown([[Blockly.Msg.LANG_MATH_INT,"int"],[Blockly.Msg.LANG_MATH_LONG,"long"],[Blockly.Msg.LANG_MATH_FLOAT,"float"],[Blockly.Msg.LANG_MATH_BYTE,"byte"],["字节数组","byte_array"],["字符数组","char_array"]]), "type")
|
||||
.appendField("EEPROM")
|
||||
.appendField(Blockly.Msg.MQTT_SERVER_ADD);
|
||||
this.appendValueInput("DATA")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_SD_DATA);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_STORE_EEPROM_PUT);
|
||||
}
|
||||
};
|
||||
|
||||
export const store_eeprom_get = {
|
||||
init: function () {
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.appendValueInput("ADDRESS")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_READ)
|
||||
//.appendField(new Blockly.FieldDropdown([[Blockly.Msg.LANG_MATH_INT,"int"],[Blockly.Msg.LANG_MATH_LONG,"long"],[Blockly.Msg.LANG_MATH_FLOAT,"float"],[Blockly.Msg.LANG_MATH_BYTE,"byte"],["字节数组","byte_array"],["字符数组","char_array"]]), "type")
|
||||
.appendField("EEPROM")
|
||||
.appendField(Blockly.Msg.MQTT_SERVER_ADD);
|
||||
this.appendValueInput("DATA")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.SAVETO + ' ' + Blockly.Msg.MSG["catVar"]);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_STORE_EEPROM_GET);
|
||||
}
|
||||
};
|
||||
|
||||
//ESP32简化SPIFFS
|
||||
var OPEN_MODE1 = [
|
||||
[Blockly.Msg.TEXT_WRITE_TEXT, '1'],
|
||||
[Blockly.Msg.TEXT_APPEND_APPENDTEXT, '2']]
|
||||
|
||||
export const simple_spiffs_read = {
|
||||
init: function () {
|
||||
this.appendValueInput("FileName")
|
||||
.appendField(Blockly.Msg.MIXLY_SERIAL_READ);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const simple_spiffs_store_spiffs_write = {
|
||||
init: function () {
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.appendValueInput("FILE")
|
||||
.appendField(Blockly.Msg.MIXLY_WRITE_SPIFFS_FILE);
|
||||
this.appendValueInput("DATA", String)
|
||||
.setCheck([String, Number])
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_SD_DATA);
|
||||
this.appendValueInput("NEWLINE", Boolean)
|
||||
.setCheck(Boolean)
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.MIXLY_SD_NEWLINE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_MODE)
|
||||
.appendField(new Blockly.FieldDropdown(OPEN_MODE1), 'MODE');
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_STORE_SDWRITE);
|
||||
}
|
||||
};
|
||||
|
||||
export const simple_spiffs_DelFile = {
|
||||
init: function () {
|
||||
this.appendValueInput("FileName")
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_DELETE_VAR);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(STORAGE_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
568
boards/default_src/arduino_avr/blocks/text.js
Normal file
568
boards/default_src/arduino_avr/blocks/text.js
Normal file
@@ -0,0 +1,568 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const TEXTS_HUE = 160;
|
||||
|
||||
export const text = {
|
||||
/**
|
||||
* Block for text value.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
//this.setHelpUrl(Blockly.Msg.TEXT_TEXT_HELPURL);
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(this.newQuote_(true))
|
||||
.appendField(new Blockly.FieldTextInput(''), 'TEXT')
|
||||
.appendField(this.newQuote_(false));
|
||||
this.setOutput(true, String);
|
||||
this.setTooltip(Blockly.Msg.TEXT_TEXT_TOOLTIP);
|
||||
},
|
||||
/**
|
||||
* Create an image of an open or closed quote.
|
||||
* @param {boolean} open True if open quote, false if closed.
|
||||
* @return {!Blockly.FieldImage} The field image of the quote.
|
||||
* @private
|
||||
*/
|
||||
newQuote_: function (open) {
|
||||
if (open == this.RTL) {
|
||||
var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==';
|
||||
} else {
|
||||
var file = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC';
|
||||
}
|
||||
return new Blockly.FieldImage(file, 12, 12, '"');
|
||||
}
|
||||
};
|
||||
|
||||
Blockly.FieldTextInput.char_validator = function (text) {
|
||||
if (text.length > 1) {
|
||||
if (text.charAt(0) === "\\") {
|
||||
var charAtOne = text.charAt(1);
|
||||
if (charAtOne === "0" ||
|
||||
charAtOne === "b" ||
|
||||
charAtOne === "f" ||
|
||||
charAtOne === "n" ||
|
||||
charAtOne === "r" ||
|
||||
charAtOne === "t" ||
|
||||
charAtOne === "\\" ||
|
||||
charAtOne === "'") {
|
||||
return String(text).substring(0, 2);
|
||||
} else if (charAtOne === "x" && text.charAt(2) === "0" && text.charAt(3) === "B") {
|
||||
return String(text).substring(0, 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
return String(text).substring(0, 1);
|
||||
};
|
||||
|
||||
export const text_char = {
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(this.newQuote_(true))
|
||||
.appendField(new Blockly.FieldTextInput('', Blockly.FieldTextInput.char_validator), 'TEXT')
|
||||
.appendField(this.newQuote_(false));
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.TEXT_CHAR_TOOLTIP);
|
||||
},
|
||||
newQuote_: function (open) {
|
||||
if (open == true) {
|
||||
var file = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAkBAMAAAB/KNeuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAbUExURQAAAP///////////////////////////////+tNPsIAAAAIdFJOUwAe1q4KRGaFPS0VAQAAAKlJREFUGNNVkD0LwkAMhlNsnUvBH+DmKnXoeODgWgXBsaOj+AGuVfTys8318l7OTA/hTe7JEWmVNwekA/fAHfNSsVoxew0/mfkbeSvo6wkLSbx0tJH2XdPS/pClsfxs7TA5WOQNl5M9X3bMF8RlS608z+JhFOZNMowybftw4GDvjHmTsc84PJJ4iPbgWcZVxuEUMHXKvS2dZHVgxJHpV4qr4Brei+Oe/usHT1JfDpNGeM0AAAAASUVORK5CYII=";
|
||||
|
||||
} else {
|
||||
var file = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAkBAMAAAB/KNeuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAbUExURQAAAP///////////////////////////////+tNPsIAAAAIdFJOUwAe1q4KRGaFPS0VAQAAAKpJREFUGNNV0bEKAjEMBuActOd6KIKrg+h4cII3Cg6u5yA6Ot4DONxcUfPYJmnaxn/6KEmaUoD/LK+XxAUibhuhR85bvBLjQHR99DqXIL7ItTo0xdyQ3RrvjWlQZQyT8cnYjcXgbl2XzBmNe5kv4WUfar6kUc9o56N6nh4Zy1NrHZ8iuSN+lB5LCR0HnXIuy/hd7qymUs3bf7WajsNQrn9CHr7Jn+IOaUH4ATxJW2wDnL5kAAAAAElFTkSuQmCC";
|
||||
}
|
||||
return new Blockly.FieldImage(file, 7, 12, '"');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const text_join = {
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendValueInput('A')
|
||||
.setCheck([String, Number]);
|
||||
this.appendValueInput('B')
|
||||
.setCheck([String, Number])
|
||||
.appendField(Blockly.Msg.MIXLY_TEXT_JOIN);
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, String);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TEXT_JOIN);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
export const text_to_number = {
|
||||
init: function () {
|
||||
var TO_INT_FLOAT = [
|
||||
[Blockly.Msg.MIXLY_TO_INT, 'toInt'],
|
||||
[Blockly.Msg.MIXLY_TO_FLOAT, 'toFloat']
|
||||
];
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendValueInput('VAR')
|
||||
.setCheck([String, Number])
|
||||
.appendField(new Blockly.FieldDropdown(TO_INT_FLOAT), 'TOWHAT');
|
||||
this.setOutput(true, Number);
|
||||
var thisBlock = this;
|
||||
this.setTooltip(function () {
|
||||
var mode = thisBlock.getFieldValue('TOWHAT');
|
||||
var TOOLTIPS = {
|
||||
'toInt': Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOINT,
|
||||
'toFloat': Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOFLOAT
|
||||
};
|
||||
return TOOLTIPS[mode];
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const ascii_to_char = {
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendValueInput('VAR')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_TOCHAR);
|
||||
this.setOutput(true, String);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOCHAR);
|
||||
}
|
||||
};
|
||||
|
||||
export const char_to_ascii = {
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_TOASCII)
|
||||
.appendField("'")
|
||||
.appendField(new Blockly.FieldTextInput('', Blockly.FieldTextInput.char_validator), 'TEXT')
|
||||
.appendField("'");
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOASCII);
|
||||
}
|
||||
};
|
||||
|
||||
export const number_to_text = {
|
||||
init: function () {
|
||||
var TO_INT_FLOAT = [
|
||||
[Blockly.Msg.MATH_BIN, 'BIN'],
|
||||
[Blockly.Msg.MATH_OCT, 'OCT'],
|
||||
[Blockly.Msg.MATH_DEC, 'DEC'],
|
||||
[Blockly.Msg.MATH_HEX, 'HEX']
|
||||
];
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendValueInput('VAR')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_TOSTRING)
|
||||
.appendField(new Blockly.FieldDropdown(TO_INT_FLOAT), 'TOWHAT');
|
||||
this.setOutput(true, String);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOTEXT);
|
||||
}
|
||||
};
|
||||
|
||||
export const number_to_text_ = {
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendValueInput('VAR')
|
||||
.setCheck(Number)
|
||||
.appendField(Blockly.Msg.MIXLY_TOSTRING);
|
||||
this.setOutput(true, String);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TEXT_TOTEXT);
|
||||
}
|
||||
};
|
||||
|
||||
export const text_length = {
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendValueInput("VAR")
|
||||
.appendField(Blockly.Msg.MIXLY_LENGTH)
|
||||
.setCheck(String);
|
||||
this.setOutput(true, Number);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_TEXT_LENGTH);
|
||||
}
|
||||
}
|
||||
|
||||
export const text_char_at = {
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendValueInput("VAR")
|
||||
.setCheck(String);
|
||||
this.appendValueInput("AT")
|
||||
.appendField(Blockly.Msg.TEXT_CHARAT)
|
||||
.setCheck(Number);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.TEXT_CHARAT2);
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
var self = this;
|
||||
this.setTooltip(function () {
|
||||
return Blockly.Msg.MIXLY_TOOLTIP_TEXT_FIND_CHAR_AT.replace('%1', Blockly.Arduino.valueToCode(self, 'VAR', Blockly.Arduino.ORDER_ATOMIC));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export const text_equals_starts_ends = {
|
||||
init: function () {
|
||||
var TEXT_DOWHAT = [
|
||||
[Blockly.Msg.MIXLY_EQUALS, 'equals'],
|
||||
[Blockly.Msg.MIXLY_STARTSWITH, 'startsWith'],
|
||||
[Blockly.Msg.MIXLY_ENDSWITH, 'endsWith']
|
||||
];
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendValueInput("STR1")
|
||||
.setCheck([String, Number]);
|
||||
this.appendValueInput("STR2")
|
||||
.appendField(new Blockly.FieldDropdown(TEXT_DOWHAT), 'DOWHAT')
|
||||
.setCheck([String, Number]);
|
||||
this.setOutput(true, [Boolean, Number]);
|
||||
this.setInputsInline(true);
|
||||
var self = this;
|
||||
this.setTooltip(function () {
|
||||
var op = self.getFieldValue('DOWHAT');
|
||||
var TOOLTIPS = {
|
||||
'equals': Blockly.Msg.MIXLY_EQUALS,
|
||||
'startsWith': Blockly.Msg.MIXLY_STARTSWITH,
|
||||
'endsWith': Blockly.Msg.MIXLY_ENDSWITH
|
||||
};
|
||||
return Blockly.Msg.MIXLY_TOOLTIP_TEXT_EQUALS_STARTS_ENDS.replace('%1', TOOLTIPS[op]).replace('%2', Blockly.Arduino.valueToCode(self, 'STR2', Blockly.Arduino.ORDER_ATOMIC));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export const text_compareTo = {
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendValueInput("STR1")
|
||||
.setCheck([String, Number]);
|
||||
this.appendValueInput("STR2")
|
||||
.appendField(Blockly.Msg.MIXLY_COMPARETO)
|
||||
.setCheck([String, Number]);
|
||||
this.setOutput(true, Number);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_COMPARETO_HELP);
|
||||
}
|
||||
}
|
||||
//小数获取有效位
|
||||
export const decimal_places = {
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendValueInput("numeral")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.LANG_MATH_FLOAT);
|
||||
this.appendValueInput("decimal_places")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.TEXT_KEEP);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.TEXT_DECIMAL);
|
||||
this.setOutput(true, null);
|
||||
this.setTooltip(Blockly.Msg.DECIMAL_PLACES_HELP);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
//截取字符串
|
||||
export const substring = {
|
||||
init: function () {
|
||||
this.appendValueInput("name")
|
||||
.setCheck(null);
|
||||
this.appendValueInput("Start")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.LISTS_GET_INDEX_GET);
|
||||
this.appendValueInput("end")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.TEXT_TO);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.LANG_MATH_STRING);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.setTooltip(Blockly.Msg.SUBSTRING_HELP);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
//字符串转化为大小写
|
||||
export const letter_conversion = {
|
||||
init: function () {
|
||||
this.appendValueInput("String")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.STRING_VARIABLE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.LETTERS_ARE_CONVERTED_TO)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.CAPITAL, ".toUpperCase()"], [Blockly.Msg.LOWER_CASE, ".toLowerCase()"]]), "type");
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.setTooltip(Blockly.Msg.LETTER_CONVERSION_HELP);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//字符串变量替换
|
||||
export const data_replacement = {
|
||||
init: function () {
|
||||
this.appendValueInput("String")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.STRING_VARIABLE);
|
||||
this.appendValueInput("source_data")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.LANG_MATH_STRING);
|
||||
this.appendValueInput("replace")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.REPLACE_WITH);
|
||||
this.appendDummyInput();
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.setTooltip(Blockly.Msg.DATA_REPLACEMENT_HELP);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//消除非可视字符
|
||||
export const eliminate = {
|
||||
init: function () {
|
||||
this.appendValueInput("String")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.STRING_VARIABLE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.ELIMINATE_NON_VISUAL_CHARACTERS);
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.setTooltip(Blockly.Msg.ELIMINATE_HELP);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//检测是否以特定字符串开头或结尾
|
||||
export const first_and_last = {
|
||||
init: function () {
|
||||
this.appendValueInput("String")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.LANG_MATH_STRING);
|
||||
this.appendValueInput("String1")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.AS_A_STRING);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.STARTSWITH, ".startsWith"], [Blockly.Msg.ENDSWITH, ".endsWith"]]), "type");
|
||||
this.setOutput(true, null);
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.setTooltip(Blockly.Msg.FIRST_AND_LAST_HELP);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
//数据类型转换
|
||||
export const type_conversion = {
|
||||
init: function () {
|
||||
this.appendValueInput("variable")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.DATA_TYPE_CONVERSION)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.LANG_MATH_STRING, "String"], [Blockly.Msg.LANG_MATH_CHAR, "char"], [Blockly.Msg.LANG_MATH_BYTE, "byte"], [Blockly.Msg.LANG_MATH_INT, "int"], [Blockly.Msg.LANG_MATH_LONG, "long"], [Blockly.Msg.LANG_MATH_FLOAT, "float"], [Blockly.Msg.LANG_MATH_WORD, "word"]]), "type");
|
||||
this.setOutput(true, null);
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.setTooltip(Blockly.Msg.TYPE_CONVERSION_HELP);
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const create_with_item = {
|
||||
/**
|
||||
* Mutator bolck for adding items.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP);
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
export const create_with_container = {
|
||||
/**
|
||||
* Mutator block for list container.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.HTML_TEXT);
|
||||
this.appendStatementInput('STACK');
|
||||
this.setTooltip("");
|
||||
this.contextMenu = false;
|
||||
}
|
||||
};
|
||||
|
||||
export const String_indexOf = {
|
||||
init: function () {
|
||||
this.appendValueInput("str1")
|
||||
.setCheck(null);
|
||||
this.appendDummyInput()
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN);
|
||||
this.appendValueInput("str2")
|
||||
.setCheck(null);
|
||||
this.appendDummyInput()
|
||||
.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
.appendField(Blockly.Msg.SERIES_INDEX);
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(160);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const text_join2 = {
|
||||
/**
|
||||
* Block for creating a list with any number of elements of any type.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
init: function () {
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_TEXT_JOIN + Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING);
|
||||
this.itemCount_ = 3;
|
||||
this.updateShape_();
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, null);
|
||||
this.setMutator(new Blockly.icons.MutatorIcon(['create_with_item'], this));
|
||||
this.setTooltip("");
|
||||
},
|
||||
/**
|
||||
* Create XML to represent list inputs.
|
||||
* @return {Element} XML storage element.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
mutationToDom: function () {
|
||||
var container = Blockly.utils.xml.createElement('mutation');
|
||||
container.setAttribute('items', this.itemCount_);
|
||||
return container;
|
||||
},
|
||||
/**
|
||||
* Parse XML to restore the list inputs.
|
||||
* @param {!Element} xmlElement XML storage element.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
domToMutation: function (xmlElement) {
|
||||
this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);
|
||||
this.updateShape_();
|
||||
},
|
||||
/**
|
||||
* Populate the mutator's dialog with this block's components.
|
||||
* @param {!Blockly.Workspace} workspace Mutator's workspace.
|
||||
* @return {!Blockly.Block} Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
decompose: function (workspace) {
|
||||
var containerBlock =
|
||||
workspace.newBlock('create_with_container');
|
||||
containerBlock.initSvg();
|
||||
var connection = containerBlock.getInput('STACK').connection;
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
var itemBlock = workspace.newBlock('create_with_item');
|
||||
itemBlock.initSvg();
|
||||
connection.connect(itemBlock.previousConnection);
|
||||
connection = itemBlock.nextConnection;
|
||||
}
|
||||
return containerBlock;
|
||||
},
|
||||
/**
|
||||
* Reconfigure this block based on the mutator dialog's components.
|
||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
compose: function (containerBlock) {
|
||||
var itemBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
// Count number of inputs.
|
||||
var connections = [];
|
||||
var i = 0;
|
||||
while (itemBlock) {
|
||||
connections[i] = itemBlock.valueConnection_;
|
||||
itemBlock = itemBlock.nextConnection &&
|
||||
itemBlock.nextConnection.targetBlock();
|
||||
i++;
|
||||
}
|
||||
this.itemCount_ = i;
|
||||
this.updateShape_();
|
||||
// Reconnect any child blocks.
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
if (connections[i]) {
|
||||
this.getInput('ADD' + i).connection.connect(connections[i]);
|
||||
}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Store pointers to any connected child blocks.
|
||||
* @param {!Blockly.Block} containerBlock Root block in mutator.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
saveConnections: function (containerBlock) {
|
||||
var itemBlock = containerBlock.getInputTargetBlock('STACK');
|
||||
var i = 0;
|
||||
while (itemBlock) {
|
||||
var input = this.getInput('ADD' + i);
|
||||
itemBlock.valueConnection_ = input && input.connection.targetConnection;
|
||||
i++;
|
||||
itemBlock = itemBlock.nextConnection &&
|
||||
itemBlock.nextConnection.targetBlock();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Modify this block to have the correct number of inputs.
|
||||
* @private
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
updateShape_: function () {
|
||||
// Delete everything.
|
||||
if (this.getInput('EMPTY')) {
|
||||
this.removeInput('EMPTY');
|
||||
} else {
|
||||
var i = 0;
|
||||
while (this.getInput('ADD' + i)) {
|
||||
this.removeInput('ADD' + i);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
// Rebuild block.
|
||||
if (this.itemCount_ == 0) {
|
||||
this.appendDummyInput('EMPTY')
|
||||
.appendField("无需要连接的字符串");
|
||||
} else {
|
||||
for (var i = 0; i < this.itemCount_; i++) {
|
||||
var input = this.appendValueInput('ADD' + i);
|
||||
if (i > 0) {
|
||||
input.setAlign(Blockly.inputs.Align.RIGHT)
|
||||
input.appendField("+");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//Arduinojson数据解析
|
||||
export const Arduinojson = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.ARDUINOJSON_STRING_PARSING);
|
||||
this.appendDummyInput("")
|
||||
.appendField(new Blockly.FieldMultilineInput('const size_t capacity = JSON_ARRAY_SIZE(3) + 10;\nDynamicJsonBuffer jsonBuffer(capacity);\nconst char* json = "[\\"0\\",\\"74\\",\\"134\\"]";\nJsonArray& root = jsonBuffer.parseArray(json);\nconst char* root_0 = root[0]; // "0"\nconst char* root_1 = root[1]; // "74"\nconst char* root_2 = root[2]; // "134"'), 'VALUE');
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setColour(120);
|
||||
this.setTooltip(Blockly.Msg.ARDUINOJSON_STRING_PARSING1);
|
||||
this.setHelpUrl("https://arduinojson.org/v5/assistant/");
|
||||
}
|
||||
};
|
||||
|
||||
//字符串转长整数
|
||||
export const String_to_Long_Integer = {
|
||||
init: function () {
|
||||
this.appendValueInput("data")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING + Blockly.Msg.A_TO_B + Blockly.Msg.LANG_MATH_LONG)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MATH_HEX, "16"], [Blockly.Msg.MATH_DEC, "10"], [Blockly.Msg.MATH_OCT, "8"], [Blockly.Msg.MATH_BIN, "2"], [Blockly.Msg.blynk_IOT_AUTO, "0"]]), "type");
|
||||
this.setOutput(true, null);
|
||||
this.setColour(TEXTS_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("https://blog.csdn.net/lizhengze1117/article/details/103318662?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-10.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-10.base");
|
||||
}
|
||||
};
|
||||
281
boards/default_src/arduino_avr/blocks/tools.js
Normal file
281
boards/default_src/arduino_avr/blocks/tools.js
Normal file
@@ -0,0 +1,281 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const TOOLS_HUE = "#555555";
|
||||
const LISTS_HUE = 260;
|
||||
|
||||
export const factory_notes = {
|
||||
init: function () {
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.MIXLY_CONTROL_NOTES)
|
||||
.appendField(new Blockly.FieldMultilineInput(''), 'VALUE');
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
}
|
||||
};
|
||||
|
||||
export const folding_block = {
|
||||
init: function () {
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldTextInput(Blockly.Msg.FOLDING_BLOCK), "peien");
|
||||
this.appendStatementInput('DO')
|
||||
.appendField('');
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setTooltip(Blockly.Msg.FOLDING_BLOCK_HELP);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//IIC地址查找
|
||||
export const IICSCAN = {
|
||||
init: function () {
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.IICSCAN);
|
||||
this.setInputsInline(true);
|
||||
this.setTooltip('');
|
||||
}
|
||||
};
|
||||
|
||||
//取模工具显示数据部分
|
||||
export const tool_modulus_show = {
|
||||
init: function () {
|
||||
this.setColour(LISTS_HUE);
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.OLED_BITMAP_NAME)
|
||||
.appendField(new Blockly.FieldTextInput('mylist'), 'VAR')
|
||||
.appendField('[')
|
||||
.appendField(new Blockly.FieldTextInput('3'), 'x')
|
||||
.appendField(']');
|
||||
this.appendDummyInput("")
|
||||
.appendField(Blockly.Msg.SAVETO + " flash")
|
||||
.appendField(new Blockly.FieldCheckbox("true"), "save_hz");
|
||||
this.appendValueInput("input_data");
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip("");
|
||||
}
|
||||
};
|
||||
|
||||
//取模工具设置部分
|
||||
export const tool_modulus = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField("点阵格式")
|
||||
.appendField(new Blockly.FieldDropdown([["阴码", "1"], ["阳码", "2"]]), "bitmap_formats")
|
||||
.appendField(" 取模方式")
|
||||
.appendField(new Blockly.FieldDropdown([["逐列式", "1"], ["逐行式", "2"], ["列行式", "3"], ["行列式", "4"]]), "modulus_way")
|
||||
.appendField(" 取模走向")
|
||||
.appendField(new Blockly.FieldDropdown([["顺向(高位在前)", "1"], ["逆向(低位在前)", "2"]]), "modulus_direction");
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NAME)
|
||||
.appendField(new Blockly.FieldDropdown([["华文黑体", "STHeiti"], ["华文楷体", "STKaiti"], ["华文细黑", "STXihei"], ["华文宋体", "STSong"], ["华文中宋", "STZhongsong"], ["华文仿宋", "STFangsong"], ["华文彩云", "STCaiyun"], ["华文琥珀", "STHupo"], ["华文隶书", "STLiti"], ["华文行楷", "STXingkai"], ["华文新魏", "STXinwei"], ["黑体", "simHei"], ["宋体", "simSun"], ["新宋体", "NSimSun"], ["仿宋", "FangSong"], ["楷体", "KaiTi"], ["仿宋_GB2312", "FangSong_GB2312"], ["楷体_GB2312", "KaiTi_GB2312"], ["隶书", "LiSu"], ["幼圆", "YouYuan"], ["新细明体", "PMingLiU"], ["细明体", "MingLiU"], ["标楷体", "DFKai-SB"], ["微软正黑体", "Microsoft JhengHei"], ["微软雅黑体", "Microsoft YaHei"]]), "hz_sharp")
|
||||
.appendField(Blockly.Msg.MIXLY_TURTLE_WRITE_FONT_NUM)
|
||||
.appendField(new Blockly.FieldTextInput("16"), "hz_line_height")
|
||||
.appendField("px")
|
||||
//.appendField("px "+Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_FILE_SEEK_OFFSET+":")
|
||||
//.appendField(new Blockly.FieldDropdown([["上移","hz_up"],["下移","hz_down"]]), "hz_up_down")
|
||||
//.appendField(new Blockly.FieldTextInput("0"), "hz_up_down_data")
|
||||
//.appendField("px ")
|
||||
// .appendField(new Blockly.FieldDropdown([["左移","hz_left"],["右移","hz_right"]]), "hz_left_right")
|
||||
//.appendField(new Blockly.FieldTextInput("0"), "hz_left_right_data")
|
||||
//.appendField("px");
|
||||
// this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.MIXLY_WIDTH)
|
||||
.appendField(new Blockly.FieldTextInput("16"), "bitmap_width")
|
||||
.appendField("px " + Blockly.Msg.MIXLY_HEIGHT)
|
||||
.appendField(new Blockly.FieldTextInput("16"), "bitmap_height")
|
||||
.appendField("px");
|
||||
// .appendField(new Blockly.FieldCheckbox("true"), "show_hz");
|
||||
this.appendDummyInput()
|
||||
.appendField("输入数据")
|
||||
.appendField(new Blockly.FieldTextInput(""), "input_data");
|
||||
this.setInputsInline(false);
|
||||
this.setOutput(true, null);
|
||||
//this.setColour("#cc66cc");
|
||||
this.setColour(180);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
|
||||
export const uno_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/uno.png'), 525, 372, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const nano_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/nano.png'), 525, 368, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const mega_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/mega.png'), 525, 736, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const promini_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/ProMini.png'), 525, 371, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const leonardo_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/leonardo.png'), 525, 371, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const esp32s2_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/ESP32s2.jpg'), 525, 376, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const esp32c3_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/ESP32c3.jpg'), 525, 376, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const core_esp32c3_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/core_esp32c3_pin.png'), 500, 376, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const esp32s3_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/ESP32s3.jpg'), 500, 350, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const esp8266_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/ESP8266-NodeMCU.png'), 525, 346, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const wemos_d1_mini_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/ESP8266-WeMos-D1-Mini.png'), 525, 264, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl();
|
||||
}
|
||||
};
|
||||
|
||||
export const stm32f103c8t6_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldImage(require('../../../../common/media/board_pin/STM32F103C8T6.png'), 525, 376, "*"));
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip();
|
||||
this.setHelpUrl("https://blog.csdn.net/xatsoft/article/details/90687016?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.nonecase");
|
||||
}
|
||||
};
|
||||
|
||||
//获取两个日期差值
|
||||
export const get_the_number_of_days_between_the_two_dates = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField(Blockly.Msg.GET_THE_DIFFERENCE_BETWEEN_TWO_DATES);
|
||||
this.appendValueInput("year_start")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.START + Blockly.Msg.MIXLY_GPS_DATE_YEAR);
|
||||
this.appendValueInput("month_start")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.START + Blockly.Msg.MIXLY_GPS_DATE_MONTH);
|
||||
this.appendValueInput("day_start")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.START + Blockly.Msg.MIXLY_GPS_DATE_DAY);
|
||||
this.appendValueInput("year_end")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.END + Blockly.Msg.MIXLY_GPS_DATE_YEAR);
|
||||
this.appendValueInput("month_end")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.END + Blockly.Msg.MIXLY_GPS_DATE_MONTH);
|
||||
this.appendValueInput("day_end")
|
||||
.setCheck(null)
|
||||
.appendField(Blockly.Msg.END + Blockly.Msg.MIXLY_GPS_DATE_DAY);
|
||||
this.setOutput(true, null);
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("https://blog.csdn.net/a_ran/article/details/43601699?utm_source=distribute.pc_relevant.none-task");
|
||||
}
|
||||
};
|
||||
|
||||
var esp8266_board_pin_type = [
|
||||
["D0", "16"],
|
||||
["D1", "5"],
|
||||
["D2", "4"],
|
||||
["D3", "0"],
|
||||
["D4", "2"],
|
||||
["D5", "14"],
|
||||
["D6", "12"],
|
||||
["D7", "13"],
|
||||
["D8", "15"],
|
||||
["RX", "3"],
|
||||
["TX", "1"],
|
||||
["A0", "A0"],
|
||||
["SD3", "10"],
|
||||
["SD2", "9"]
|
||||
];
|
||||
|
||||
export const esp8266_board_pin = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField("ESP8266 GPIO")
|
||||
.appendField(new Blockly.FieldDropdown(esp8266_board_pin_type), "pin");
|
||||
this.setOutput(true, null);
|
||||
this.setColour(TOOLS_HUE);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
128
boards/default_src/arduino_avr/blocks/variables.js
Normal file
128
boards/default_src/arduino_avr/blocks/variables.js
Normal file
@@ -0,0 +1,128 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
|
||||
const VARIABLES_HUE = 330;
|
||||
|
||||
var DATATYPES = [
|
||||
[Blockly.Msg.LANG_MATH_INT, 'int'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_INT, 'unsigned int'],
|
||||
[Blockly.Msg.LANG_MATH_WORD, 'word'],
|
||||
[Blockly.Msg.LANG_MATH_LONG, 'long'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_LONG, 'unsigned long'],
|
||||
[Blockly.Msg.LANG_MATH_FLOAT, 'float'],
|
||||
[Blockly.Msg.LANG_MATH_DOUBLE, 'double'],
|
||||
[Blockly.Msg.LANG_MATH_BOOLEAN, 'boolean'],
|
||||
[Blockly.Msg.LANG_MATH_BYTE, 'byte'],
|
||||
[Blockly.Msg.LANG_MATH_CHAR, 'char'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_CHAR, 'unsigned char'],
|
||||
[Blockly.Msg.LANG_MATH_STRING, 'String'],
|
||||
["char*", "char*"],
|
||||
["uint8_t", "uint8_t"],
|
||||
["uint16_t", "uint16_t"],
|
||||
["uint32_t", "uint32_t"],
|
||||
["uint64_t", "uint64_t"]
|
||||
];
|
||||
// ************************************************************************
|
||||
// THIS SECTION IS INSERTED INTO BLOCKLY BY BLOCKLYDUINO.
|
||||
export const variables_declare = {
|
||||
// Variable setter.
|
||||
init: function () {
|
||||
this.setColour(VARIABLES_HUE);
|
||||
this.appendValueInput('VALUE', null)
|
||||
.appendField(Blockly.Msg.MIXLY_DECLARE)
|
||||
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_GLOBAL_VARIABLE, "global_variate"], [Blockly.Msg.MIXLY_LOCAL_VARIABLE, "local_variate"]]), "variables_type")
|
||||
.appendField(new Blockly.FieldTextInput('item'), 'VAR')
|
||||
.appendField(Blockly.Msg.MIXLY_AS)
|
||||
.appendField(new Blockly.FieldDropdown(DATATYPES), "TYPE")
|
||||
.appendField(Blockly.Msg.MIXLY_VALUE);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_VARIABLES_DECLARE);
|
||||
},
|
||||
getVars: function () {
|
||||
return [this.getFieldValue('VAR')];
|
||||
},
|
||||
renameVar: function (oldName, newName) {
|
||||
if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {
|
||||
this.setFieldValue(newName, 'VAR');
|
||||
}
|
||||
}
|
||||
};
|
||||
// ************************************************************************
|
||||
|
||||
export const variables_get = {
|
||||
init: function () {
|
||||
this.setColour(VARIABLES_HUE);
|
||||
this.appendDummyInput()
|
||||
.appendField(new Blockly.FieldTextInput('item'), 'VAR')
|
||||
this.setOutput(true);
|
||||
this.setTooltip(Blockly.Msg.VARIABLES_GET_TOOLTIP);
|
||||
},
|
||||
getVars: function () {
|
||||
return [this.getFieldValue('VAR')];
|
||||
},
|
||||
renameVar: function (oldName, newName) {
|
||||
if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {
|
||||
this.setFieldValue(newName, 'VAR');
|
||||
}
|
||||
}/*,
|
||||
onchange: function() {
|
||||
var varName = Blockly.Arduino.variableDB_.getName(this.getFieldValue('VAR'),Blockly.Variables.NAME_TYPE);
|
||||
if(Blockly.Arduino.definitions_['var_declare'+varName]){
|
||||
this.setWarningText(null);
|
||||
}else{
|
||||
this.setWarningText(Blockly.Msg.MIXLY_WARNING_NOT_DECLARE);
|
||||
}
|
||||
}*/
|
||||
};
|
||||
|
||||
export const variables_set = {
|
||||
init: function () {
|
||||
this.setColour(VARIABLES_HUE);
|
||||
this.appendValueInput('VALUE')
|
||||
.appendField(new Blockly.FieldTextInput('item'), 'VAR')
|
||||
.appendField(Blockly.Msg.MIXLY_VALUE2);
|
||||
this.setPreviousStatement(true);
|
||||
this.setNextStatement(true);
|
||||
this.setTooltip(Blockly.Msg.VARIABLES_SET_TOOLTIP);
|
||||
},
|
||||
getVars: function () {
|
||||
return [this.getFieldValue('VAR')];
|
||||
},
|
||||
renameVar: function (oldName, newName) {
|
||||
if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {
|
||||
this.setFieldValue(newName, 'VAR');
|
||||
}
|
||||
}
|
||||
};
|
||||
/**
|
||||
* Block for basic data type change.
|
||||
* @this Blockly.Block
|
||||
*/
|
||||
export const variables_change = {
|
||||
init: function () {
|
||||
this.setColour(VARIABLES_HUE);
|
||||
var DATATYPES = [
|
||||
[Blockly.Msg.LANG_MATH_INT, 'int'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_INT, 'unsigned int'],
|
||||
[Blockly.Msg.LANG_MATH_WORD, 'word'],
|
||||
[Blockly.Msg.LANG_MATH_LONG, 'long'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_LONG, 'unsigned long'],
|
||||
[Blockly.Msg.LANG_MATH_FLOAT, 'float'],
|
||||
[Blockly.Msg.LANG_MATH_DOUBLE, 'double'],
|
||||
[Blockly.Msg.LANG_MATH_BOOLEAN, 'boolean'],
|
||||
[Blockly.Msg.LANG_MATH_BYTE, 'byte'],
|
||||
[Blockly.Msg.LANG_MATH_CHAR, 'char'],
|
||||
[Blockly.Msg.LANG_MATH_UNSIGNED_CHAR, 'unsigned char'],
|
||||
[Blockly.Msg.LANG_MATH_STRING, 'String']
|
||||
];
|
||||
this.appendValueInput('MYVALUE')
|
||||
.appendField(new Blockly.FieldDropdown(DATATYPES), 'OP');
|
||||
// Assign 'this' to a variable for use in the tooltip closure below.
|
||||
this.setOutput(true);
|
||||
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_VARIABLES_CHANGE);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
319
boards/default_src/arduino_avr/css/color.css
Normal file
319
boards/default_src/arduino_avr/css/color.css
Normal file
@@ -0,0 +1,319 @@
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/inout.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/inout2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/ctrl.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(2)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/ctrl2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/math.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(3)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/math2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/logic.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(4)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/logic2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/text.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(5)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/text2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/list.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(6)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/list2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/var.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(7)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/var2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/func.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(8)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/func2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/port.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(9)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/port2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/sensor.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(10)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/sensor2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第一个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div:nth-child(2)>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/motor.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第一个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div:nth-child(2)>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/motor2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第一个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div:nth-child(2)>div:nth-child(2)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/voice.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第一个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div:nth-child(2)>div:nth-child(2)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/voice2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第一个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div:nth-child(2)>div:nth-child(3)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/light.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第一个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(11)>div:nth-child(2)>div:nth-child(3)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/light2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第一个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div:nth-child(2)>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/4Digitdisplay.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第一个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div:nth-child(2)>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/4Digitdisplay2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第二个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div:nth-child(2)>div:nth-child(2)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/lcd.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第二个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div:nth-child(2)>div:nth-child(2)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/lcd2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第三个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div:nth-child(2)>div:nth-child(3)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/oled.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第三个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div:nth-child(2)>div:nth-child(3)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/oled2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第四个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div:nth-child(2)>div:nth-child(4)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/oled.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第四个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div:nth-child(2)>div:nth-child(4)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/oled2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第五个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div:nth-child(2)>div:nth-child(5)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/Matrix.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第五个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(12)>div:nth-child(2)>div:nth-child(5)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/Matrix2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div.blocklyTreeRow>span.blocklyTreeIcon.blocklyTreeIconNone {
|
||||
background: url('../../../../common/media/mark/comuni.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div.blocklyTreeRow.blocklyTreeSelected>span.blocklyTreeIcon.blocklyTreeIconNone {
|
||||
background: url('../../../../common/media/mark/comuni2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第1个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div:nth-child(2)>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/comuni.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第1个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div:nth-child(2)>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/comuni2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第2个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div:nth-child(2)>div:nth-child(2)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/comuni.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第2个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div:nth-child(2)>div:nth-child(2)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/comuni2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第3个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div:nth-child(2)>div:nth-child(3)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/comuni.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第3个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div:nth-child(2)>div:nth-child(3)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/comuni2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第4个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div:nth-child(2)>div:nth-child(4)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/comuni.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第4个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(13)>div:nth-child(2)>div:nth-child(4)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/comuni2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTreeRow>span.blocklyTreeIcon.blocklyTreeIconNone {
|
||||
background: url('../../../../common/media/mark/store.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div.blocklyTreeRow.blocklyTreeSelected>span.blocklyTreeIcon.blocklyTreeIconNone {
|
||||
background: url('../../../../common/media/mark/store2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第一个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div:nth-child(2)>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/store.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第一个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div:nth-child(2)>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/store2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第二个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div:nth-child(2)>div:nth-child(2)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/store.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第二个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(14)>div:nth-child(2)>div:nth-child(2)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/store2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第二个图标(未选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(15)>div:nth-child(2)>div:nth-child(1)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/blynk.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
/*子模块的第二个图标(选中时)*/
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(15)>div:nth-child(2)>div:nth-child(1)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/blynk2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(17)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/factory3.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(17)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/factory4.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(18)>div.blocklyTreeRow>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/tool.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
|
||||
div.blocklyToolboxDiv>div.blocklyToolboxContents>div:nth-child(18)>div.blocklyTreeRow.blocklyTreeSelected>div.blocklyTreeRowContentContainer>span.blocklyTreeIcon {
|
||||
background: url('../../../../common/media/mark/tool2.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
}
|
||||
87
boards/default_src/arduino_avr/export.js
Normal file
87
boards/default_src/arduino_avr/export.js
Normal file
@@ -0,0 +1,87 @@
|
||||
import ArduinoAVRPins from './pins/pins';
|
||||
|
||||
import * as ArduinoAVRActuatorBlocks from './blocks/actuator';
|
||||
import * as ArduinoAVRBlynkBlocks from './blocks/blynk';
|
||||
import * as ArduinoAVRCommunicateBlocks from './blocks/communicate';
|
||||
import * as ArduinoAVRControlBlocks from './blocks/control';
|
||||
import * as ArduinoAVRDisplayBlocks from './blocks/display';
|
||||
import * as ArduinoAVREthernetBlocks from './blocks/ethernet';
|
||||
import * as ArduinoAVRFactoryBlocks from './blocks/factory';
|
||||
import * as ArduinoAVRInoutBlocks from './blocks/inout';
|
||||
import * as ArduinoAVRListsBlocks from './blocks/lists';
|
||||
import * as ArduinoAVRLogicBlocks from './blocks/logic';
|
||||
import * as ArduinoAVRMathBlocks from './blocks/math';
|
||||
import * as ArduinoAVRPinsBlocks from './blocks/pins';
|
||||
import * as ArduinoAVRProceduresBlocks from './blocks/procedures';
|
||||
import * as ArduinoAVRScoopBlocks from './blocks/scoop';
|
||||
import * as ArduinoAVRSensorBlocks from './blocks/sensor';
|
||||
import * as ArduinoAVRSerialBlocks from './blocks/serial';
|
||||
import * as ArduinoAVRStorageBlocks from './blocks/storage';
|
||||
import * as ArduinoAVRTextBlocks from './blocks/text';
|
||||
import * as ArduinoAVRToolsBlocks from './blocks/tools';
|
||||
import * as ArduinoAVRVariablesBlocks from './blocks/variables';
|
||||
|
||||
import * as ArduinoAVRActuatorGenerators from './generators/actuator';
|
||||
import * as ArduinoAVRBlynkGenerators from './generators/blynk';
|
||||
import * as ArduinoAVRCommunicateGenerators from './generators/communicate';
|
||||
import * as ArduinoAVRControlGenerators from './generators/control';
|
||||
import * as ArduinoAVRDisplayGenerators from './generators/display';
|
||||
import * as ArduinoAVREthernetGenerators from './generators/ethernet';
|
||||
import * as ArduinoAVRFactoryGenerators from './generators/factory';
|
||||
import * as ArduinoAVRInoutGenerators from './generators/inout';
|
||||
import * as ArduinoAVRListsGenerators from './generators/lists';
|
||||
import * as ArduinoAVRLogicGenerators from './generators/logic';
|
||||
import * as ArduinoAVRMathGenerators from './generators/math';
|
||||
import * as ArduinoAVRPinsGenerators from './generators/pins';
|
||||
import * as ArduinoAVRProceduresGenerators from './generators/procedures';
|
||||
import * as ArduinoAVRScoopGenerators from './generators/scoop';
|
||||
import * as ArduinoAVRSensorGenerators from './generators/sensor';
|
||||
import * as ArduinoAVRSerialGenerators from './generators/serial';
|
||||
import * as ArduinoAVRStorageGenerators from './generators/storage';
|
||||
import * as ArduinoAVRTextGenerators from './generators/text';
|
||||
import * as ArduinoAVRToolsGenerators from './generators/tools';
|
||||
import * as ArduinoAVRVariablesGenerators from './generators/variables';
|
||||
|
||||
export {
|
||||
ArduinoAVRPins,
|
||||
ArduinoAVRActuatorBlocks,
|
||||
ArduinoAVRBlynkBlocks,
|
||||
ArduinoAVRCommunicateBlocks,
|
||||
ArduinoAVRControlBlocks,
|
||||
ArduinoAVRDisplayBlocks,
|
||||
ArduinoAVREthernetBlocks,
|
||||
ArduinoAVRFactoryBlocks,
|
||||
ArduinoAVRInoutBlocks,
|
||||
ArduinoAVRListsBlocks,
|
||||
ArduinoAVRLogicBlocks,
|
||||
ArduinoAVRMathBlocks,
|
||||
ArduinoAVRPinsBlocks,
|
||||
ArduinoAVRProceduresBlocks,
|
||||
ArduinoAVRScoopBlocks,
|
||||
ArduinoAVRSensorBlocks,
|
||||
ArduinoAVRSerialBlocks,
|
||||
ArduinoAVRStorageBlocks,
|
||||
ArduinoAVRTextBlocks,
|
||||
ArduinoAVRToolsBlocks,
|
||||
ArduinoAVRVariablesBlocks,
|
||||
ArduinoAVRActuatorGenerators,
|
||||
ArduinoAVRBlynkGenerators,
|
||||
ArduinoAVRCommunicateGenerators,
|
||||
ArduinoAVRControlGenerators,
|
||||
ArduinoAVRDisplayGenerators,
|
||||
ArduinoAVREthernetGenerators,
|
||||
ArduinoAVRFactoryGenerators,
|
||||
ArduinoAVRInoutGenerators,
|
||||
ArduinoAVRListsGenerators,
|
||||
ArduinoAVRLogicGenerators,
|
||||
ArduinoAVRMathGenerators,
|
||||
ArduinoAVRPinsGenerators,
|
||||
ArduinoAVRProceduresGenerators,
|
||||
ArduinoAVRScoopGenerators,
|
||||
ArduinoAVRSensorGenerators,
|
||||
ArduinoAVRSerialGenerators,
|
||||
ArduinoAVRStorageGenerators,
|
||||
ArduinoAVRTextGenerators,
|
||||
ArduinoAVRToolsGenerators,
|
||||
ArduinoAVRVariablesGenerators
|
||||
};
|
||||
732
boards/default_src/arduino_avr/generators/actuator.js
Normal file
732
boards/default_src/arduino_avr/generators/actuator.js
Normal 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;
|
||||
};
|
||||
894
boards/default_src/arduino_avr/generators/blynk.js
Normal file
894
boards/default_src/arduino_avr/generators/blynk.js
Normal 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;
|
||||
};
|
||||
696
boards/default_src/arduino_avr/generators/communicate.js
Normal file
696
boards/default_src/arduino_avr/generators/communicate.js
Normal 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; //选择操作的块地址0~63';
|
||||
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];
|
||||
};
|
||||
238
boards/default_src/arduino_avr/generators/control.js
Normal file
238
boards/default_src/arduino_avr/generators/control.js
Normal 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;
|
||||
};
|
||||
1369
boards/default_src/arduino_avr/generators/display.js
Normal file
1369
boards/default_src/arduino_avr/generators/display.js
Normal file
File diff suppressed because it is too large
Load Diff
3179
boards/default_src/arduino_avr/generators/ethernet.js
Normal file
3179
boards/default_src/arduino_avr/generators/ethernet.js
Normal file
File diff suppressed because it is too large
Load Diff
117
boards/default_src/arduino_avr/generators/factory.js
Normal file
117
boards/default_src/arduino_avr/generators/factory.js
Normal 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];
|
||||
}
|
||||
265
boards/default_src/arduino_avr/generators/inout.js
Normal file
265
boards/default_src/arduino_avr/generators/inout.js
Normal 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];
|
||||
}
|
||||
288
boards/default_src/arduino_avr/generators/lists.js
Normal file
288
boards/default_src/arduino_avr/generators/lists.js
Normal 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];
|
||||
}
|
||||
58
boards/default_src/arduino_avr/generators/logic.js
Normal file
58
boards/default_src/arduino_avr/generators/logic.js
Normal 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];
|
||||
}
|
||||
239
boards/default_src/arduino_avr/generators/math.js
Normal file
239
boards/default_src/arduino_avr/generators/math.js
Normal 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;
|
||||
}
|
||||
13
boards/default_src/arduino_avr/generators/pins.js
Normal file
13
boards/default_src/arduino_avr/generators/pins.js
Normal 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;
|
||||
107
boards/default_src/arduino_avr/generators/procedures.js
Normal file
107
boards/default_src/arduino_avr/generators/procedures.js
Normal 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;
|
||||
}
|
||||
30
boards/default_src/arduino_avr/generators/scoop.js
Normal file
30
boards/default_src/arduino_avr/generators/scoop.js
Normal 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;
|
||||
}
|
||||
736
boards/default_src/arduino_avr/generators/sensor.js
Normal file
736
boards/default_src/arduino_avr/generators/sensor.js
Normal 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];
|
||||
}
|
||||
110
boards/default_src/arduino_avr/generators/serial.js
Normal file
110
boards/default_src/arduino_avr/generators/serial.js
Normal 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 "";
|
||||
}
|
||||
262
boards/default_src/arduino_avr/generators/storage.js
Normal file
262
boards/default_src/arduino_avr/generators/storage.js
Normal 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;
|
||||
}
|
||||
152
boards/default_src/arduino_avr/generators/text.js
Normal file
152
boards/default_src/arduino_avr/generators/text.js
Normal 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];
|
||||
}
|
||||
605
boards/default_src/arduino_avr/generators/tools.js
Normal file
605
boards/default_src/arduino_avr/generators/tools.js
Normal 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];
|
||||
}
|
||||
61
boards/default_src/arduino_avr/generators/variables.js
Normal file
61
boards/default_src/arduino_avr/generators/variables.js
Normal 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];
|
||||
}
|
||||
120
boards/default_src/arduino_avr/index.js
Normal file
120
boards/default_src/arduino_avr/index.js
Normal file
@@ -0,0 +1,120 @@
|
||||
import * as Blockly from 'blockly/core';
|
||||
import { Profile } from 'mixly';
|
||||
|
||||
import {
|
||||
ArduinoEthernetBlocks,
|
||||
ArduinoTextBlocks,
|
||||
ArduinoEthernetGenerators,
|
||||
ArduinoTextGenerators,
|
||||
Procedures,
|
||||
Variables,
|
||||
Arduino
|
||||
} from '@mixly/arduino';
|
||||
|
||||
import {
|
||||
ArduinoAVRPins,
|
||||
ArduinoAVRActuatorBlocks,
|
||||
ArduinoAVRBlynkBlocks,
|
||||
ArduinoAVRCommunicateBlocks,
|
||||
ArduinoAVRControlBlocks,
|
||||
ArduinoAVRDisplayBlocks,
|
||||
ArduinoAVREthernetBlocks,
|
||||
ArduinoAVRFactoryBlocks,
|
||||
ArduinoAVRInoutBlocks,
|
||||
ArduinoAVRListsBlocks,
|
||||
ArduinoAVRLogicBlocks,
|
||||
ArduinoAVRMathBlocks,
|
||||
ArduinoAVRPinsBlocks,
|
||||
ArduinoAVRProceduresBlocks,
|
||||
ArduinoAVRScoopBlocks,
|
||||
ArduinoAVRSensorBlocks,
|
||||
ArduinoAVRSerialBlocks,
|
||||
ArduinoAVRStorageBlocks,
|
||||
ArduinoAVRTextBlocks,
|
||||
ArduinoAVRToolsBlocks,
|
||||
ArduinoAVRVariablesBlocks,
|
||||
ArduinoAVRActuatorGenerators,
|
||||
ArduinoAVRBlynkGenerators,
|
||||
ArduinoAVRCommunicateGenerators,
|
||||
ArduinoAVRControlGenerators,
|
||||
ArduinoAVRDisplayGenerators,
|
||||
ArduinoAVREthernetGenerators,
|
||||
ArduinoAVRFactoryGenerators,
|
||||
ArduinoAVRInoutGenerators,
|
||||
ArduinoAVRListsGenerators,
|
||||
ArduinoAVRLogicGenerators,
|
||||
ArduinoAVRMathGenerators,
|
||||
ArduinoAVRPinsGenerators,
|
||||
ArduinoAVRProceduresGenerators,
|
||||
ArduinoAVRScoopGenerators,
|
||||
ArduinoAVRSensorGenerators,
|
||||
ArduinoAVRSerialGenerators,
|
||||
ArduinoAVRStorageGenerators,
|
||||
ArduinoAVRTextGenerators,
|
||||
ArduinoAVRToolsGenerators,
|
||||
ArduinoAVRVariablesGenerators
|
||||
} from './';
|
||||
|
||||
import './css/color.css';
|
||||
|
||||
Blockly.Arduino = Arduino;
|
||||
Blockly.generator = Arduino;
|
||||
|
||||
Object.assign(Blockly.Variables, Variables);
|
||||
Object.assign(Blockly.Procedures, Procedures);
|
||||
|
||||
Profile.default = {};
|
||||
Object.assign(Profile, ArduinoAVRPins);
|
||||
Object.assign(Profile.default, ArduinoAVRPins.arduino_standard);
|
||||
|
||||
Object.assign(
|
||||
Blockly.Blocks,
|
||||
ArduinoEthernetBlocks,
|
||||
ArduinoTextBlocks,
|
||||
ArduinoAVRActuatorBlocks,
|
||||
ArduinoAVRBlynkBlocks,
|
||||
ArduinoAVRCommunicateBlocks,
|
||||
ArduinoAVRControlBlocks,
|
||||
ArduinoAVRDisplayBlocks,
|
||||
ArduinoAVREthernetBlocks,
|
||||
ArduinoAVRFactoryBlocks,
|
||||
ArduinoAVRInoutBlocks,
|
||||
ArduinoAVRListsBlocks,
|
||||
ArduinoAVRLogicBlocks,
|
||||
ArduinoAVRMathBlocks,
|
||||
ArduinoAVRPinsBlocks,
|
||||
ArduinoAVRProceduresBlocks,
|
||||
ArduinoAVRScoopBlocks,
|
||||
ArduinoAVRSensorBlocks,
|
||||
ArduinoAVRSerialBlocks,
|
||||
ArduinoAVRStorageBlocks,
|
||||
ArduinoAVRTextBlocks,
|
||||
ArduinoAVRToolsBlocks,
|
||||
ArduinoAVRVariablesBlocks
|
||||
);
|
||||
|
||||
Object.assign(
|
||||
Blockly.Arduino.forBlock,
|
||||
ArduinoEthernetGenerators,
|
||||
ArduinoTextGenerators,
|
||||
ArduinoAVRActuatorGenerators,
|
||||
ArduinoAVRBlynkGenerators,
|
||||
ArduinoAVRCommunicateGenerators,
|
||||
ArduinoAVRControlGenerators,
|
||||
ArduinoAVRDisplayGenerators,
|
||||
ArduinoAVREthernetGenerators,
|
||||
ArduinoAVRFactoryGenerators,
|
||||
ArduinoAVRInoutGenerators,
|
||||
ArduinoAVRListsGenerators,
|
||||
ArduinoAVRLogicGenerators,
|
||||
ArduinoAVRMathGenerators,
|
||||
ArduinoAVRPinsGenerators,
|
||||
ArduinoAVRProceduresGenerators,
|
||||
ArduinoAVRScoopGenerators,
|
||||
ArduinoAVRSensorGenerators,
|
||||
ArduinoAVRSerialGenerators,
|
||||
ArduinoAVRStorageGenerators,
|
||||
ArduinoAVRTextGenerators,
|
||||
ArduinoAVRToolsGenerators,
|
||||
ArduinoAVRVariablesGenerators
|
||||
);
|
||||
109
boards/default_src/arduino_avr/origin/config.json
Normal file
109
boards/default_src/arduino_avr/origin/config.json
Normal file
@@ -0,0 +1,109 @@
|
||||
{
|
||||
"board": {
|
||||
"Arduino/Genuino Uno": {
|
||||
"key": "arduino:avr:uno",
|
||||
"config": []
|
||||
},
|
||||
"Arduino Nano": {
|
||||
"key": "arduino:avr:nano",
|
||||
"config": [
|
||||
{
|
||||
"label": "Processor",
|
||||
"key": "cpu",
|
||||
"options": [
|
||||
{
|
||||
"key": "atmega328old",
|
||||
"label": "ATmega328P (Old Bootloader)"
|
||||
}, {
|
||||
"key": "atmega328",
|
||||
"label": "ATmega328P"
|
||||
}, {
|
||||
"key": "atmega168",
|
||||
"label": "ATmega168"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"Arduino Pro or Pro Mini": {
|
||||
"key": "arduino:avr:pro",
|
||||
"config": [
|
||||
{
|
||||
"label": "Processor",
|
||||
"key": "cpu",
|
||||
"options": [
|
||||
{
|
||||
"key": "16MHzatmega328",
|
||||
"label": "ATmega328P (5V, 16 MHz)"
|
||||
}, {
|
||||
"key": "8MHzatmega328",
|
||||
"label": "ATmega328P (3.3V, 8 MHz)"
|
||||
}, {
|
||||
"key": "16MHzatmega168",
|
||||
"label": "ATmega168 (5V, 16 MHz)"
|
||||
}, {
|
||||
"key": "8MHzatmega168",
|
||||
"label": "ATmega168 (3.3V, 8 MHz)"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"Arduino Mega or Mega 2560": {
|
||||
"key": "arduino:avr:mega",
|
||||
"config": [
|
||||
{
|
||||
"label": "Processor",
|
||||
"key": "cpu",
|
||||
"options": [
|
||||
{
|
||||
"key": "atmega2560",
|
||||
"label": "ATmega2560 (Mega 2560)"
|
||||
}, {
|
||||
"key": "atmega1280",
|
||||
"label": "ATmega1280"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"Arduino Leonardo": "arduino:avr:leonardo"
|
||||
},
|
||||
"language": "C/C++",
|
||||
"burn": "None",
|
||||
"upload": {
|
||||
"portSelect": "all"
|
||||
},
|
||||
"nav": {
|
||||
"compile": true,
|
||||
"upload": true,
|
||||
"save": {
|
||||
"ino": true,
|
||||
"hex": true
|
||||
},
|
||||
"setting": {
|
||||
"thirdPartyLibrary": true,
|
||||
"wiki": true
|
||||
}
|
||||
},
|
||||
"serial": {
|
||||
"ctrlCBtn": false,
|
||||
"ctrlDBtn": false,
|
||||
"baudRates": 9600,
|
||||
"yMax": 100,
|
||||
"yMin": 0,
|
||||
"pointNum": 100,
|
||||
"rts": true,
|
||||
"dtr": true
|
||||
},
|
||||
"lib": {
|
||||
"mixly": {
|
||||
"url": [
|
||||
"http://download.mixlylibs.cloud/mixly-packages/cloud-libs/arduino_avr/libs.json"
|
||||
]
|
||||
}
|
||||
},
|
||||
"web": {
|
||||
"com": "serial"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="%7/$M@N7uVYD-9;Xoanp" x="87" y="81"><field name="VALUE">D13连接LED\nLED将亮一秒灭一秒</field><next><block type="inout_digital_write2" id="5I?mY;XLB5aG+8WQF0,N"><value name="PIN"><shadow type="pins_digital" id=".u:BArqSJAoy%~)@9e~J"><field name="PIN">13</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="NgqfKpDv_U+=W,Sq9p8K"><field name="BOOL">HIGH</field></shadow></value><next><block type="base_delay" id="/VC4xT5Q1rM([Y)@cHHB"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="5W.@`n(d/Aaz~aF4tDFo"><field name="NUM">1000</field></shadow></value><next><block type="inout_digital_write2" id="D4AK_(3XazX9:BJJzzQz"><value name="PIN"><shadow type="pins_digital" id="``4Ml5j3KOKJy2fV_0QC"><field name="PIN">13</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="~;WUPDI?EJdru+wEQ~x6"><field name="BOOL">LOW</field></shadow></value><next><block type="base_delay" id="Mo2XM8LM3X#6c/mAD+TN"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="KGw3x~Ye;u:LqJY4#WsN"><field name="NUM">1000</field></shadow></value></block></next></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="$þi_`;z-VGa+{bL=GH" x="-264" y="115"><field name="VALUE">D2接按钮,D13接LED。\n按下按钮产生高电平,点亮LED。\n松开按钮产生低电平,熄灭LED。</field><next><block type="inout_digital_write2" id="_3sjo{/2bf,.Q)eYm#HU"><value name="PIN"><shadow type="pins_digital" id="jP:`Dt1p)5#wSHC#z@E."><field name="PIN">13</field></shadow></value><value name="STAT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="inout_highlow" id="303~O#-j1HPeBpC!xW3D"><field name="BOOL">HIGH</field></shadow><block type="inout_digital_read2" id="WHcs.@LmLv%Sh70uE+Y?"><value name="PIN"><shadow type="pins_digital" id=";#0I9(~NtIUpU=#FW|lE"><field name="PIN">2</field></shadow></value></block></value></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="Za_v4_@(D7[bA+rgal2l" x="-424" y="47"><field name="VALUE">A0接电位器,D3接LED。\n调节电位器,LED灯随电位器转动改变亮度。</field><next><block type="inout_analog_write" id="P^oj@5C90vJf]vY-=z8?"><value name="PIN"><shadow type="pins_pwm" id="w@V@Vg`3i_L/h{v]ZboN"><field name="PIN">3</field></shadow></value><value name="NUM"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="2gc+GDaPe[T}qXzB1Ha["><field name="NUM">0</field></shadow><block type="math_arithmetic" id="3*E_5tsDr0{qDgQvDY)/"><field name="OP">DIVIDE</field><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="-(im|Jt2c0ydUhJl1w/W"><field name="NUM">1</field></shadow><block type="inout_analog_read" id="5WHgd@[1uUXs,$6^lUA7"><value name="PIN"><shadow type="pins_analog" id="`%Z`J/Z:.)IDwf|}F;dt"><field name="PIN">A0</field></shadow></value></block></value><value name="B"><shadow type="math_number" id="C{GMjPoS/hLR6]TatmrE"><field name="NUM">4</field></shadow></value></block></value></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="-qABfA./d?eWD(`kIwgp" x="0" y="0"><field name="VALUE">D2上连接按钮\n将看到单击、双击、长按开始、长按中、长按结束,在串口输出不同的提示语。</field></block><block type="OneButton_interrupt" id="}f_O5n}224:2XXq|:Nr*" x="0" y="85"><field name="mode">attachClick</field><value name="PIN"><shadow type="pins_digital" id="!oL_(.$Hz6x$Zq/e4LY?"><field name="PIN">2</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="ECY;UvUV6Ay_NwL8Fv;l"><field name="BOOL">HIGH</field></shadow></value><statement name="DO"><block type="serial_println" id="pc$Q)/3ryJz;.v|%jX2)"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id=".`^9ZO88n_YCcZwiI[9`"><field name="TEXT">one Click</field></block></value></block></statement></block><block type="OneButton_interrupt" id="^920H]~0ot{VcPzlnA2n" x="0" y="189"><field name="mode">attachDoubleClick</field><value name="PIN"><shadow type="pins_digital" id="^fu}Et-.O2}P)rOr/-0M"><field name="PIN">2</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="4,h`uVVTpS|$hS%(QCed"><field name="BOOL">HIGH</field></shadow></value><statement name="DO"><block type="serial_println" id="F/OZ|aF#,!+CQ,;xY9[Y"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id="d+Zse%0=v9;!]N,1Dwco"><field name="TEXT">double Click</field></block></value></block></statement></block><block type="OneButton_interrupt" id="3fNVB6AeS7sH5@ox-uRe" x="0" y="293"><field name="mode">attachLongPressStart</field><value name="PIN"><shadow type="pins_digital" id="H(%2WW:M7:dYa9BltoUJ"><field name="PIN">2</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="(hH#.Y6jL;5+NZIMu{M^"><field name="BOOL">HIGH</field></shadow></value><statement name="DO"><block type="serial_println" id=";S;y^6kLB#}2BbYiA{y-"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id="CJ^%VV3DuC=Ov!xGRZ5."><field name="TEXT">longPress Start</field></block></value></block></statement></block><block type="OneButton_interrupt" id="h_yWQeXR~NDsaNMDzwdZ" x="0" y="397"><field name="mode">attachDuringLongPress</field><value name="PIN"><shadow type="pins_digital" id="Lg4txf7TGpE!=A`VcK~%"><field name="PIN">2</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="}K]z+{et/J[^XW?|4vSv"><field name="BOOL">HIGH</field></shadow></value><statement name="DO"><block type="serial_println" id="FPb~%[z3!hN`[snD,k{k"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id="tM}AuTQ;INcv9wTZ^Q`M"><field name="TEXT">longPressing</field></block></value></block></statement></block><block type="OneButton_interrupt" id=",FlrUSEXy--7Gv}0+;ur" x="0" y="501"><field name="mode">attachLongPressStop</field><value name="PIN"><shadow type="pins_digital" id="[6,NG[Mb]=fC~q8g~Df+"><field name="PIN">2</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="bL)4hEJ?JCxG~nA6)Qi4"><field name="BOOL">HIGH</field></shadow></value><statement name="DO"><block type="serial_println" id="$#CS)#.uhGElO*`S^=Yb"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id="RIXw2g^MtE!YA=K:sQ2_"><field name="TEXT">longPress End</field></block></value></block></statement></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="v)MT}Dct]P130YkSVq3C" x="0" y="0"><field name="VALUE">硬件中断\nD2连接按钮,D12连接LED。\n按下按钮,LED灯点亮。\n再次按下按钮,LED灯熄灭。如此往复。</field></block><block type="base_setup" id="wZXYB!R2R{@1*M1+tdv2" x="0" y="125"><statement name="DO"><block type="controls_attachInterrupt" id="Sr-*1#DV!rHf1nCy6H[Y"><field name="mode">RISING</field><value name="PIN"><shadow type="pins_interrupt" id="13%-H+9.iRg5SEcGMqj6"><field name="PIN">2</field></shadow></value><statement name="DO"><block type="inout_digital_write2" id="gO~;SN|yASiQ=Fde:il@"><value name="PIN"><shadow type="pins_digital" id="D)Xc9*d4kx+^dZ-bYzjb"><field name="PIN">12</field></shadow></value><value name="STAT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="inout_highlow" id=";_4MaL98h]t}2L]!R4S]"><field name="BOOL">HIGH</field></shadow><block type="logic_negate" id="Rqt,xFN-_*uphvdJm~q^"><value name="BOOL"><block type="inout_digital_read2" id="^}U:fN*nYHG1FG51IB[6"><value name="PIN"><shadow type="pins_digital" id="*~`3S%8rfAa!CE9E9Dg7"><field name="PIN">12</field></shadow></value></block></value></block></value></block></statement></block></statement></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id=".j3YgQW3wV=4`uA`I1Vr" x="0" y="0"><field name="VALUE">软件中断\n\nD4连接按钮,D12连接LED。\n将看到按钮被按下,LED灯亮灭切换。</field></block><block type="base_setup" id="WuzzT{pjb],,.!#NwDMc" x="0" y="125"><statement name="DO"><block type="controls_attachPinInterrupt" id="`Q`Sq,Y#;DsiRPRa{{qm"><field name="mode">FALLING</field><value name="PIN"><shadow type="pins_digital" id="f6g.$b*FoSiss5`D|SoK"><field name="PIN">4</field></shadow></value><statement name="DO"><block type="inout_digital_write2" id="n!Z0b=b+7rY{We`l8:Qo"><value name="PIN"><shadow type="pins_digital" id="j7NVjtcC2*$J_6A@H!CY"><field name="PIN">12</field></shadow></value><value name="STAT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="inout_highlow" id="{d/Lz+v|.e%/5|AB8Ux="><field name="BOOL">HIGH</field></shadow><block type="logic_negate" id="VLna2#3*e}2[a!oD`Xn0"><value name="BOOL"><block type="inout_digital_read2" id=")9C^/1UhrVNCnd5VXQYE"><value name="PIN"><shadow type="pins_digital" id="kaL#=paLrfn)Z$?8FM+j"><field name="PIN">12</field></shadow></value></block></value></block></value></block></statement></block></statement></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="W#8dF_x;U@SNrzk[Cvo-" x="-34" y="150"><field name="VALUE">A1连接声音传感器,D11连接LED灯。\n先通过串口输出A1的模拟值,观察声音值大小。\n当声音传感器的模拟值大于300时,点亮11引脚的LED灯1秒,否则熄灭LED。</field><next><block type="serial_begin" id="Cty8^9}RR`Y@%nFE._"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="gMxFn;x.7JE=5p|eHzX:"><field name="NUM">9600</field></shadow></value><next><block type="serial_println" id="w?w=YA!?eE:J:MfP[Q(u"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="inout_analog_read" id="wpI69.3FLwHPPZF[#GJe"><value name="PIN"><shadow type="pins_analog" id="e_/?RL!4I=Z#LdrPg~#F"><field name="PIN">A1</field></shadow></value></block></value><next><block type="controls_if" id="dRSIh)3Y+qiuq%tM#^mh"><mutation xmlns="http://www.w3.org/1999/xhtml" else="1"></mutation><value name="IF0"><block type="logic_compare" id=".?my,OTJ`[oF(r+_/L7b"><field name="OP">GT</field><value name="A"><block type="inout_analog_read" id="ktK,]Ti0kB7O#)`]!9rH"><value name="PIN"><shadow type="pins_analog" id="/t2D+DEXcN?hzbed~Ysa"><field name="PIN">A1</field></shadow></value></block></value><value name="B"><block type="math_number" id="`Gr[zml/ltXQEd/H^=Eu"><field name="NUM">300</field></block></value></block></value><statement name="DO0"><block type="inout_digital_write2" id="=b7hlVa9xt{w0F{%Y(d}"><value name="PIN"><shadow type="pins_digital" id="in9dmts4O^L+(DQ1Y4lw"><field name="PIN">11</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="0WUTA//*3Jt{hm{k|?nf"><field name="BOOL">HIGH</field></shadow></value><next><block type="base_delay" id="CVZ;+|.dn;[QsU4)?=6."><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="KWiJwGv5JMTzV1n+uS.H"><field name="NUM">1000</field></shadow></value></block></next></block></statement><statement name="ELSE"><block type="inout_digital_write2" id="wiL0n;#%S¾9t;U##;8"><value name="PIN"><shadow type="pins_digital" id="QkZ^=WxlF-nijDai#=tM"><field name="PIN">11</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="7/V}@4^8a4_wOq|ei.D}"><field name="BOOL">LOW</field></shadow></value></block></statement></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="}5vt7]DJj#krIVoVW5B}" x="-1151" y="-156"><field name="VALUE">D3连接蜂鸣器\n在串口监视器中将看到高电平的脉冲周期</field><next><block type="serial_begin" id=".{(7Pnc*ml{|WNv4HCpO"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="ZksQo`sZwdR`sr*rlZS?"><field name="NUM">9600</field></shadow></value><next><block type="controls_tone" id="52%whi3L!R.w]fBL*H^h"><value name="PIN"><shadow type="pins_digital" id="qJ,wHR;1d^VR!P@WW(L_"><field name="PIN">3</field></shadow></value><value name="FREQUENCY"><shadow type="tone_notes" id="=$?8I@M,g+R@DMLsJ]UN"><field name="STAT">131</field></shadow></value><next><block type="serial_println" id="!vwG^kX~|XC-X{G=P+}L"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="inout_pulseIn" id="}R~xk:5_.~PTs,ZjgL0j"><field name="STAT">HIGH</field><value name="PIN"><shadow type="pins_digital" id="s`zzL!t%x[tn6fBmIYjr"><field name="PIN">3</field></shadow></value></block></value><next><block type="serial_println" id="GEQWh`h|R!u2]5vUiaxe"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="inout_pulseIn2" id="-Ty%YY%N4YJDT[JjW_2C"><field name="STAT">HIGH</field><value name="PIN"><shadow type="pins_digital" id="Sl.[,qfJXp+.3Me7y1Aa"><field name="PIN">3</field></shadow></value><value name="TIMEOUT"><shadow type="math_number" id="amSJXZ=gZ6lTw7v1m[X0"><field name="NUM">1000000</field></shadow></value></block></value><next><block type="controls_delay" id="}l3b1BL/7lv;e,wLF5Gb"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="$u.`1Fp|m1[4qVN[b2;`"><field name="NUM">1000</field></shadow></value><next><block type="serial_println" id="_q(0F{V[lHEA|$b@W$[m"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id="37c:[jYF@;w~`rQ$EP(v"><field name="TEXT">***********************************************************</field></block></value><next><block type="controls_notone" id="aE{xg~BN89Nvl7O?Hu)x"><value name="PIN"><shadow type="pins_digital" id="+ou])@MS`EJgKn7c{/37"><field name="PIN">3</field></shadow></value><next><block type="controls_delay" id="O|E@ds]y[eYNkJC.2jeR"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="}%i}Y10l|mbgv2ACz3/Z"><field name="NUM">1000</field></shadow></value></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="controls_for" id="-E|,x{YX(eFJY_#*1Oqj" x="106" y="191"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="v1f9r*croH.0u/R5spgD"><field name="NUM">0</field></shadow></value><value name="TO"><shadow type="math_number" id=".P~^60_ED*+r=i}R5g6n"><field name="NUM">255</field></shadow></value><value name="STEP"><shadow type="math_number" id="iY.]4mt)Le~9q53Q1xDv"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="inout_soft_analog_write" id="qEOY2/1t#5b57dB{gXFj"><value name="PIN"><shadow type="pins_digital" id="S]R=WbHh@U3wOk#c%rx*"><field name="PIN">13</field></shadow></value><value name="NUM"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="CKcbol6F,%~M!8RPMV}L"><field name="NUM">255</field></shadow><block type="variables_get" id="7E%YK;VP2-Q:A^-^;{}+"><field name="VAR">i</field></block></value><next><block type="controls_delay" id="%Ov0TG^[M5[a3_[~UzjY"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="Zi0G_I#Rz;L5!#(/Zgc)"><field name="NUM">5</field></shadow></value></block></next></block></statement><next><block type="controls_for" id="Zsu/FwknNHrT~|=76vdg"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="(lk31;1-2f|l)70?i2j0"><field name="NUM">254</field></shadow></value><value name="TO"><shadow type="math_number" id="F?,Jb[9!K]*.zI@x-haY"><field name="NUM">1</field></shadow></value><value name="STEP"><shadow type="math_number" id="uFtD43nnp4x`$qi9lX[C"><field name="NUM">-1</field></shadow></value><statement name="DO"><block type="inout_soft_analog_write" id="I0pShU;aE!).n:7$qUD1"><value name="PIN"><shadow type="pins_digital" id="1YPNr#4vxG[=O^lxn@z`"><field name="PIN">13</field></shadow></value><value name="NUM"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="CKcbol6F,%~M!8RPMV}L"><field name="NUM">255</field></shadow><block type="variables_get" id="YbTQ|2ApKlGRm4HV|E:B"><field name="VAR">i</field></block></value><next><block type="controls_delay" id="V[!uU7D[2}M;/tS|(E%;"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="qMVodeJh4]I15AamwsAG"><field name="NUM">5</field></shadow></value></block></next></block></statement></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="base_setup" id="igiz?e):w#HplBjsO%%v" x="-1855" y="-195"><statement name="DO"><block type="lists_create_with_text2" id="L8($P=wD.ArJw|~~C)$;"><field name="TYPE">byte</field><field name="VAR">mylist</field><field name="SIZE">11</field><field name="TEXT">0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90</field></block></statement></block><block type="factory_notes" id="Y$yR`jMTSv7=79lWzOh6" x="-1856" y="-92"><field name="VALUE">D8连接到74HC595芯片的使能引脚\nD3连接到74HC595芯片的时钟引脚\nD9连接到74HC595芯片的数据引脚\n利用ShiftOut模块实现单位数码管的随机数字骰子</field><next><block type="controls_for" id="Q/N_N1AHAckzK[O={l7o"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="Cbc;^U3-,~(-H:8_~8yQ"><field name="NUM">1</field></shadow></value><value name="TO"><shadow type="math_number" id="tOu34.?W39C-s,SRSQ[u"><field name="NUM">5</field></shadow></value><value name="STEP"><shadow type="math_number" id="^2a7dFgb;nB2mH#{`E@k"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="inout_digital_write2" id="pT;vH8m#iL]*Rr:n#RX7"><value name="PIN"><shadow type="pins_digital" id="_|@jzNFq+RSAFAy:*qal"><field name="PIN">8</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="qgd^CoU`o}VkohX}iuVA"><field name="BOOL">LOW</field></shadow></value><next><block type="inout_shiftout" id="bD/r^6^|tfpW^1XU+;r."><field name="ORDER">MSBFIRST</field><value name="PIN1"><shadow type="pins_digital" id="M)[u7CK2rfny|s7R+hnJ"><field name="PIN">9</field></shadow></value><value name="PIN2"><shadow type="pins_digital" id="6D^qh3A/bAU[-uDvE^N}"><field name="PIN">3</field></shadow></value><value name="DATA"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="++{T3frtZU2d1h/7)Bb?"><field name="NUM">0</field></shadow><block type="lists_getIndex" id="zwai_-(Ur0%Nuij{x/3v"><field name="VAR">mylist</field><value name="AT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="4h8sw|vHIA-Xls;aKniO"><field name="NUM">1</field></shadow><block type="math_random_int" id="EUtItk]X[+N7TIE}rRk`"><value name="FROM"><shadow type="math_number" id="4l`c=][n7P!3Ns(V=9G3"><field name="NUM">1</field></shadow></value><value name="TO"><shadow type="math_number" id="^SCoo7*7YU(Zd4^lsy[c"><field name="NUM">10</field></shadow></value></block></value></block></value><next><block type="inout_digital_write2" id="96IMy*+5{7e*Fs;t51iH"><value name="PIN"><shadow type="pins_digital" id=":ND]MB0O::y_1hoYA+lS"><field name="PIN">8</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="/5S`OgGs6Pov,x`)~h2a"><field name="BOOL">HIGH</field></shadow></value><next><block type="controls_delay" id="yY}-R/!02GFA`@l-h#?J"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="$ZV/awIZe9=61y(6:!+K"><field name="NUM">1000</field></shadow></value></block></next></block></next></block></next></block></statement></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="base_setup" id="YP:L9EuH64jex9U3d)`N" x="-1136" y="-392"><statement name="DO"><block type="lists_create_with_text2" id="ZC9WyxxooVYf00kr57hU"><field name="TYPE">int</field><field name="VAR">Light</field><field name="SIZE">9</field><field name="TEXT">1,2,4,8,16,32,64,128,256</field></block></statement></block><block type="factory_notes" id="Y$yR`jMTSv7=79lWzOh6" x="-1162" y="-283"><field name="VALUE">D8连接到74HC595芯片的使能引脚\nD12连接到74HC595芯片的时钟引脚\nD11连接到74HC595芯片的数据引脚\n实现8个LED的流水灯效果</field><next><block type="controls_for" id="A[Q3{)XC{j+FQ+J;uHLX"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="e)HZZ*.e*Ot?%_.1*?m9"><field name="NUM">1</field></shadow></value><value name="TO"><shadow type="math_number" id="EHXwf@PV;Jy-k)niG*Qd"><field name="NUM">8</field></shadow></value><value name="STEP"><shadow type="math_number" id="~E~~ay{VLSH}.Y%`-Ie6"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="inout_digital_write2" id="aDu?1$]z[K/k,gJUDr]*"><value name="PIN"><shadow type="pins_digital" id="q?NCDdCWCG*H#AWbsbO7"><field name="PIN">8</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="xkx%pE@=`hDOQaKvwcY("><field name="BOOL">LOW</field></shadow></value><next><block type="inout_shiftout" id="qRvsqRaa!5k(Kv1Q36}T"><field name="ORDER">MSBFIRST</field><value name="PIN1"><shadow type="pins_digital" id="Y!QDa6ioUX!j$nqNzP7i"><field name="PIN">11</field></shadow></value><value name="PIN2"><shadow type="pins_digital" id="]0:V8q]aOqoQPQDaPOeb"><field name="PIN">12</field></shadow></value><value name="DATA"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="P)G,(nMDuuLgcsP;moHX"><field name="NUM">0</field></shadow><block type="lists_getIndex" id="dt]pgJRC{pLRg5=F6MAJ"><field name="VAR">Light</field><value name="AT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="-iO:-|g;)$PhW!DOQCZ6"><field name="NUM">1</field></shadow><block type="variables_get" id="k|9Hd0SRY~wu8t*EU,gz"><field name="VAR">i</field></block></value></block></value><next><block type="inout_digital_write2" id="Q~k$mlYF82wHK097iy^)"><value name="PIN"><shadow type="pins_digital" id="ia|eO/AW5lMkCl^GYGW+"><field name="PIN">8</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="_v#G7K{j()ys,O6)O+:Z"><field name="BOOL">HIGH</field></shadow></value><next><block type="controls_delay" id="6Yl^.FmIT^V/r-2mv^Ch"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="LT80mn#mmTCBu1XuJ/9;"><field name="NUM">1000</field></shadow></value><next><block type="inout_digital_write2" id="Az.sB;{S@0,Inlxb{]K9"><value name="PIN"><shadow type="pins_digital" id="VX1s-%z$}/#oa)DV6z)$"><field name="PIN">8</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="|t=;|*yxVALibLklm9fr"><field name="BOOL">LOW</field></shadow></value><next><block type="inout_shiftout" id="+l2P~Rn)`G}CtvjS_tt*"><field name="ORDER">MSBFIRST</field><value name="PIN1"><shadow type="pins_digital" id="K6n]wf3sWaVP0.ehEB:L"><field name="PIN">11</field></shadow></value><value name="PIN2"><shadow type="pins_digital" id="*jHY5vvRpZx5atF6=ei."><field name="PIN">12</field></shadow></value><value name="DATA"><shadow type="math_number" id="y^3w/eQ+D9YZ5puUo)"><field name="NUM">0</field></shadow></value><next><block type="inout_digital_write2" id="fT=WB[a/L):_jQup3UNC"><value name="PIN"><shadow type="pins_digital" id="Y~)xTCZQ*nFT2sb?6,+E"><field name="PIN">8</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="uVdxnA/1B:N#Az:DY:ed"><field name="BOOL">HIGH</field></shadow></value></block></next></block></next></block></next></block></next></block></next></block></next></block></statement></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="fx.tMK3Mp-F:gO98b.{M" x="0" y="0"><field name="VALUE">D13连接LED。\n在初始化内的程序,\n只会在硬件上电后执行一次,\n一般用来放初始化设置程序。</field></block><block type="base_setup" id="M41Ca~txmdyL=m{y!@1/" x="0" y="125"><statement name="DO"><block type="inout_digital_write2" id="#!t2#L)F#SwB:p2:]kD;"><value name="PIN"><shadow type="pins_digital" id="y5gM/fre}!!`c[#kFG|g"><field name="PIN">13</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="0P`{XGay()kC;A6w:8ax"><field name="BOOL">HIGH</field></shadow></value><next><block type="controls_delay" id="sQ6rToqql,q6iY}4Y8P,"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="(5;}h$x2P6c[K,-$bYA("><field name="NUM">1000</field></shadow></value><next><block type="inout_digital_write2" id="3%U{^MF_ROJm_}qLBVP-"><value name="PIN"><shadow type="pins_digital" id="zByWH{/[6-wU_|qd%lH("><field name="PIN">13</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="Ew}xmogL~$`)X=,+((DX"><field name="BOOL">LOW</field></shadow></value><next><block type="controls_delay" id="}@P)G[bVgbo45BtQg)dv"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id=";TgerMk/D?DDmc!bJ{NV"><field name="NUM">1000</field></shadow></value></block></next></block></next></block></next></block></statement></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="lCJZ7n8*-UoexFf+!*fK" x="-120" y="59"><field name="VALUE">D5-D13接LED灯\n用循环结构来实现流水灯效果</field><next><block type="controls_for" id="Qa,vGGq/tiwt=[Qytxpm"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="n,Mm[pP5#)nlaqch1;:5"><field name="NUM">5</field></shadow></value><value name="TO"><shadow type="math_number" id="!)LQW6h^QyBv@R%/dZ_9"><field name="NUM">13</field></shadow></value><value name="STEP"><shadow type="math_number" id="q`z|iL8bCyCe[*m8u5+t"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="inout_digital_write2" id="Mbh8=47nE;%o9rj?#9{="><value name="PIN"><shadow xmlns="http://www.w3.org/1999/xhtml" type="pins_digital" id="2i23T;,t`QhYXfNB/DuE"><field name="PIN">10</field></shadow><block type="variables_get" id="JucAL=jOZIm6a7_hglMl"><field name="VAR">i</field></block></value><value name="STAT"><shadow type="inout_highlow" id="F+J#+S?#fn/8lNpAl0aV"><field name="BOOL">HIGH</field></shadow></value><next><block type="base_delay" id="^vndshs]x1MRmTAgQw2t"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="DzusC,dM8Pit|g4,PHwL"><field name="NUM">1000</field></shadow></value><next><block type="inout_digital_write2" id="l,.!`saRsImgQwIjMlW0"><value name="PIN"><shadow xmlns="http://www.w3.org/1999/xhtml" type="pins_digital" id="1XChT6~z}v*+kC+9xa0,"><field name="PIN">10</field></shadow><block type="variables_get" id="=XGdRb+SldN?=hq+If9?"><field name="VAR">i</field></block></value><value name="STAT"><shadow type="inout_highlow" id="Dy_km`Yvy*X=j~|4;U%^"><field name="BOOL">LOW</field></shadow></value><next><block type="base_delay" id="YNMN?2m~}k=`G/-X%HK9"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="#g!9gA^d4n:%=(qkXb.]"><field name="NUM">1000</field></shadow></value></block></next></block></next></block></next></block></statement></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="ByGnom]5$%;#v]ol3bxR" x="182" y="216"><field name="VALUE">D7连接按钮\n按钮按下时,串口输出提示语“D7 is HIGH”</field><next><block type="serial_begin" id="XY3;-e*k(6^}v0k|1%Jx"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="u];2q{0e,g3~bywqPQMI"><field name="NUM">9600</field></shadow></value><next><block type="controls_whileUntil" id=".k:OO#hs_Uss~!~ePdaL"><field name="MODE">WHILE</field><value name="BOOL"><shadow xmlns="http://www.w3.org/1999/xhtml" type="logic_boolean" id="Iq=sb1Ih8N)M-iOqdXTm"><field name="BOOL">TRUE</field></shadow><block type="inout_digital_read2" id="(=G~~.i-.mX8{!Xe;fyt"><value name="PIN"><shadow type="pins_digital" id="Z.8;{J#A1X!tm-us+gE!"><field name="PIN">7</field></shadow></value></block></value><statement name="DO"><block type="serial_println" id="?4PP;LS7yM{Kem.[?Myh"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id="oaXgjm5F[lf_Jt:.U5|1"><field name="TEXT">D7 is HIGH</field></block></value></block></statement></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="e2v=iH.N4lJBVsIUE5[Q" x="-431" y="-180"><field name="VALUE">D2连接按钮,D12连接LED\n按下按钮,LED亮3秒,然后熄灭。</field><next><block type="controls_if" id="dR3W+Bup*dZ+IsQrSQCf"><mutation xmlns="http://www.w3.org/1999/xhtml" else="1"></mutation><value name="IF0"><block type="inout_digital_read2" id=";%dR?8,W/hCY-lp|K#-r"><value name="PIN"><shadow type="pins_digital" id="{NX?F{?I4QR*pHUUX7j{"><field name="PIN">2</field></shadow></value></block></value><statement name="DO0"><block type="inout_digital_write2" id="t`n+L^?}ZLX)~Cw3v=.{"><value name="PIN"><shadow type="pins_digital" id="@2l(Gso3]CZ0J*zMEJa2"><field name="PIN">12</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="J-5cufzT3+J9Ze[iQ,pU"><field name="BOOL">HIGH</field></shadow></value><next><block type="base_delay" id="k,dQXge3#jSsFiZJrSN+"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="nGVe4:8C7-uGqRk?H)R]"><field name="NUM">3000</field></shadow></value></block></next></block></statement><statement name="ELSE"><block type="inout_digital_write2" id="8?L8Dh[)baeaz+.)b,Xv"><value name="PIN"><shadow type="pins_digital" id="-v3w+m2@br0;3B(UAvN["><field name="PIN">12</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="+iW]yPHZ;U0Bb|SCzuU?"><field name="BOOL">LOW</field></shadow></value></block></statement></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="Iq3KhN3WM$@.e#D%fnUH" x="0" y="0"><field name="VALUE">D12连接LED\n每隔500ms,切换亮灭效果</field></block><block type="base_setup" id="*](F}Au!RAeas|p#G7vk" x="0" y="85"><statement name="DO"><block type="controls_mstimer2" id="f+j)Z1L{BTbBfcCXjhsg"><value name="TIME"><shadow type="math_number" id=",=l8os)Ae$f`HT{O|.)U"><field name="NUM">500</field></shadow></value><statement name="DO"><block type="inout_digital_write2" id="[K1BXhMV~|AK^^2]kzEF"><value name="PIN"><shadow type="pins_digital" id="0{XS?.EM|!qYddr/JxPn"><field name="PIN">12</field></shadow></value><value name="STAT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="inout_highlow" id="J+wZCZ9vCi$M[u^6c]3@"><field name="BOOL">HIGH</field></shadow><block type="logic_negate" id="@-*_!D=Gwx.Q!QJp*0{)"><value name="BOOL"><block type="inout_digital_read2" id="jhqkwk_,?O3+FhkR;)e("><value name="PIN"><shadow type="pins_digital" id="^.gu~73L?z6GgK*QDLU#"><field name="PIN">12</field></shadow></value></block></value></block></value></block></statement><next><block type="controls_mstimer2_start" id="MIYoNm13sFc}bA`|2mBh"></block></next></block></statement></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="_2v!q$ffbws$F#p1U!d{" x="0" y="0"><field name="VALUE">D12,D13分别连接LED灯\n每隔200ms,D12引脚LED灯切换亮灭;\n每隔300ms,D13引脚LED灯切换亮灭;\n简单定时器常用于多任务处理</field></block><block type="simple_timer" id="8a-cE*R-,)q*z$J^*UYF" x="0" y="125"><field name="NO">1</field><value name="timein"><shadow type="math_number" id="Rmo`fsb%j^Xp3g*[mqIu"><field name="NUM">200</field></shadow></value><statement name="zxhs"><block type="inout_digital_write2" id="1?N!cFw+WUCOcq:5q|v]"><value name="PIN"><shadow type="pins_digital" id="/O.E1Ln2o^,u(XHBGTh2"><field name="PIN">12</field></shadow></value><value name="STAT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="inout_highlow" id="SOuS},cI|/1[X-Z6pa-O"><field name="BOOL">HIGH</field></shadow><block type="logic_negate" id="+8Fc5Q==2(Xg#;oyp=0Q"><value name="BOOL"><block type="inout_digital_read2" id="aOGRjB]BvN2f0kg)cZ.X"><value name="PIN"><shadow type="pins_digital" id="Sl/~A?Y,$2O#TNH8p:/x"><field name="PIN">12</field></shadow></value></block></value></block></value></block></statement></block><block type="simple_timer" id="=IygVs#+.#^ykCQa(;SX" x="0" y="251"><field name="NO">2</field><value name="timein"><shadow type="math_number" id="hT*1Gw#f``*+O-H9uUWT"><field name="NUM">300</field></shadow></value><statement name="zxhs"><block type="inout_digital_write2" id="{[5!jD][ah2ZImeg9piV"><value name="PIN"><shadow type="pins_digital" id="K}S@:9t{yg:8YNSs(0L("><field name="PIN">13</field></shadow></value><value name="STAT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="inout_highlow" id="SOuS},cI|/1[X-Z6pa-O"><field name="BOOL">HIGH</field></shadow><block type="logic_negate" id="#s477eC~iW-}}4VO(~h?"><value name="BOOL"><block type="inout_digital_read2" id="PTS%mAWk*=CsttbZfS.w"><value name="PIN"><shadow type="pins_digital" id="o7-sv((@s[+,QOd[fg3d"><field name="PIN">13</field></shadow></value></block></value></block></value></block></statement></block></xml>
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="`yYM50v;j}xe6nR(Uq/K" x="0" y="0"><field name="VALUE">D13,D12分别接1个LED模块,\nD12的LED每隔200ms亮灭一次\nD13的LED每隔300ms亮灭一次</field></block><block type="SCoopTask" id="23Z[I?}3A2G}$_-,?cRL" x="0" y="105"><field name="_tasknum">1</field><statement name="loop"><block type="inout_digital_write2" id="jU}5S,RuRqiJmA0^$1(^"><value name="PIN"><shadow type="pins_digital" id="]Ji5=m.a(Q0[]fV9S0)@"><field name="PIN">13</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="!(oeV|b[Dku8i1d]1B}!"><field name="BOOL">HIGH</field></shadow></value><next><block type="SCoop_sleep" id="M+aksAbSMnG_!1~K4A.z"><value name="sleeplength"><shadow type="math_number" id="NUPxZte%`k@zHkZ@/WF*"><field name="NUM">300</field></shadow></value><next><block type="inout_digital_write2" id="m~vZF40FVd?:sIM[6z7|"><value name="PIN"><shadow type="pins_digital" id="^^/3,:k|ny7b*0A^|jU0"><field name="PIN">13</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="},)v!@TJ+Wtk*dQ,CYII"><field name="BOOL">LOW</field></shadow></value><next><block type="SCoop_sleep" id="R}/+(;8eq2w*HqfTFweJ"><value name="sleeplength"><shadow type="math_number" id="hMpB-a,M=v)9xN-:q*oQ"><field name="NUM">300</field></shadow></value></block></next></block></next></block></next></block></statement></block><block type="SCoopTask" id="p+@q=4cflk*)/Kp{+DBE" x="0" y="354"><field name="_tasknum">2</field><statement name="loop"><block type="inout_digital_write2" id="Uf=CI?}xS;34tom~n23/"><value name="PIN"><shadow type="pins_digital" id="VKbfH[PDx^?df_ORnOm%"><field name="PIN">12</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="k^fV}IHHenLRtj?me5lK"><field name="BOOL">HIGH</field></shadow></value><next><block type="SCoop_sleep" id="[[yL7-q.P.^z+y61~^.P"><value name="sleeplength"><shadow type="math_number" id="?T$m}iG#${_}it$PIru?"><field name="NUM">200</field></shadow></value><next><block type="inout_digital_write2" id="t/?EOJ{Y=nP^sZ9j$jpV"><value name="PIN"><shadow type="pins_digital" id="wlu8EvIR^[+ao3U3]9(1"><field name="PIN">12</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="~wrGWdX3p3`kzh;0j0TU"><field name="BOOL">LOW</field></shadow></value><next><block type="SCoop_sleep" id="lIS3_XVHHsk}6x55*{9R"><value name="sleeplength"><shadow type="math_number" id="c*Rv;$6[5b4ey]wSC[91"><field name="NUM">200</field></shadow></value></block></next></block></next></block></next></block></statement></block><block type="SCoop_yield" id="dzd@gYkj7ZcD!-$}n~lY" x="0" y="603"></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="base_setup" id="azT8VQ]1k58TQS^AdZAb" x="-34" y="-72"><statement name="DO"><block type="factory_notes" id="fOlu_DE)v*cJ#04KC)-U"><field name="VALUE">秒表\n按钮传感器连接到D2\n第一次按下按钮开始计时,再次按下按钮停止计时,\n并通过串口监视器输出时间值</field><next><block type="serial_begin" id="D%EggaJ+A,ipXh.AeNpR"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="=@X{WaY_UjaV;[mq~noj"><field name="NUM">9600</field></shadow></value><next><block type="variables_declare" id="aE:G4*UURW=}l8}QBW~)"><field name="variables_type">global_variate</field><field name="VAR">startTime</field><field name="TYPE">int</field><next><block type="variables_declare" id="L|wl@VjLO!SpAA!FvqqW"><field name="variables_type">global_variate</field><field name="VAR">endTime</field><field name="TYPE">int</field><next><block type="variables_declare" id="zRFVDSU$jSmm)o5X5q.5"><field name="variables_type">global_variate</field><field name="VAR">state</field><field name="TYPE">boolean</field><value name="VALUE"><block type="logic_boolean" id="o`o$F$^bL93xFj!!/)LE"><field name="BOOL">FALSE</field></block></value><next><block type="controls_attachInterrupt" id="{oOQZfPv{9_=NaeC8-/Y"><field name="mode">RISING</field><value name="PIN"><shadow type="pins_interrupt" id="KkB5zh8DJ?2v)`GGdRU["><field name="PIN">2</field></shadow></value><statement name="DO"><block type="controls_if" id="x0}*fmYZmKu|z!RT*!4]"><mutation xmlns="http://www.w3.org/1999/xhtml" else="1"></mutation><value name="IF0"><block type="logic_compare" id="rX#fkA{kNKXxh,:wH#JK"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="uE?`FN|!jc(O^k[%GH=w"><field name="VAR">state</field></block></value><value name="B"><block type="logic_boolean" id="tSRgm1b4-%o@(t[a3bsJ"><field name="BOOL">FALSE</field></block></value></block></value><statement name="DO0"><block type="variables_set" id="6^(w:BwrHmO5(`:y:+K."><field name="VAR">state</field><value name="VALUE"><block type="logic_boolean" id="|-p:?Op@t$(Ln6[$|gwP"><field name="BOOL">TRUE</field></block></value><next><block type="variables_set" id="@ck=nlybobPk^|AQSLjt"><field name="VAR">startTime</field><value name="VALUE"><block type="controls_millis" id="cd$`abbC))ZMi3m8NBVG"><field name="UNIT">millis</field></block></value></block></next></block></statement><statement name="ELSE"><block type="variables_set" id="6Y_dx:QK)BJHVV#RB{X/"><field name="VAR">state</field><value name="VALUE"><block type="logic_boolean" id="@T!c,!pbafFbA^TxT~fK"><field name="BOOL">FALSE</field></block></value><next><block type="variables_set" id="xbc^t;GTC[Ph+EKWM]18"><field name="VAR">endTime</field><value name="VALUE"><block type="controls_millis" id="t@rrVKp^/tr*E[?+a}vR"><field name="UNIT">millis</field></block></value><next><block type="serial_println" id="323*=o2jfFHRH::nm8.J"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="math_arithmetic" id="8x{(XkXd@Z:h$ebhq)Fy"><field name="OP">MINUS</field><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="B!_OK+JYozA7Ww5kE!XZ"><field name="NUM">1</field></shadow><block type="variables_get" id="{QjI`y=F,-jyCN%Xgrlv"><field name="VAR">endTime</field></block></value><value name="B"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="!!Lx%~/I@S]1qwv9Im[I"><field name="NUM">1</field></shadow><block type="variables_get" id="m]f=KMgOJ-uKRbWw5qj3"><field name="VAR">startTime</field></block></value></block></value></block></next></block></next></block></statement></block></statement></block></next></block></next></block></next></block></next></block></next></block></statement></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="W}~6ec~+P;mT5l+,;]fA" x="-751" y="-144"><field name="VALUE">A0连接旋转电位器,D11连接LED\nLED灯随着电位器的旋转呈现在0-255区间的不同亮度</field><next><block type="variables_declare" id="Y6-*lP:W[J,}?m~(Xh7Q"><field name="variables_type">global_variate</field><field name="VAR">liangdu</field><field name="TYPE">int</field><value name="VALUE"><block type="base_map" id="@Guu~IxV,L]1~L^6fi+5"><field name="maptype">map_int</field><value name="NUM"><block type="inout_analog_read" id="AO9=*_J5_Qn#.J7RHOj@"><value name="PIN"><shadow type="pins_analog" id=",zboVYo8+MBm^T_g?pNt"><field name="PIN">A0</field></shadow></value></block></value><value name="fromLow"><shadow type="math_number" id="u6Zo@|Wr]dvvtiR-GyjU"><field name="NUM">0</field></shadow></value><value name="fromHigh"><shadow type="math_number" id="dMS5,4+{77WYfqaASlFW"><field name="NUM">1023</field></shadow></value><value name="toLow"><shadow type="math_number" id="][I.;eA,D-XG0R-TeES]"><field name="NUM">0</field></shadow></value><value name="toHigh"><shadow type="math_number" id="B6!l`q7pv0SL`aCNv7x{"><field name="NUM">255</field></shadow></value></block></value><next><block type="inout_analog_write" id="@7=QftUxyhzeMl]L+DN*"><value name="PIN"><shadow type="pins_pwm" id="Fi7^1kk-o#AnuQ_ZWM?y"><field name="PIN">11</field></shadow></value><value name="NUM"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="g/2y:_ga(AVq7o+1w{nO"><field name="NUM">0</field></shadow><block type="variables_get" id=",+lgv2+=qLHaI`y]fTK`"><field name="VAR">liangdu</field></block></value></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="=}ynWVr!(}h-d;yCl,X(" x="-40" y="110"><field name="VALUE">绘制SIN-COS的函数图像\n程序上传后,打开串口监视器\n并切换到绘图模式</field><next><block type="serial_begin" id="*FH*+q2A?V5*Yf4;o[9*"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="jzy(`c$`UtGEpZ1yjIry"><field name="NUM">9600</field></shadow></value><next><block type="controls_for" id="=hVHlF()/a2l*xkyiY_i"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="bP2myzI1YfRpxtf]-~+Q"><field name="NUM">0</field></shadow></value><value name="TO"><shadow type="math_number" id="_Ym`uml`=`k)oj/4mZH_"><field name="NUM">360</field></shadow></value><value name="STEP"><shadow type="math_number" id="EW*@r!I.)/Ti#-RBYR.="><field name="NUM">1</field></shadow></value><statement name="DO"><block type="serial_print" id=")osIjp#r`D(QJKVY|gA|"><field name="serial_select">Serial</field><field name="new_line">print</field><value name="CONTENT"><block type="math_arithmetic" id="nY=MwF;|rK2.ew=1-]zd"><field name="OP">ADD</field><value name="A"><shadow xmlns="" type="math_number" id="Xs:d*5PSsjzB!%Inn#n?"><field xmlns="" name="NUM">1</field></shadow><block type="math_arithmetic" id=")UjGHX-A=/Se6)Xq~p^q"><field name="OP">MULTIPLY</field><value name="A"><shadow xmlns="" type="math_number"><field xmlns="" name="NUM">1</field></shadow><block type="math_trig" id="_2c*siwq#l:.aV~KD*lN"><field name="OP">SIN</field><value name="NUM"><block type="variables_get" id="wh7e;Hn[7[]Q18Rf*DBp"><field name="VAR">i</field></block></value></block></value><value name="B"><shadow xmlns="" type="math_number"><field xmlns="" name="NUM">1</field></shadow><block type="math_number" id="VXJbhfnBHn6=g#kc7d**"><field name="NUM">256</field></block></value></block></value><value name="B"><shadow type="math_number" id="@log/n%BorDm:QGR(O+E"><field name="NUM">512</field></shadow></value></block></value><next><block type="serial_print" id="sQOwxQ,*1m=joCqIBvK4"><field name="serial_select">Serial</field><field name="new_line">print</field><value name="CONTENT"><block type="text" id=";p]=bCFKWa}c!`7ro53?"><field name="TEXT">,</field></block></value><next><block type="serial_println" id="nXYC@@.z%Jw)0.T7#}aP"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="math_arithmetic" id="}eL0CKC~hgFFlqb9Cy:B"><field name="OP">ADD</field><value name="A"><shadow xmlns="" type="math_number" id="Xs:d*5PSsjzB!%Inn#n?"><field xmlns="" name="NUM">1</field></shadow><block type="math_arithmetic" id="X6vsB.q5Z)Aw5nmetdT?"><field name="OP">MULTIPLY</field><value name="A"><shadow xmlns="" type="math_number"><field xmlns="" name="NUM">1</field></shadow><block type="math_trig" id="m!9jU%;-PAl[O/PowAbb"><field name="OP">COS</field><value name="NUM"><block type="variables_get" id="xiZ=FR=aAZL4cJAkqrhR"><field name="VAR">i</field></block></value></block></value><value name="B"><shadow xmlns="" type="math_number"><field xmlns="" name="NUM">1</field></shadow><block type="math_number" id="?dj*,J3G7HoC_wsWCx^]"><field name="NUM">256</field></block></value></block></value><value name="B"><shadow type="math_number" id="k-ROx[sDL}6W;Bh#a~7y"><field name="NUM">512</field></shadow></value></block></value><next><block type="base_delay" id="iHn,)wreVS0eKN?;a%_s"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id=")G3Dw4PjHKZ)#?-05-x/"><field name="NUM">200</field></shadow></value></block></next></block></next></block></next></block></statement></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="HBM,=JKlM@dQAe~!!-J1" x="-680" y="158"><field name="VALUE">A0接电位器\n串口输出20-180区间的数值</field><next><block type="serial_begin" id="uG{H~~BS/fIYV]6:]#m9"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="|~k?:X5%O@mN^2*m;icz"><field name="NUM">9600</field></shadow></value><next><block type="serial_println" id="3%mkwJBit8H*1C.c$8;G"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="base_map" id="gl|{eO:a]s7H=TcB_ZT-"><field name="maptype">map_int</field><value name="NUM"><block type="inout_analog_read" id="dl{4yVR8Dk.HM);]%[u]"><value name="PIN"><shadow type="pins_analog" id="ry./XNAT%FXC{YssC-91"><field name="PIN">A0</field></shadow></value></block></value><value name="fromLow"><shadow type="math_number" id="7oxU6!5BO{(gs(=]I$(O"><field name="NUM">0</field></shadow></value><value name="fromHigh"><shadow type="math_number" id="?1)93(F`=lne-!(4EjI8"><field name="NUM">1023</field></shadow></value><value name="toLow"><shadow type="math_number" id="a8Z`{VZe,EcHg^P0[xW5"><field name="NUM">20</field></shadow></value><value name="toHigh"><shadow type="math_number" id=":;@)*0mY9|k,RLwZKewJ"><field name="NUM">180</field></shadow></value></block></value><next><block type="controls_delay" id="U1!`OE%JO_m]VYHW/r~h"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="LUKeKH**C({[S7E5+0n}"><field name="NUM">500</field></shadow></value></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="?KGHe+/?gY1*H!I69/=l" x="-275" y="189"><field name="VALUE">随机数不包括最大数,如 1—7 随机数只有 1、2、3、4、5、6。</field><next><block type="serial_begin" id="0xP_Z?UfR;o~#{*k6O2x"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="q%W?A_Kk|)ef4`l.R)PU"><field name="NUM">9600</field></shadow></value><next><block type="math_random_seed" id="XDN.NlO!#B72]8n{8dV!"><value name="NUM"><shadow type="math_number" id="qbD^ATa0_cFz2yh/;5=h"><field name="NUM">997</field></shadow></value><next><block type="serial_println" id="lbgs|Y?r9T|)0sy!m1:F"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="math_random_int" id="d1ltWbZ4YuS;0WbJ%Uq6"><value name="FROM"><shadow type="math_number" id="9QpaSrQ,_pMOQ/:04hE`"><field name="NUM">1</field></shadow></value><value name="TO"><shadow type="math_number" id="4s}KhB|ZJO21-{EtW=pm"><field name="NUM">100</field></shadow></value></block></value><next><block type="controls_delay" id="a5|.`(,mW^`R/Z_ma0Ga"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="VQZg[g+?(QjK)bBQ4hh4"><field name="NUM">100</field></shadow></value></block></next></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="base_setup" id="De`ruz5VtD=)vw?X%w,3" x="-1277" y="-32"><statement name="DO"><block type="serial_begin" id="esyVxp0%?{)-[C`$%/e`"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="8$F}agubXC8+abgF#e5@"><field name="NUM">9600</field></shadow></value></block></statement></block><block type="factory_notes" id="#.ucTz$+[{A3~)M:XP%E" x="-1278" y="77"><field name="VALUE">输出两个数取余的值</field><next><block type="serial_println" id="#*|lx[gI%yGgxFfu)ptc"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="math_arithmetic" id="9u)#s3WxCiH]!L(H%]GT"><field name="OP">QUYU</field><value name="A"><shadow type="math_number" id="2_Vw7`;K/e[npErGqSN3"><field name="NUM">10</field></shadow></value><value name="B"><shadow type="math_number" id="yp?`VM_+}y?7_432_~Um"><field name="NUM">3</field></shadow></value></block></value><next><block type="factory_notes" id="%IASTx3#}m~=^@S94SUP"><field name="VALUE">A0连接电位器,\n将看到LED亮灭随电位器的旋转约束在0-255之间不同的亮度</field><next><block type="inout_analog_write" id="?PQldvR/W9o]+WSp6Jj:"><value name="PIN"><shadow type="pins_pwm" id="2Z!ht5x%:u5wh;wRB9O~"><field name="PIN">11</field></shadow></value><value name="NUM"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="4M5u,rAh#jqBZmI/L2Ns"><field name="NUM">0</field></shadow><block type="math_constrain" id="]oC8h`.2bfr{KqykHe~,"><value name="VALUE"><block type="math_arithmetic" id=".b14:o,/X2z5]7SRU/DN"><field name="OP">MULTIPLY</field><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="quTq2,zRFWC(=L#^?gc5"><field name="NUM">10</field></shadow><block type="math_arithmetic" id="64fa-`ZSvQmNWZX]d-E2"><field name="OP">QUYU</field><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="quTq2,zRFWC(=L#^?gc5"><field name="NUM">10</field></shadow><block type="inout_analog_read" id="|/^L,#K4_K?HZ!.-!dcL"><value name="PIN"><shadow type="pins_analog" id="G-VIsu[9=IU(#7q=V=su"><field name="PIN">A0</field></shadow></value></block></value><value name="B"><shadow type="math_number" id="6mKII?:J2.0(oIG,k:J?"><field name="NUM">3</field></shadow></value></block></value><value name="B"><shadow type="math_number" id="lFrP[s=H[=ZM?8)O0;Ln"><field name="NUM">50</field></shadow></value></block></value><value name="LOW"><shadow type="math_number" id="Csm0!V-ELrS,|OcsSTHt"><field name="NUM">0</field></shadow></value><value name="HIGH"><shadow type="math_number" id="2ysA]d+WP4Gy9-Jpx_}e"><field name="NUM">255</field></shadow></value></block></value></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="uk{i3#|J+Vg:a2$wM}MV" x="-165" y="-77"><field name="VALUE">使用移位计算</field><next><block type="variables_declare" id="*he3DGS3:@jq;:OLX[u8"><field name="variables_type">global_variate</field><field name="VAR">item</field><field name="TYPE">int</field><value name="VALUE"><block type="math_number" id="m6G=u9g9}vA+ecZt3ZZf"><field name="NUM">4096</field></block></value><next><block type="serial_begin" id="Hr@7cg!#%(U#H#7:P[r3"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="RG5h!57N)UK?h:(.EQv3"><field name="NUM">9600</field></shadow></value><next><block type="controls_for" id="QW6^lf#;*Yb4Dv$)g%9o"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="Eimv5gSJ)q-9-/g}i8hP"><field name="NUM">1</field></shadow></value><value name="TO"><shadow type="math_number" id="^7K72c!uqv~!HmdO#e5*"><field name="NUM">12</field></shadow></value><value name="STEP"><shadow type="math_number" id="(YRvB.=U:SSA}fg;!9wh"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="serial_println" id="WBWTV}sOFq{{SX!-]fXp"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="math_bit" id="VIOJ;`7cBe=hiFkg[n;e"><field name="OP">>></field><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="vXtSkDQWx|.aWzle)7cj"><field name="NUM">4096</field></shadow><block type="variables_get" id=";{.tGp!oWSC{?ir=qa$M"><field name="VAR">item</field></block></value><value name="B"><shadow type="math_number" id="?V7ta|AWgmo%+vP[UE0x"><field name="NUM">1</field></shadow></value></block></value><next><block type="variables_set" id="jWndQ)u5nMlH^T{ag9d{"><field name="VAR">item</field><value name="VALUE"><block type="math_bit" id="biLJh=ws;7!T5b,T0!2e"><field name="OP">>></field><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="vXtSkDQWx|.aWzle)7cj"><field name="NUM">4096</field></shadow><block type="variables_get" id="`JA=R=xAFX0MS=|(!H^T"><field name="VAR">item</field></block></value><value name="B"><shadow type="math_number" id=",C-T+V/XW#`~eR(dHh7-"><field name="NUM">1</field></shadow></value></block></value></block></next></block></statement><next><block type="controls_end_program" id="0lQAm1:#]7qlv$InUOm0"></block></next></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="S#xw}jtPi![a~FhH_0}n" x="-257" y="56"><field name="VALUE">只执行一次串口输出积木块</field><next><block type="serial_begin" id="eS#A7,P~:L,!YB2cv[eq"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="xy$^OY62W!F_;m|gGyur"><field name="NUM">9600</field></shadow></value><next><block type="serial_println" id="bvPTEs$a2?ZAO;xaT+G."><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id="z`me95Uyr/OEn/;fZcvQ"><field name="TEXT">I like Mixly!</field></block></value><next><block type="factory_notes" id="2DMs`q#fjTAGHAA-)riR"><field name="VALUE">串口输出数字后不换行</field><next><block type="controls_for" id="GL_Av$MuL7BSHzCh^{[*"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="8,8S2/,ulCkI}Xa6=2+H"><field name="NUM">1</field></shadow></value><value name="TO"><shadow type="math_number" id="Z3]Yiv[eR$MLD.MwQ?0/"><field name="NUM">6</field></shadow></value><value name="STEP"><shadow type="math_number" id="e^4:lQB5*0SlFYDk_OhC"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="serial_print" id="Vj10YTO9),K^9_4i0oy?"><field name="serial_select">Serial</field><field name="new_line">print</field><value name="CONTENT"><block type="variables_get" id="5vv:y!y%_w{6M/mzOvKZ"><field name="VAR">i</field></block></value><next><block type="serial_print" id="mF`NLwX;/0@Q;];azuMm"><field name="serial_select">Serial</field><field name="new_line">print</field><value name="CONTENT"><block type="text_char" id=";pLhtOMClaIImMcE.W1N"><field name="TEXT"> </field></block></value></block></next></block></statement><next><block type="serial_println" id="q_;qy_rsD=9}=)Y6om}L"><field name="serial_select">Serial</field><field name="new_line">println</field><next><block type="controls_end_program" id="/oEE9%Snn*=@0.yB_CQ{"></block></next></block></next></block></next></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="4Wk.%MQ40nJqX)fI/g+q" x="-278" y="164"><field name="VALUE">用转ASCII字符积木块加空格</field><next><block type="serial_begin" id="eS#A7,P~:L,!YB2cv[eq"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="xy$^OY62W!F_;m|gGyur"><field name="NUM">9600</field></shadow></value><next><block type="serial_println" id="bvPTEs$a2?ZAO;xaT+G."><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text_join" id="4q.Rd8s$,:i~mPa_TpxZ"><value name="A"><shadow type="text" id="HwVl%j1](aZ[sD_bFvaM"><field name="TEXT">Hello</field></shadow></value><value name="B"><shadow type="text" id="3;wxiX43KxU:`Jb^Lsny"><field name="TEXT">Mixly</field></shadow></value></block></value><next><block type="serial_println" id="@Z469x{ReQjNE[i2NRwi"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text_join" id="i|4Rlo#O2n.1V;[th47~"><value name="A"><shadow type="text" id="0Sorn]K44Bw6Y7[E2r2o"><field name="TEXT">Hello</field></shadow></value><value name="B"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="m{!`wi6p!Kj$Rb~,+{Nt"><field name="TEXT"></field></shadow><block type="text_join" id="PyDjGWB]+qI4,Z4M;#W9"><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="?6C3RBmycGEKStnuZ$OW"><field name="TEXT"> </field></shadow><block type="ascii_to_char" id="??aPi5aKho{]J2F3%3g~"><value name="VAR"><shadow type="math_number" id="xu3e~4,;J{XcuL:=D]s#"><field name="NUM">127</field></shadow></value></block></value><value name="B"><shadow type="text" id="7Fl8K0VH!/8}sy+X?b_`"><field name="TEXT">Mixly</field></shadow></value></block></value></block></value><next><block type="controls_delay" id="LI8.cIyWa=z|PFc~mjqp"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="Z3n)ZF`ZrixR7Ldb}`PU"><field name="NUM">1000</field></shadow></value></block></next></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="M=.e8s_?S~V4+(Wa-B8v" x="-219" y="105"><field name="VALUE">截取字符串中的一部分</field><next><block type="serial_begin" id="eH|I5SMkdci,6,g{AEhy"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="Bi)o6tw1#08m}9,@:1(N"><field name="NUM">9600</field></shadow></value><next><block type="serial_println" id="0!=_?_%P,h^G5OSC_FY."><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="substring" id="J:G?R-4hECM7!3H^l1*0"><value name="name"><shadow type="text" id="LxJm:aEg~@*VpzbQEncI"><field name="TEXT">I Love Mixly</field></shadow></value><value name="Start"><shadow type="math_number" id="8QDAs%0:BkTqE::d+8Ju"><field name="NUM">7</field></shadow></value><value name="end"><shadow type="math_number" id="GUL3BIcT}/aD,}E|Zp@9"><field name="NUM">12</field></shadow></value></block></value><next><block type="controls_end_program" id="Ne1b{+9D7=gH7}gpju0A"></block></next></block></next></block></next></block></xml>
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 rc4" board="Arduino AVR@Arduino/Genuino Uno"><block type="base_setup" id="BW;FlBf1=G?PkND`ijxA" x="-463" y="6"><statement name="DO"><block type="serial_begin" id="bf~pF7aXupJ`d!ni9{68"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="L6P8YTnXzqPD[tMuYoan"><field name="NUM">9600</field></shadow></value><next><block type="serial_print" id="H/W]`Rt#.-?a:RJwLa$M"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id="@I$Ng+4K()e}UF0,Xjp]"><field name="TEXT">=========Base64编解码=========</field></block></value><next><block type="serial_print" id="`d3Hh_Ti?-UY7wOY@vcf"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text_base64_url_codec" id="J8?H9Q.iIWq.rf(:w*PB"><field name="TYPE">BASE64</field><field name="OPTION">ENCODE</field><value name="VALUE"><shadow type="text" id="GDFKfTOw=UIpH-VEmz!/"><field name="TEXT">你好Mixly</field></shadow></value></block></value><next><block type="serial_print" id=")eo[4Lod8kDO_pDa?4lv"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text_base64_url_codec" id="0V2xn=os|pqjE#rZew3P"><field name="TYPE">BASE64</field><field name="OPTION">DECODE</field><value name="VALUE"><shadow type="text" id="=jqkwR}aVi!83kx1(0ky"><field name="TEXT">5L2g5aW9TWl4bHk=</field></shadow></value></block></value><next><block type="serial_print" id="#7K}Yhk3qhmV./bwQr5;"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id="ut3YM,rxoiYJXdvk23W^"><field name="TEXT">==========Url编解码===========</field></block></value><next><block type="serial_print" id="Aq^Vioo*xK={vh9e}@Vp"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text_base64_url_codec" id="s43sgBC4KQb+s{?,Z}K0"><field name="TYPE">URL</field><field name="OPTION">ENCODE</field><value name="VALUE"><shadow type="text" id=",bDlu;#x}f|b@ElFwUz1"><field name="TEXT">你好Mixly</field></shadow></value></block></value><next><block type="serial_print" id="x:kJ1HcUw_r,_A7qWP#s"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text_base64_url_codec" id="82A@G!l-zG-JQ5S0a,P6"><field name="TYPE">URL</field><field name="OPTION">DECODE</field><value name="VALUE"><shadow type="text" id="|75viF}9th~6=1-!TzT}"><field name="TEXT">%E4%BD%A0%E5%A5%BDMixly</field></shadow></value></block></value><next><block type="serial_print" id="5fmmL?u86:g6G[Q~E)_j"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="text" id="cXmXosOy0Ir(s1{30/WN"><field name="TEXT">==============================</field></block></value></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></statement></block></xml><config>{}</config><code>CiNpbmNsdWRlIDxyQmFzZTY0Lmg+CiNpbmNsdWRlIDxVUkxDb2RlLmg+CgpVUkxDb2RlIHVybENvZGU7CgpTdHJpbmcgdXJsRW5jb2RlKFN0cmluZyB1cmxTdHIpIHsKICB1cmxDb2RlLnN0cmNvZGUgPSB1cmxTdHI7CiAgdXJsQ29kZS51cmxlbmNvZGUoKTsKICByZXR1cm4gdXJsQ29kZS51cmxjb2RlOwp9CgpTdHJpbmcgdXJsRGVjb2RlKFN0cmluZyB1cmxTdHIpIHsKICB1cmxDb2RlLnVybGNvZGUgPSB1cmxTdHI7CiAgdXJsQ29kZS51cmxkZWNvZGUoKTsKICByZXR1cm4gdXJsQ29kZS5zdHJjb2RlOwp9Cgp2b2lkIHNldHVwKCl7CiAgU2VyaWFsLmJlZ2luKDk2MDApOwogIFNlcmlhbC5wcmludGxuKCI9PT09PT09PT1CYXNlNjTnvJbop6PnoIE9PT09PT09PT0iKTsKICBTZXJpYWwucHJpbnRsbihyYmFzZTY0LmVuY29kZSgi5L2g5aW9TWl4bHkiKSk7CiAgU2VyaWFsLnByaW50bG4ocmJhc2U2NC5kZWNvZGUoIjVMMmc1YVc5VFdsNGJIaz0iKSk7CiAgU2VyaWFsLnByaW50bG4oIj09PT09PT09PT1VcmznvJbop6PnoIE9PT09PT09PT09PSIpOwogIFNlcmlhbC5wcmludGxuKHVybEVuY29kZSgi5L2g5aW9TWl4bHkiKSk7CiAgU2VyaWFsLnByaW50bG4odXJsRGVjb2RlKCIlRTQlQkQlQTAlRTUlQTUlQkRNaXhseSIpKTsKICBTZXJpYWwucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Cn0KCnZvaWQgbG9vcCgpewoKfQ==</code>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="y#Kes_K4:xIR1v#:ne0%" x="-167" y="25"><field name="VALUE">串口输出字符型数组元素</field><next><block type="lists_create_with2" id="PL;]W*E)Ps|+3}!*xV4W"><mutation xmlns="http://www.w3.org/1999/xhtml" items="5"></mutation><field name="TYPE">char</field><field name="VAR">CHINA</field><value name="ADD0"><block type="text_char" id="pjH6me=@yP9a+IqmBXRB"><field name="TEXT">C</field></block></value><value name="ADD1"><block type="text_char" id="t?mm{SnIzU;EuvGuTr-u"><field name="TEXT">H</field></block></value><value name="ADD2"><block type="text_char" id="?46G=`K~:aGapNJzBp?R"><field name="TEXT">I</field></block></value><value name="ADD3"><block type="text_char" id="nAdLv~gu%sk-wb^[J7pu"><field name="TEXT">N</field></block></value><value name="ADD4"><block type="text_char" id=".{X5|)]/{.h_)R)bsIzK"><field name="TEXT">A</field></block></value><next><block type="controls_for" id="jbzPL^@/YVrMTM$fN83{"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="Vur!.RWF,HZT|JNX?2Lx"><field name="NUM">1</field></shadow></value><value name="TO"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="j|MUg`E*W`E,ukztoi73"><field name="NUM">5</field></shadow><block type="lists_length" id="8qlKYMUDR}nba=bU}[q,"><field name="VAR">CHINA</field></block></value><value name="STEP"><shadow type="math_number" id="}Uqh0suBq=F5HVuRVwF,"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="serial_print" id="LOvZb?g7l6cvRXMyI!Ol"><field name="serial_select">Serial</field><field name="new_line">print</field><value name="CONTENT"><block type="lists_getIndex" id="zsAFb)FrRA]:Xu_pS9!I"><field name="VAR">CHINA</field><value name="AT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="[dcr?Q0WAQd-}bY!Wz|w"><field name="NUM">1</field></shadow><block type="variables_get" id="KCUB~TjfMVj!{$o..,FM"><field name="VAR">i</field></block></value></block></value></block></statement><next><block type="controls_end_program" id="M?5aHv,/#B`4;b~IU`Ld"></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="!Ze(0oPDPgt-MfM`Mx;M" x="-338" y="116"><field name="VALUE">串口输出二维数组元素</field><next><block type="create_array2_with_text" id="]83Ha={H^ft;3e9;V;e3"><field name="TYPE">int</field><value name="name"><shadow type="math_number" id="+xoCN4bqrSZv*CU3Ry}F"><field name="NUM">array</field></shadow></value><value name="line"><shadow type="math_number" id="{EYf9HWzCx6Ie#?qEI10"><field name="NUM">3</field></shadow></value><value name="list"><shadow type="math_number" id="H5lX$C#S{XV:K`6e)gR~"><field name="NUM">3</field></shadow></value><value name="String"><shadow type="math_number" id="#qBZ9mnhrNB8/VT$VDz}"><field name="NUM">{1,2,3},{4,5,6},{7,8,9}</field></shadow></value><next><block type="controls_for" id="sy,aR:JX;)dsc4FA2UuY"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="tMKI}RV^r8#+vK,z]``("><field name="NUM">1</field></shadow></value><value name="TO"><shadow type="math_number" id="zzjg+uGqHkJ8=t{/_Tt`"><field name="NUM">3</field></shadow></value><value name="STEP"><shadow type="math_number" id="^(tYAJm9x|FC5#)J=H1~"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="controls_for" id=":wxw.=Sp?!H:R*/w{^tw"><field name="VAR">j</field><value name="FROM"><shadow type="math_number" id="@O/1m+m4jviNkZff-C(O"><field name="NUM">1</field></shadow></value><value name="TO"><shadow type="math_number" id="Gd0U4H3fW/(=5J?+EfDB"><field name="NUM">3</field></shadow></value><value name="STEP"><shadow type="math_number" id=",A3.^6QALUyGI!WWTBGi"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="serial_print" id="JE-@(ZcRB#Y+:uuee,73"><field name="serial_select">Serial</field><field name="new_line">print</field><value name="CONTENT"><block type="text_join" id="9a;hpIqm${-.{nK?[|Gx"><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="qta!]V{yy)y$HdnbXW!n"><field name="TEXT">Hello</field></shadow><block type="get_array2_value" id="v-.j+;W%Qm@2N{M@awJc"><value name="name"><shadow type="math_number" id="lnR3iKgH4dM0kue0mfnI"><field name="NUM">array</field></shadow></value><value name="line"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="5_r?-0Mx+oEoYS]I+Nv6"><field name="NUM">1</field></shadow><block type="variables_get" id="gRIQEQyPTCl.Y+k2Z#]."><field name="VAR">i</field></block></value><value name="list"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="EJZl1ph[D}(+o-_{!O0x"><field name="NUM">1</field></shadow><block type="variables_get" id="-2j#8Q|Q.P5fmuiI~f[K"><field name="VAR">j</field></block></value></block></value><value name="B"><shadow type="text" id="=l[XeQDkGKu}3~O7lp}P"><field name="TEXT">,</field></shadow></value></block></value><next><block type="controls_if" id="Eo)Ki`yOt}gh|m,9af~v"><value name="IF0"><block type="logic_compare" id="r:#GL$|J{m8ZElv@%wzy"><field name="OP">EQ</field><value name="A"><block type="math_arithmetic" id="Dfnq?1coVyUKJx5`!FCZ"><field name="OP">QUYU</field><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="x$by83XP6Ob~[~`9r3Pq"><field name="NUM">1</field></shadow><block type="variables_get" id="IHXJ[7=qO(=w/c#[vTOj"><field name="VAR">j</field></block></value><value name="B"><shadow type="math_number" id="Dsxu~AH{~iJo6d$s*qmt"><field name="NUM">3</field></shadow></value></block></value><value name="B"><block type="math_number" id="f71z]6h|n^$UAQJyjnz2"><field name="NUM">0</field></block></value></block></value><statement name="DO0"><block type="serial_println" id="wBNd[Mh!%9/zK-]W!U1D"><field name="serial_select">Serial</field><field name="new_line">println</field></block></statement></block></next></block></statement></block></statement><next><block type="controls_end_program" id="=rxZu$o#k??=L/HS.~QE"></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="oaDDyHQz5zG79Bw![c*," x="54" y="86"><field name="VALUE">在A0连接电位器,D9连接LED。\n转动电位器,大于600灯一直亮,在400和600之间,灯灭,小于400灯闪。</field><next><block type="serial_println" id="p7_5BYklUm;cR;))SMWV"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="inout_analog_read" id="6X5h3CQd+40Jdyoapej/"><value name="PIN"><shadow type="pins_analog" id=";E-0OsTKDjSZLwKZ{E:n"><field name="PIN">A0</field></shadow></value></block></value><next><block type="controls_delay" id="UdK_@ZtLRC3G)qhyX1es"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="vN]ZH8pO(x~L!INGn^BJ"><field name="NUM">1000</field></shadow></value><next><block type="controls_if" id="5g0bewqag9j[pU+SU.u!"><mutation xmlns="http://www.w3.org/1999/xhtml" elseif="1" else="1"></mutation><value name="IF0"><block type="logic_compare" id="o46q6CsR}E(om5stdk8U"><field name="OP">GTE</field><value name="A"><block type="inout_analog_read" id="G1B}F7$,.3U.qe|^-M4s"><value name="PIN"><shadow type="pins_analog" id="?|sAhQ%)6//6+/sWb1zp"><field name="PIN">A0</field></shadow></value></block></value><value name="B"><block type="math_number" id="|*BfxhMx0/DJLQ%+C@g9"><field name="NUM">600</field></block></value></block></value><statement name="DO0"><block type="inout_digital_write2" id="F8pkAI/i]h_/`Y%!FkOC"><value name="PIN"><shadow type="pins_digital" id="/WiQZw3L-[_~}6BmS]y5"><field name="PIN">9</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="(:ze}`jZ*%y#P{%Y-vH,"><field name="BOOL">HIGH</field></shadow></value></block></statement><value name="IF1"><block type="logic_compare" id=";j~4L=POk}Hs_W,.uCH["><field name="OP">LTE</field><value name="A"><block type="inout_analog_read" id="+Ygf0xG9]jN#QGnRN{[p"><value name="PIN"><shadow type="pins_analog" id="r6o9gOK1Uq5Gt!lW#_^*"><field name="PIN">A0</field></shadow></value></block></value><value name="B"><block type="math_number" id=",MW:At{~fX*o5##+cJTD"><field name="NUM">400</field></block></value></block></value><statement name="DO1"><block type="inout_digital_write2" id="seuRcOh$qgOvPNARM:f-"><value name="PIN"><shadow type="pins_digital" id="q@eEG6kckADo.3$rr#_)"><field name="PIN">9</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="Y9%M%Q3^hc]!FLiMK:G7"><field name="BOOL">HIGH</field></shadow></value><next><block type="controls_delay" id="22/*WH6c)xA_7e;=1((5"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="mA!c)uPhM=.FBW){}o?D"><field name="NUM">200</field></shadow></value><next><block type="inout_digital_write2" id="GCq21UblEp$S*gNnY-k]"><value name="PIN"><shadow type="pins_digital" id="ZdvU?g78Y}TLjruf#Y^0"><field name="PIN">9</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="qpGhy#(qgjzd%4o(vOkN"><field name="BOOL">LOW</field></shadow></value><next><block type="controls_delay" id="7`WJvH,1jLZ+8NT|:+l`"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="^WWAxpbdzKPX?((F|}T^"><field name="NUM">200</field></shadow></value></block></next></block></next></block></next></block></statement><statement name="ELSE"><block type="inout_digital_write2" id="J=pAPH`Z:J3w^w2S2^fs"><value name="PIN"><shadow type="pins_digital" id="/N.@q%jAaQw:UGBIx]xe"><field name="PIN">9</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="v7$Z,+Mu?^RzGKK-a.Fc"><field name="BOOL">LOW</field></shadow></value></block></statement></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="+lM#H;=X)K9uC#yWs?F9" x="8" y="23"><field name="VALUE">光控按钮灯\n\nA0连接光线传感器,D4连接LED,D3连接按钮\n当A0<50(光线暗)并按钮被被下时,LED为高电平\n否则,LED为低电电平</field><next><block type="controls_if" id="xG$SH4CF?ee^:R-@9]Dr"><mutation xmlns="http://www.w3.org/1999/xhtml" else="1"></mutation><value name="IF0"><block type="logic_operation" id="syD`tfE(n0{T/+xR^6v("><field name="OP">AND</field><value name="A"><block type="logic_compare" id="vF0M?@Da)(V|[J)L$-k3"><field name="OP">LT</field><value name="A"><block type="inout_analog_read" id="b4pj`qmJqYPLrZTey$)s"><value name="PIN"><shadow type="pins_analog" id="P^Qt~4fY$(q9nP4MeWi)"><field name="PIN">A0</field></shadow></value></block></value><value name="B"><block type="math_number" id="D(p=qwAU/kjb[$]($(xK"><field name="NUM">50</field></block></value></block></value><value name="B"><block type="inout_digital_read2" id="VqV;r94(Q~GnjyO_wBj4"><value name="PIN"><shadow type="pins_digital" id="4WzAu%N5tllOcvPe].yO"><field name="PIN">3</field></shadow></value></block></value></block></value><statement name="DO0"><block type="inout_digital_write2" id="fw!+CMMCro|[@NrieoLr"><value name="PIN"><shadow type="pins_digital" id="aT4Zk)4wHHu}C@)dZI.P"><field name="PIN">4</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="}YD3($hi+)^u$TL3UG7T"><field name="BOOL">HIGH</field></shadow></value></block></statement><statement name="ELSE"><block type="inout_digital_write2" id="KqsF@z~[@tMVcaS2;A~k"><value name="PIN"><shadow type="pins_digital" id="3O{SoVAC!I(OEBGGB~{A"><field name="PIN">4</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="}Bbr?Laxs+IRZT.*D)Uu"><field name="BOOL">LOW</field></shadow></value></block></statement></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="+lM#H;=X)K9uC#yWs?F9" x="-1512" y="-99"><field name="VALUE">声控灯\nA0连接声音传感器,D2连接LED\n当A0>50时,LED为高电平\n否则,LED为低电平</field><next><block type="serial_println" id="VoVQcP]~yy}X8NUKC#L/"><field name="serial_select">Serial</field><field name="new_line">println</field><value name="CONTENT"><block type="inout_analog_read" id="kk#4$`bUP@,nl^BwIGIs"><value name="PIN"><shadow type="pins_analog" id="O2DwA?7/#(+We8KX,UcO"><field name="PIN">A0</field></shadow></value></block></value><next><block type="inout_digital_write2" id="782dX0b.V}D.S6u0ri76"><value name="PIN"><shadow type="pins_digital" id="4l1M*]:i_Y/,dq:cgdp^"><field name="PIN">2</field></shadow></value><value name="STAT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="inout_highlow" id="yE0U~17(`DSpM{q)ol;*"><field name="BOOL">HIGH</field></shadow><block type="logic_true_or_false" id="tj=i-5ADuQP,ynk^G[vY" inline="false"><value name="A"><block type="logic_compare" id="?FJ_2sfAP/p~aw2+!G(F"><field name="OP">GT</field><value name="A"><block type="inout_analog_read" id="_d{1{A^JUygB7KQ6?FMk"><value name="PIN"><shadow type="pins_analog" id="=@-DQ8M,R]lgrr-D{mx("><field name="PIN">A0</field></shadow></value></block></value><value name="B"><block type="math_number" id="uVm*@cOw0|+=.pet3A08"><field name="NUM">50</field></block></value></block></value><value name="B"><block type="inout_highlow" id="Xe}D(:xiQ.T=m@*@aiCV"><field name="BOOL">HIGH</field></block></value><value name="C"><block type="inout_highlow" id=".gN~b*v1r(h}eY8m+kxY"><field name="BOOL">LOW</field></block></value></block></value></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="5st)k?W=^aVnD=p@p+dd" x="-278" y="106"><field name="VALUE">串口交互\nD9连接红色LED,D10连接黄色LED,D11连接绿色LED。\n输入R,点亮红色LED,输入Y,点亮黄色LED,输入G,点亮绿色LED。</field><next><block type="serial_begin" id="R:2=0(.l/OsyYIFHH,~;"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="/$6|]rGt4z!]m#ybD|AT"><field name="NUM">9600</field></shadow></value><next><block type="variables_declare" id="pHZn*U]cX2909+[d2P5l"><field name="variables_type">global_variate</field><field name="VAR">Light</field><field name="TYPE">char</field><value name="VALUE"><block type="text_char" id="EO1L5CBxkoKHhGS_$WeE"><field name="TEXT"> </field></block></value><next><block type="controls_if" id="mq]k4.ip:/zur:$^jPY@"><value name="IF0"><block type="serial_available" id="tjg$7Z2kQKNga2n%rEUh"><field name="serial_select">Serial</field></block></value><statement name="DO0"><block type="variables_set" id="7m#Z%1,8jD9XMsiQuB[q"><field name="VAR">Light</field><value name="VALUE"><block type="serial_parseInt_Float" id="H#?#r97F3{@:HZ`{#Gc-"><field name="serial_select">Serial</field><field name="STAT">read</field></block></value></block></statement><next><block type="controls_switch_case" id="f8xtKvR+a~M(X4)MlL|R"><mutation xmlns="http://www.w3.org/1999/xhtml" elseif="3" else="1"></mutation><value name="IF0"><block type="variables_get" id="A}y;N@(U`.tJ.WY5;5_J"><field name="VAR">Light</field></block></value><value name="IF1"><block type="text_char" id="QO/P(0aDCuY5B{:g6h=m"><field name="TEXT">R</field></block></value><statement name="DO1"><block type="inout_digital_write2" id="LGhGXtLy5:VM6Mq4)eW,"><value name="PIN"><shadow type="pins_digital" id="Q#}cG9H9^%h9N0zla94z"><field name="PIN">9</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="eJ;Iw$Egfx?x8m@W3jAF"><field name="BOOL">HIGH</field></shadow></value></block></statement><value name="IF2"><block type="text_char" id="pl_5H8MWV.gfa/G:0S|D"><field name="TEXT">Y</field></block></value><statement name="DO2"><block type="inout_digital_write2" id="7KQ%vY?1)zFvXsw[N?F="><value name="PIN"><shadow type="pins_digital" id="(RHjuj!rx5bdS0P$DwU4"><field name="PIN">10</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="lsL1?}u!c_jh_]3jWEo`"><field name="BOOL">HIGH</field></shadow></value></block></statement><value name="IF3"><block type="text_char" id="!J!qpR)K~DNLXEl{9HAH"><field name="TEXT">G</field></block></value><statement name="DO3"><block type="inout_digital_write2" id="F:X3ys=:#2I;BZ5{,%{U"><value name="PIN"><shadow type="pins_digital" id="=7:5+TD_L!%)eck2rhU="><field name="PIN">11</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="5;3#h6tCoOMq/KRHidoe"><field name="BOOL">HIGH</field></shadow></value></block></statement><statement name="ELSE"><block type="inout_digital_write2" id="-zUqd1sp9wb.!%fp=qz^"><value name="PIN"><shadow type="pins_digital" id="7{*.{#krgZ*4Up#bV]jE"><field name="PIN">9</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="8+]3iOCV5q{$K#f``6N{"><field name="BOOL">LOW</field></shadow></value><next><block type="inout_digital_write2" id="Ux9z]MZ%l5Nh=0zx8c(8"><value name="PIN"><shadow type="pins_digital" id="`o4FiYOOFA`f5|Bfna.s"><field name="PIN">10</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="E9()vIzymz_%;67JmVYd"><field name="BOOL">LOW</field></shadow></value><next><block type="inout_digital_write2" id="9|EWbdXO:B}Cf=7~H6*m"><value name="PIN"><shadow type="pins_digital" id="Tbl@T3!klqbbdrCkvxLk"><field name="PIN">11</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="uq5@fe^UUGZ/Az63CuTR"><field name="BOOL">LOW</field></shadow></value></block></next></block></next></block></statement></block></next></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="5st)k?W=^aVnD=p@p+dd" x="0" y="0"><field name="VALUE">串口交互\nD13接LED。\n输入1,开灯;输入0,关灯。</field><next><block type="serial_begin" id="R:2=0(.l/OsyYIFHH,~;"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="/$6|]rGt4z!]m#ybD|AT"><field name="NUM">9600</field></shadow></value><next><block type="variables_declare" id="pHZn*U]cX2909+[d2P5l"><field name="variables_type">global_variate</field><field name="VAR">Light</field><field name="TYPE">char</field><value name="VALUE"><block type="text_char" id="ck%GjEk7ki*jfddUM;N("><field name="TEXT">0</field></block></value><next><block type="controls_if" id="mq]k4.ip:/zur:$^jPY@"><value name="IF0"><block type="serial_available" id="tjg$7Z2kQKNga2n%rEUh"><field name="serial_select">Serial</field></block></value><statement name="DO0"><block type="variables_set" id="7m#Z%1,8jD9XMsiQuB[q"><field name="VAR">Light</field><value name="VALUE"><block type="serial_parseInt_Float" id="H#?#r97F3{@:HZ`{#Gc-"><field name="serial_select">Serial</field><field name="STAT">read</field></block></value></block></statement><next><block type="controls_switch_case" id="f8xtKvR+a~M(X4)MlL|R"><mutation xmlns="http://www.w3.org/1999/xhtml" elseif="2"></mutation><value name="IF0"><block type="variables_get" id="A}y;N@(U`.tJ.WY5;5_J"><field name="VAR">Light</field></block></value><value name="IF1"><block type="text_char" id="P[g91fuCahV-=%zSmwc!"><field name="TEXT">1</field></block></value><statement name="DO1"><block type="inout_digital_write2" id="LGhGXtLy5:VM6Mq4)eW,"><value name="PIN"><shadow type="pins_digital" id="Q#}cG9H9^%h9N0zla94z"><field name="PIN">13</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="eJ;Iw$Egfx?x8m@W3jAF"><field name="BOOL">HIGH</field></shadow></value></block></statement><value name="IF2"><block type="text_char" id="PfsN+G|iu39vv2~;{4Z4"><field name="TEXT">0</field></block></value><statement name="DO2"><block type="inout_digital_write2" id="7KQ%vY?1)zFvXsw[N?F="><value name="PIN"><shadow type="pins_digital" id="(RHjuj!rx5bdS0P$DwU4"><field name="PIN">13</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="lsL1?}u!c_jh_]3jWEo`"><field name="BOOL">LOW</field></shadow></value></block></statement></block></next></block></next></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="serial_begin" id="jO4]umi`?wc#]h{`~YfI" x="11" y="69"><field name="serial_select">Serial</field><value name="CONTENT"><shadow type="math_number" id="PbAKr|Ir|XJat%N0tS=,"><field name="NUM">9600</field></shadow></value><next><block type="controls_for" id="2jJ(FlotoW9S(EqKn3yu"><field name="VAR">i</field><value name="FROM"><shadow type="math_number" id="wRiXr)fODBM{{w=ud|k^"><field name="NUM">33</field></shadow></value><value name="TO"><shadow type="math_number" id="75phmqis@~Es9/}NO~7X"><field name="NUM">127</field></shadow></value><value name="STEP"><shadow type="math_number" id="[e2..w_eEsfcMveB)wnX"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="serial_write" id="3cZR!}MgY[^+D5uL@Aow"><field name="serial_select">Serial</field><value name="CONTENT"><block type="variables_get" id="E,=B~y3D8+JUTmhVhk7A"><field name="VAR">i</field></block></value><next><block type="serial_print" id=")7`c/X[a(Gf7W{8?2Z9q"><field name="serial_select">Serial</field><field name="new_line">print</field><value name="CONTENT"><block type="text" id="eMY%i.i;=x1_@L?Nq*]T"><field name="TEXT">,DEC:</field></block></value><next><block type="serial_print" id="X,AR*Fjb3Bi=?)YS[yeW"><field name="serial_select">Serial</field><field name="new_line">print</field><value name="CONTENT"><block type="variables_get" id="Rhx/ns5uyqyQ3?,OTI!~"><field name="VAR">i</field></block></value><next><block type="serial_print" id=".V=gu}Z-/=QQDEDWWn#,"><field name="serial_select">Serial</field><field name="new_line">print</field><value name="CONTENT"><block type="text" id="qv^f[ay/#KO96A8EX#Vq"><field name="TEXT">,HEX:</field></block></value><next><block type="serial_print_num" id="CLCK*a@huD[qxd3`sFqu"><field name="serial_select">Serial</field><field name="new_line">print</field><field name="STAT">HEX</field><value name="CONTENT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="f$#X;jc2);qym%{SM+~d"><field name="NUM">0</field></shadow><block type="variables_get" id="ZgJcaMaLY!4dJt-7=wp9"><field name="VAR">i</field></block></value><next><block type="serial_print" id="5IV9[z9BfR)WLW+IN,gx"><field name="serial_select">Serial</field><field name="new_line">print</field><value name="CONTENT"><block type="text" id="gt|sjTo2`1LGU[}OBNtQ"><field name="TEXT">,BIN:</field></block></value><next><block type="serial_print_num" id="@(3`e`6n;f3z(F=*HY59"><field name="serial_select">Serial</field><field name="new_line">print</field><field name="STAT">BIN</field><value name="CONTENT"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="f$#X;jc2);qym%{SM+~d"><field name="NUM">0</field></shadow><block type="variables_get" id="+|gXmx|*os!6$QA{F6u+"><field name="VAR">i</field></block></value><next><block type="serial_println" id="j((!vs0AW`4kpQP`#XJf"><field name="serial_select">Serial</field><field name="new_line">println</field></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></statement><next><block type="controls_end_program" id="-j_.K4C-MfpFqkERnrty"></block></next></block></next></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="ir_recv" id="6bbMjUOryE8IInlp1!Yy" x="69" y="85"><field name="VAR">ir_item</field><value name="PIN"><shadow type="pins_digital" id="H2OX/[-tWpuo-7;bp8o="><field name="PIN">2</field></shadow></value><statement name="DO"><block type="serial_print_num" id="{$+DV{ZShLUngWXDxU#s"><field name="serial_select">Serial</field><field name="new_line">println</field><field name="STAT">HEX</field><value name="CONTENT"><block type="variables_get" id="PJ94%RkQsJkj#{+GG#P,"><field name="VAR">ir_item</field></block></value><next><block type="controls_switch_case" id="ZVy!rc:]UFqwheDhU4Ff"><mutation xmlns="http://www.w3.org/1999/xhtml" elseif="3" else="1"></mutation><value name="IF0"><block type="variables_get" id="$.T0_(o|kxYVk1)K+cZ)"><field name="VAR">ir_item</field></block></value><value name="IF1"><block type="math_number" id="bd9i;jB{$:NC^Rzc=!{s"><field name="NUM">0xFFA25D</field></block></value><statement name="DO1"><block type="inout_digital_write2" id="*=qwI_Mv0#t[jo2gNy^3"><value name="PIN"><shadow type="pins_digital" id="l8_Q/N2}u]RhYMrOmyAu"><field name="PIN">9</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="_mV%yEq@}$xFD5O?0~mO"><field name="BOOL">HIGH</field></shadow></value></block></statement><value name="IF2"><block type="math_number" id="!N$RdTgrM[mS,T}R[JoL"><field name="NUM">0xFF629D</field></block></value><statement name="DO2"><block type="inout_digital_write2" id="arM77HhM9tY%ueTy-TgF"><value name="PIN"><shadow type="pins_digital" id="Be@e|6`/-Fax$HcVTE]e"><field name="PIN">10</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="dBKgG648A.Dl1)cVLHxa"><field name="BOOL">HIGH</field></shadow></value></block></statement><value name="IF3"><block type="math_number" id="q8g/Uq_OVK.-F]$nW{pb"><field name="NUM">0xFFE21D</field></block></value><statement name="DO3"><block type="inout_digital_write2" id="H2[HccKu+5VBZ5Rn%_h}"><value name="PIN"><shadow type="pins_digital" id="`yL%ITbDa9ELyitrOm/."><field name="PIN">11</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="+?Kj+JAl+h:M*oF?@ope"><field name="BOOL">HIGH</field></shadow></value></block></statement><statement name="ELSE"><block type="inout_digital_write2" id="3OW|KxQPLW@.Dp.10ugR"><value name="PIN"><shadow type="pins_digital" id="c7^R=]e$nmu_-Xy)k-5J"><field name="PIN">9</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="$O(:|YP,YbRpL58PAT):"><field name="BOOL">LOW</field></shadow></value><next><block type="inout_digital_write2" id="hU@I%GQOpQ}c.q+a-11G"><value name="PIN"><shadow type="pins_digital" id="bv^6oYl%MtKE9L!*YH7Y"><field name="PIN">10</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="Hv02,*qmSYsx68v$#;w{"><field name="BOOL">LOW</field></shadow></value><next><block type="inout_digital_write2" id="9h^IIwO_w5m4to}95/Lg"><value name="PIN"><shadow type="pins_digital" id=":-{^vB31M#|$LVpfv~]]"><field name="PIN">11</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="b/dn(=,[Jj~bjr8l,8rg"><field name="BOOL">LOW</field></shadow></value></block></next></block></next></block></statement></block></next></block></statement></block></xml>
|
||||
@@ -0,0 +1 @@
|
||||
<xml version="Mixly 2.0 Beta11" board="Arduino AVR@Arduino/Genuino Uno" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_notes" id="3W)Qcgc!z4s5Ho)WFl]," x="0" y="53"><field name="VALUE">IIC通信:主机发送字符a、b、c</field></block><block type="base_setup" id="O2|Y?g/J;3MNA}[kZ8%#" x="0" y="118"><statement name="DO"><block type="i2c_master_Init" id="T}wjVmh.vk0DgS*f9h$G"></block></statement></block><block type="controls_for" id="(H+_O$cAY*c]lxl~d@3{" x="0" y="209"><field name="VAR">i</field><value name="FROM"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="-~6w|@jGn6{qICVDDGRg"><field name="NUM">1</field></shadow><block type="char_to_ascii" id="H~aLHLTI;U[?RvWtab%u"><field name="TEXT">a</field></block></value><value name="TO"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="jbCprakNGSZQ#!$BOX~="><field name="NUM">10</field></shadow><block type="char_to_ascii" id="NZqUJz/_OC6:kng[QT?r"><field name="TEXT">c</field></block></value><value name="STEP"><shadow type="math_number" id="2mP6g@BKI50ZhoeUnL1~"><field name="NUM">1</field></shadow></value><statement name="DO"><block type="i2c_begin_end_transmission" id="THUq!6c{FyTMCL8-Cauj"><value name="i2c_address"><shadow type="math_number" id="rnI2*$C:?HtrI#L=1T?+"><field name="NUM">4</field></shadow></value><statement name="transmission_data"><block type="i2c_write" id="kDKfvP)jt{qm#mO{!~}I"><value name="i2c_write_data"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="4xmSo9lt-xl/+s0MF[yj"><field name="TEXT"></field></shadow><block type="ascii_to_char" id="%j(]T;IWSch[M8AoM4-b"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="z2^#[j6Z4|k6+UWtsYxq"><field name="NUM">223</field></shadow><block type="variables_get" id="v}o$;w-rk/TPe[M0_nHY"><field name="VAR">i</field></block></value></block></value><next><block type="controls_delay" id="XA;:XbLz{*h=whn*7])h"><field name="UNIT">delay</field><value name="DELAY_TIME"><shadow type="math_number" id="4.t7TQXe8?Wri@M4}|vV"><field name="NUM">1000</field></shadow></value></block></next></block></statement></block></statement></block></xml>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user