private bool isBytesChangedAccordingToRule(byte[] bytes, MemoryRule rule, out IChangedDataContainer changedBytes) { if (rule.DataType == DataType.Decimal || rule.DataType == DataType.SignedInteger || rule.DataType == DataType.UnsignedInteger) { return(isNumberChangedAccordingToRule(bytes, rule, out changedBytes)); } if (rule.DataType == DataType.Data) { return(isDataChangedAccordingToRule(bytes, rule, out changedBytes)); } changedBytes = null; return(false); }
private bool isDataChangedAccordingToRule(byte[] bytes, MemoryRule rule, out IChangedDataContainer changedBytes) { ISet <long> changedBytesSet = new HashSet <long>(); var count = bytes.LongLength; var sendAll = rule.TransferType == TransferType.AllBytes; for (long i = 0; i < count; ++i) { if (rule.Bytes[i] != bytes[i]) { if (rule.ChangeTrigger == ChangeTrigger.AnyChange || rule.ChangeTrigger == ChangeTrigger.FlagOn && (rule.Bytes[i] | bytes[i]) != rule.Bytes[i] || rule.ChangeTrigger == ChangeTrigger.FlagOff && (rule.Bytes[i] & bytes[i]) != rule.Bytes[i] || rule.ChangeTrigger == ChangeTrigger.Increase && rule.NumBytes == 1 && bytes[i] > rule.Bytes[i] || rule.ChangeTrigger == ChangeTrigger.Decrease && rule.NumBytes == 1 && bytes[i] < rule.Bytes[i]) { changedBytesSet.Add(i); if (sendAll) { break; } } } } if (changedBytesSet.Count > 0) { if (sendAll) { changedBytes = new BytesContainer(bytes, rule.MemoryOffset64); } else { changedBytes = BytesDifferenceContainer.ChangedBytesFromIndexSet(rule.MemoryOffset64, changedBytesSet, bytes); } return(true); } else { changedBytes = null; return(false); } }
public static IChangedDataContainer BuildChangedData(byte[] buffer) { if (buffer.Length == 0) { throw new Exception("Empty buffer"); } if (buffer[0] > 2) { throw new Exception("Invalid ChangeDataType"); } var type = (ChangeDataType)buffer[0]; IChangedDataContainer container = null; if (type == ChangeDataType.Bytes) { container = new BytesContainer(new byte[0], 0); container.FillFromNetworkBytes(buffer); } if (type == ChangeDataType.BytesDifference) { container = new BytesDifferenceContainer(0); container.FillFromNetworkBytes(buffer); } if (type == ChangeDataType.NumberDifference) { container = new NumberDifferenceContainer(new byte[0], 0); container.FillFromNetworkBytes(buffer); } if (container == null) { throw new Exception("Unable to build change data from supplied buffer"); } return(container); }
public IncomingMemoryData(UserInfo user, IChangedDataContainer change) { User = user; ChangedData = change; }
private bool isNumberChangedAccordingToRule(byte[] bytes, MemoryRule rule, out IChangedDataContainer changedBytes) { byte[] diff = null; bool numbersChanged = false; if (rule.DataType == DataType.Decimal) { if (bytes.Length == 4) { var ov = ByteParser.ParseFloat(rule.Bytes, rule.Endianness); var nv = ByteParser.ParseFloat(bytes, rule.Endianness); diff = BitConverter.GetBytes(nv - ov); numbersChanged = (rule.ChangeTrigger == ChangeTrigger.AnyChange && !ov.Equals(nv) || rule.ChangeTrigger == ChangeTrigger.Decrease && ov > nv || rule.ChangeTrigger == ChangeTrigger.Increase && ov < nv); } else if (bytes.Length == 8) { var ov = ByteParser.ParseDouble(rule.Bytes, rule.Endianness); var nv = ByteParser.ParseDouble(bytes, rule.Endianness); diff = BitConverter.GetBytes(nv - ov); numbersChanged = (rule.ChangeTrigger == ChangeTrigger.AnyChange && !ov.Equals(nv) || rule.ChangeTrigger == ChangeTrigger.Decrease && ov > nv || rule.ChangeTrigger == ChangeTrigger.Increase && ov < nv); } else { throw new Exception("Can not parse decimal. Expected 4 or 8 bytes"); } } else if (rule.DataType == DataType.SignedInteger || rule.DataType == DataType.UnsignedInteger) { bool signed = rule.DataType == DataType.SignedInteger; if (bytes.Length == 1) { if (signed) { var ov = (sbyte)rule.Bytes[0]; var nv = (sbyte)bytes[0]; diff = BitConverter.GetBytes(nv - ov); numbersChanged = (rule.ChangeTrigger == ChangeTrigger.AnyChange && !ov.Equals(nv) || rule.ChangeTrigger == ChangeTrigger.Decrease && ov > nv || rule.ChangeTrigger == ChangeTrigger.Increase && ov < nv); } else { var ov = rule.Bytes[0]; var nv = bytes[0]; diff = BitConverter.GetBytes(nv - ov); numbersChanged = (rule.ChangeTrigger == ChangeTrigger.AnyChange && !ov.Equals(nv) || rule.ChangeTrigger == ChangeTrigger.Decrease && ov > nv || rule.ChangeTrigger == ChangeTrigger.Increase && ov < nv); } } else if (bytes.Length == 2) { if (signed) { var ov = ByteParser.ParseShort(rule.Bytes, rule.Endianness); var nv = ByteParser.ParseShort(bytes, rule.Endianness); diff = BitConverter.GetBytes(nv - ov); numbersChanged = (rule.ChangeTrigger == ChangeTrigger.AnyChange && !ov.Equals(nv) || rule.ChangeTrigger == ChangeTrigger.Decrease && ov > nv || rule.ChangeTrigger == ChangeTrigger.Increase && ov < nv); } else { var ov = ByteParser.ParseUnsignedShort(rule.Bytes, rule.Endianness); var nv = ByteParser.ParseUnsignedShort(bytes, rule.Endianness); diff = BitConverter.GetBytes(nv - ov); numbersChanged = (rule.ChangeTrigger == ChangeTrigger.AnyChange && !ov.Equals(nv) || rule.ChangeTrigger == ChangeTrigger.Decrease && ov > nv || rule.ChangeTrigger == ChangeTrigger.Increase && ov < nv); } } else if (bytes.Length == 4) { if (signed) { var ov = ByteParser.ParseInt(rule.Bytes, rule.Endianness); var nv = ByteParser.ParseInt(bytes, rule.Endianness); diff = BitConverter.GetBytes(nv - ov); numbersChanged = (rule.ChangeTrigger == ChangeTrigger.AnyChange && !ov.Equals(nv) || rule.ChangeTrigger == ChangeTrigger.Decrease && ov > nv || rule.ChangeTrigger == ChangeTrigger.Increase && ov < nv); } else { var ov = ByteParser.ParseUnsignedInt(rule.Bytes, rule.Endianness); var nv = ByteParser.ParseUnsignedInt(bytes, rule.Endianness); long diff2 = (long)nv - (long)ov; diff = BitConverter.GetBytes((int)diff2); numbersChanged = (rule.ChangeTrigger == ChangeTrigger.AnyChange && !ov.Equals(nv) || rule.ChangeTrigger == ChangeTrigger.Decrease && ov > nv || rule.ChangeTrigger == ChangeTrigger.Increase && ov < nv); } } else if (bytes.Length == 8) { if (signed) { var ov = ByteParser.ParseLong(rule.Bytes, rule.Endianness); var nv = ByteParser.ParseLong(bytes, rule.Endianness); long diff2 = (long)nv - (long)ov; diff = BitConverter.GetBytes((int)diff2); numbersChanged = (rule.ChangeTrigger == ChangeTrigger.AnyChange && !ov.Equals(nv) || rule.ChangeTrigger == ChangeTrigger.Decrease && ov > nv || rule.ChangeTrigger == ChangeTrigger.Increase && ov < nv); } else { var ov = ByteParser.ParseUnsignedLong(rule.Bytes, rule.Endianness); var nv = ByteParser.ParseUnsignedLong(bytes, rule.Endianness); long diff2 = (long)nv - (long)ov; diff = BitConverter.GetBytes((int)diff2); numbersChanged = (rule.ChangeTrigger == ChangeTrigger.AnyChange && !ov.Equals(nv) || rule.ChangeTrigger == ChangeTrigger.Decrease && ov > nv || rule.ChangeTrigger == ChangeTrigger.Increase && ov < nv); } } else { throw new Exception("Can not parse number. Expected 1, 2, 4 or 8 bytes"); } } if (numbersChanged) { if (rule.TransferType == TransferType.AllBytes) { changedBytes = new BytesContainer(bytes, rule.MemoryOffset64); return(true); } else { changedBytes = new NumberDifferenceContainer(diff, rule.MemoryOffset64); return(true); } } changedBytes = null; return(false); }
public MemoryChangedEventArgs(MemoryRule rule, IChangedDataContainer change) { MemoryRule = rule; ChangedData = change; }