/** * GPIO按键服务模块 * 处理GPIO按键相关的业务逻辑,主要包括防拆报警功能 */ import logger from "../../dxmodules/dxLogger.js"; import config from "../../dxmodules/dxConfig.js"; import driver from "../driver.js"; import bus from "../../dxmodules/dxEventBus.js"; const gpiokeyService = {} /** * 接收GPIO按键消息并处理 * @param {object} data - GPIO按键数据 * @param {number} data.code - GPIO的标识,表示是哪个GPIO有输入 256-防拆,257-门磁 * @param {number} data.type - 按键类型,1表示防拆/门磁状态变化 * @param {number} data.value - 按键值,1表示触发/门开,0表示未触发/门关 */ gpiokeyService.receiveMsg = function (data) { logger.info('[gpiokeyService] 接收到GPIO消息:', JSON.stringify(data)) // 防拆报警处理 if (data.code === 256) { if (config.get("access.tamperAlarm") && data.type == 1 && data.value == 1) { logger.info('[gpiokeyService] 防拆报警触发') driver.alsa.play("/app/code/resource/wav/alarm.wav") } } // 门磁状态变化处理 if (data.code === 257) { const doorStatus = data.value == 1 ? "门开" : "门关" logger.info(`[gpiokeyService] 门磁状态变化: ${doorStatus}`) if (data.value === 1) { // 门开 driver.alsa.play("/app/code/resource/CN/wav/door_open.wav") } else { // 门关 driver.alsa.play("/app/code/resource/CN/wav/door_close.wav") } // 发送门磁状态变化通知事件 bus.fire('doorStatusChanged', { status: data.value, statusText: doorStatus, time: Math.floor(Date.now() / 1000) }) } } export default gpiokeyService