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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1105|回复: 0

B4A库文件编写(一)——使用B4A配置生成代码

[复制链接]
发表于 2022-7-14 00:00 | 显示全部楼层 |阅读模式
[md]# B4A库文件编写  
B4A库基本遵循blockly库结构,并对此进行了简化和扩展。  

B4A库存存放路径:`\resources\app\libraries`,您可以参照我提供的库,开发自己的B4A库。  
另外,我还开发了一个库创建器[B4A-creator](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": [3.3,5]
    },
    "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配置,可以参照[blockly官方文档](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配置,可见[blockly官方文档](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};"
},
```

如图:  

QQ截图20220714000212.jpg


##### 变量
b4a配置支持变量,变量形式为`${VAR_NAME}`,其中`VAR_NAME`即是`args0`中输入项`name`。
B4A会自动将代码中的变量,替换为变量对应的值。  


[/md]

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 00:07 , Processed in 0.096643 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表