B4A库文件编写(一)——使用B4A配置生成代码
# B4A库文件编写B4A库基本遵循blockly库结构,并对此进行了简化和扩展。
B4A库存存放路径:`\resources\app\libraries`,您可以参照我提供的库,开发自己的B4A库。
另外,我还开发了一个库创建器(https://b4a.clz.me/creator/),作为库开发的辅助工具。
B4A-creator目前出于早起测试阶段,bug可能较多,如遇问题,可在社区或者github提交反馈。
传统blockly库分为三部分:block、generator、toolbox,作用分别如下:
block:定义block样式
generator:定义block生成的代码
toolbox:配置边栏中显示的block
B4A库将block、toolbox做了合并和扩展,并简化了generator部分,这里对B4A库进行说明:
## json部分
B4A block json在blockly json上进行了扩展。这里以servo lib(舵机库)为例进行说明,舵机库json如下:
```
{
"category": "舵机", //分类名称,用于在边栏中显示的名称
"name": "servo", //实际名称,程序中用于处理的名称
"icon": "fal fa-undo", //分类图标,用于在边栏中显示的图标
"introduction": "舵机控制支持库,支持Arduino UNO、MEGA、ESP8266、ESP32等开发板",//库说明内容
"colour": "#48c2c4", //分类颜色,用于在边栏中显示的颜色
"version": "0.0.1", //库版本
"author": "奈何col", //作者
"compatibility": { //兼容性配置,预留以后使用,当前软件中还未做判断
"core": [
"arduino:avr",
"esp32:esp32",
"esp8266:esp8266"
],
"voltage":
},
"blocks": [ //blocks配置
{
"inputsInline": true,
"message0": "舵机%1移动到%2",
"type": "servo1_write",
"args0": [
{
"type": "field_variable",
"name": "OBJECT",
"variable": "servo1",
"variableTypes": [
"Servo"
],
"defaultType": "Servo"
},
{
"type": "field_number",
"name": "ANGLE",
"value": 0
}
],
"b4a": {
"code": "${OBJECT}.write(${ANGLE});"
},
"previousStatement": null,
"nextStatement": null,
"colour": "#03a9f4",
"toolbox": {
"show": true
}
},
{
"inputsInline": true,
"message0": "舵机%1连接到引脚%2",
"type": "servo1_attach",
"args0": [
{
"type": "field_variable",
"name": "OBJECT",
"variable": "servo1",
"variableTypes": [
"Servo"
],
"defaultType": "Servo"
},
{
"type": "field_dropdown",
"name": "PIN1",
"options": "${board.digitalPins}"
}
],
"b4a": {
"code": "${OBJECT}.attach(${PIN1});",
"library": "#include <Servo.h>",
"object": "Servo ${OBJECT};"
},
"previousStatement": null,
"nextStatement": null,
"colour": "#03a9f4",
"toolbox": {
"show": true,
"category": "舵机"
}
}
]
}
```
### block配置
json文件中`blocks数组`即是具体的block配置,可以参照(https://developers.google.com/blockly/guides/create-custom-blocks/define-blocks)了解相关配置。
单一block示例如下:
```
{
"inputsInline": true, // block样式,true输入项目为一行显示,flase为多行显示
"message0": "舵机%1连接到引脚%2", // block信息,定义该block上显示的内容
"type": "servo1_attach", // block类型,该参数必须是唯一的
"previousStatement": null, // 前置连接,配置该block之前的block类型
"nextStatement": null, // 后置连接,配置该block之后的block类型
"colour": "#03a9f4", // block颜色
"args0": [ // 输入项
{
"type": "field_variable",
"name": "OBJECT",
"variable": "servo1",
"variableTypes": [
"Servo"
],
"defaultType": "Servo"
},
{
"type": "field_dropdown",
"name": "PIN1",
"options": "${board.digitalPins}"
}
],
"b4a": { // B4A代码生成器配置
"code": "${OBJECT}.attach(${PIN1});",
"library": "#include <Servo.h>",
"object": "Servo ${OBJECT};"
}, // toolbox配置
"toolbox": {
"show": true,
"category": "舵机"
}
}
```
其中 toolbox和b4a中,都是b4a提供扩展配置。
#### toolbox配置
toolbox配置,决定了该block在侧边栏中显示情况,和默认绑定的输入项
```
"toolbox": {
"show": true, // true,即会在边栏中显示,false,不显示
"inputs": {}// 默认输入项设置,遵循blockly toolbox配置,可见(https://developers.google.com/blockly/guides/configure/web/toolbox)
}
```
对于inputs配置,你也可以参考io库中我写的配置。
#### b4a配置
b4a配置是用于快速生成代码的配置,在**简单场景**下,可以替代generator js文件。
##### 代码结构
我将一个Arduino程序切分为以下部分:
```
// 宏定义 macros
// 库引用 libraries
#include <Servo.h>
// 变量 variables
static const int servoPin = 4;
// 对象 objects
Servo servo1;
// 函数 functions
void setup() {
// 初始化部分 setup
// 用户自定义 userSetups
Serial.begin(115200);
servo1.attach(servoPin);
}
// 主程序 loops
void loop() {
for(int posDegrees = 0; posDegrees <= 180; posDegrees++) {
servo1.write(posDegrees);
Serial.println(posDegrees);
delay(20);
}
for(int posDegrees = 180; posDegrees >= 0; posDegrees--) {
servo1.write(posDegrees);
Serial.println(posDegrees);
delay(20);
}
}
```
回到b4a配置中,其中对应的代码会被插入到程序中对应的位置。
```
"b4a": { // B4A代码生成器配置
"code": "${OBJECT}.attach(${PIN1});",
"library": "#include <Servo.h>",
"object": "Servo ${OBJECT};"
},
```
如图:
##### 变量
b4a配置支持变量,变量形式为`${VAR_NAME}`,其中`VAR_NAME`即是`args0`中输入项`name`。
B4A会自动将代码中的变量,替换为变量对应的值。
页:
[1]