B4A库文件编写(二)——使用js进行代码生成-Arduino中文社区 - Powered by Discuz! Archiver

奈何col 发表于 2022-7-26 09:09

B4A库文件编写(二)——使用js进行代码生成

# 使用js进行代码生成
接上节,在简单场景下,b4a配置可以替代generator js文件,完成从block到代码的转换。
但在一些复杂场景下,还是推荐使用blockly原本的generator js文件进行转换。

这里以时钟模块RTC库为例,其block定义如下:
`json部分较长,可以直接看到后面js部分`
```js
[
{
    "inputsInline": true,
    "message0": "初始化RTC 类型%1",
    "type": "rtc_begin",
    "colour": "#48c2c4",
    "args0": [
      {
            "type": "field_dropdown",
            "name": "RTC_TYPE",
            "options": [
                [
                  "DS1307",
                  "DS1307"
                ],
                [
                  "DS3231",
                  "DS3231"
                ]
            ]
      }
    ],
    "toolbox": {
      "show": true,
      "inputs": null
    },
    "previousStatement": null,
    "nextStatement": null
},
]
```

## js部分
使用js进行代码生成,需要建立一个与库json文件同名的js文件,然后添加对应的解释代码,解释代码基本格式如下:
```js
Arduino = function (block) {
    let code = '';
    // 想程序其他部分添加代码
    // 组合出code的内容,并返回
    return code;
}
```
### getValue
```js
let value= getValue(block, argName, fieldType)
```
可以使用方法获取对应输入项中的

以下为向程序中对应位置插入代码的方法,代码结构请查看[库文件编写-代码结构]()

### 添加代码

#### addMacro
添加`宏定义`代码到对应区域
#### addLibrary
添加`库引用`代码到对应区域
#### addVariable
添加`变量创建`代码到对应区域
#### addObject
添加`对象创建`代码到对应区域
#### addFunction
添加`函数`代码到对应区域
#### addSetup
添加代码到`setup`中
#### addUserSetup
添加代码到`用户自定义setup`中
#### addLoop
添加代码到`loop`中

## 示例程序
这里还是以RTC库为例:
```js
Arduino['rtc_begin'] = function (block) {
    let RTC_TYPE = getValue(block, 'RTC_TYPE', 'field_dropdown');
    Arduino.addMacro('#include <Wire.h>', '#include <Wire.h>')
    switch (RTC_TYPE) {
      case 'DS1307':
            Arduino.addMacro('#include <RtcDS1307.h>', '#include <RtcDS1307.h>')
            Arduino.addObject('Rtc', 'RtcDS1307<TwoWire> Rtc(Wire);')
            break;
      case 'DS3231':
            Arduino.addMacro('#include <RtcDS3231.h>', '#include <RtcDS3231.h>')
            Arduino.addObject('Rtc', 'RtcDS3231<TwoWire> Rtc(Wire);')
            break;
      default:
            break;
    }
    let code = 'Rtc.Begin();\n';
    return code;
}
```




页: [1]
查看完整版本: B4A库文件编写(二)——使用js进行代码生成