#冲刺创作新星#【FFH】Bearpi-Micro深入解析通过JS应用控制LED灯 原创 精华
目录
一、前言
最近跑了一遍Bearpi-Micro编写点亮LED灯程序的Demo,深入了解了如何在开发板上运行一个控制LED灯的程序,达到能关闭灯、开启灯以及翻转灯的状态,南向如何编写JS API接口提供驱动服务给北向应用使用。突发奇想,发现了官方给出的点灯应用中的一个不足,并进行优化。
参考文章:编写通过JS应用控制LED灯
二、(南向)深入解析通过JS应用控制LED灯
1.前提
请确保已经完成编写一个点亮LED灯程序实验,因为本实验将依赖编写一个点亮LED灯程序实验中开发的驱动,以下教程篇幅较长,请耐心仔细阅读。
2.JS API接口开发
注:以下代码为主要代码的剖析,详细完整的代码可查看参考文章编写通过JS应用控制LED灯
(1)添加控制LED灯的JS API接口
修改foundation\ace\ace_engine_lite\frameworks\src\core\modules\app_module.h,加入toggleLed JS API,
("##start##“和”##end##"仅用来标识位置,添加完配置后删除这两行)。
解析:在头文件中封装好JS API接口函数。
提供给北向的接口名为:ledcontrol ,南向业务代码函数为ToggleLed 。
(2)编写控制LED灯c++ 业务代码
在foundation\ace\ace_engine_lite\frameworks\src\core\modules\app_module.cpp中加入控制LED灯c++ 业务代码
注:以下代码仅为部分重要代码
主函数ToggleLed将会调用的GpioWriteRead函数👇
- 1.
解析:已在代码中注释。
重要的:Dispatch函数,调度驱动服务呼叫,需要传入4个参数:*service-驱动服务对象的指针,cmdId-函数的命令字,*data-想要传入驱动的数据指针,*reply-驱动待回复的数据指针。
接口ToggleLed主函数👇
解析:获取北向接口中的属性success、fail、complete、code
几个功能相似的赋值函数
主要流程:北向应用调用ledcontrol接口,南向ToggleLed获取ledcontrol接口中的属性,并将属性值通过驱动服务中的Dispatch函数传递进驱动任务中,驱动给出返回值。
三、样例效果
点击应用的开关灯,嗯!挺流畅的。但是,如果我只打开北向应用,通过南向命令行终端打开LED灯,北向应用中灯的状态并不会发生改变。
南北向没有达到完美的联动效果。。。
四、优化官方的应用样例
分析:
从上文的剖析中可以看出南北向的接口似乎没有优化的地方,北向调用接口,南向就返回灯的状态值给北向。但是我们通过南向命令行终端执行应用程序的时候虽然也使用到了LED的驱动服务,但是并没有将灯的状态值反馈给北向(因为北向没有调用接口,自然就不会有返回值)。
思路:
既然知道了问题可能出在北向的应用方面,那么就着手尝试修改/增加一下,让北向应用中灯的图片一直调用接口就能一直得到返回的状态值。既然需要用到接口就得传参数。经过实验发现,不管传入命令code=0(关灯)、1(开灯)、2(转换灯状态),效果都极不理想。于是乎深入底层了解LED的驱动服务。
👇以下为主要代码段
解决方案
既然如此如果我们在北向传入其他命令值,比如3,它同样会调用LED的驱动服务,同样会返回灯的状态值,只是没有进行其他操作。
所以在北向可以多写一个函数为getstatus()👇,发送命令3,单纯只为获得灯的状态值。
效果展示
南向点灯的同时,北向的应用也会实时更新灯的状态。完美!
优秀的打通南北案例
很清晰的思路,学技术就要这样
感谢~~
学习下优化思路
光看教程还是不行,果然还是要有自己的东西。
谢谢~~
赞
你好,请问一下
struct HdfSBuf *data = HdfSBufObtainDefaultSize(); //获取256字节的容量
向这个函数开辟的空间中写入uint8_t类型的数据只能写入64个,这个涉及到了内存对齐的原因吗?
请问一下我想写入256个数据的话要怎么操作啊?