结合之前学的一些知识,设计一个基于NAPI框架和HDF框架读取温度传感器数据的程序应用。
(相关资料图)
想了解更多关于开源的内容,请访问:
清一色开源基础软件社区
https://ost.51cto.com
前言
前面两篇文章已经实现了ADC的HDF框架接入,现在已经可以正常调用HDF提供的ADC统一驱动接口进行应用开发。结合之前学的一些知识,设计一个基于NAPI框架和HDF框架读取温度传感器数据的程序应用。
参考
平台驱动使用标准系统HDF平台驱动(一)——ADC驱动适配标准系统HDF平台驱动(二)——ADC平台驱动使用
环境
OpenHarmony-3.2-Beta5九联UnionPi-Tiger开发板Visual Studio Code(版本需1.62.0及以上)USB_Burning_Tool烧录工具napi_generator工具可执行文件或vs code插件Deveco Studio(API 9 )LM35线性模拟温度传感器概述
开发步骤
一、编译构建实现
添加子系统。
"napisubsys":{ "path":"vendor/unionman/unionpi_tiger/sample/napi/napisubsys", "name":"napisubsys" }
添加组件,打开unionpi_tiger/sample/napi/napisubsys/ohos.build文件,在”parts”:中添加下列语句。
"adc_hdf": { "variants": [ "phone" ], "module_list": [ "//vendor/unionman/unionpi_tiger/sample/napi/napisubsys/adc_hdf:adc_hdf" ] }
添加产品定义,打开vendor/unionman/unionpi_tiger/config.json文件,在”subsystems”:中添加下列语句。
{ "subsystem": "napisubsys", "components": [ { "component": "adc_hdf", "features": [] } ] },
二、NAPI接口设计及NAPI框架生成
编写ts文件,新建文件@ohos.adc_hdf.d.ts于vendor/unionman/unionpi_tiger/sample/napi/napisubsys/adc_hdf目录下,声明应用接口函数get_adc_value,传入参数为通道号,返回值为ADC采样值,北向应用通过调用该接口获取的ADC采样值计算温度。
declare namespace adc_hdf { function get_adc_value(channel: number): number;}export default adc_hdf;
生成NAPI框架,使用napi_generator可执行程序或者vscode插件生成NAPI框架。
生成框架路径也选择当前路径,number类型选择uint32_t。
三、NAPI接口实现
实现adc_hdf.cpp接口,文件生成结束后,我们定义的北向应用接口需要在adc_hdf.cpp中实现,具体代码如下:
#include "adc_hdf.h"#include "adc_if.h"#include "hdf_log.h"#includenamespace adc_hdf {bool get_adc_value(NUMBER_TYPE_1& channel, NUMBER_TYPE_2& out){ int32_t ret; DevHandle adcHandle = NULL; uint32_t read_val = 0; /* 打开ADC设备 */ adcHandle = AdcOpen(ADC_DEVICE_NUM); if (adcHandle == NULL) { printf("%s: Open ADC%u fail!", __func__, ADC_DEVICE_NUM); return false; } /* 读取ADC采样值 */ ret = AdcRead(adcHandle, (uint32_t)channel, &read_val); if (ret != HDF_SUCCESS) { printf("%s: ADC read fail!:%d", __func__, ret); AdcClose(adcHandle); return false; } /* 结果返回值 */ out = (NUMBER_TYPE_2)read_val; printf("ADC read:%d\r\n",read_val); /* 访问完毕关闭ADC设备 */ AdcClose(adcHandle); return true;}}
修改BUILD.gn文件,主要添加了ADC平台驱动所需依赖及头文件路径,并且修改目标子系统及所属部件,编译后会生成相应的.so共享库文件,存放在/system/lib/module目录下。
import("//build/ohos.gni")ohos_shared_library("adc_hdf"){ sources = [ "adc_hdf_middle.cpp", "adc_hdf.cpp", "tool_utility.cpp", ] include_dirs = [ ".", "//third_party/node/src", "//drivers/hdf_core/framework/include/platform" ] deps=[ "//foundation/arkui/napi:ace_napi", "//drivers/hdf_core/adapter/uhdf2/platform:libhdf_platform" ] external_deps = [ "hdf_core:libhdf_utils", "hiviewdfx_hilog_native:libhilog", ] remove_configs = [ "//build/config/compiler:no_rtti" ] cflags=[ ] cflags_cc=[ "-frtti", ] ldflags = [ ] relative_install_dir = "module" part_name = "adc_hdf" subsystem_name = "napisubsys"}
四、编译打包烧录
进入源码根目录,执行如下命令进行编译:
./build.sh --product-name unionpi_tiger
编译完成后需要打包成可以给开发板烧录的镜像,执行一下命令:
./device/board/unionman/unionpi_tiger/common/tools/packer-unionpi.sh
固件打包完成,生成路径为编译根目录下的out/unionpi_tiger/packages/phone/images/OpenHarmony.img,下载或映射到Windows上进行烧录。
打开烧录工具,连接PC与开发板OTG口并接通电源,导入烧录包进行烧录。
或者使用hdc_std工具:
hdc_std shell mount -o remount,rw /hdc_std file send libadc_hdf.z.so /system/lib/module/
五、NAPI应用实现
新建OpenHarmony工程(stage+ArkTs)。
导入外部接口,adc_hdf为上述定义NAPI接口生成的动态库文件名字一致,直接导入会报找不到包,忽略即可,prompt为弹窗组件接口。
// @ts-ignoreimport adc_hdf from "@ohos.adc_hdf";import prompt from "@system.prompt"
ADC通道选择组件(使用Swiper滑块视图容器实现)。新建滑块视图数据类。
class MyDataSource implements IDataSource { private list: string[] = [] private listener: DataChangeListener constructor(list: string[]) { this.list = list } totalCount(): number { return this.list.length } getData(index: number): any { return this.list[index] } registerDataChangeListener(listener: DataChangeListener): void { this.listener = listener } unregisterDataChangeListener() { }}
Swiper滑块视图容器组件,滑动或点击可以切换ADC通道,点击select进行数据采集。
//通道选择组件实现@Componentstruct channel_chose { private swiperController: SwiperController = new SwiperController() private data: MyDataSource = new MyDataSource([]) private channelNum: number = 2 private tmp: number = 1 @Link channel: number//导入轮播内容 aboutToAppear(): void { let list = [] for (var i = 1; i <= this.channelNum; i++) { list.push("ADC_" + i.toString()); } this.data = new MyDataSource(list) } build() { Column({ space: 5 }) { Swiper(this.swiperController) { LazyForEach(this.data, (item: string) => { Text(item) .borderRadius(10) .width("80%") .height(70) .fontColor("#ff1a5ea4") .fontWeight(FontWeight.Bolder) .textAlign(TextAlign.Center) .fontSize(30) }, item => item) } .cachedCount(2) .interval(4000) .indicator(false) .duration(1000) .itemSpace(10) .vertical(true) .curve(Curve.Linear) .onChange((index: number) => { this.tmp = index + 1 }) Row({ space: 12 }) { Button("Change").backgroundColor("#ff366fb1").fontSize(20).height(50).width(120) .onClick(() => { this.swiperController.showNext() }) Button("Select").backgroundColor("#ff366fb1").fontSize(20).height(50).width(120) .onClick(() => { this.channel = this.tmp; prompt.showToast({ message: "Select data From ADC_"+this.channel.toString() }) console.info("Select data From Channel_"+this.channel.toString()) }) }.margin(20) }.width("50%") }}
文本组件显示温度值。
@Componentstruct show_temperature{ @Link temperature: Number build(){ Text(this.temperature.toFixed(1)+"°C") .width("50%") .fontSize(60) .fontColor(Color.White) .fontStyle(FontStyle.Italic) .textAlign(TextAlign.Center) .fontWeight(FontWeight.Bold) }}
温度计算及首页内容组件,程序启动时开启定时器,每隔1s获取一次ADC温度值。
@Entry@Componentstruct Index { @State channel: number = 1 @State adc_val: number = 0 @State temperature: number = 0 private timerId: number = -1 //获取温度传感器ADC采样值并计算温度 private get_adc_value() { let get_value = adc_hdf.get_adc_value(this.channel-1); if (get_value <= 1500) { this.adc_val = get_value; this.temperature = (this.adc_val / 4096) * 1.8 * 100; } else { this.temperature = 0 prompt.showToast({ message: "获取失败,请检查连线", // 显示文本 duration: 1000, // 显示时长 }) } } //程序运行时开启定时器Interval,每隔一秒调用get_adc_value更新温度值 aboutToAppear(): void { this.timerId = setInterval(() => { this.get_adc_value() }, 1000) } //销毁定时器 aboutToDisappear() { if (this.timerId > 0) { clearTimeout(this.timerId) this.timerId = -1 } } build() { Row() { show_temperature({temperature: $temperature}) Column({space:0}){ channel_chose({channel:$channel}) }.height("80%") }.height("100%") .backgroundImage($r("app.media.bg")).backgroundImageSize(ImageSize.Cover) }}
应用签名。
安装应用到开发板。
结果演示
https://ost.51cto.com/show/22186
文章相关附件可以点击下面的原文链接前往下载:
https://ost.51cto.com/resource/2661
想了解更多关于开源的内容,请访问:
清一色开源基础软件社区
https://ost.51cto.com
关键词:
结合之前学的一些知识,设计一个基于NAPI框架和HDF框架读取温度传感器数据的程序应用。2023-05-07
01:12告别“五一”人从众模式,看展正是好时机。周末即将到来,一大波内容丰富多元、含金量相当高的精品展2023-05-07
里弗斯批哈登无效传球恩比德:他进攻不稳定76人闹分歧记者拱火,76人队,道格·里弗斯,詹姆斯·哈登,乔尔·恩2023-05-07
1、中巴联合研制的,其实主要是咱们牵头,让卡巴斯基能跟着咱们学习技术、完事还能得到飞机。2、成功后主要2023-05-07
巴菲特被问及,在英国监管机构阻止微软收购动视暴雪后,伯克希尔哈撒韦是否调整了其所持动视暴雪股份。他表2023-05-07
入夏后别瞎穿,不露肩不露腰,40岁女人这样打扮,时尚又高级,衬衫,露肩,穿搭,版型,入夏,阔腿裤,同色系,时尚2023-05-07
1、感觉吉安比宜春要好,虽然都没去过。2、其他无异议。本文到此分享完毕,希望对大家有所帮助。2023-05-07
从品质上说,《浪姐4》的制作水准肉眼可见地回升,可夸的点很多:有人津津乐道真人秀的自然有趣,要被蔡少2023-05-06
1、绿色食品蔬菜,按照绿色食品标准生产的蔬菜。2、是指遵循可持续发展原则,按特定生产方式生产,并经专门机2023-05-06
欢迎观看本篇文章,小升来为大家解答以上问题。歌曲痒的作词作曲是谁,现在就为大家介绍很多人还不知道,现2023-05-06
文物主题游径是以不可移动文物为主干,以特定主题为主线,有机关联、串珠成链,集中展示专题历史文化的文化遗2023-05-06
02:16喝一杯没有明码标价的咖啡,你会支付多少钱?近日,杭州创业老兵吴裕炼和几个朋友开了一家“佛系”咖2023-05-06
5月6日是国际不节食日,由一位经历过神经性厌食症之苦的英国青年提出,目的是希望人们学会欣赏自己的身体,2023-05-06
如今,计算机的应用越来越广泛,这对工作和学习都非常重要。而且随着科技的进步,电脑的种类和品牌也在发生2023-05-06
1、黄山。黄山最出名的就是云海、奇松、怪石、温泉和雪景,奇松想必大家都知道,安徽旅游业的标志就是选自2023-05-06
从十八、十九世纪涌现的制表大师开始,机械表就一直在艰难地一步一步接近「完美」,但距离绝对的完美总是保2023-05-06
中国—中东欧经贸合作取得积极进展(权威发布) 双向投资规模已接近两百亿美元 第三届中国—中东欧国家2023-05-06
(美银行危机 深度)4大危机缠身!加息将让美国大量银行破产,加息,美联储,高通胀,金融危机,美银行危机,美国2023-05-06
近日,华中农业大学信息学院杨庆勇教授课题组在国际学术期刊MolecularPlant上发表研究成果。该研究搜集并整2023-05-06
拼多多的最新股权结构曝光了。5月3日,拼多多日前向美国SEC递交了20-F文件。文件显示,截至2023年2月28日,2023-05-06
看剧||秦昊可能都不知道他演了一个人生中最好的角色2023-05-06
1、肌肤之钥 CPB2、资生堂 Shiseido3、兰蔻 Lancome4、海蓝之谜 LAMER5、SK-II6、迪奥2023-05-06
5月5日,重庆市南川区鸣玉镇举行插秧技能大赛,参赛选手们在稻田里比拼插秧技艺。当日,鸣玉镇在稻香渔歌乡2023-05-06
起点校园音乐节门票无需额外单独购票,成都欢乐谷入园门票或年卡均可观看日场门票:230元 人夜场门票:1002023-05-06
1、完善学校突发事件应急管理机制研究是一本2017年出版的图书。2、由经济科学出版社出版。本文到此分享完毕2023-05-06