private static void LoadDynamic(MessageRecord msgRecord, DataChunk chunk) { Element element = msgRecord.Message.Elements[0]; // Dynamic must be first element Variable var = null; if (element.GetType() == typeof(UseVariable)) var = ((UseVariable)element).Variable; else return; if (var.GetType() != typeof(DynamicByteVar)) return; DynamicByteVar byteVar = (DynamicByteVar)var; byteVar.SetBytes(chunk.ChunkBytes, 0, chunk.ChunkSize); //byteVar.ValueSet = true; }
private static bool CheckActual(MessageRecord msgRecord) { int pos = 0; bool result = true; foreach (Element element in msgRecord.Message.Elements) { int elemPos = 0; int length = element.Length; bool known = true; Variable var = null; if (element.GetType() == typeof(UseVariable)) { var = ((UseVariable)element).Variable; known = !var.IsUnknown; } int bytesRead = msgRecord.MatchInfo.BytesRead; if (msgRecord.Message.MessageType == MessageType.Read || element.GetType() == typeof(Literal)) while (elemPos < length) { int testPos = pos + elemPos; if (testPos >= bytesRead || msgRecord.Actual[testPos] != msgRecord.Expected[testPos]) { msgRecord.ByteResults[testPos] = ByteStatus.Mismatch; result = false; } else msgRecord.ByteResults[testPos] = ByteStatus.Match; elemPos++; } else if (msgRecord.Message.MessageType == MessageType.Extract) { if (var.GetType() == typeof(ByteVar)) { ByteVar byteVar = (ByteVar)var; byteVar.SetBytes(ref msgRecord.Actual, pos, length); //byteVar.ValueSet = true; while (elemPos < length) { int testPos = pos + elemPos; if (testPos >= bytesRead) { msgRecord.ByteResults[testPos] = ByteStatus.Mismatch; result = false; } msgRecord.ByteResults[testPos] = ByteStatus.Extract; elemPos++; } } } pos += length; } return result; }
public MessageRecord Receive(TimeSpan? timeOut, bool continueOnFailure) { MessageRecord msgRecord = new MessageRecord(); msgRecord.Message = this; byte[] expected = GetBytes(); if (timeOut == null && !Converse.NoTimeout) timeOut = TimeSpan.FromSeconds(Converse.DefaultTimeOut); msgRecord.Expected = expected; if (MessageType == Conversations.MessageType.ExtractDynamic) { DataChunk skipped = null; msgRecord.MatchInfo = Converse.DeviceStream.FindInBuffer(expected, 20000, true, out skipped, timeOut); LoadDynamic(msgRecord, skipped); msgRecord.Conformant = msgRecord.MatchInfo.Matched; } else { if (continueOnFailure) // cannot consume if no match so check for a match before removing from buffer { DataChunk skipped = null; msgRecord.MatchInfo = Converse.DeviceStream.FindInBuffer(expected, 0, true, out skipped, timeOut, false); msgRecord.Conformant = msgRecord.MatchInfo.Matched; if (!msgRecord.MatchInfo.Matched) { if (Converse.UtilityLog.LogMessageContent) { Converse.UtilityLog.LogMessage("Message.Receive", "Message: " + MessageText + " - Mismatch - Expected: ", LogEntryType.MeterMessage); ByteBuffer.FormatDump(expected, 0, expected.Length, Converse.DeviceStream.SystemServices); Converse.UtilityLog.LogMessage("Message.Receive", "Mismatch - Found: ", LogEntryType.MeterMessage); ByteBuffer.FormatDump(skipped.ChunkBytes, 0, skipped.ChunkBytes.Length, Converse.DeviceStream.SystemServices); } return msgRecord; } } msgRecord.MatchInfo = Converse.DeviceStream.ReadFromBuffer(expected.Length, expected.Length, out msgRecord.Actual, timeOut); msgRecord.ByteResults = new ByteStatus[expected.Length]; msgRecord.Conformant = CheckActual(msgRecord); if (!msgRecord.Conformant.Value && Converse.UtilityLog.LogMessageContent) { Converse.UtilityLog.LogMessage("Message.Receive", "Message: " + MessageText + " - Mismatch - Expected: ", LogEntryType.MeterMessage); ByteBuffer.FormatDump(expected, 0, expected.Length, Converse.DeviceStream.SystemServices); Converse.UtilityLog.LogMessage("Message.Receive", "Mismatch - Found: ", LogEntryType.MeterMessage); ByteBuffer.FormatDump(msgRecord.Actual, 0, msgRecord.Actual.Length, Converse.DeviceStream.SystemServices); } } return msgRecord; }
public bool Send(out MessageRecord sentMessage) { MessageRecord msgRecord = new MessageRecord(); msgRecord.Message = this; msgRecord.Actual = GetBytes(); msgRecord.Expected = null; msgRecord.ByteResults = null; sentMessage = msgRecord; DateTime now = DateTime.Now; Double gap = (now - Converse.LastSendTime).TotalMilliseconds; if (gap < Converse.SendGap) System.Threading.Thread.Sleep((int)(Converse.SendGap - gap)); Converse.LastSendTime = DateTime.Now; if (Converse.DeviceStream.Write(msgRecord.Actual, 0, msgRecord.Actual.Length)) return true; else { Converse.UtilityLog.LogMessage("Message.Send - FAILED - Message: ", MessageText, LogEntryType.ErrorMessage); return false; } }
public MessageRecord Find(TimeSpan? timeOut, bool continueOnFailure) { MessageRecord msgRecord = new MessageRecord(); msgRecord.Message = this; if (timeOut == null && !Converse.NoTimeout) timeOut = TimeSpan.FromSeconds(Converse.DefaultTimeOut); byte[] expected = GetBytes(); msgRecord.Expected = expected; DataChunk skipped = null; msgRecord.MatchInfo = Converse.DeviceStream.FindInBuffer(expected, 5000, true, out skipped, timeOut); if (msgRecord.MatchInfo.BytesSkipped > 0 && Converse.UtilityLog.LogMessageContent) { Converse.LogMessage("Message.Find", "Skipped " + msgRecord.MatchInfo.BytesSkipped + " bytes: " + ByteBuffer.BytesToHex(skipped.ChunkBytes, " ", (int)skipped.ChunkSize) + " - Total Read: " + msgRecord.MatchInfo.TotalBytesRead, LogEntryType.MeterMessage); } msgRecord.Conformant = msgRecord.MatchInfo.Matched; if (Converse.UtilityLog.LogDetailTrace) if (msgRecord.Conformant.HasValue && msgRecord.Conformant.Value) Converse.LogMessage("Message.Find", "Found: " + ByteBuffer.BytesToHex(expected, " ", expected.GetUpperBound(0) + 1)); else Converse.LogMessage("Message.Find", "Not Found: " + ByteBuffer.BytesToHex(expected, " ", expected.GetUpperBound(0) + 1)); return msgRecord; }