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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1160|回复: 0

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

[复制链接]
发表于 2022-7-26 09:09 | 显示全部楼层 |阅读模式
[md]# 使用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[blockType] = 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;
}
```
rtc-demo.jpg

[/md]

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

本版积分规则

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

GMT+8, 2024-11-28 01:35 , Processed in 0.138588 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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