Skip to content

Commit

Permalink
reduce zcl callstack
Browse files Browse the repository at this point in the history
  • Loading branch information
splitice committed Sep 28, 2023
1 parent b19d112 commit 08524d2
Showing 1 changed file with 36 additions and 35 deletions.
71 changes: 36 additions & 35 deletions lib/Af.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ class Af extends EventEmitter {
return this._seq;
}

// 4 types of message: dataConfirm, reflectError, incomingMsg, incomingMsgExt, zclIncomingMsg
// 4 types of message: dataConfirm, reflectError, incomingMsg, incomingMsgExt
dispatchIncomingMsg(targetEp, remoteEp, type, msg) {
let dispatchTo, // which callback on targetEp
let dispatchTo // which callback on targetEp


assert(targetEp, 'targetEp should be given.');
Expand Down Expand Up @@ -112,52 +112,53 @@ class Af extends EventEmitter {
if(type !== 'incomingMsgExt' && type !== 'incomingMsg') return

let zclData

// after zcl packet parsed, re-emit it
try {
if (zclData.frameCntl.frameType === 0) { // foundation
zclData = zcl.parse(msg.data);
} else if (zclData.frameCntl.frameType === 1) { // functional
zclData = zcl.parse(msg.data, msg.clusterid);
}
zclData = zcl.parse(msg.data, msg.clusterid);
} catch (ex) {
debug(`Error parsing ZCL ${zclData.frameCntl.frameType ? 'functional' : 'foundation'} packet: ${ex}`);
const zclHeader = zcl.header(msg.data);
debug(`Error parsing ZCL ${zclHeader.frameType ? 'functional' : 'foundation'} packet: ${ex}`);
return
}

if (zclData) {
this.emit('ZCL:incomingMsg', {zclData, msg});
const frameType = zclData.frameCntl.frameType;
if(zclDebug.enabled){
zclDebug(`0x${msg.srcaddr.toString(16)}:${msg.srcendpoint}->0x00:${msg.dstendpoint} (${zclData.seqNum}) ${msg.clusterid} ${frameType === 0 ? 'foundation' : 'functional'}(${zclData.cmdId}) ${JSON.stringify(zclData.payload)}`);
}

const frameType = zclData.frameCntl.frameType;
if(zclDebug.enabled){
zclDebug(`0x${msg.srcaddr.toString(16)}:${msg.srcendpoint}->0x00:${msg.dstendpoint} (${zclData.seqNum}) ${msg.clusterid} ${frameType === 0 ? 'foundation' : 'functional'}(${zclData.cmdId}) ${JSON.stringify(zclData.payload)}`);
let zApp = targetEp.zive
if(zApp){
if (frameType === 0 && zApp.foundationHandler) // foundation
zApp.foundationHandler(msg, zclData, remoteEp)
else if (frameType === 1 && zApp.functionalHandler) // functional
zApp.functionalHandler(msg, zclData, remoteEp)
return
} else {
// Necessary, some IAS devices don't respect endpoints
if (zclData.cmdId === 'statusChangeNotification' && frameType === 1 && zclData.payload) {
this.emit('ind:statusChange', { ep: remoteEp, cId: msg.clusterid, zclData: zclData, msg });
}

if (frameType === 0 && zclData.cmdId === 'report')
this.emit('ind:reported', { ep: remoteEp, cId: msg.clusterid, attrs: zclData.payload });

const evt = {zclData, msg}
this.emit('ZCL:incomingMsg', evt);

if(zclData.frameCntl.direction === 1) {
let prefix = 'ZCL:'+((frameType === 0 && zclData.cmdId !== 'defaultRsp') ? 'foundation' : 'functional')+':'

// for broadcast responses only
this.emit(prefix + msg.dstendpoint + ':' + zclData.seqNum, msg);

this.emit(prefix + msg.dstendpoint + ':' + zclData.seqNum, evt);
prefix += msg.srcaddr.toString(16) + ':' + msg.srcendpoint + ':'

// { groupid, clusterid, srcaddr, srcendpoint, dstendpoint, wasbroadcast, linkquality, securityuse, timestamp, transseqnumber, zclMsg }
this.emit(prefix + msg.dstendpoint + ':' + zclData.seqNum, msg);

this.emit(prefix + zclData.seqNum, msg);
}

// Necessary, some IAS devices don't respect endpoints
if (zclData.cmdId === 'statusChangeNotification' && frameType === 1 && zclData.payload) {
this.emit('ind:statusChange', { ep: remoteEp, cId: msg.clusterid, payload: zclData.payload, msg });
this.emit(prefix + msg.dstendpoint + ':' + zclData.seqNum, evt);

this.emit(prefix + zclData.seqNum, evt);
}

if (frameType === 0 && zclData.cmdId === 'report')
this.emit('ind:reported', { ep: remoteEp, cId: msg.clusterid, attrs: zclData.payload });

if (frameType === 0 && targetEp.onZclFoundation) // foundation
targetEp.onZclFoundation(msg, zclData, remoteEp)
else if (frameType === 1 && targetEp.onZclFunctional) // functional
targetEp.onZclFunctional(msg, zclData, remoteEp)
}
}
makeAfParamsExt(srcEp, addrMode, dstAddrOrGrpId, cId, rawPayload, opt) {
Expand Down Expand Up @@ -491,7 +492,7 @@ class Af extends EventEmitter {
throw err
}

return rsp[0].zclMsg
return rsp[0].zclData
}

async _zclFunctional(srcEp, dstEp, cId, cmd, zclData, cfg) {
Expand Down Expand Up @@ -581,7 +582,7 @@ class Af extends EventEmitter {
throw err
}

return rsp[0].zclMsg
return rsp[0].zclData
}

async zclFoundation(srcEp, dstEp, cId, cmd, zclData, cfg) {
Expand Down

0 comments on commit 08524d2

Please sign in to comment.