コード例 #1
0
        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;
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        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;
        }
コード例 #4
0
        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;
            }
        }
コード例 #5
0
        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;
        }