public InsteonMessage(int messageId, InsteonMessageType messageType, Dictionary<PropertyKey, int> properties)
 {
     MessageId = messageId;
     MessageType = messageType;
     Properties = properties;
     Key = ToString("Key");
 }
예제 #2
0
        private static bool DeviceLinkCleanupMessage(byte[] data, int offset, out int count, out InsteonMessage message)
        {
            message = null;
            count   = 0;
            if (data.Length <= offset + 8)
            {
                return(false);
            }

            byte messageId = data[offset];
            InsteonMessageType            messageType = InsteonMessageType.DeviceLinkCleanup;
            Dictionary <PropertyKey, int> properties  = new Dictionary <PropertyKey, int>();

            properties[PropertyKey.LinkStatus] = data[offset + 1];
            count = 2;

            message = new InsteonMessage(messageId, messageType, properties);
            return(true);
        }
예제 #3
0
        private static bool GetIMInfo(byte[] data, int offset, out int count, out InsteonMessage message)
        {
            message = null;
            count   = 0;
            if (data.Length < offset + 7)
            {
                return(false);
            }

            byte messageId = data[offset];
            InsteonMessageType            messageType = InsteonMessageType.GetIMInfo;
            Dictionary <PropertyKey, int> properties  = new Dictionary <PropertyKey, int>();

            properties[PropertyKey.Address]         = new InsteonAddress(data[offset + 1], data[offset + 2], data[offset + 3]).Value;
            properties[PropertyKey.DevCat]          = data[offset + 4];
            properties[PropertyKey.SubCat]          = data[offset + 5];
            properties[PropertyKey.FirmwareVersion] = data[offset + 6];
            count = 7;

            message = new InsteonMessage(messageId, messageType, properties);
            return(true);
        }
예제 #4
0
        private static bool DeviceLinkRecordMessage(byte[] data, int offset, out int count, out InsteonMessage message)
        {
            message = null;
            count   = 0;
            if (data.Length < offset + 9)
            {
                return(false);
            }

            byte messageId = data[offset];
            InsteonMessageType            messageType = InsteonMessageType.DeviceLinkRecord;
            Dictionary <PropertyKey, int> properties  = new Dictionary <PropertyKey, int>();

            properties[PropertyKey.LinkRecordFlags] = data[offset + 1];
            properties[PropertyKey.LinkGroup]       = data[offset + 2];
            properties[PropertyKey.LinkAddress]     = new InsteonAddress(data[offset + 3], data[offset + 4], data[offset + 5]).Value;
            properties[PropertyKey.LinkData1]       = data[offset + 6];
            properties[PropertyKey.LinkData2]       = data[offset + 7];
            properties[PropertyKey.LinkData3]       = data[offset + 8];
            count = 9;

            message = new InsteonMessage(messageId, messageType, properties);
            return(true);
        }
예제 #5
0
        private static bool DeviceLinkMessage(byte[] data, int offset, out int count, out InsteonMessage message)
        {
            message = null;
            count   = 0;
            if (data.Length < offset + 9)
            {
                return(false);
            }

            byte messageId = data[offset];
            InsteonMessageType            messageType = InsteonMessageType.DeviceLink;
            Dictionary <PropertyKey, int> properties  = new Dictionary <PropertyKey, int>();

            properties[PropertyKey.LinkType]  = data[offset + 1];
            properties[PropertyKey.LinkGroup] = data[offset + 2];
            GetAddressProperty(PropertyKey.Address, data, offset + 3, out count, properties);
            properties[PropertyKey.DevCat]          = data[offset + 6];
            properties[PropertyKey.SubCat]          = data[offset + 7];
            properties[PropertyKey.FirmwareVersion] = data[offset + 8];
            count = 9;

            message = new InsteonMessage(messageId, messageType, properties);
            return(true);
        }
예제 #6
0
        private static InsteonMessageType GetMessageType(byte[] data, int offset, Dictionary <PropertyKey, int> properties)
        {
            byte cmd1      = (byte)properties[PropertyKey.Cmd1];
            bool ack       = properties[PropertyKey.MessageFlagsAck] != 0;
            bool broadcast = properties[PropertyKey.MessageFlagsBroadcast] != 0;
            bool allLink   = properties[PropertyKey.MessageFlagsAllLink] != 0;

            InsteonMessageType messageType = InsteonMessageType.Other;

            if (ack)
            {
                messageType = InsteonMessageType.Ack;
            }
            else if (cmd1 == 0x06 && broadcast && allLink)
            {
                messageType = InsteonMessageType.SuccessBroadcast;
                properties[PropertyKey.ResponderCmd1]       = data[offset + 4];
                properties[PropertyKey.ResponderCount]      = data[offset + 5];
                properties[PropertyKey.ResponderGroup]      = data[offset + 6];
                properties[PropertyKey.ResponderErrorCount] = data[offset + 9];
            }
            else if (cmd1 == 0x11 && allLink && broadcast)
            {
                messageType = InsteonMessageType.OnBroadcast;
                properties[PropertyKey.Group] = data[offset + 5];
            }
            else if (cmd1 == 0x11 && allLink && !broadcast)
            {
                messageType = InsteonMessageType.OnCleanup;
                properties[PropertyKey.Group] = data[offset + 9];
            }
            else if (cmd1 == 0x13 && allLink && broadcast)
            {
                messageType = InsteonMessageType.OffBroadcast;
                properties[PropertyKey.Group] = data[offset + 5];
            }
            else if (cmd1 == 0x13 && allLink && !broadcast)
            {
                messageType = InsteonMessageType.OffCleanup;
                properties[PropertyKey.Group] = data[offset + 9];
            }
            else if (cmd1 == 0x12 && allLink && broadcast)
            {
                messageType = InsteonMessageType.FastOnBroadcast;
                properties[PropertyKey.Group] = data[offset + 5];
            }
            else if (cmd1 == 0x12 && allLink && !broadcast)
            {
                messageType = InsteonMessageType.FastOnCleanup;
                properties[PropertyKey.Group] = data[offset + 9];
            }
            else if (cmd1 == 0x14 && allLink && broadcast)
            {
                messageType = InsteonMessageType.FastOffBroadcast;
                properties[PropertyKey.Group] = data[offset + 5];
            }
            else if (cmd1 == 0x14 && allLink && !broadcast)
            {
                messageType = InsteonMessageType.FastOffCleanup;
                properties[PropertyKey.Group] = data[offset + 9];
            }
            else if (cmd1 == 0x17 && allLink && broadcast)
            {
                messageType = InsteonMessageType.IncrementBeginBroadcast;
                properties[PropertyKey.Group] = data[offset + 5];
                properties[PropertyKey.IncrementDirection] = data[offset + 9];
            }
            else if (cmd1 == 0x18 && allLink && broadcast)
            {
                messageType = InsteonMessageType.IncrementEndBroadcast;
                properties[PropertyKey.Group] = data[offset + 5];
            }
            else if (cmd1 == 0x01 || cmd1 == 0x02)
            {
                messageType = InsteonMessageType.SetButtonPressed;
                properties[PropertyKey.DevCat]          = data[offset + 3];
                properties[PropertyKey.SubCat]          = data[offset + 4];
                properties[PropertyKey.FirmwareVersion] = data[offset + 5];
            }

            return(messageType);
        }
 public WaitItem(byte messageId, InsteonMessageType? messageType)
 {
     MessageId = messageId;
     MessageType = messageType;
     MessageEvent = new AutoResetEvent(false);
     Message = null;
 }
        public EchoStatus TrySendReceive(byte[] message, bool retryOnNak, byte receiveMessageId, InsteonMessageType? receiveMessageType, out Dictionary<PropertyKey, int> properties)
        {
            properties = null;
            WaitItem item = new WaitItem(receiveMessageId, receiveMessageType);

            lock (waitList)
                waitList.Add(item);

            EchoStatus status = TrySend(message, retryOnNak);
            if (status == EchoStatus.ACK)
            {
                if (item.Message == null)
                {
                    item.MessageEvent.WaitOne(Constants.sendReceiveTimeout);
                }
                if (item.Message != null)
                {
                    properties = item.Message.Properties;
                }
                else
                {
                    logger.ErrorFormat("Did not receive expected message reply; SentMessage='{0}', ExpectedReceiveMessageId={1:X2}, Timeout={2}ms", Utilities.ByteArrayToString(message), receiveMessageId, Constants.sendReceiveTimeout);
                }
            }

            lock (waitList)
                waitList.Remove(item);

            return status;
        }