Example #1
0
        private async void _comms_FrameReady(object sender, Frame frame)
        {
            if (_currentState == States.Disposed)
            {
                return;
            }

            if (frame.FrameType == Frame.FrameTypes.RxAtCommandResponse)
            {
                if (frame.ATCommandString == "WR")
                {
                    HandleWriteEPROMFrame(frame);
                }
                else if (frame.Payload != null && frame.Payload.Length > 0)
                {
                    HandleATReadFrame(frame);
                }
                else
                {
                    HandleATWriteFrame(frame);
                }
            }
            else if (frame.FrameType == Frame.FrameTypes.RxReceivePacket)
            {
                if (frame.ClusterId == 0x0005)
                {
                    var endpointFrame = new Frame();
                    endpointFrame.FrameType = Frame.FrameTypes.TxExplicitAddressCommand;
                    endpointFrame.ClusterId = Convert.ToUInt16(0x8000 | frame.ClusterId);

                    endpointFrame.DestinationAddress64Bit = 0x00000000;
                    endpointFrame.DestinationAddress16Bit = 0x0000;
                    endpointFrame.SourceEndPoint          = 0x00;
                    endpointFrame.DestinationEndPoint     = 0x00;

                    endpointFrame.Payload    = new byte[6];
                    endpointFrame.Payload[0] = frame.Payload[0];
                    endpointFrame.Payload[1] = 0x00; /* OK */
                    endpointFrame.Payload[2] = frame.Payload[1];
                    endpointFrame.Payload[3] = frame.Payload[2];
                    endpointFrame.Payload[4] = 1;              /* Number of end points */
                    endpointFrame.Payload[5] = LOCAL_ENDPOINT; /* Address of the end point */

                    await _comms.SendFrameAsync(endpointFrame);
                }

                else if (frame.ClusterId == 0x0004)
                {
                    var endpointFrame = new Frame();
                    endpointFrame.FrameType = Frame.FrameTypes.TxExplicitAddressCommand;
                    endpointFrame.ClusterId = Convert.ToUInt16(0x8000 | frame.ClusterId);

                    endpointFrame.DestinationAddress64Bit = 0x00000000;
                    endpointFrame.DestinationAddress16Bit = 0x0000;
                    endpointFrame.SourceEndPoint          = 0x00;
                    endpointFrame.DestinationEndPoint     = 0x00;

                    var inClusters = GetInClusters();

                    endpointFrame.Payload    = new byte[13 + (inClusters.Count * 2)];
                    endpointFrame.Payload[0] = frame.Payload[0];
                    endpointFrame.Payload[1] = 0x00; /* OK */
                    endpointFrame.Payload[2] = frame.Payload[1];
                    endpointFrame.Payload[3] = frame.Payload[2];

                    endpointFrame.Payload[4] = Convert.ToByte(endpointFrame.Payload.Length - 5); /* Bytes Sent */

                    endpointFrame.Payload[5] = frame.Payload[3];

                    endpointFrame.Payload[6] = 0x04; /* HA Client */
                    endpointFrame.Payload[7] = 0x01;

                    endpointFrame.Payload[8] = 0x02; /* On/Off Output */
                    endpointFrame.Payload[9] = 0x00;

                    endpointFrame.Payload[10] = 0x30;                             /* Version */

                    endpointFrame.Payload[11] = Convert.ToByte(inClusters.Count); /* Number of Cluster Types We Accept */

                    var payloadIndex = 12;
                    foreach (var inCluster in inClusters)
                    {
                        endpointFrame.Payload[payloadIndex++] = Convert.ToByte(inCluster & 0xFF); /* Cluster Type => Basic */
                        endpointFrame.Payload[payloadIndex++] = Convert.ToByte(inCluster >> 8);
                    }

                    endpointFrame.Payload[payloadIndex] = 0x00;

                    await _comms.SendFrameAsync(endpointFrame);
                }
                else if (frame.DestinationEndPoint == LOCAL_ENDPOINT && frame.ProfileId == 0x0104)
                {
                    var myAddr        = BitConverter.ToUInt16(_deviceATSettings["MY"], 0);
                    var endpointFrame = new Frame();
                    endpointFrame.FrameType = Frame.FrameTypes.TxExplicitAddressCommand;
                    //endpointFrame.ClusterId = Convert.ToUInt16(0x8000 | frame.ClusterId);
                    endpointFrame.ClusterId = frame.ClusterId;
                    endpointFrame.DestinationAddress64Bit = 0x00000000;
                    endpointFrame.DestinationAddress16Bit = 0x0000;
                    endpointFrame.SourceEndPoint          = frame.DestinationEndPoint;
                    endpointFrame.DestinationEndPoint     = frame.SourceEndPoint;
                    endpointFrame.ProfileId = 0x0104;


                    /*                    endpointFrame.Payload[0] = frame.Payload[0];
                     *                  endpointFrame.Payload[1] = 0x00; /* OK */
                    //endpointFrame.Payload[2] = frame.Payload[1]; /* Return Our Address */
                    //endpointFrame.Payload[3] = frame.Payload[2]; /* Return Our Address */

                    /*
                     * endpointFrame.Payload[2] = Convert.ToByte((myAddr >> 8));
                     * endpointFrame.Payload[3] = Convert.ToByte(myAddr & 0xFF);
                     * endpointFrame.Payload[4] = Convert.ToByte(endpointFrame.Payload.Length - 5); // Bytes Sent
                     * endpointFrame.Payload[5] = frame.DestinationEndPoint;
                     * endpointFrame.Payload[6] = (byte)'o' ;
                     * endpointFrame.Payload[7] = (byte)'f';
                     * endpointFrame.Payload[8] = (byte)'f';
                     * endpointFrame.Payload[9] = 0x00;*/

                    endpointFrame.Payload    = new byte[8];
                    endpointFrame.Payload[0] = 0x18;
                    endpointFrame.Payload[1] = frame.Payload[1];
                    endpointFrame.Payload[2] = 0x01;             // Read response
                    endpointFrame.Payload[3] = frame.Payload[3]; // ATTR LSB
                    endpointFrame.Payload[4] = 0x00;             // ATTR MSB
                    endpointFrame.Payload[5] = 0x00;             // Status Success
                    endpointFrame.Payload[6] = 0x10;             // Attr Type (Binary)
                    endpointFrame.Payload[7] = 0x00;             // Attr VBalue - Off

                    /*                    endpointFrame.Payload[4] = 1;
                     *                  endpointFrame.Payload[5] = 0x10; */

                    await _comms.SendFrameAsync(endpointFrame);
                }
                else
                {
                    HandleFrame(frame);
                }
            }
            else if (frame.FrameType == Frame.FrameTypes.RxModemStatus)
            {
                switch (frame.ModemStatus)
                {
                case Frame.ModemStatuss.JoinedNetwork: IsJoinedToNetwork = true; break;

                case Frame.ModemStatuss.Disassociated: IsJoinedToNetwork = false; break;

                case Frame.ModemStatuss.WatchdogTimerReset:
                    lock (this)
                    {
                        if (_resetCompletionSource != null)
                        {
                            _resetCompletionSource.SetResult(true);
                            _resetCompletionSource = null;
                        }
                    }
                    break;
                }
            }
        }