UNPKG

zigbee-shepherd

Version:

An open source ZigBee gateway solution with node.js.

79 lines (64 loc) 2.9 kB
/* jshint node: true */ 'use strict'; const zdoHelper = require('./zdo_helper.js'); const debug = { msgHdlr: require('debug')('zigbee-shepherd:msgHdlr') }; const bridge = {}; bridge._areqEventBridge = function (controller, msg) { // msg: { subsys: 'ZDO', ind: 'endDeviceAnnceInd', data: { srcaddr: 63536, nwkaddr: 63536, ieeeaddr: '0x00124b0001ce3631', ... } const mandatoryEvent = `${msg.subsys}:${msg.ind}`; // 'SYS:resetInd', 'SYS:osalTimerExpired' controller.emit(mandatoryEvent, msg.data); // bridge to subsystem events, like 'SYS:resetInd', 'SYS:osalTimerExpired' if (msg.subsys === 'AF') debug.msgHdlr('IND <-- %s, transId: %d', mandatoryEvent, msg.data.transid || msg.data.transseqnumber); else debug.msgHdlr('IND <-- %s', mandatoryEvent); // dispatch to specific event bridge if (msg.subsys === 'ZDO') bridge._zdoIndicationEventBridge(controller, msg); else if (msg.subsys === 'SAPI') bridge._sapiIndicationEventBridge(controller, msg); // else: Do nothing. No need to bridge: SYS, MAC, NWK, UTIL, DBG, APP }; bridge._zdoIndicationEventBridge = function (controller, msg) { const payload = msg.data; const zdoEventHead = `ZDO:${msg.ind}`; let zdoBridgedEvent; if (msg.ind === 'stateChangeInd') { // this is a special event if (!payload.hasOwnProperty('nwkaddr')) // Coord itself zdoBridgedEvent = 'coordStateInd'; else if (payload.state === 0x83 || payload.state === 'NOT_ACTIVE') zdoBridgedEvent = `${zdoEventHead}:${payload.nwkaddr}:NOT_ACTIVE`; else if (payload.state === 0x82 || payload.state === 'INVALID_EP') zdoBridgedEvent = `${zdoEventHead}:${payload.nwkaddr}:INVALID_EP`; } else { zdoBridgedEvent = zdoHelper.generateEventOfIndication(msg.ind, payload); } if (zdoBridgedEvent) controller.emit(zdoBridgedEvent, payload); }; bridge._sapiIndicationEventBridge = function (controller, msg) { const payload = msg.data; const sapiEventHead = `SAPI:${msg.ind}`; let sapiBridgedEvent; switch (msg.ind) { case 'bindConfirm': sapiBridgedEvent = `${sapiEventHead}:${payload.commandid}`; break; case 'sendDataConfirm': sapiBridgedEvent = `${sapiEventHead}:${payload.handle}`; break; case 'receiveDataIndication': sapiBridgedEvent = `${sapiEventHead}:${payload.source}:${payload.command}`; break; case 'findDeviceConfirm': if (payload.hasOwnProperty('result')) sapiBridgedEvent = `${sapiEventHead}:${payload.result}`; break; default: // startConfirm and allowBindConfirm need no bridging break; } if (sapiBridgedEvent) controller.emit(sapiBridgedEvent, payload); }; module.exports = bridge;