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]