小熊派添加自定义JS API接口流程(以点亮LED为例)

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://harmonyos.51cto.com​

一、前言

之前我们开发了小熊派的LED灯驱动,并且编写了相应的代码调用自己的开发驱动,但是自己写的代码只能在终端以命令的形式调用,显然这样十分的不太友好。假设小熊派是我们的一个智能设备,这个LED是我们的手电筒,通过命令行的形式打开手电筒肯定不是我们所期待的,我们更希望能够在图像界面上点一个按钮从而打开我们的手电筒,而目前OpenHarmony大多数采用JS开发应用,如果我们想要在图形界面上打开我们的手电筒,就需要自己定义一个JS的API接口来调用我们的LED。本文便介绍了如何自定义JS API从而调用自己开发的驱动。

二、流程总览

添加JS API接口–>编写接口代码–>配置HDF头文件路径–>添加编译依赖

三、添加JS API接口

打开文件foundationaceace_engine_liteframeworkssrccoremodulesapp_module.h,在32行处添加如下代码

static JSIValue ToggleLed(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum);

如图所示

小熊派添加自定义JS API接口流程(以点亮LED为例)

在65行处添加如下代码

JSI::SetModuleAPI(exports, "ledcontrol", AppModule::ToggleLed);

小熊派添加自定义JS API接口流程(以点亮LED为例)

四、编写对应的驱动代码

打开foundationaceace_engine_liteframeworkssrccoremodulesapp_module.cpp文件,需要在两个位置添加我们自己API的代码

4.1添加头文件

在头文件导入处添加如下头文件

#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"

#define LED_WRITE_READ 1
#define LED_SERVICE "hdf_led"

如图所示

小熊派添加自定义JS API接口流程(以点亮LED为例)

4.2添加API的代码

在适当位置加入以下代码,建议在JSIValue AppModule::GetInfo函数之前

static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data)
{
uint32_t value;
HdfSbufReadUint32(data, &value);
HILOG_ERROR(HILOG_MODULE_ACE,"%s: dev event received: %u %un", (char *)priv, id, value);

return HDF_SUCCESS;
}

static int GpioWriteRead(struct HdfIoService *serv, int32_t eventData, int32_t *val)
{
int ret = HDF_FAILURE;
struct HdfSBuf *data = HdfSBufObtainDefaultSize();
struct HdfSBuf *reply = HdfSBufObtainDefaultSize();

if (data == NULL || reply == NULL) {
HILOG_ERROR(HILOG_MODULE_ACE,"fail to obtain sbuf datan");
return ret;
}

if (!HdfSbufWriteUint8(data, (uint8_t)eventData))
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to write sbufn");
HdfSBufRecycle(data);
HdfSBufRecycle(reply);
return ret;
}

ret = serv->dispatcher->Dispatch(&serv->object, LED_WRITE_READ, data, reply);
if (ret != HDF_SUCCESS)
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to send service calln");
HdfSBufRecycle(data);
HdfSBufRecycle(reply);
return ret;
}
if (!HdfSbufReadInt32(reply, val))
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to get service call replyn");
ret = HDF_ERR_INVALID_OBJECT;
HdfSBufRecycle(data);
HdfSBufRecycle(reply);
return ret;
}
HILOG_ERROR(HILOG_MODULE_ACE,"Get reply is: %dn", val);

HdfSBufRecycle(data);
HdfSBufRecycle(reply);
return ret;
}

JSIValue AppModule::ToggleLed(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)
{
HILOG_ERROR(HILOG_MODULE_ACE, "led button pressed.");

struct HdfIoService *serv = HdfIoServiceBind(LED_SERVICE);
if (serv == NULL)
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to get service2 %sn", LED_SERVICE);
return JSI::CreateUndefined();
}

if ((args == nullptr) || (argsNum == 0) || (JSI::ValueIsUndefined(args[0]))) {
return JSI::CreateUndefined();
}

JSIValue success = JSI::GetNamedProperty(args[0], CB_SUCCESS);
JSIValue fail = JSI::GetNamedProperty(args[0], CB_FAIL);
JSIValue complete = JSI::GetNamedProperty(args[0], CB_COMPLETE);

int32_t num = (int32_t)JSI::GetNumberProperty(args[0], "code");

int32_t replyData = 0;

if (GpioWriteRead(serv, num, &replyData))
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to send eventn");
JSI::CallFunction(fail, thisVal, nullptr, 0);
JSI::CallFunction(complete, thisVal, nullptr, 0);
JSI::ReleaseValueList(success, fail, complete);
return JSI::CreateUndefined();
}

JSIValue result = JSI::CreateObject();
JSI::SetNumberProperty(result, "led_status", replyData);

JSIValue argv[ARGC_ONE] = {result};
JSI::CallFunction(success, thisVal, argv, ARGC_ONE);
JSI::CallFunction(complete, thisVal, nullptr, 0);
JSI::ReleaseValueList(success, fail, complete, result);

HdfIoServiceRecycle(serv);

return JSI::CreateUndefined();
}

代码推荐添加位置如图所示

小熊派添加自定义JS API接口流程(以点亮LED为例)

五、配置HDF头文件路径

打开foundationaceace_engine_liteace_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",
]

小熊派添加自定义JS API接口流程(以点亮LED为例)

![](C:Users33124Desktop博客素材小熊派开发JS APIHDF配置.png)

六、添加编译依赖

打开foundationaceace_engine_liteframeworksBUILD.gn,在public_deps中添加以下代码

"//drivers/adapter/uhdf/manager:hdf_core",

打开foundationaceace_engine_litetestace_test_config.gni,在extra_deps中添加以下代码

"//drivers/adapter/uhdf/manager:hdf_core",

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://harmonyos.51cto.com​

小熊派添加自定义JS API接口流程(以点亮LED为例)

文章版权声明

 1 原创文章作者:Riky,如若转载,请注明出处: https://www.52hwl.com/92710.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年1月16日 下午9:24
下一篇 2024年1月16日 下午9:24