예제 #1
0
        private void _zwavemessagereceived(object sender, ZWaveMessageReceivedEventArgs args)
        {
            int length = args.Message.Length;

            //
            try
            {
                ZWaveMessageHeader zh = (ZWaveMessageHeader)args.Message[0];
                switch (zh)
                {
                case ZWaveMessageHeader.CAN:
                    zp.SendAck();
                    // RESEND
//Console.WriteLine("ZWaveLib: received CAN, resending last message");
//                        zp.ResendLastMessage();
                    break;

                case ZWaveMessageHeader.ACK:
                    zp.SendAck();
                    break;

                case ZWaveMessageHeader.SOF:     // start of zwave frame
                    //
                    // parse frame headers
                    //
                    int msglength              = (int)args.Message[1];
                    ZWaveMessageType  msgtype  = (ZWaveMessageType)args.Message[2];
                    ZWaveCommandClass cmdclass = (args.Message.Length > 3 ? (ZWaveCommandClass)args.Message[3] : 0);
                    //
                    byte sourcenode = 0;
                    //
                    switch (msgtype)
                    {
                    case ZWaveMessageType.REQUEST:
                        zp.SendAck();

                        if (_devices.Count == 0)
                        {
                            break;
                        }

                        byte callbackid = 0;

                        switch (cmdclass)
                        {
                        case ZWaveCommandClass.CMD_NONE:
                            break;

                        case ZWaveCommandClass.CMD_NODE_ADD:

                            callbackid = args.Message[4];
                            if (args.Message[5] == 0x03)             // ADD_NODE_STATUS_ADDING_SLAVE
                            {
                                //
//Console.WriteLine("\n\nADDING NODE SLAVE {0}\n     ->   ", zp.ByteArrayToString(args.Message));
                                //
                                // example response from HSM-100 3in1 sensor
                                // 01 15 00 4A 32 03 2E 0E 04 21 01 60 31 70 84 85 80 72 77 86 EF 20 79
                                //                         bt gt st c1 c2 c3 c4 c5 c6 c7 c8 c9 --------
                                // node supported classes (c1, c2.... cn)
                                //
                                _nodeoperationidcheck = args.Message[6];
                                CreateDevice(_nodeoperationidcheck, 0x00);
                            }
                            else if (args.Message[5] == 0x05)             // ADD_NODE_STATUS_PROTOCOL_DONE
                            {
                                if (_nodeoperationidcheck == args.Message[6])
                                {
//Console.WriteLine("\n\nADDING NODE PROTOCOL DONE {0} {1}\n\n", args.Message[6], callbackid);
                                    Thread.Sleep(500);
                                    GetNodeCapabilities(args.Message[6]);
                                    //Discovery();
                                }
                            }
                            else if (args.Message[5] == 0x07)             // ADD_NODE_STATUS_ADDING_FAIL
                            {
//Console.WriteLine("\n\nADDING NODE FAIL {0}\n\n", args.Message[6]);
                            }
                            break;

                        case ZWaveCommandClass.CMD_NODE_REMOVE:

                            callbackid = args.Message[4];
                            if (args.Message[5] == 0x03)             // REMOVE_NODE_STATUS_REMOVING_SLAVE
                            {
//Console.WriteLine("\n\nREMOVING NODE SLAVE {0}\n\n", args.Message[6]);
                                _nodeoperationidcheck = args.Message[6];
                            }
                            else if (args.Message[5] == 0x06)             // REMOVE_NODE_STATUS_REMOVING_DONE
                            {
                                if (_nodeoperationidcheck == args.Message[6])
                                {
//Console.WriteLine("\n\nREMOVING NODE DONE {0} {1}\n\n", args.Message[6], callbackid);
                                    OnDiscoveryEvent(new DiscoveryEventArgs(args.Message[6], DISCOVERY_STATUS.NODE_REMOVED));             // Send event
                                    RemoveDevice(args.Message[6]);
                                }
                            }
                            else if (args.Message[5] == 0x07)             // REMOVE_NODE_STATUS_REMOVING_FAIL
                            {
//Console.WriteLine("\n\nREMOVING NODE FAIL {0}\n\n", args.Message[6]);
                            }
                            break;

                        case ZWaveCommandClass.CMD_APPLICATION_COMMAND:

                            sourcenode = args.Message[5];
                            ZWaveNode node = _devices.Find(n => n.NodeId == sourcenode);
                            if (node == null)
                            {
                                CreateDevice(sourcenode, 0x00);
                                GetNodeCapabilities(sourcenode);
                            }
                            try
                            {
                                node.MessageRequestHandler(args.Message);
                            }
                            catch (Exception ex)
                            {
//Console.WriteLine("# " + ex.Message + "\n" + ex.StackTrace);
                            }
                            break;

                        case ZWaveCommandClass.CMD_SEND_DATA:

                            byte cid = args.Message[4];
                            if (cid == 0x01)             // SEND DATA OK
                            {
                                // TODO: ... what does that mean?
                            }
                            else if (args.Message[5] == 0x00)
                            {
                                // Messaging complete, remove callbackid
                                zp.PendingMessages.RemoveAll(zm => zm.CallbackId == cid);
                            }
                            else if (args.Message[5] == 0x01)
                            {
                                // TODO: callback error???
                                zp.ResendLastMessage(cid);
                            }
                            break;

                        case ZWaveCommandClass.CMD_NODE_UPDATE_INFO:

                            sourcenode = args.Message[5];
                            int       niflen = (int)args.Message[6];
                            ZWaveNode znode  = _devices.Find(n => n.NodeId == sourcenode);
                            if (znode != null)
                            {
                                byte[] nodeinfo = new byte[niflen - 2];
//Console.WriteLine(ByteArrayToString(args.Message));
                                Array.Copy(args.Message, 7, nodeinfo, 0, niflen - 2);
                                //
                                _raiseUpdateParameterEvent(znode, 0, ParameterType.PARAMETER_NODE_INFO, zp.ByteArrayToString(nodeinfo));
                                _raiseUpdateParameterEvent(znode, 0, ParameterType.PARAMETER_WAKEUP_NOTIFY, "1");
                            }
                            break;

                        default:
                            Console.WriteLine("\nUNHANDLED Z-Wave REQUEST\n     " + zp.ByteArrayToString(args.Message) + "\n");
                            break;
                        }


                        break;

                    case ZWaveMessageType.RESPONSE:


                        switch (cmdclass)
                        {
                        case ZWaveCommandClass.CMD_DISCOVERY_NODES:
                            MessageResponseNodeBitMaskHandler(args.Message);
                            //zp.SendAck();
                            break;

                        case ZWaveCommandClass.CMD_GET_NODE_PROTOCOL_INFO:
                            MessageResponseNodeCapabilityHandler(args.Message);
                            //zp.SendAck();
                            break;

                        case ZWaveCommandClass.CMD_REQUEST_NODE_INFO:
//                                        Console.WriteLine("\nNODE INFO RESPONSE: " + zp.ByteArrayToString(args.Message) + "\n");
                            break;

                        case ZWaveCommandClass.CMD_SEND_DATA:
                            this.ReadyToSend = true;
                            break;

                        default:
                            //if (args.Message.Length > 2 && args.Message[3] != 0x13)
                            Console.WriteLine("\nUNHANDLED Z-Wave RESPONSE\n     " + zp.ByteArrayToString(args.Message) + "\n");
                            break;
                        }


                        break;

                    default:
                        Console.WriteLine("\nUNHANDLED Z-Wave message TYPE\n     " + zp.ByteArrayToString(args.Message) + "\n");
                        break;
                    }



                    //
                    break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
            }
        }
예제 #2
0
        private void ZwaveMessageReceived(object sender, ZWaveMessageReceivedEventArgs args)
        {
            int length = args.Message.Length;
            //
            try
            {
                ZWaveMessageHeader zwaveHeader = (ZWaveMessageHeader)args.Message[0];
                switch (zwaveHeader)
                {
                case ZWaveMessageHeader.CAN:
                    zwavePort.SendAck();
                        // RESEND
                        //Console.WriteLine("ZWaveLib: received CAN, resending last message");
                        //                        zp.ResendLastMessage();
                    break;
                case ZWaveMessageHeader.ACK:
                    zwavePort.SendAck();
                    break;
                case ZWaveMessageHeader.SOF: // start of zwave frame
                        //
                        // parse frame headers
                        //
                        //int msgLength = (int)args.Message[1];
                    var msgType = (ZWaveMessageType)args.Message[2];
                    var cmdClass = (args.Message.Length > 3 ? (ZWaveCommandClass)args.Message[3] : 0);
                        //
                    byte sourceNodeId = 0;
                        //
                    switch (msgType)
                    {
                    case ZWaveMessageType.REQUEST:
                        zwavePort.SendAck();

                        if (devices.Count == 0) break;

                        //byte callbackId = 0;

                        switch (cmdClass)
                        {
                        case ZWaveCommandClass.CMD_NONE:
                            break;

                        case ZWaveCommandClass.CMD_NODE_ADD:

                            //callbackId = args.Message[ 4 ];
                            if (args.Message[5] == 0x03) // ADD_NODE_STATUS_ADDING_SLAVE
                            {
                                //
                                //Console.WriteLine("\n\nADDING NODE SLAVE {0}\n     ->   ", zp.ByteArrayToString(args.Message));
                                //
                                // example response from HSM-100 3in1 sensor 
                                // 01 15 00 4A 32 03 2E 0E 04 21 01 60 31 70 84 85 80 72 77 86 EF 20 79
                                //                         bt gt st c1 c2 c3 c4 c5 c6 c7 c8 c9 --------
                                // node supported classes (c1, c2.... cn)
                                //
                                nodeOperationIdCheck = args.Message[6];
                                CreateDevice(nodeOperationIdCheck, 0x00);
                            }
                            else if (args.Message[5] == 0x05) // ADD_NODE_STATUS_PROTOCOL_DONE
                            {
                                if (nodeOperationIdCheck == args.Message[6])
                                {
                                    //Console.WriteLine("\n\nADDING NODE PROTOCOL DONE {0} {1}\n\n", args.Message[6], callbackid);
                                    Thread.Sleep(500);
                                    GetNodeCapabilities(args.Message[6]);
                                    //Discovery();
                                }
                                OnDiscoveryEvent(new DiscoveryEventArgs(
                                    0x00,
                                    DISCOVERY_STATUS.DISCOVERY_END
                                )); // Send event
                            }
                            else if (args.Message[5] == 0x07) // ADD_NODE_STATUS_ADDING_FAIL
                            {
                                //Console.WriteLine("\n\nADDING NODE FAIL {0}\n\n", args.Message[6]);
                            }
                            break;

                        case ZWaveCommandClass.CMD_NODE_REMOVE:

                            //callbackId = args.Message[ 4 ];
                            if (args.Message[5] == 0x03) // REMOVE_NODE_STATUS_REMOVING_SLAVE
                            {
                                //Console.WriteLine("\n\nREMOVING NODE SLAVE {0}\n\n", args.Message[6]);
                                nodeOperationIdCheck = args.Message[6];
                            }
                            else if (args.Message[5] == 0x06) // REMOVE_NODE_STATUS_REMOVING_DONE
                            {
                                if (nodeOperationIdCheck == args.Message[6])
                                {
                                    //Console.WriteLine("\n\nREMOVING NODE DONE {0} {1}\n\n", args.Message[6], callbackid);
                                    RemoveDevice(args.Message[6]);
                                }
                                OnDiscoveryEvent(new DiscoveryEventArgs(
                                    0x00,
                                    DISCOVERY_STATUS.DISCOVERY_END
                                )); // Send event
                            }
                            else if (args.Message[5] == 0x07) // REMOVE_NODE_STATUS_REMOVING_FAIL
                            {
                                //Console.WriteLine("\n\nREMOVING NODE FAIL {0}\n\n", args.Message[6]);
                            }
                            break;

                        case ZWaveCommandClass.CMD_APPLICATION_COMMAND:

                            sourceNodeId = args.Message[5];
                            var node = devices.Find(n => n.NodeId == sourceNodeId);
                            if (node == null)
                            {
                                CreateDevice(sourceNodeId, 0x00);
                                GetNodeCapabilities(sourceNodeId);
                            }
                            try
                            {
                                node.MessageRequestHandler(args.Message);
                            }
                            catch
                            {
                                //Console.WriteLine("# " + ex.Message + "\n" + ex.StackTrace);
                            }
                            break;

                        case ZWaveCommandClass.CMD_SEND_DATA:

                            byte commandId = args.Message[4];
                            if (commandId == 0x01) // SEND DATA OK
                            {
                                // TODO: ... what does that mean?
                            }
                            else if (args.Message[5] == 0x00)
                            {
                                // Messaging complete, remove callbackid
                                zwavePort.PendingMessages.RemoveAll(zm => zm.CallbackId == commandId);
                            }
                            else if (args.Message[5] == 0x01)
                            {
                                // TODO: callback error???
                                zwavePort.ResendLastMessage(commandId);
                            }
                            break;

                        case ZWaveCommandClass.CMD_NODE_UPDATE_INFO:

                            sourceNodeId = args.Message[5];
                            int nifLength = (int)args.Message[6];
                            var znode = devices.Find(n => n.NodeId == sourceNodeId);
                            if (znode != null)
                            {
                                byte[] nodeInfo = new byte[nifLength - 2];
                                //Console.WriteLine(ByteArrayToString(args.Message));
                                Array.Copy(args.Message, 7, nodeInfo, 0, nifLength - 2);
                                //
                                RaiseUpdateParameterEvent(
                                    znode,
                                    0,
                                    ParameterType.PARAMETER_NODE_INFO,
                                    zwavePort.ByteArrayToString(nodeInfo)
                                );
                                RaiseUpdateParameterEvent(
                                    znode,
                                    0,
                                    ParameterType.PARAMETER_WAKEUP_NOTIFY,
                                    "1"
                                );
                            }
                            break;

                        default:
                            Console.WriteLine("\nUNHANDLED Z-Wave REQUEST\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                            break;

                        }


                        break;
                    case ZWaveMessageType.RESPONSE:


                        switch (cmdClass)
                        {
                        case ZWaveCommandClass.CMD_DISCOVERY_NODES:
                            MessageResponseNodeBitMaskHandler(args.Message);
                                        //zp.SendAck();
                            break;
                        case ZWaveCommandClass.CMD_GET_NODE_PROTOCOL_INFO:
                            MessageResponseNodeCapabilityHandler(args.Message);
                                        //zp.SendAck();
                            break;
                        case ZWaveCommandClass.CMD_REQUEST_NODE_INFO:
                                        //                                        Console.WriteLine("\nNODE INFO RESPONSE: " + zp.ByteArrayToString(args.Message) + "\n");
                            break;
                        case ZWaveCommandClass.CMD_SEND_DATA:
                            this.ReadyToSend = true;
                            break;
                        default:
                                        //if (args.Message.Length > 2 && args.Message[3] != 0x13) 
                            Console.WriteLine("\nUNHANDLED Z-Wave RESPONSE\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                            break;
                        }


                        break;

                    default:
                        Console.WriteLine("\nUNHANDLED Z-Wave message TYPE\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                        break;
                    }



                        //
                    break;
                }

            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message + "\n" + ex.StackTrace);

            }
        }
예제 #3
0
        private void ZwaveMessageReceived(object sender, ZWaveMessageReceivedEventArgs args)
        {
            // discard repeated messages within last 2 seconds time range
            bool repeated = false;

            if (lastMessage != null)
            {
                var elapsed = (DateTime.UtcNow - lastMessageTimestamp);
                if (elapsed.TotalSeconds <= 2 && lastMessage.SequenceEqual(args.Message))
                {
                    repeated = true;
                }
            }
            lastMessageTimestamp = DateTime.UtcNow;
            lastMessage          = new byte[args.Message.Length];
            Buffer.BlockCopy(args.Message, 0, lastMessage, 0, args.Message.Length * sizeof(byte));
            if (repeated)
            {
                zwavePort.SendAck();
                Console.WriteLine("ZWaveLib: repeated message discarded.");
                return;
            }
            //
            int length = args.Message.Length;

            try
            {
                ZWaveMessageHeader zwaveHeader = (ZWaveMessageHeader)args.Message[0];
                switch (zwaveHeader)
                {
                case ZWaveMessageHeader.CAN:
                    zwavePort.SendAck();
                    // RESEND
                    //Console.WriteLine("ZWaveLib: received CAN, resending last message");
                    //zp.ResendLastMessage();
                    break;

                case ZWaveMessageHeader.ACK:
                    zwavePort.SendAck();
                    break;

                case ZWaveMessageHeader.SOF: // start of zwave frame
                    //
                    // parse frame headers
                    //
                    //int msgLength = (int)args.Message[1];
                    var  msgType      = (ZWaveMessageType)args.Message[2];
                    var  cmdClass     = (args.Message.Length > 3 ? (Command)args.Message[3] : 0);
                    byte sourceNodeId = 0;
                    //
                    switch (msgType)
                    {
                    case ZWaveMessageType.REQUEST:
                        zwavePort.SendAck();

                        if (devices.Count == 0)
                        {
                            break;
                        }

                        switch (cmdClass)
                        {
                        case Command.CMD_NONE:
                            break;

                        case Command.CMD_NODE_ADD:

                            //callbackId = args.Message[ 4 ];
                            if (args.Message[5] == 0x03) // ADD_NODE_STATUS_ADDING_SLAVE
                            {
                                //
                                //Console.WriteLine("\n\nADDING NODE SLAVE {0}\n     ->   ", zp.ByteArrayToString(args.Message));
                                //
                                // example response from HSM-100 3in1 sensor
                                // 01 15 00 4A 32 03 2E 0E 04 21 01 60 31 70 84 85 80 72 77 86 EF 20 79
                                //                         bt gt st c1 c2 c3 c4 c5 c6 c7 c8 c9 --------
                                // node supported classes (c1, c2.... cn)
                                //
                                nodeOperationIdCheck = args.Message[6];
                                CreateDevice(nodeOperationIdCheck, 0x00);
                            }
                            else if (args.Message[5] == 0x05) // ADD_NODE_STATUS_PROTOCOL_DONE
                            {
                                if (nodeOperationIdCheck == args.Message[6])
                                {
                                    //Console.WriteLine("\n\nADDING NODE PROTOCOL DONE {0} {1}\n\n", args.Message[6], callbackid);
                                    Thread.Sleep(500);
                                    GetNodeCapabilities(args.Message[6]);
                                }
                                OnControllerEvent(new ControllerEventArgs(
                                                      0x00,
                                                      ControllerStatus.DISCOVERY_END
                                                      ));     // Send event
                            }
                            else if (args.Message[5] == 0x07) // ADD_NODE_STATUS_ADDING_FAIL
                            {
                                //Console.WriteLine("\n\nADDING NODE FAIL {0}\n\n", args.Message[6]);
                            }
                            break;

                        case Command.CMD_NODE_REMOVE:

                            if (args.Message[5] == 0x03) // REMOVE_NODE_STATUS_REMOVING_SLAVE
                            {
                                //Console.WriteLine("\n\nREMOVING NODE SLAVE {0}\n\n", args.Message[6]);
                                nodeOperationIdCheck = args.Message[6];
                            }
                            else if (args.Message[5] == 0x06) // REMOVE_NODE_STATUS_REMOVING_DONE
                            {
                                if (nodeOperationIdCheck == args.Message[6])
                                {
                                    //Console.WriteLine("\n\nREMOVING NODE DONE {0} {1}\n\n", args.Message[6], callbackid);
                                    RemoveDevice(args.Message[6]);
                                }
                                OnControllerEvent(new ControllerEventArgs(
                                                      0x00,
                                                      ControllerStatus.DISCOVERY_END
                                                      ));     // Send event
                            }
                            else if (args.Message[5] == 0x07) // REMOVE_NODE_STATUS_REMOVING_FAIL
                            {
                                //Console.WriteLine("\n\nREMOVING NODE FAIL {0}\n\n", args.Message[6]);
                            }
                            break;

                        case Command.CMD_APPLICATION_COMMAND:

                            sourceNodeId = args.Message[5];
                            var node = devices.Find(n => n.NodeId == sourceNodeId);
                            if (node == null)
                            {
                                CreateDevice(sourceNodeId, 0x00);
                                GetNodeCapabilities(sourceNodeId);
                            }
                            try
                            {
                                node.MessageRequestHandler(args.Message);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("# " + ex.Message + "\n" + ex.StackTrace);
                            }
                            break;

                        case Command.CMD_SEND_DATA:

                            byte commandId = args.Message[4];
                            if (commandId == 0x01) // SEND DATA OK
                            {
                                // TODO: ... what does that mean?
                            }
                            else if (args.Message[5] == 0x00)
                            {
                                // Messaging complete, remove callbackid
                                zwavePort.PendingMessages.RemoveAll(zm => zm.CallbackId == commandId);
                            }
                            else if (args.Message[5] == 0x01)
                            {
                                byte nodeID = zwavePort.ResendLastMessage(commandId);
                                if (nodeID != 0)
                                {
                                    // Resend timed out
                                    OnControllerEvent(new ControllerEventArgs(nodeID, ControllerStatus.NODE_ERROR));
                                }
                            }
                            break;

                        case Command.CMD_NODE_UPDATE_INFO:

                            sourceNodeId = args.Message[5];
                            int nifLength = (int)args.Message[6];
                            var znode     = devices.Find(n => n.NodeId == sourceNodeId);
                            if (znode != null)
                            {
                                byte[] nodeInfo = new byte[nifLength - 2];
                                //Console.WriteLine(ByteArrayToString(args.Message));
                                Array.Copy(args.Message, 7, nodeInfo, 0, nifLength - 2);
                                //
                                RaiseUpdateParameterEvent(
                                    znode,
                                    0,
                                    ParameterType.PARAMETER_NODE_INFO,
                                    zwavePort.ByteArrayToString(nodeInfo)
                                    );
                                RaiseUpdateParameterEvent(
                                    znode,
                                    0,
                                    ParameterType.PARAMETER_WAKEUP_NOTIFY,
                                    "1"
                                    );
                            }
                            break;

                        default:
                            Console.WriteLine("\nUNHANDLED Z-Wave REQUEST\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                            break;
                        }

                        break;

                    case ZWaveMessageType.RESPONSE:

                        switch (cmdClass)
                        {
                        case Command.CMD_DISCOVERY_NODES:
                            MessageResponseNodeBitMaskHandler(args.Message);
                            break;

                        case Command.CMD_GET_NODE_PROTOCOL_INFO:
                            MessageResponseNodeCapabilityHandler(args.Message);
                            break;

                        case Command.CMD_REQUEST_NODE_INFO:
                            // TODO: shall we do something here?
                            break;

                        case Command.CMD_SEND_DATA:
                            // TODO: shall we do something here?
                            break;

                        default:
                            Console.WriteLine("\nUNHANDLED Z-Wave RESPONSE\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                            break;
                        }

                        break;

                    default:
                        Console.WriteLine("\nUNHANDLED Z-Wave message TYPE\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                        break;
                    }

                    break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
            }
        }
예제 #4
0
        private void ZwaveMessageReceived(object sender, ZWaveMessageReceivedEventArgs args)
        {
            // discard repeated messages within last 2 seconds time range
            bool repeated = false;

            if (lastMessage != null)
            {
                var elapsed = (DateTime.UtcNow - lastMessageTimestamp);
                if (elapsed.TotalSeconds <= 2 && lastMessage.SequenceEqual(args.Message))
                {
                    repeated = true;
                }
            }
            lastMessageTimestamp = DateTime.UtcNow;
            lastMessage          = new byte[args.Message.Length];
            Buffer.BlockCopy(args.Message, 0, lastMessage, 0, args.Message.Length * sizeof(byte));
            if (repeated)
            {
                zwavePort.SendAck();
                Console.WriteLine("ZWaveLib: repeated message discarded.");
                return;
            }
            //
            int length = args.Message.Length;

            try
            {
                MessageHeader zwaveHeader = (MessageHeader)args.Message[0];
                switch (zwaveHeader)
                {
                case MessageHeader.CAN:
                    zwavePort.SendAck();
                    // RESEND
                    //Console.WriteLine("ZWaveLib: received CAN, resending last message");
                    //zp.ResendLastMessage();
                    break;

                case MessageHeader.ACK:
                    zwavePort.SendAck();
                    break;

                case MessageHeader.SOF: // start of zwave frame
                    //
                    // parse frame headers
                    //
                    //int msgLength = (int)args.Message[1];
                    var  msgType       = (MessageType)args.Message[2];
                    var  cmdClass      = (args.Message.Length > 3 ? (Function)args.Message[3] : 0);
                    byte sourceNodeId  = 0;
                    byte nodeOperation = 0;
                    //
                    switch (msgType)
                    {
                    case MessageType.REQUEST:
                        zwavePort.SendAck();

                        if (devices.Count == 0)
                        {
                            break;
                        }

                        switch (cmdClass)
                        {
                        case Function.None:
                            break;

                        case Function.NodeAdd:

                            nodeOperation = args.Message[5];
                            if (nodeOperation == (byte)NodeFunctionStatus.AddNodeAddingSlave)
                            {
                                //Console.WriteLine("\n\nADDING NODE SLAVE {0}\n     ->   ", zp.ByteArrayToString(args.Message));
                                nodeOperationIdCheck = args.Message[6];
                                var newNode = CreateDevice(nodeOperationIdCheck, 0x00);
                                // Extract node information frame
                                int    nodeInfoLength = (int)args.Message[7];
                                byte[] nodeInfo       = new byte[nodeInfoLength - 2];
                                Array.Copy(args.Message, 8, nodeInfo, 0, nodeInfoLength - 2);
                                RaiseUpdateParameterEvent(
                                    newNode,
                                    0,
                                    ParameterType.NODE_INFO,
                                    zwavePort.ByteArrayToString(nodeInfo)
                                    );
                            }
                            else if (nodeOperation == (byte)NodeFunctionStatus.AddNodeProtocolDone /* || nodeOperation == (byte)NodeFunctionStatus.AddNodeDone */)
                            {
                                if (nodeOperationIdCheck == args.Message[6])
                                {
                                    //Console.WriteLine("\n\nADDING NODE DONE {0} {1}\n\n", args.Message[6], callbackid);
                                    Thread.Sleep(500);
                                    GetNodeCapabilities(args.Message[6]);
                                    var newNode = devices.Find(n => n.NodeId == args.Message[6]);
                                    if (newNode != null)
                                    {
                                        newNode.ManufacturerSpecific_Get();
                                    }
                                }
                                OnControllerEvent(new ControllerEventArgs(
                                                      0x00,
                                                      ControllerStatus.DiscoveryEnd
                                                      )); // Send event
                            }
                            else if (nodeOperation == (byte)NodeFunctionStatus.AddNodeFailed)
                            {
                                //Console.WriteLine("\n\nADDING NODE FAIL {0}\n\n", args.Message[6]);
                            }
                            break;

                        case Function.NodeRemove:

                            nodeOperation = args.Message[5];
                            if (nodeOperation == (byte)NodeFunctionStatus.RemoveNodeRemovingSlave)
                            {
                                //Console.WriteLine("\n\nREMOVING NODE SLAVE {0}\n\n", args.Message[6]);
                                nodeOperationIdCheck = args.Message[6];
                            }
                            else if (nodeOperation == (byte)NodeFunctionStatus.RemoveNodeDone)
                            {
                                if (nodeOperationIdCheck == args.Message[6])
                                {
                                    //Console.WriteLine("\n\nREMOVING NODE DONE {0} {1}\n\n", args.Message[6], callbackid);
                                    RemoveDevice(args.Message[6]);
                                }
                                OnControllerEvent(new ControllerEventArgs(
                                                      0x00,
                                                      ControllerStatus.DiscoveryEnd
                                                      )); // Send event
                            }
                            else if (nodeOperation == (byte)NodeFunctionStatus.RemoveNodeFailed)
                            {
                                //Console.WriteLine("\n\nREMOVING NODE FAIL {0}\n\n", args.Message[6]);
                            }
                            break;

                        case Function.ApplicationCommand:

                            sourceNodeId = args.Message[5];
                            var node = devices.Find(n => n.NodeId == sourceNodeId);
                            if (node == null)
                            {
                                CreateDevice(sourceNodeId, 0x00);
                                GetNodeCapabilities(sourceNodeId);
                            }
                            try
                            {
                                node.MessageRequestHandler(args.Message);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("# " + ex.Message + "\n" + ex.StackTrace);
                            }
                            break;

                        case Function.SendData:

                            byte commandId = args.Message[4];
                            if (commandId == 0x01) // SEND DATA OK
                            {
                                // TODO: ... what does that mean?
                            }
                            else if (args.Message[5] == 0x00)
                            {
                                // Messaging complete, remove callbackid
                                zwavePort.PendingMessages.RemoveAll(zm => zm.CallbackId == commandId);
                            }
                            else if (args.Message[5] == 0x01)
                            {
                                byte nodeID = zwavePort.ResendLastMessage(commandId);
                                if (nodeID != 0)
                                {
                                    // Resend timed out
                                    OnControllerEvent(new ControllerEventArgs(nodeID, ControllerStatus.NodeError));
                                }
                            }
                            break;

                        case Function.NodeUpdateInfo:

                            sourceNodeId = args.Message[5];
                            int nifLength = (int)args.Message[6];
                            var znode     = devices.Find(n => n.NodeId == sourceNodeId);
                            if (znode != null)
                            {
                                byte[] nodeInfo = new byte[nifLength - 2];
                                //Console.WriteLine(ByteArrayToString(args.Message));
                                Array.Copy(args.Message, 7, nodeInfo, 0, nifLength - 2);
                                //
                                RaiseUpdateParameterEvent(
                                    znode,
                                    0,
                                    ParameterType.NODE_INFO,
                                    zwavePort.ByteArrayToString(nodeInfo)
                                    );
                                RaiseUpdateParameterEvent(
                                    znode,
                                    0,
                                    ParameterType.WAKEUP_NOTIFY,
                                    "1"
                                    );
                            }
                            break;

                        default:
                            Console.WriteLine("\nUNHANDLED Z-Wave REQUEST\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                            break;
                        }

                        break;

                    case MessageType.RESPONSE:

                        switch (cmdClass)
                        {
                        case Function.DiscoveryNodes:
                            MessageResponseNodeBitMaskHandler(args.Message);
                            break;

                        case Function.GetNodeProtocolInfo:
                            MessageResponseNodeCapabilityHandler(args.Message);
                            break;

                        case Function.RequestNodeInfo:
                            // TODO: shall we do something here?
                            break;

                        case Function.SendData:
                            // TODO: shall we do something here?
                            break;

                        default:
                            Console.WriteLine("\nUNHANDLED Z-Wave RESPONSE\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                            break;
                        }

                        break;

                    default:
                        Console.WriteLine("\nUNHANDLED Z-Wave message TYPE\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                        break;
                    }

                    break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
            }
        }
예제 #5
0
        private void ZwaveMessageReceived(object sender, ZWaveMessageReceivedEventArgs args)
        {
            // discard repeated messages within last 2 seconds time range
            bool repeated = false;
            if (lastMessage != null)
            {
                var elapsed = (DateTime.UtcNow - lastMessageTimestamp);
                if (elapsed.TotalSeconds <= 2 && lastMessage.SequenceEqual(args.Message)) repeated = true;
            }
            lastMessageTimestamp = DateTime.UtcNow;
            lastMessage = new byte[args.Message.Length];
            Buffer.BlockCopy(args.Message, 0, lastMessage, 0, args.Message.Length * sizeof(byte));
            if (repeated)
            {
                zwavePort.SendAck();
                Console.WriteLine("ZWaveLib: repeated message discarded.");
                return;
            }
            //
            int length = args.Message.Length;
            try
            {
                ZWaveMessageHeader zwaveHeader = (ZWaveMessageHeader)args.Message[0];
                switch (zwaveHeader)
                {
                case ZWaveMessageHeader.CAN:
                    zwavePort.SendAck();
                    // RESEND
                    //Console.WriteLine("ZWaveLib: received CAN, resending last message");
                    //zp.ResendLastMessage();
                    break;

                case ZWaveMessageHeader.ACK:
                    zwavePort.SendAck();
                    break;

                case ZWaveMessageHeader.SOF: // start of zwave frame
                    //
                    // parse frame headers
                    //
                    //int msgLength = (int)args.Message[1];
                    var msgType = (ZWaveMessageType)args.Message[2];
                    var cmdClass = (args.Message.Length > 3 ? (Command)args.Message[3] : 0);
                    byte sourceNodeId = 0;
                    //
                    switch (msgType)
                    {
                    case ZWaveMessageType.REQUEST:
                        zwavePort.SendAck();

                        if (devices.Count == 0) break;

                        switch (cmdClass)
                        {
                        case Command.CMD_NONE:
                            break;

                        case Command.CMD_NODE_ADD:

                            //callbackId = args.Message[ 4 ];
                            if (args.Message[5] == 0x03) // ADD_NODE_STATUS_ADDING_SLAVE
                            {
                                //
                                //Console.WriteLine("\n\nADDING NODE SLAVE {0}\n     ->   ", zp.ByteArrayToString(args.Message));
                                //
                                // example response from HSM-100 3in1 sensor 
                                // 01 15 00 4A 32 03 2E 0E 04 21 01 60 31 70 84 85 80 72 77 86 EF 20 79
                                //                         bt gt st c1 c2 c3 c4 c5 c6 c7 c8 c9 --------
                                // node supported classes (c1, c2.... cn)
                                //
                                nodeOperationIdCheck = args.Message[6];
                                CreateDevice(nodeOperationIdCheck, 0x00);
                            }
                            else if (args.Message[5] == 0x05) // ADD_NODE_STATUS_PROTOCOL_DONE
                            {
                                if (nodeOperationIdCheck == args.Message[6])
                                {
                                    //Console.WriteLine("\n\nADDING NODE PROTOCOL DONE {0} {1}\n\n", args.Message[6], callbackid);
                                    Thread.Sleep(500);
                                    GetNodeCapabilities(args.Message[6]);
                                }
                                OnControllerEvent(new ControllerEventArgs(
                                    0x00,
                                    ControllerStatus.DISCOVERY_END
                                )); // Send event
                            }
                            else if (args.Message[5] == 0x07) // ADD_NODE_STATUS_ADDING_FAIL
                            {
                                //Console.WriteLine("\n\nADDING NODE FAIL {0}\n\n", args.Message[6]);
                            }
                            break;

                        case Command.CMD_NODE_REMOVE:

                            if (args.Message[5] == 0x03) // REMOVE_NODE_STATUS_REMOVING_SLAVE
                            {
                                //Console.WriteLine("\n\nREMOVING NODE SLAVE {0}\n\n", args.Message[6]);
                                nodeOperationIdCheck = args.Message[6];
                            }
                            else if (args.Message[5] == 0x06) // REMOVE_NODE_STATUS_REMOVING_DONE
                            {
                                if (nodeOperationIdCheck == args.Message[6])
                                {
                                    //Console.WriteLine("\n\nREMOVING NODE DONE {0} {1}\n\n", args.Message[6], callbackid);
                                    RemoveDevice(args.Message[6]);
                                }
                                OnControllerEvent(new ControllerEventArgs(
                                    0x00,
                                    ControllerStatus.DISCOVERY_END
                                )); // Send event
                            }
                            else if (args.Message[5] == 0x07) // REMOVE_NODE_STATUS_REMOVING_FAIL
                            {
                                //Console.WriteLine("\n\nREMOVING NODE FAIL {0}\n\n", args.Message[6]);
                            }
                            break;

                        case Command.CMD_APPLICATION_COMMAND:

                            sourceNodeId = args.Message[5];
                            var node = devices.Find(n => n.NodeId == sourceNodeId);
                            if (node == null)
                            {
                                CreateDevice(sourceNodeId, 0x00);
                                GetNodeCapabilities(sourceNodeId);
                            }
                            try
                            {
                                node.MessageRequestHandler(args.Message);
                            }
                            catch(Exception ex)
                            {
                                Console.WriteLine("# " + ex.Message + "\n" + ex.StackTrace);
                            }
                            break;

                        case Command.CMD_SEND_DATA:

                            byte commandId = args.Message[4];
                            if (commandId == 0x01) // SEND DATA OK
                            {
                                // TODO: ... what does that mean?
                            }
                            else if (args.Message[5] == 0x00)
                            {
                                // Messaging complete, remove callbackid
                                zwavePort.PendingMessages.RemoveAll(zm => zm.CallbackId == commandId);
                            }
                            else if (args.Message[5] == 0x01)
                            {
                                byte nodeID = zwavePort.ResendLastMessage(commandId) ;
                                if( nodeID != 0 )
                                {
                                    // Resend timed out
                                    OnControllerEvent(new ControllerEventArgs(nodeID, ControllerStatus.NODE_ERROR));
                                }
                            }
                            break;

                        case Command.CMD_NODE_UPDATE_INFO:

                            sourceNodeId = args.Message[5];
                            int nifLength = (int)args.Message[6];
                            var znode = devices.Find(n => n.NodeId == sourceNodeId);
                            if (znode != null)
                            {
                                byte[] nodeInfo = new byte[nifLength - 2];
                                //Console.WriteLine(ByteArrayToString(args.Message));
                                Array.Copy(args.Message, 7, nodeInfo, 0, nifLength - 2);
                                //
                                RaiseUpdateParameterEvent(
                                    znode,
                                    0,
                                    ParameterType.PARAMETER_NODE_INFO,
                                    zwavePort.ByteArrayToString(nodeInfo)
                                );
                                RaiseUpdateParameterEvent(
                                    znode,
                                    0,
                                    ParameterType.PARAMETER_WAKEUP_NOTIFY,
                                    "1"
                                );
                            }
                            break;

                        default:
                            Console.WriteLine("\nUNHANDLED Z-Wave REQUEST\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                            break;

                        }

                        break;

                    case ZWaveMessageType.RESPONSE:

                        switch (cmdClass)
                        {
                        case Command.CMD_DISCOVERY_NODES:
                            MessageResponseNodeBitMaskHandler(args.Message);
                            break;
                        case Command.CMD_GET_NODE_PROTOCOL_INFO:
                            MessageResponseNodeCapabilityHandler(args.Message);
                            break;
                        case Command.CMD_REQUEST_NODE_INFO:
                            // TODO: shall we do something here?
                            break;
                        case Command.CMD_SEND_DATA:
                            // TODO: shall we do something here?
                            break;
                        default:
                            Console.WriteLine("\nUNHANDLED Z-Wave RESPONSE\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                            break;
                        }

                        break;

                    default:
                        Console.WriteLine("\nUNHANDLED Z-Wave message TYPE\n     " + zwavePort.ByteArrayToString(args.Message) + "\n");
                        break;
                    }

                    break;
                }

            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message + "\n" + ex.StackTrace);

            }
        }