public InsteonMessage(int messageId, InsteonMessageType messageType, Dictionary<PropertyKey, int> properties) { MessageId = messageId; MessageType = messageType; Properties = properties; Key = ToString("Key"); }
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); }
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); }
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); }
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); }
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; }