18c339a94Sopenharmony_ci# Develop Guide
28c339a94Sopenharmony_ci
38c339a94Sopenharmony_ci## h2hdf工具使用场景
48c339a94Sopenharmony_ci
58c339a94Sopenharmony_ci在OpenHarmony系统中,上层应用或服务层通过调用HDF框架提供的HDI接口,能够以一种标准化和抽象化的方式与底层硬件设备进行交互。使用h2hdf工具,用户只需提供一个drivername,工具会自动生成整个框架的代码,包含驱动配置文件、idl接口、驱动程序driver和驱动服务框架。
68c339a94Sopenharmony_ci
78c339a94Sopenharmony_ci![image-20240724093743837](./figures/pic_code_frame.png)
88c339a94Sopenharmony_ci
98c339a94Sopenharmony_ci## h2hdf工具代码框架说明
108c339a94Sopenharmony_ci
118c339a94Sopenharmony_ci```
128c339a94Sopenharmony_cih2hdf
138c339a94Sopenharmony_ci├── docs                                      # 文档
148c339a94Sopenharmony_ci│   ├── figures                               # 图片资源
158c339a94Sopenharmony_ci│   ├── usage.md                              # 使用文档
168c339a94Sopenharmony_ci│   ├── develop.md                            # 设计文档        
178c339a94Sopenharmony_ci├── src
188c339a94Sopenharmony_ci│   ├── templete                              # 模板文件
198c339a94Sopenharmony_ci│   │   ├── HcsconfigTemplete
208c339a94Sopenharmony_ci│   │   │   ├── hcsconfigTemplete.gen         # hcs配置模板
218c339a94Sopenharmony_ci│   │   ├── IdlInterfaceTemplete
228c339a94Sopenharmony_ci│   │   │   ├── buildgnTemplete.gen           # idl接口BUILD.gn模板
238c339a94Sopenharmony_ci│   │   │   ├── v4_1
248c339a94Sopenharmony_ci│   │   │   │   ├── bundlejsonTemplete.gen    # idl接口bundle.json模板
258c339a94Sopenharmony_ci│   │   │   ├── idlInterfaceTemplete.gen      # idl接口定义文件模板
268c339a94Sopenharmony_ci│   │   ├── PeripheralTemplete
278c339a94Sopenharmony_ci│   │   │   ├── DumpExampleTemplete           # dump示例
288c339a94Sopenharmony_ci│   │   │   │   ├── v4_1
298c339a94Sopenharmony_ci│   │   │   │   │   ├── buildgnTemplete.gen   # BUILD.gn模板
308c339a94Sopenharmony_ci│   │   │   │   ├── dumpCTemplete.gen         # dump实现示例模板
318c339a94Sopenharmony_ci│   │   │   │   ├── dumpHTemplete.gen         # dump h文件模板
328c339a94Sopenharmony_ci│   │   │   ├── HdiServiceTemplete            # hdi_service 模板
338c339a94Sopenharmony_ci│   │   │   │   ├── v4_1
348c339a94Sopenharmony_ci│   │   │   │   │   ├── buildgnTemplete.gen   # BUILD.gn模板
358c339a94Sopenharmony_ci│   │   │   │   ├── driverTemplete.gen        # driver模板
368c339a94Sopenharmony_ci│   │   │   │   ├── logHTemplte.gen           # 日志文件模板
378c339a94Sopenharmony_ci│   │   │   │   ├── serviceCppTemplete.gen    # 驱动服务模板
388c339a94Sopenharmony_ci│   │   │   │   ├── serviceHTemplete.gen      # 驱动服务 h 文件模板
398c339a94Sopenharmony_ci│   │   │   ├── buildgnTemplete.gen           # hdi service BUILD.gn模板
408c339a94Sopenharmony_ci│   │   │   ├── v4_1
418c339a94Sopenharmony_ci│   │   │   │   ├── bundlejsonTemplete.gen    # hdi service bundle.json模板
428c339a94Sopenharmony_ci│   │   ├── framework.json                    # 存储模板对应相对路径   
438c339a94Sopenharmony_ci│   ├── generate.js                           # 使用templete中对应的模板生成代码。
448c339a94Sopenharmony_ci│   ├── main.js                               # 工具入口文件,定义输入参数,调用generate.js来启动代码生成过程。
458c339a94Sopenharmony_ci├── package.json                              # Node.js打包配置文件
468c339a94Sopenharmony_ci```
478c339a94Sopenharmony_ci
488c339a94Sopenharmony_ci运行逻辑
498c339a94Sopenharmony_ci
508c339a94Sopenharmony_ci![image-20240724093743837](./figures/pic_code_process.png)
518c339a94Sopenharmony_ci
528c339a94Sopenharmony_cimain.js为脚本入口,其中使用stdio.getopt获取参数,其中,参数详情如下:
538c339a94Sopenharmony_ci
548c339a94Sopenharmony_ci  -n, drivername,例如:hello
558c339a94Sopenharmony_ci
568c339a94Sopenharmony_ci  -v, 可选参数,版本,默认为4.1
578c339a94Sopenharmony_ci
588c339a94Sopenharmony_ci  -o, 可选参数,默认为当前目录,指定生成框架代码输出路径。
598c339a94Sopenharmony_ci
608c339a94Sopenharmony_ci```
618c339a94Sopenharmony_cilet ops = stdio.getopt({
628c339a94Sopenharmony_ci    // 输入driver name ,输入一个字符串,默认为hello
638c339a94Sopenharmony_ci    'drivername': { key: 'n', args: 1, description: 'driver name', default: 'hello' },
648c339a94Sopenharmony_ci    // 输入版本号
658c339a94Sopenharmony_ci    'version': { key: 'v', args: 1, description: 'source version', default: '4.1' },
668c339a94Sopenharmony_ci    // 输出文件夹路径
678c339a94Sopenharmony_ci    'out': { key: 'o', args: 1, description: 'output directory', default: '' },
688c339a94Sopenharmony_ci});
698c339a94Sopenharmony_ci```
708c339a94Sopenharmony_ci
718c339a94Sopenharmony_ci对输入的参数值进行校验:checkInput对输入的drivername进行校验,输入的drivername必须符合命名规范;isValidValue对输入的版本号进行校验,输入的版本号必须包含在版本号数组中,该数组后续可持续更新:
728c339a94Sopenharmony_ci
738c339a94Sopenharmony_ci```
748c339a94Sopenharmony_ci...
758c339a94Sopenharmony_ciconst allowedVersion = ['4.1'];
768c339a94Sopenharmony_cifunction isValidValue(value, allowedVersion) {
778c339a94Sopenharmony_ci  return allowedVersion.includes(value);
788c339a94Sopenharmony_ci}
798c339a94Sopenharmony_ci
808c339a94Sopenharmony_cifunction checkInput(input) {
818c339a94Sopenharmony_ci  const regex = /\b[a-zA-Z_][a-zA-Z0-9_]*\b/;
828c339a94Sopenharmony_ci  return regex.test(input);
838c339a94Sopenharmony_ci}
848c339a94Sopenharmony_ci```
858c339a94Sopenharmony_ci
868c339a94Sopenharmony_ci获取到每个模板的路径后,根据路径读取模板文件,并替换模板文件中的drivername等:
878c339a94Sopenharmony_ci
888c339a94Sopenharmony_ci```
898c339a94Sopenharmony_ci/* 根据用户输入的driver名字生成framework框架
908c339a94Sopenharmony_ci * drivername:用户输入的驱动名,frameworkJson: 模板内容,out:生成框架路径
918c339a94Sopenharmony_ci * 替换模板中的名字并写文件输出
928c339a94Sopenharmony_ci */
938c339a94Sopenharmony_cifunction genDriverFramework(driverName, frameworkJson, version, out = '') {
948c339a94Sopenharmony_ci  ...
958c339a94Sopenharmony_ci  // 生成Hcs配置文件
968c339a94Sopenharmony_ci  genHcsconfigFile(frameworkJson, driverName, frameworkPath);
978c339a94Sopenharmony_ci  // 生成Idl接口
988c339a94Sopenharmony_ci  genInterface(frameworkPath, frameworkJson, rootInfo);
998c339a94Sopenharmony_ci  // 生成hdi_service
1008c339a94Sopenharmony_ci  genPeripheral(frameworkPath, frameworkJson, rootInfo);
1018c339a94Sopenharmony_ci}
1028c339a94Sopenharmony_ci```
1038c339a94Sopenharmony_ci
1048c339a94Sopenharmony_ci## 开发指导
1058c339a94Sopenharmony_ci
1068c339a94Sopenharmony_ci### 适配新版本
1078c339a94Sopenharmony_ci
1088c339a94Sopenharmony_ci适配新版本的步骤如下:
1098c339a94Sopenharmony_ci
1108c339a94Sopenharmony_ci1.在main.js中,在allowedVersion数组中加入适配的版本号,其中版本号需统一写法,如4.1
1118c339a94Sopenharmony_ci
1128c339a94Sopenharmony_ci2.在templete目录下,IdlInterfaceTemplete目录下新建适配版本文件夹,如v4_1,在适配版本文件夹下新增bundle.json模板,在 Periphheral, Periphheral/DumpExampleTemplete, Periphheral/HdiServiceTemplete新增适配版本文件夹,在适配版本下新增对应的BUILD.gn模板,并在framework.json中新增版本的bundle.json,BUILD.gn模板路径。
1138c339a94Sopenharmony_ci
1148c339a94Sopenharmony_ci3.在generate.js中,在genInterface方法、genExampleDumpfile方法、genHdiService方法、genBuildFile方法中修改相应代码:当rootInfo.version为新增版本时,替换对应的BUILD.gn, bundle.json模板路径。
1158c339a94Sopenharmony_ci
1168c339a94Sopenharmony_ci4.适配新版本增加其它配置时,可在templete目录下增加配置模板,并在framework.json中增加配置文件模板的路径,然后在generate.js中替换模板并生成配置文件。
1178c339a94Sopenharmony_ci
1188c339a94Sopenharmony_ci## Roadmap
1198c339a94Sopenharmony_ci
1208c339a94Sopenharmony_ci| 工作目标                      | 工作内容                                                     | 验收要求                                                     | 时间节点         |
1218c339a94Sopenharmony_ci| ----------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ---------------- |
1228c339a94Sopenharmony_ci| 支持一个简单的sample_host模板 | 根据工具基于OpenHarmony4.1源码,编写脚本生成Hdf框架模板,其中包括hcsconfig模板,idl接口模板,peripheral模板 | 生成之后可动态加载Host,并能使用Hidump查看日志,打印出"hello word!" | 2024.8(已完成) |
1238c339a94Sopenharmony_ci| 完善host模板                  | 增加testapp测试程序;完善模板中hitrace日志跟踪定位工具的使用;模板中增加死亡监听:客户端监听服务端消亡、服务端监听客户端消亡、服务端监听底层HDI侧消亡 | 驱动host能随镜像起来,服务端/客户端/HDI侧消亡时能打印出日志;检测接口被调用时打印hitrace日志 | 2024.10          |
1248c339a94Sopenharmony_ci| 适配5.0                       | 适配5.0release版本                                           | 适配5.0时,可以编译出对应版本的工具,且编译验证成功          | 2024.11          |
1258c339a94Sopenharmony_ci
126