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 + -
显示快捷键?