Exemple #1
0
        public static byte[] GetTerminalResponse(this NetworkStream stream)
        {
            var buffer        = new byte[4096];
            int bytesReceived = stream.ReadAsync(buffer, 0, buffer.Length).Result;

            if (bytesReceived <= 0)
            {
                bytesReceived = stream.ReadAsync(buffer, 0, buffer.Length).Result;
            }

            if (bytesReceived > 0)
            {
                byte[] readBuffer = new byte[bytesReceived];
                Array.Copy(buffer, readBuffer, bytesReceived);

                var code = (ControlCodes)readBuffer[0];
                if (code == ControlCodes.NAK)
                {
                    return(null);
                }
                else if (code == ControlCodes.EOT)
                {
                    throw new MessageException("Terminal returned EOT for the current message.");
                }
                else if (code == ControlCodes.ACK)
                {
                    return(stream.GetTerminalResponse());
                }
                else if (code == ControlCodes.STX)
                {
                    var queue = new Queue <byte>(readBuffer);

                    // break off only one message
                    var rec_buffer = new List <byte>();
                    do
                    {
                        rec_buffer.Add(queue.Dequeue());
                        if (rec_buffer[rec_buffer.Count - 1] == (byte)ControlCodes.ETX)
                        {
                            break;
                        }
                    }while (queue.Count > 0);

                    // Should be the LRC
                    if (queue.Count > 0)
                    {
                        rec_buffer.Add(queue.Dequeue());
                    }
                    return(rec_buffer.ToArray());
                }
                else
                {
                    throw new MessageException(string.Format("Unknown message received: {0}", code));
                }
            }
            return(null);
        }
Exemple #2
0
        public byte[] Send(IDeviceMessage message)
        {
            Connect();

            using (_stream) {
                byte[] buffer = message.GetSendBuffer();

                try {
                    if (OnMessageSent != null)
                    {
                        OnMessageSent(message.ToString());
                    }
                    for (int i = 0; i < 3; i++)
                    {
                        _stream.WriteAsync(buffer, 0, buffer.Length).Wait();

                        var rvalue = _stream.GetTerminalResponse();
                        if (rvalue != null)
                        {
                            byte lrc = rvalue[rvalue.Length - 1]; // should the the LRC
                            if (lrc != TerminalUtilities.CalculateLRC(rvalue))
                            {
                                SendControlCode(ControlCodes.NAK);
                            }
                            else
                            {
                                SendControlCode(ControlCodes.ACK);
                                return(rvalue);
                            }
                        }
                    }
                    throw new HpsMessageException("Terminal did not respond in the given timeout.");
                }
                catch (Exception exc) {
                    throw new HpsMessageException(exc.Message, exc);
                }
                finally {
                    Disconnect();
                }
            }
        }