//build 20240524
|
//接受 gpio 的输入
|
//依赖组件: dxLogger,dxDriver,dxEventBus
|
import { gpioKeyClass } from './libvbar-m-dxkey.so'
|
import bus from './dxEventBus.js'
|
import * as os from "os";
|
const gpioKeyObj = new gpioKeyClass();
|
const gpioKey = {}
|
|
/**
|
* gpioKey 初始化
|
* @returns true:成功,false:失败
|
*/
|
gpioKey.init = function () {
|
const res = gpioKeyObj.init()
|
if (res) {
|
gpioKeyObj.registerCb("gpioKeyCb")
|
}
|
return res
|
}
|
|
/**
|
* gpioKey 取消初始化
|
* @returns true:成功,false:失败
|
*/
|
gpioKey.deinit = function () {
|
gpioKeyObj.unRegisterCb("gpioKeyCb")
|
return gpioKeyObj.deinit()
|
}
|
|
/**
|
* 判断gpioKey消息队列是否为空
|
* @returns true:成功,false:失败
|
*/
|
gpioKey.msgIsEmpty = function () {
|
return gpioKeyObj.msgIsEmpty()
|
}
|
|
/**
|
* 从gpioKey消息队列中读取数据
|
* @returns json消息对象,格式:{"code":30,"type":1,"value":1}
|
*/
|
gpioKey.msgReceive = function () {
|
let msg = gpioKeyObj.msgReceive()
|
return JSON.parse(msg);
|
}
|
|
gpioKey.RECEIVE_MSG = '__gpioKey__MsgReceive'
|
|
/**
|
* 简化gpiokey组件的使用,无需轮询去获取数据,数据会通过eventbus发送出去
|
* run 只会执行一次
|
* 如果需要实时获取数据,可以订阅 eventbus的事件,事件的topic是GPIO_KEY,事件的内容是类似{"code":30,"type":1,"value":1}
|
* 其中code是gpio的标识,表示是那个gpio有输入,value值只能是0,1通常表示低电平和高电平
|
* type是事件类型,遵循Linux的标准输入规定,以下列出常用几个:
|
(0x01):按键事件,包括所有的键盘和按钮事件。例如,当按下或释放键盘上的一个键时,将报告此类事件。
|
(0x05):开关事件,例如笔记本电脑盖的开关可以报告开合状态。
|
(Ox11):LED事件,用于控制设备上的LED指示灯,
|
(Ox12):声音事件,用于控制设备上的声音输出,
|
(0x16):电源事件,可以用于报告电源按钮事件或电池电量低
|
*
|
*/
|
gpioKey.run = function () {
|
bus.newWorker("__gpiokey", '/app/code/dxmodules/gpioKeyWorker.js')
|
}
|
|
/**
|
* 如果gpioKey单独一个线程,可以直接使用run函数,会自动启动一个线程,
|
* 如果想加入到其他已有的线程,可以使用以下封装的函数
|
*/
|
gpioKey.worker = {
|
//在while循环前
|
beforeLoop: function () {
|
gpioKey.init()
|
},
|
//在while循环里
|
loop: function () {
|
if (!gpioKey.msgIsEmpty()) {
|
let res = gpioKey.msgReceive();
|
bus.fire(gpioKey.RECEIVE_MSG, res)
|
}
|
}
|
}
|
export default gpioKey;
|