B4A库文件编写(一)——使用B4A配置生成代码-Arduino中文社区 - Powered by Discuz! Archiver

奈何col 发表于 2022-7-14 00:00

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]
查看完整版本: B4A库文件编写(一)——使用B4A配置生成代码