| 816 | }; |
| 817 | |
| 818 | BYTE __stdcall CSuperSerialCard::CommStatus(WORD, WORD, BYTE, BYTE, ULONG) |
| 819 | { |
| 820 | if (!CheckComm()) |
| 821 | return ST_DSR | ST_DCD | ST_TX_EMPTY; |
| 822 | |
| 823 | DWORD modemStatus = m_kDefaultModemStatus; |
| 824 | if (m_hCommHandle != INVALID_HANDLE_VALUE) |
| 825 | { |
| 826 | modemStatus = m_dwModemStatus; // Take a copy of this volatile variable |
| 827 | if (!m_bCfgSupportDCD) // Default: DSR state is mirrored to DCD (GH#553) |
| 828 | { |
| 829 | modemStatus &= ~MS_RLSD_ON; |
| 830 | if (modemStatus & MS_DSR_ON) |
| 831 | modemStatus |= MS_RLSD_ON; |
| 832 | } |
| 833 | } |
| 834 | else if (m_hCommListenSocket != INVALID_SOCKET && m_hCommAcceptSocket != INVALID_SOCKET) |
| 835 | { |
| 836 | modemStatus = MS_RLSD_ON | MS_DSR_ON | MS_CTS_ON; |
| 837 | } |
| 838 | |
| 839 | // |
| 840 | |
| 841 | bool bComSerialBufferEmpty = true; // Assume true, so if using TCP then logic below works |
| 842 | |
| 843 | if (m_hCommHandle != INVALID_HANDLE_VALUE) |
| 844 | { |
| 845 | EnterCriticalSection(&m_CriticalSection); |
| 846 | const UINT uSSCIdx = m_vuRxCurrBuffer ^ 1; |
| 847 | bComSerialBufferEmpty = m_qComSerialBuffer[uSSCIdx].empty(); |
| 848 | } |
| 849 | |
| 850 | BYTE IRQ = 0; |
| 851 | if (m_bTxIrqEnabled) |
| 852 | { |
| 853 | IRQ |= m_vbTxIrqPending ? ST_IRQ : 0; |
| 854 | m_vbTxIrqPending = false; // Ensure 2 reads of STATUS reg only return ST_IRQ for first read |
| 855 | } |
| 856 | if (m_bRxIrqEnabled) |
| 857 | { |
| 858 | IRQ |= m_vbRxIrqPending ? ST_IRQ : 0; |
| 859 | m_vbRxIrqPending = false; // Ensure 2 reads of STATUS reg only return ST_IRQ for first read |
| 860 | } |
| 861 | |
| 862 | // |
| 863 | |
| 864 | BYTE DSR = (modemStatus & MS_DSR_ON) ? 0x00 : ST_DSR; // DSR is active low (see SY6551 datasheet) (GH#386) |
| 865 | BYTE DCD = (modemStatus & MS_RLSD_ON) ? 0x00 : ST_DCD; // DCD is active low (see SY6551 datasheet) (GH#386) |
| 866 | |
| 867 | // |
| 868 | |
| 869 | BYTE TX_EMPTY = m_vbTxEmpty ? ST_TX_EMPTY : 0; |
| 870 | BYTE RX_FULL = (!bComSerialBufferEmpty || !m_qTcpSerialBuffer.empty()) ? ST_RX_FULL : 0; |
| 871 | |
| 872 | // |
| 873 | |
| 874 | BYTE uStatus = |
| 875 | IRQ |
no test coverage detected