CN114064041B - 通过Android系统将控车矩阵文件生成控车代码的方法及系统 - Google Patents
通过Android系统将控车矩阵文件生成控车代码的方法及系统 Download PDFInfo
- Publication number
- CN114064041B CN114064041B CN202111365689.4A CN202111365689A CN114064041B CN 114064041 B CN114064041 B CN 114064041B CN 202111365689 A CN202111365689 A CN 202111365689A CN 114064041 B CN114064041 B CN 114064041B
- Authority
- CN
- China
- Prior art keywords
- data
- message
- code
- file
- template
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/76—Adapting program code to run in a different environment; Porting
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Mobile Radio Communication Systems (AREA)
- Selective Calling Equipment (AREA)
Abstract
本发明涉及一种数据转换方法,尤其是通过Android系统将控车矩阵文件自动生成控车代码的方法及系统。通过Android手机将控车矩阵文件自动生成控车代码的方法,包括以下步骤:将控车矩阵协议编辑在Excel中,并在Excel文件中写入远程驾驶控制器报文定义数据;Android手机读取Excel表格内容,并定位到远程驾驶控制器报文定义数据;对数据进行解析;将数据根据预先定义的代码模板转换成代码,并保存为代码文件;将代码文件导出到C文件。该方法通过Android系统就可以将一份Excel格式的控车矩阵文件自动生成一份对应的控车功能代码,然后稍加修改,就可以完成一个车型的适配,大大的节省人力与时间成本,具有非常可观的经济效益。
Description
技术领域
本发明涉及一种数据转换方法,尤其是通过Android系统将控车矩阵文件自动生成控车代码的方法及系统。
背景技术
在完成一个远程驾驶项目车型开发后,相似类型的远程驾驶项目车型,其控车逻辑基本不会有太大变化,但复杂的控车矩阵,针对每个不同的车型都需要花费大量的时间精力去解析适配的。
发明内容
为解决上述问题,本发明提供一种将控车矩阵协议文件编写在Excel中,并通过预先定义的代码模板将Excel文件转换成代码文件,能够适配不同项目车型的通过Android系统将控车矩阵文件自动生成控车代码的方法,具体技术方案为:
通过Android手机将控车矩阵文件自动生成控车代码的方法,包括以下步骤:
将控车矩阵协议编辑在Excel中,并在Excel文件中写入远程驾驶控制器报文定义数据;
Android手机读取Excel表格内容,并定位到远程驾驶控制器报文定义数据;
对数据进行解析;
将数据根据预先定义的代码模板转换成代码,并保存为代码文件;
将代码文件导出到C文件。
优选的,所述远程驾驶控制器报文定义数据包括:报文ID、报文发送类型、报文周期、报文长度、信号名称、信号描述、信号长度、起始字节位置、起始位位置、精度、偏移量、十六进制取值范围、“物理值取值范围、信号值描述和初始值。
进一步的,数据解析时:
先提取报文ID、报文发送类型、报文周期和报文长度,并根据ID的不同将上述信息分条目保存到一个数据列表中,数据列表类型为:
ArrayList<RcuCanSignalData>;
其中RcuCanSignalData为包含:报文ID、报文发送类型、报文周期、报文长度和SignalData的自定义类。
然后解析报文ID下的详细条目,提取信号名称、信号描述、信号长度、起始字节位置、起始位位置、精度、偏移量、十六进制取值范围、“物理值取值范围、信号值描述和初始值,将上述信息保存在对应报文ID的RcuCanSignalData 类的SignalData内部类中。
其中,预先定义的代码模板包括数据声明模板、数据定义模板和函数实现模板,代码模板以字符串形式存储在res/string.xml中。
进一步的,所述数据声明模板包括声明固定部分和声明动态获取部分;
所述声明固定部分包含C语言语法内容,所述C语言语法内容包括include 头文件、标识符、关键字和变量类型;
所述声明动态获取部分定义为%1$s、%2$s、%3$s……,在AndroidAPP的sourcecode中通过getString()的传入参数来写入具体的字符串;
所述数据定义模板包括定义固定部分和定义动态获取部分;
所述定义固定部分包含C语言语法内容,所述C语言语法内容包括标识符、关键字和变量类型;
所述定义动态获取部分定义为%1$s、%2$s、%3$s……,在sourcecode中通过getString()的传入参数来写入具体的字符串。
所述函数实现模板包括函数固定部分和函数动态获取部分;
所述函数固定部分包含C语言语法内容,所述C语言语法内容包括标识符、关键字、变量类型;
所述函数动态获取部分定义为%1$s、%2$s、%3$s……,在sourcecode中通过getString()的传入参数来写入具体的字符串。
优选的,转化代码时:
遍历数据解析出的数据列表,获取各RcuCanSignalData的成员数据,根据起始字节位置和起始位位置来控制调用顺序,然后分别:
通过getString带入参数:R.string.c_code_claims、报文ID、报文长度、信号名称和信号描述,将定义好的数据声明模板通过传入具体的参数,生成包含:头文件引用、宏定义、变量声名和结构体声名内容;
通过getString带入参数:R.string.c_code_define、报文ID和初始值,将定义好的数据定义模板通过传入具体的参数,生成包含:头文件引用、变量定义、结构体变量定义的代码片段;
通过getString带入参数:R.string.c_code_function、报文ID、报文发送类型、报文周期、偏移量和十六进制取值范围,将定义好的函数实现模板通过传入具体的参数,生成包含:函数实现、定时任务启动、函数调用的代码片段。
通过Android手机将控车矩阵自动生成控车代码的系统,包括:浏览单元,所述浏览单元用于选取控车矩阵协议文件;生成代码单元,所述生成代码单元用于将控车矩阵协议文件生成代码文件;及导出单元,所述导出单元将代码文件导出到C文件。
与现有技术相比本发明具有以下有益效果:
本发明提供的通过Android系统将控车矩阵文件自动生成控车代码的方法通过Android系统就可以将一份Excel格式的控车矩阵文件自动生成一份对应的控车功能代码,然后稍加修改,就可以完成一个车型的适配,大大的节省人力与时间成本,具有非常可观的经济效益。
附图说明
图1是通过Android系统将控车矩阵文件自动生成控车代码的方法的流程图;
图2是通过Android系统将控车矩阵文件自动生成控车代码的系统的界面图。
具体实施方式
现结合附图对本发明作进一步说明。
远程驾驶车架底盘功能设计时以Excel表格的形式进行编写控车矩阵协议,远程驾驶车载端的开发者在拿到控车矩阵协议后,对着Excel表格逐行去适配控车代码,将Excel中的内容转成一条条的控车CAN报文。
Android系统将特定格式的Excel控车矩阵协议文档自动转换成控车代码,开发者只需要通过简单的操作,就可得到控车代码,然后稍加调整编译通过,即可完成不同车型的适配。
实施例一
用户可将控车矩阵协议文件放在Android手机或平板的存储中,通过点击系统界面的“浏览”弹出文件选择,选取对应的控车矩阵协议文件,在浏览时,只显示Excel文件。当用户选取了常规的控车矩阵协议文件后,可通过点击“生成代码”,APP将在后台对Excel文件第一列进行逐行遍历,确认是否有“RCU”列存在,RCU为远程驾驶控制器报文描述,如果不存在,提示未找到控车矩阵定义,请重启选取文件。如果存在,则执行转换步骤,转换完成后点击“导出到 C文件”将转换的代码片段以文本形式保存到C文件中。
如图1所示,通过Android系统将控车矩阵文件自动生成控车代码的方法,包括以下步骤:
S1、将控车矩阵协议编辑在Excel中,并在Excel文件中写入远程驾驶控制器报文定义数据;远程驾驶控制器报文定义数据包括:报文ID、报文发送类型、报文周期、报文长度、信号名称、信号描述、信号长度、起始字节位置、起始位位置、精度、偏移量、十六进制取值范围、物理值取值范围、信号值描述和初始值。
S2、Android系统读取Excel表格内容,对Excel文件第一列进行逐行遍历,定位到远程驾驶控制器报文定义数据;
S3、对数据进行解析;
先提取报文ID、报文发送类型、报文周期和报文长度,并根据ID的不同将上述信息分条目保存到一个数据列表中,数据列表类型为:
ArrayList<RcuCanSignalData>;其中RcuCanSignalData为包含:报文ID、报文发送类型、报文周期、报文长度和SignalData(信号详细定义类)的自定义类。
然后解析报文ID下的详细条目,提取信号名称、信号描述、信号长度、起始字节位置、起始位位置、精度、偏移量、十六进制取值范围、“物理值取值范围、信号值描述和初始值,将上述信息保存在对应报文ID的RcuCanSignalData 类的SignalData内部类中。
S4、将数据根据预先定义的代码模板转换成代码,并保存为代码文件;
预先定义的代码模板包括数据声明模板、数据定义模板和函数实现模板,代码模板以字符串形式存储在res/string.xml中。
数据声明模板:
<stringname="c_code_claims">[数据定义模板内容]</string>。
其中,数据声明模板内容由两部分组成:a.声明固定部分,b.声明动态获取部分。声明固定部分包含C语言语法内容部分,如include头文件、标识符、关键字、变量类型等;声明动态获取部分定义为%1$s、%2$s、%3$s……,在 AndroidAPP的sourcecode中通过声明getString()的传入参数来写入具体的字符串,如:报文ID(用于数据结构体名的定义)、报文长度(用于结构体长度的定义)、信号名称(用于SignalData类的成员变量的命名)、信号描述(用于SignalData 类的成员变量的注释)、信号长度(SignalData类的成员变量的位长度定义)等。
数据定义模板:
<stringname="c_code_define">[数据定义模板内容]</string>。
其中,数据定义模板内容由两部分组成:a.定义固定部分,b.定义成动态获取部分。定义固定部分包含C语言语法内容部分,如标识符、关键字、变量类型等;定义动态获取部分定义为%1$s、%2$s、%3$s……,在sourcecode中通过定义getString()的传入参数来写入具体的字符串,如:报文ID(用于 RcuCanSignalData类成员变量id的赋值)、初始值(用于SignalData类各信号的赋初始)等。
函数实现模板:
<stringname="c_code_function">[数据定义模板内容]</string>。
其中,函数实现模板内容由两部分组成:a.函数固定部分,b.函数动态获取部分。函数固定部分包含C语言语法内容部分,如标识符、关键字、变量类型等;函数动态获取部分定义为%1$s、%2$s、%3$s……,在sourcecode中通过函数getString()的传入参数来写入具体的字符串,如:偏移量(用于计算数据偏移值)、十六进制取值范围(用于控制数据的范围)、报文周期(用于控车程序定时器调用的传入参数)等。
生成代码:
针对解析出的数据列表,遍历列表,获取各RcuCanSignalData的成员数据,根据起始字节位置、起始位位置来控制调用顺序,然后分别:
通过getString带入参数:R.string.c_code_claims、报文ID、报文长度、信号名称和信号描述,将定义好的数据声明模板通过传入具体的参数,生成包含:头文件引用、宏定义、变量声名和结构体声名内容;
通过getString带入参数:R.string.c_code_define、报文ID和初始值,将定义好的数据定义模板通过传入具体的参数,生成包含:头文件引用、变量定义、结构体变量定义的代码片段;
通过getString带入参数:R.string.c_code_function、报文ID、报文发送类型、报文周期、偏移量和十六进制取值范围,将定义好的函数实现模板通过传入具体的参数,生成包含:函数实现、定时任务启动、函数调用的代码片段。
S5、将代码片段以文本形式保存到C文件中。
车载端控车功能开发者拿到C文件合入控车程序代码,在linux工程中编译生成控车程序。
报文ID下的详细条目包括:
RCU_Dig_Ord_eBoosterAutoDriveEnable:eBooster自动驾驶状态使能;
RCU_Dig_Ord_Brake:EPB使能;
RCU_Dig_Ord_VCUAutoDriveEnable:VCU自动驾驶状态使能;
RCU_Dig_Ord_ESCAutoDriveEnable:ESC自动驾驶状态使能;
RCU_Dig_Ord_EPSAutoDriveEnable:EPS自动驾驶状态使能;
RCU_Dig_Ord_EPBAutoDriveEnable:EPB自动驾驶状态使能;
RCU_Ang_Stat_ElectricAccPedal:加速踏板开度;
RCU_Ang_Stat_WhellAngle_H:方向盘转角高;
RCU_Ang_Stat_WhellAngle_L:方向盘转角低;
RCU1_Checksum:校验码;
RCU_Ang_Stat_BrakeAccleration_H:制动减速度;
RCU_Dig_Ord_Gear:档位;
RCU_Dig_Ord_BCMAutoDriveEnable:BCM自动驾驶状态使能;
RCU_Ang_Stat_BrakeAccleration_L:制动减速度;
RCU_Dig_Ord_SystemStatus:RCU系统运行状态信号;
resv2:预留;
RCU1_Rollingcount:计数器。
如下表为报文定义数据表:
实施例二
如图2所示,通过Android系统将控车矩阵自动生成控车代码的系统,包括:浏览单元、生成代码单元和导出单元,浏览单元用于选取控车矩阵协议文件;生成代码单元用于将控车矩阵协议文件生成代码文件;导出单元将代码文件导出到 C文件。
用户可将控车矩阵协议文件放在Android手机或平板的存储中,通过点击系统界面的“浏览”弹出文件选择,选取对应的控车矩阵协议文件,在浏览时,只显示Excel文件。当用户选取了常规的控车矩阵协议文件后,可通过点击“生成代码”,APP将在后台对Excel文件第一列进行逐行遍历,确认是否有“RCU”列存在,RCU为远程驾驶控制器报文描述,如果不存在,提示未找到控车矩阵定义,请重启选取文件。如果存在,则执行转换步骤,转换完成后点击“导出到 C文件”将转换的代码片段以文本形式保存到C文件中。
以上结合具体实施例描述了本发明的技术原理。这些描述只是为了解释本发明的原理,而不能以任何方式解释为对本发明保护范围的限制。基于此处的解释,本领域的技术人员不需要付出创造性的劳动即可联想到本发明的其它具体实施方式,这些方式都将落入本发明权利要求的保护范围之内。
Claims (2)
1.通过Android系统将控车矩阵文件自动生成控车代码的方法,其特征在于,包括以下步骤:
将控车矩阵协议编辑在Excel中,并在Excel文件中写入远程驾驶控制器报文定义数据;
Android系统读取Excel表格内容,并定位到远程驾驶控制器报文定义数据;
对数据进行解析;
将数据根据预先定义的代码模板转换成代码,并保存为代码文件;
将代码文件导出到C文件;
所述远程驾驶控制器报文定义数据包括:报文ID、报文发送类型、报文周期、报文长度、信号名称、信号描述、信号长度、起始字节位置、起始位位置、精度、偏移量、十六进制取值范围、物理值取值范围、信号值描述和初始值;
数据解析时:
先提取报文ID、报文发送类型、报文周期和报文长度,并根据ID的不同将上述信息分条目保存到一个数据列表中,数据列表类型为:
ArrayList<RcuCanSignalData>;
其中RcuCanSignalData为包含:报文ID、报文发送类型、报文周期、报文长度和SignalData的自定义类;
然后解析报文ID下的详细条目,提取信号名称、信号描述、信号长度、起始字节位置、起始位位置、精度、偏移量、十六进制取值范围、物理值取值范围、信号值描述和初始值,将上述信息保存在对应报文ID的RcuCanSignalData类的SignalData内部类中;
其中,将数据根据预先定义的代码模板转换成代码,并保存为代码文件;
预先定义的代码模板包括数据声明模板、数据定义模板和函数实现模板,代码模板以字符串形式存储在res/string.xml中;
数据声明模板:
<stringname="c_code_claims">[数据定义模板内容]</string>;
其中,数据声明模板内容由两部分组成:a.声明固定部分,b.声明动态获取部分;声明固定部分包含C语言语法内容部分,包括:include头文件、标识符、关键字、变量类型;声明动态获取部分定义为%1$s、%2$s、%3$s……,在AndroidAPP的sourcecode中通过声明getString()的传入参数来写入具体的字符串,包括:用于数据结构体名的定义的报文ID、用于结构体长度的定义的报文长度、用于SignalData类的成员变量的命名的信号名称、用于SignalData类的成员变量的注释的信号描述、用于SignalData类的成员变量的位长度定义的信号长度;
数据定义模板:
<stringname="c_code_define">[数据定义模板内容]</string>;
其中,数据定义模板内容由两部分组成:a.定义固定部分,b.定义成动态获取部分;定义固定部分包含C语言语法内容部分,包括:标识符、关键字、变量类型;定义动态获取部分定义为%1$s、%2$s、%3$s……,在sourcecode中通过定义getString()的传入参数来写入具体的字符串,包括:用于RcuCanSignalData类成员变量id的赋值的报文ID、用于SignalData类各信号的赋初始的初始值;
函数实现模板:
<stringname="c_code_function">[数据定义模板内容]</string>;
其中,函数实现模板内容由两部分组成:a.函数固定部分,b.函数动态获取部分;函数固定部分包含C语言语法内容部分,包括:标识符、关键字、变量类型;函数动态获取部分定义为%1$s、%2$s、%3$s……,在sourcecode中通过函数getString()的传入参数来写入具体的字符串,包括:用于计算数据偏移值的偏移量、用于控制数据的范围的十六进制取值范围、用于控车程序定时器调用的传入参数的报文周期;
生成代码:
针对解析出的数据列表,遍历列表,获取各RcuCanSignalData的成员数据,根据起始字节位置、起始位位置来控制调用顺序,然后分别:
通过getString带入参数:R.string.c_code_claims、报文ID、报文长度、信号名称和信号描述,将定义好的数据声明模板通过传入具体的参数,生成包含:头文件引用、宏定义、变量声名和结构体声名内容;
通过getString带入参数:R.string.c_code_define、报文ID和初始值,将定义好的数据定义模板通过传入具体的参数,生成包含:头文件引用、变量定义、结构体变量定义的代码片段;
通过getString带入参数:R.string.c_code_function、报文ID、报文发送类型、报文周期、偏移量和十六进制取值范围,将定义好的函数实现模板通过传入具体的参数,生成包含:函数实现、定时任务启动、函数调用的代码片段。
2.一种用于权利要求1所述的通过Android系统将控车矩阵文件自动生成控车代码的方法的系统,其特征在于,包括:
浏览单元,所述浏览单元用于选取控车矩阵协议文件;
生成代码单元,所述生成代码单元用于将控车矩阵协议文件生成代码文件;及
导出单元,所述导出单元将代码文件导出到C文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111365689.4A CN114064041B (zh) | 2021-11-18 | 2021-11-18 | 通过Android系统将控车矩阵文件生成控车代码的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111365689.4A CN114064041B (zh) | 2021-11-18 | 2021-11-18 | 通过Android系统将控车矩阵文件生成控车代码的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114064041A CN114064041A (zh) | 2022-02-18 |
CN114064041B true CN114064041B (zh) | 2022-08-02 |
Family
ID=80278031
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111365689.4A Active CN114064041B (zh) | 2021-11-18 | 2021-11-18 | 通过Android系统将控车矩阵文件生成控车代码的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114064041B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106776343A (zh) * | 2017-01-13 | 2017-05-31 | 中国科学院软件研究所 | 一种Web应用程序自动化测试工具及方法 |
CN111684766A (zh) * | 2019-05-23 | 2020-09-18 | 深圳市大疆创新科技有限公司 | 分布式系统中通信协议版本号的更新 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107132832B (zh) * | 2016-02-29 | 2019-10-11 | 株洲南车时代电气股份有限公司 | 一种基于can通讯的dbc文件解析及其程序设计方法 |
CN106603482B (zh) * | 2016-05-26 | 2023-01-13 | 欣旺达电动汽车电池有限公司 | 自动生成can通讯协议代码的方法和装置 |
JP6499996B2 (ja) * | 2016-06-06 | 2019-04-10 | アップルオートネットワーク株式会社 | 車載式故障診断装置に記録された情報に基づいて中古車査定の適正化を促す中古車査定支援システム |
CN112379883A (zh) * | 2020-11-10 | 2021-02-19 | 上海拿森汽车电子有限公司 | 一种代码文件生成方法、装置、设备及存储介质 |
CN112714134B (zh) * | 2021-01-19 | 2023-09-26 | 广州导远电子科技有限公司 | Can报文的解析方法、适配方法、装置、设备及介质 |
-
2021
- 2021-11-18 CN CN202111365689.4A patent/CN114064041B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106776343A (zh) * | 2017-01-13 | 2017-05-31 | 中国科学院软件研究所 | 一种Web应用程序自动化测试工具及方法 |
CN111684766A (zh) * | 2019-05-23 | 2020-09-18 | 深圳市大疆创新科技有限公司 | 分布式系统中通信协议版本号的更新 |
Also Published As
Publication number | Publication date |
---|---|
CN114064041A (zh) | 2022-02-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5209209B2 (ja) | コンピュータプログラムを構成する方法 | |
CN102880468B (zh) | 一种用于ecu程序开发的代码智能提示方法及其系统 | |
US6226692B1 (en) | Method and system for constructing software components and systems as assemblies of independent parts | |
US7730102B2 (en) | Method and system for organizing and manipulating nodes by category in a program tree | |
US20020013862A1 (en) | Method for data access code generation | |
EP2330504A1 (en) | Lambda expressions | |
KR20090013243A (ko) | 워드 프로세서 문서의 원시 xml에서 비원시 xml을 지원하는 시스템 및 방법 | |
CN113778449B (zh) | 航空电子接口数据适配转换系统 | |
CN116483980A (zh) | 人机交互方法、装置及系统 | |
CN102566984A (zh) | 一种配置参数的方法及装置 | |
WO2004102380A2 (en) | Method and system for storing pending changes to data | |
CN113805890A (zh) | 小程序跨应用迁移方法、设备、终端、系统及存储介质 | |
CN114064041B (zh) | 通过Android系统将控车矩阵文件生成控车代码的方法及系统 | |
JPH05197562A (ja) | Yaccプログラム編集装置 | |
CN114327185A (zh) | 一种车机屏幕控制方法、装置、介质及电子设备 | |
CN106484488A (zh) | 一体化云编译方法和系统 | |
CN109254774A (zh) | 软件开发系统中代码的管理方法和装置 | |
CN114564195B (zh) | 一种基于b/s架构的云cad平台的二次开发方法 | |
US10643024B2 (en) | Method for converting a binary data stream | |
CN114595246B (zh) | 一种语句生成方法、装置、设备及存储介质 | |
Boskovic et al. | A proposal of Android services generator for inter-connection with ADAS | |
CN110347816B (zh) | 一种信息推荐方法及装置 | |
JPH04362738A (ja) | 変数管理方法 | |
CN113391816A (zh) | Python代码的资源加载方法及装置 | |
JPH09179738A (ja) | オブジェクト指向言語処理方法及び処理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |