applicationlayer.cs
来自「zwave 无线通讯协议 PC controller 控制器源码」· CS 代码 · 共 1,676 行 · 第 1/5 页
CS
1,676 行
}
break;
case DataFrame.CommandType.CmdZWaveControllerChange:
case DataFrame.CommandType.CmdZWaveCreateNewPrimary:
case DataFrame.CommandType.CmdZWaveAddNodeToNetwork:
{
// 0 1 2 3 4 5 6 7
// FuncID|status|nodeId|len|basic|generic|specific|data[0]|data[1],data[2]..data[len-7]....
byte nid = payload[2];
NodeStatus nodeStatus = (NodeStatus)payload[1];
switch (nodeStatus)
{
case NodeStatus.AddingRemovingSlave:
case NodeStatus.AddingRemovingController:
{ //ZWNode(byte id , byte capability, byte security, byte reserved, byte basic, byte generic, byte specific)
if (payload.Length >= 4)
{
if (payload[3] >= 3)
{
addedNode = new Node(nid, 0, 0, 0, payload[4], payload[5], payload[6]);
if ((payload.Length - 7) > 0)
{
addedNode.SupportedCmdClasses = new byte[payload.Length - 7];
for (byte i = 0; i < addedNode.SupportedCmdClasses.Length; i++)
{
addedNode.SupportedCmdClasses[i] = payload[i + 7];
}
}
nodeTable.add(addedNode);
}
}
}
break;
case NodeStatus.Done:
{
addedNode = ZWaveGetNodeProtocolInfo(nid);
AddNodeEventArgs e = new AddNodeEventArgs(addedNode, cmd, nodeStatus);
if (AddNodeEvent != null) AddNodeEvent(this, e);
}
break;
case NodeStatus.Failed:
{
nodeTable.remove(nid);
AddNodeEventArgs e = new AddNodeEventArgs(addedNode, cmd, nodeStatus);
if (AddNodeEvent != null) AddNodeEvent(this, e);
}
break;
case NodeStatus.ProtocolDone:
{
AddNodeEventArgs e = new AddNodeEventArgs(addedNode, cmd, nodeStatus);
if (AddNodeEvent != null) AddNodeEvent(this, e);
}
break;
}
}
break;
case DataFrame.CommandType.CmdZWaveRemoveNodeFromNetwork:
{
NodeStatus nodeStatus = (NodeStatus)payload[1];
switch (nodeStatus)
{
case NodeStatus.AddingRemovingController:
case NodeStatus.AddingRemovingSlave:
case NodeStatus.LearnReady:
case NodeStatus.NodeFound:
break;
case NodeStatus.Done:
{
byte nid = payload[2];
if (nodeTable.contains(nid))
{
removedNode = nodeTable.get(nid);
nodeTable.remove(nid);
}
RemoveNodeEventArgs e = new RemoveNodeEventArgs(removedNode, cmd);
if (RemoveNodeEvent != null) RemoveNodeEvent(this, e);
}
break;
case NodeStatus.Failed:
{
RemoveNodeEventArgs e = new RemoveNodeEventArgs(removedNode, cmd);
if (RemoveNodeEvent != null) RemoveNodeEvent(this, e);
}
break;
}
}
break;
case DataFrame.CommandType.CmdApplicationControllerUpdate:
{
byte nid = payload[1];
switch ((AppCtrlUpdateStatus)payload[0])
{
// Node requested removed from remote control...
case AppCtrlUpdateStatus.DELETE_DONE:
{
if (nodeTable.contains(nid))
{
Node node = nodeTable.get(nid);
nodeTable.remove(nid);
RemoveNodeEventArgs e = new RemoveNodeEventArgs(node, cmd);
if (RemoveNodeEvent != null) RemoveNodeEvent(this, e);
}
}
break;
case AppCtrlUpdateStatus.ADD_DONE:
{
Node node;
if (libraryType.lib == Library.ControllerBridgeLib)
{
node = ZWaveGetNodeProtocolInfo(nid, true);
}
else
{
node = ZWaveGetNodeProtocolInfo(nid);
}
if (payload.Length - 6 > 0)
{
node.SupportedCmdClasses = new byte[payload.Length - 6];
for (int i = 0; i < node.SupportedCmdClasses.Length; i++)
{
node.SupportedCmdClasses[i] = payload[i + 6];
}
}
nodeTable.add(node);
AddNodeEventArgs e = new AddNodeEventArgs(node, cmd, NodeStatus.Done);
if (AddNodeEvent != null) AddNodeEvent(this, e);
}
break;
case AppCtrlUpdateStatus.SUC_ID:
{
UpdateEventArgs e = new UpdateEventArgs(payload[0], payload[1]);
if (UpdateEvent != null) UpdateEvent(this, e);
}
break;
case AppCtrlUpdateStatus.NODE_INFO_REQ_FAILED:
{
waitForNodeInfocallbackHandler(null);
}
break;
// NODE_INFO_REQ_DONE only used with Serial API 2.16 and below.
case AppCtrlUpdateStatus.NODE_INFO_REQ_DONE:
{
RequestNodeInfo(payload, nid);
}
break;
case AppCtrlUpdateStatus.NODE_INFO_RECEIVED:
{
if (_requestNodeInfo)
{
RequestNodeInfo(payload, nid);
}
}
break;
case AppCtrlUpdateStatus.ROUTING_PENDING:
break;
default:
{
UnknownCommandEventArgs e = new UnknownCommandEventArgs(packet);
if (UnknownCommandEvent != null) UnknownCommandEvent(this, e);
}
break;
}//Case Status
}
break;
case DataFrame.CommandType.CmdZWaveRequestNodeInfo:
break;
case DataFrame.CommandType.CmdZWaveSetLearnMode:
{
byte nid = payload[2];
switch ((LearnMode)payload[1])
{
case LearnMode.Failed:
nodeTable.remove(nid);
break;
case LearnMode.Done:
EnumerateNodes();
UpdateEventArgs e = new UpdateEventArgs(payload[1], payload[2]);
if (UpdateEvent != null) UpdateEvent(this, e);
break;
}
}
break;
case DataFrame.CommandType.CmdZWaveSetSlaveLearnMode:
{
byte status = payload[1];
byte orgId = payload[2];
byte newId = payload[3];
if (newId == 0)
{
NodeRemove(orgId);
}
else
{
Node node = ZWaveGetNodeProtocolInfo(newId, true);
/* We know the node is virtual... */
node.IsVirtual = true;
if (payload.Length - 6 > 0)
{
node.SupportedCmdClasses = new byte[payload.Length - 6];
for (int i = 0; i < node.SupportedCmdClasses.Length; i++)
{
node.SupportedCmdClasses[i] = payload[i + 6];
}
}
nodeTable.add(node);
}
SlaveEventArgs e = new SlaveEventArgs(status, orgId, newId);
if (SlaveEvent != null) SlaveEvent(this, e);
}
break;
case DataFrame.CommandType.CmdZWaveReplaceFailedNode:
if (payload.Length > 1)
{
byte st = payload[1]; // Byte 1: funcID, Byte 2: status
NodeFailedEventArgs nodeEvent = new NodeFailedEventArgs(st,false);
if (NodeFailedEvent != null) NodeFailedEvent(this, nodeEvent);
}
else
{ // Return value
byte st = payload[0]; // Byte 1: status
NodeFailedEventArgs nodeEvent = new NodeFailedEventArgs(st,true);
if (NodeFailedEvent != null) NodeFailedEvent(this, nodeEvent);
}
break;
case DataFrame.CommandType.CmdSerialApiTest:
// testcmd, state, nodeid, status, runnr.
if (TestEvent != null)
{
if (payload.Length >= 6)
{
TestEventArgs e = new TestEventArgs(payload[1], payload[2], payload[3], payload[4], payload[5]);
TestEvent(this, e);
}
else
{
TestEvent(this, null);
}
}
break;
default:
bool found = false;
foreach (DataFrame.CommandType _cmd in GetValues(typeof(DataFrame.CommandType)))
{
// command is not an unknown commando.
if (cmd == _cmd)
{
found = true;
break;
}
}
if (!found)
{
Debug.WriteLine("Unknown CMD: " + cmd + " Data: " + packet);
if (UnknownCommandEvent != null)
{
UnknownCommandEventArgs e = new UnknownCommandEventArgs(packet);
UnknownCommandEvent(this, e);
}
}
break;
}
}
private void RequestNodeInfo(byte[] payload, byte nid)
{
// FuncID|status|nodeId|len|basic|generic|specific|data[0]|data[1],data[2]..data[len-7]....
Node node = nodeTable.get(nid);
node.Generic = payload[4];
node.Specific = payload[5];
if (payload.Length > 6)
{
node.SupportedCmdClasses = new byte[payload.Length - 6];
for (int i = 0; i < node.SupportedCmdClasses.Length; i++)
{
node.SupportedCmdClasses[i] = payload[i + 6];
}
}
else
{
node.SupportedCmdClasses = null;
}
nodeTable.add(node);
_requestNodeInfo = false;
waitForNodeInfocallbackHandler(node);
}
#region ZWave interface library
/// <summary>
/// Read nodes from module and copy them into nodeTable
/// </summary>
/// <returns></returns>
public Node[] EnumerateNodes()
{
lock (this)
{
DataPacket res;
DataPacket req = new DataPacket();
TXStatus rc = sessionLayer.RequestWithResponse(DataFrame.CommandType.CmdSerialApiGetInitData, req, out res);
if (rc != TXStatus.CompleteOk) throw new ApplicationLayerException("CMD_SERIAL_API_GET_INIT_DATA");
byte[] payload = res.GetPayload();
serialAPIver = payload[0];
byte capab = payload[1];
byte len = payload[2];
slaveController = (capab & GET_INIT_DATA_FLAG_SECONDARY_CTRL) > 0;
slaveApi = (capab & GET_INIT_DATA_FLAG_SLAVE_API) != 0;
if (payload.Length > len)
{
chipType = payload[3 + len];
chipRev = payload[4 + len];
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?