Ejemplo n.º 1
0
        private static bool ExtendedMessage(byte[] data, int offset, out int count, out InsteonMessage message)
        {
            message = null;
            count   = 0;
            if (data.Length < offset + 23)
            {
                return(false);
            }

            StandardMessage(data, offset, out count, out message);
            message.Properties[PropertyKey.Data1]  = data[offset + 10];
            message.Properties[PropertyKey.Data2]  = data[offset + 11];
            message.Properties[PropertyKey.Data3]  = data[offset + 12];
            message.Properties[PropertyKey.Data4]  = data[offset + 13];
            message.Properties[PropertyKey.Data5]  = data[offset + 14];
            message.Properties[PropertyKey.Data6]  = data[offset + 15];
            message.Properties[PropertyKey.Data7]  = data[offset + 16];
            message.Properties[PropertyKey.Data8]  = data[offset + 17];
            message.Properties[PropertyKey.Data9]  = data[offset + 18];
            message.Properties[PropertyKey.Data10] = data[offset + 19];
            message.Properties[PropertyKey.Data11] = data[offset + 20];
            message.Properties[PropertyKey.Data12] = data[offset + 21];
            message.Properties[PropertyKey.Data13] = data[offset + 22];
            message.Properties[PropertyKey.Data14] = data[offset + 23];
            count = 23;
            return(true);
        }
 internal void OnMessage(InsteonMessage message)
 {
     if (message.MessageType == InsteonMessageType.DeviceLink)
     {
         InsteonAddress  address  = new InsteonAddress(message.Properties[PropertyKey.Address]);
         InsteonIdentity identity = new InsteonIdentity((byte)message.Properties[PropertyKey.DevCat], (byte)message.Properties[PropertyKey.SubCat], (byte)message.Properties[PropertyKey.FirmwareVersion]);
         InsteonDevice   device   = network.Devices.Add(address, identity);
         timer.Stop();
         IsInLinkingMode = false;
         if (linkingMode.HasValue)
         {
             if (linkingMode != InsteonLinkMode.Delete)
             {
                 OnDeviceLinked(device);
             }
             else
             {
                 OnDeviceUnlinked(device);
             }
         }
         else
         {
             OnDeviceLinked(device);
         }
     }
 }
Ejemplo n.º 3
0
        public static bool ProcessMessage(byte[] data, int offset, out int count, out InsteonMessage message)
        {
            message = null;
            count   = 0;
            if (data.Length <= offset)
            {
                return(false);
            }

            switch (data[offset])
            {
            case 0x50: return(InsteonMessageProcessor.StandardMessage(data, offset, out count, out message));

            case 0x51: return(InsteonMessageProcessor.ExtendedMessage(data, offset, out count, out message));

            case 0x53: return(InsteonMessageProcessor.DeviceLinkMessage(data, offset, out count, out message));

            case 0x57: return(InsteonMessageProcessor.DeviceLinkRecordMessage(data, offset, out count, out message));

            case 0x58: return(InsteonMessageProcessor.DeviceLinkCleanupMessage(data, offset, out count, out message));

            case 0x60: return(InsteonMessageProcessor.GetIMInfo(data, offset, out count, out message));
            }

            return(false);
        }
Ejemplo n.º 4
0
        private static bool StandardMessage(byte[] data, int offset, out int count, out InsteonMessage message)
        {
            message = null;
            count   = 0;
            if (data.Length < offset + 10)
            {
                return(false);
            }

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

            GetAddressProperty(PropertyKey.FromAddress, data, offset + 1, out count, properties);
            GetMessageFlagProperty(data, offset, out count, properties);
            if (properties[PropertyKey.MessageFlagsBroadcast] == 0)
            {
                GetAddressProperty(PropertyKey.ToAddress, data, offset + 4, out count, properties);
            }
            properties[PropertyKey.Cmd1] = data[offset + 8];
            properties[PropertyKey.Cmd2] = data[offset + 9];
            count = 10;

            InsteonMessageType messageType = GetMessageType(data, offset, properties);

            message = new InsteonMessage(messageId, messageType, properties);
            return(true);
        }
 private void OnMessage(InsteonMessage message)
 {
     if (message.Properties.ContainsKey(PropertyKey.FromAddress))
     {
         int address = message.Properties[PropertyKey.FromAddress];
         if (network.Devices.ContainsKey(address))
         {
             Log.WriteLine("Device {0} received message {1}", InsteonAddress.Format(address), message.ToString());
             InsteonDevice device = network.Devices.Find(address);
             device.OnMessage(message);
         }
         else if (message.MessageType == InsteonMessageType.SetButtonPressed)
         {
             // don't warn about SetButtonPressed message from unknown devices, because it may be from a device about to be added
         }
         else if (network.AutoAdd)
         {
             Log.WriteLine("Unknown device {0} received message {1}, adding device", InsteonAddress.Format(address), message.ToString());
             InsteonDevice device = network.Devices.Add(new InsteonAddress(address), new InsteonIdentity());
             device.OnMessage(message);
         }
         else
         {
             Log.WriteLine("WARNING: Unknown device {0} received message {1}", InsteonAddress.Format(address), message.ToString());
         }
     }
     else
     {
         Log.WriteLine("Controller received message {0}", message.ToString());
         network.Controller.OnMessage(message);
     }
 }
 private void OnSetButtonPressed(InsteonMessage message)
 {
     if (this.Identity.IsEmpty)
     {
         byte devCat          = (byte)message.Properties[PropertyKey.DevCat];
         byte subCat          = (byte)message.Properties[PropertyKey.DevCat];
         byte firmwareVersion = (byte)message.Properties[PropertyKey.DevCat];
         this.Identity = new InsteonIdentity(devCat, subCat, firmwareVersion);
     }
     OnDeviceIdentified();
 }
Ejemplo n.º 7
0
        public EchoStatus TrySendEchoCommand(byte[] message, bool retryOnNak, int echoLength, out Dictionary <PropertyKey, int> properties)
        {
            echoMessage = null;

            echoCommand = true;
            EchoStatus status = TrySend(message, retryOnNak, echoLength);

            echoCommand = false;

            properties  = echoMessage != null ? echoMessage.Properties : null;
            echoMessage = null;
            return(status);
        }
Ejemplo n.º 8
0
        internal void OnMessage(InsteonMessage message)
        {
            // publish message
            _insteonMessageSubject.OnNext(message);

            switch (message.MessageType)
            {
            case InsteonMessageType.Ack:
                PendingCommandAck(message);
                break;

            case InsteonMessageType.OnCleanup:
                OnDeviceStatusChanged(InsteonDeviceStatus.On);
                break;

            case InsteonMessageType.OffCleanup:
                OnDeviceStatusChanged(InsteonDeviceStatus.Off);
                break;

            case InsteonMessageType.FastOnCleanup:
                OnDeviceStatusChanged(InsteonDeviceStatus.On);
                OnDeviceStatusChanged(InsteonDeviceStatus.FastOn);
                break;

            case InsteonMessageType.FastOffCleanup:
                OnDeviceStatusChanged(InsteonDeviceStatus.Off);
                OnDeviceStatusChanged(InsteonDeviceStatus.FastOff);
                break;

            case InsteonMessageType.IncrementBeginBroadcast:
                dimmerDirection = message.Properties[PropertyKey.IncrementDirection] != 0 ? DimmerDirection.Up : DimmerDirection.Down;
                break;

            case InsteonMessageType.IncrementEndBroadcast:
                if (dimmerDirection == DimmerDirection.Up)
                {
                    OnDeviceStatusChanged(InsteonDeviceStatus.Brighten);
                }
                else if (dimmerDirection == DimmerDirection.Down)
                {
                    OnDeviceStatusChanged(InsteonDeviceStatus.Dim);
                }
                break;

            case InsteonMessageType.SetButtonPressed:
                OnSetButtonPressed(message);
                break;
            }
        }
Ejemplo n.º 9
0
 private void UpdateWaitItems(InsteonMessage message)
 {
     lock (waitList)
     {
         for (int i = 0; i < waitList.Count; ++i)
         {
             WaitItem item = waitList[i];
             if (message.MessageId == item.MessageId)
             {
                 if (item.Message == null)
                 {
                     item.Message = message;
                     item.MessageEvent.Set();
                 }
             }
         }
     }
 }
Ejemplo n.º 10
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);
        }
Ejemplo n.º 11
0
        private bool IsDuplicateMessage(InsteonMessage message)
        {
            lock (duplicates)
            {
                // determine if message key matches an entry in the list
                foreach (KeyValuePair <string, Timer> item in duplicates)
                {
                    if (message.Key == item.Key)
                    {
                        return(true);
                    }
                }

                // create a new duplicte entry
                Timer timer = new Timer(new TimerCallback(DuplicateMessageTimerCallback), message.Key, 0, 1000);
                duplicates.Add(message.Key, timer);

                return(false);
            }
        }
 // if a command is pending determines whether the current message completes the pending command
 private void PendingCommandAck(InsteonMessage message)
 {
     lock (pendingEvent)
     {
         if (pendingCommand != null)
         {
             int cmd1 = message.Properties[PropertyKey.Cmd1];
             if (Enum.IsDefined(typeof(InsteonDeviceCommands), cmd1))
             {
                 InsteonDeviceCommands command = (InsteonDeviceCommands)cmd1;
                 if (pendingCommand.Value == command)
                 {
                     pendingCommand = null;
                     pendingValue   = 0;
                     ackTimer.Change(Timeout.Infinite, Timeout.Infinite); // stop ACK timeout timer
                     pendingEvent.Set();                                  // unblock any thread that may be waiting on the pending command
                 }
             }
         }
     }
 }
Ejemplo n.º 13
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);
        }
Ejemplo n.º 14
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);
        }
Ejemplo n.º 15
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);
        }