更多内容请访问:与华为官方共建的鸿蒙技术社区https:///harmonyos.51cto.com一、前言我们之前开发过熊派的LED灯驱动,并编写了相应的代码来调用我们自己开发的驱动,但是我们写的代码只能在终端以命令的形式调用,显然这是很不友好的。假设小熊派是我们的智能设备之一,而这个LED就是我们的手电筒,那么通过命令行打开手电筒肯定不是我们所期望的。我们希望能够在图形界面上点击一个按钮来打开我们的手电筒。目前OpenHarmony主要使用JS开发应用。如果我们想在图形界面打开我们的手电筒,我们需要定义一个JSAPI接口来调用我们的LED。本文介绍如何自定义JSAPI调用自己开发的驱动。2.流程概览添加JSAPI接口–>编写接口代码–>配置HDF头文件路径–>添加编译依赖3.添加JSAPI接口打开文件foundation\ace\ace_engine_lite\frameworks\src\core\modules\app_module。h,在第32行添加如下代码staticJSIValueToggleLed(constJSIValuethisVal,constJSIValue*args,uint8_targsNum);在第65行添加如下代码如图JSI::SetModuleAPI(exports,"ledcontrol",AppModule::ToggleLed);4.编写相应的驱动代码打开foundation\ace\ace_engine_lite\frameworks\src\core\modules\app_module.cpp文件,需要在两处添加我们自己的API代码4.1在头文件import处添加头文件添加下面的头文件#include"hdf_sbuf.h"#include"hdf_io_service_if.h"#defineLED_WRITE_READ1#defineLED_SERVICE"hdf_led"如图4.2添加API代码在合适的位置添加如下代码,建议在JSIValueAppModule::GetInfo函数前添加如下代码staticintOnDevEventReceived(void*priv,uint32_tid,structHdfSBuf*data){uint32_tvalue;HdfSbufReadUint32(数据,&值);HILOG_ERROR(HILOG_MODULE_ACE,"%s:收到开发事件:%u%u\n",(char*)priv,id,value);返回HDF_SUCCESS;}staticintGpioWriteRead(structHdfIoService*serv,int32_teventData,int32_t*val){intret=HDF_FAILURE;结构HdfSBuf*数据=HdfSBufObtainDefaultSize();结构HdfSBuf*回复=HdfSBufObtainDefaultSize();if(data==NULL||reply==NULL){HILOG_ERROR(HILOG_MODULE_ACE,"获取sbuf数据失败\n");返还;}if(!HdfSbufWriteUint8(data,(uint8_t)eventData)){HILOG_ERROR(HILOG_MODULE_ACE,"写入sbuf失败\n");HdfSBuf回收(数据);HdfSBufRecycle(回复);返还;}ret=serv->dispatcher->Dispatch(&serv->object,LED_WRITE_READ,data,reply);if(ret!=HDF_SUCCESS){HILOG_ERROR(HILOG_MODULE_ACE,"发送服务调用失败\n");HdfSBuf回收(数据);HdfSBufRecycle(回复);返还;}if(!HdfSbufReadInt32(reply,val)){HILOG_ERROR(HILOG_MODULE_ACE,"未能获得服务调用回复\n");ret=HDF_ERR_INVALID_OBJECT;HdfSBuf回收(数据);HdfSBufRecycle(回复);退役骨灰盒;}HILOG_ERROR(HILOG_MODULE_ACE,"获取回复为:%d\n",val);HdfSBuf回收(数据);HdfSBufRecycle(回复);returnret;}JSIValueAppModule::ToggleLed(constJSIValuethisVal,constJSIValue*args,uint8_targsNum){HILOG_ERROR(HILOG_MODULE_ACE,"ledbuttonpressed.");结构HdfIoService*serv=HdfIoServiceBind(LED_SERVICE);if(serv==NULL){HILOG_ERROR(HILOG_MODULE_ACE,"无法获取service2%s\n",LED_SERVICE);返回JSI::CreateUndefined();}if((args==nullptr)||(argsNum==0)||(JSI::ValueIsUndefined(args[0]))){returnJSI::CreateUndefined();}JSIValue成功=JSI::GetNamedProperty(args[0],CB_SUCCESS);JSIValue失败=JSI::GetNamedProperty(args[0],CB_FAIL);JSIValuecomplete=JSI::GetNamedProperty(args[0],CB_COMPLETE);int32_tnum=(int32_t)JSI::GetNumberProperty(args[0],"代码");int32_treplyData=0;如果(GpioWriteRead(serv,num,&replyData)){HILOG_ERROR(HILOG_MODULE_ACE,"发送事件失败\n");JSI::CallFunction(fail,thisVal,nullptr,0);JSI::CallFunction(complete,thisVal,nullptr,0);JSI::ReleaseValueList(成功,失败,完成);返回JSI::CreateUndefined();}JSIValue结果=JSI::CreateObject();JSI::SetNumberProperty(结果,"led_status",replyData);JSIValueargv[ARGC_ONE]={结果};JSI::CallFunction(成功,thisVal,argv,ARGC_ONE);JSI::CallFunction(complete,thisVal,nullptr,0);JSI::ReleaseValueList(成功、失败、完成、结果);HdfIoServiceRecycle(服务);returnJSI::CreateUndefined();}建议添加代码的位置如图5配置HDF头文件路径打开foundation\ace\ace_engine_lite\ace_lite.gni文件,在80行左右添加如下配置ace_lite_include_dirs+=["//drivers/framework/ability/sbuf/include","//drivers/framework/include/core","//drivers/framework/include/utils","//drivers/adapter/uhdf/posix/include",]六、添加编译依赖打开foundation\ace\ace_engine_lite\frameworks\BUILD.gn,在public_deps中添加如下代码"//drivers/adapter/uhdf/manager:hdf_core",打开foundation\ace\ace_engine_lite\test\ace_test_config.gni,在extra_deps中添加如下代码"//drivers/adapter/uhdf/manager:hdf_core",更多信息请访问:鸿蒙技术社区华为官方共建https://harmonyos.51cto.com
