using System.Text; using PInvokeSerialPort.Win32PInvoke; namespace PInvokeSerialPort { /// /// Represents the current condition of the port queues. /// public struct QueueStatus { private uint status; private uint inQueue; private uint outQueue; private uint inQueueSize; private uint outQueueSize; internal QueueStatus(uint stat, uint inQ, uint outQ, uint inQs, uint outQs) { status = stat; inQueue = inQ; outQueue = outQ; inQueueSize = inQs; outQueueSize = outQs; } /// /// Output is blocked by CTS handshaking. /// public bool ctsHold { get { return ((status & COMSTAT.fCtsHold) != 0); } } /// /// Output is blocked by DRS handshaking. /// public bool dsrHold { get { return ((status & COMSTAT.fDsrHold) != 0); } } /// /// Output is blocked by RLSD handshaking. /// public bool rlsdHold { get { return ((status & COMSTAT.fRlsdHold) != 0); } } /// /// Output is blocked because software handshaking is enabled and XOFF was received. /// public bool xoffHold { get { return ((status & COMSTAT.fXoffHold) != 0); } } /// /// Output was blocked because XOFF was sent and this station is not yet ready to receive. /// public bool xoffSent { get { return ((status & COMSTAT.fXoffSent) != 0); } } /// /// There is a character waiting for transmission in the immediate buffer. /// public bool immediateWaiting { get { return ((status & COMSTAT.fTxim) != 0); } } /// /// Number of bytes waiting in the input queue. /// public long InQueue { get { return inQueue; } } /// /// Number of bytes waiting for transmission. /// public long OutQueue { get { return outQueue; } } /// /// Total size of input queue (0 means information unavailable) /// public long InQueueSize { get { return inQueueSize; } } /// /// Total size of output queue (0 means information unavailable) /// public long OutQueueSize { get { return outQueueSize; } } public override string ToString() { var m = new StringBuilder("The reception queue is ", 60); if (inQueueSize == 0) { m.Append("of unknown size and "); } else { m.Append(inQueueSize.ToString() + " bytes long and "); } if (inQueue == 0) { m.Append("is empty."); } else if (inQueue == 1) { m.Append("contains 1 byte."); } else { m.Append("contains "); m.Append(inQueue.ToString()); m.Append(" bytes."); } m.Append(" The transmission queue is "); if (outQueueSize == 0) { m.Append("of unknown size and "); } else { m.Append(outQueueSize.ToString() + " bytes long and "); } if (outQueue == 0) { m.Append("is empty"); } else if (outQueue == 1) { m.Append("contains 1 byte. It is "); } else { m.Append("contains "); m.Append(outQueue.ToString()); m.Append(" bytes. It is "); } if (outQueue > 0) { if (ctsHold || dsrHold || rlsdHold || xoffHold || xoffSent) { m.Append("holding on"); if (ctsHold) m.Append(" CTS"); if (dsrHold) m.Append(" DSR"); if (rlsdHold) m.Append(" RLSD"); if (xoffHold) m.Append(" Rx XOff"); if (xoffSent) m.Append(" Tx XOff"); } else { m.Append("pumping data"); } } m.Append(". The immediate buffer is "); if (immediateWaiting) m.Append("full."); else m.Append("empty."); return m.ToString(); } } }