#ifndef CMMIO_SERIAL_H #define CMMIO_SERIAL_H #include #include #include "CMMIO_BASE.H " //////////////////////////////////////////////////////////////////////////////// /* *$!!*************************************************************************** *$!! MODULE NAME *$!! Serial.h *$!! *$!! DESCRIPTION *$!! Header file for CPSerial. *$!! *$!! AUTHOR *$!! M.J.S.Gooder. *$!! *$!! HISTORY *$!! $Log: /Plugins/BPI/Serial.h $ *$!! *$!! 28 19/03/98 14:04 Mgooder *$!!*************************************************************************** */ /////////////////////////////////////////////////////////////////////////////// // Function for starting serial monitor thread unsigned int WINAPI CSerialTask(LPVOID CSerialPtr); /////////////////////////////////////////////////////////////////////////////// // Useful serial codes const char CS_NUL = 0; const char CS_SOH = 1; const char CS_STX = 2; const char CS_ETX = 3; const char CS_EOT = 4; const char CS_ENQ = 5; const char CS_ACK = 6; const char CS_BEL = 7; const char CS_LF = 10; const char CS_DLE = 16; const char CS_X_ON = 17; const char CS_X_OFF = 19; const char CS_NAK = 21; const char CS_ETB = 23; const char CS_CAN = 24; const char CS_ESC = 27; /////////////////////////////////////////////////////////////////////////////// // Handshake settings const int CS_HANDSHAKE_RTSCTS = 1; const int CS_HANDSHAKE_XONXOFF = 2; const int CS_HANDSHAKE_NONE = 3; const int CS_HANDSHAKE_RTSCTS_DTRDSR = 4; const int CS_HANDSHAKE_FOR_SO7 = 5; const int CS_HANDSHAKE_FOR_TRESASTR_E = 6; /////////////////////////////////////////////////////////////////////////////// // Debug constants const int CS_DEBUG_SIZE = 1024; /////////////////////////////////////////////////////////////////////////////// // Timeouts (ms) const int CS_DEFAULT_RX_TIMEOUT = 25; const int CS_DEFAULT_TX_TIMEOUT = 1000; /////////////////////////////////////////////////////////////////////////////// // The CPSerial class class CPSerial : public CMMIO { // Construction public: CPSerial(); // Implementation public: ~CPSerial() override; // Attributes public: // Operations public: // Open the serial port ( if possible ) using the parameters set by SetPort() DWORD Open() override; // Setup the serial port prior to opening it int SetPort(int Port, int Baud = 0, char Parity = 0, int Bits = 0, int StopBits = 0, int HandShake = 0); // Set up the port timeouts void SetTimeouts(int RXTimeout = CS_DEFAULT_RX_TIMEOUT, int TXTimeout = CS_DEFAULT_TX_TIMEOUT); // Get the serial port settings void GetPortData(int* Port, int* Baud, char* Parity, int* Bits, int* StopBits, int* HandShake); // Test if the serial port is open bool IsValid() override { return IsOpen() != 0; } int IsOpen(void); // Close the serial port DWORD Close(void) override; // Flush all data in any serial port buffers int FlushPort(void); // Attempt to read the specified number of bytes DWORD ReadPort(char* Buffer, DWORD Bytes); DWORD ReadPort(CString& Buffer, DWORD Bytes); // Attempt to write the specified number of bytes DWORD WritePort(const char* Buffer, DWORD Bytes); DWORD SendWriteFile(const char* Buffer, DWORD Bytes); // Send the specifed number of bytes out when possible int Transmit(const char* Buffer, DWORD Bytes); // Add a block of data to the internal list of receieved blocks int AddReceived(const char* Buffer, DWORD Bytes); // Get the next block of data added with AddReceived() // char *GetNextReceived( void ); // Find the maximum port number available int MaxPort(void); // Add text to the debug output void AddToDebug(const char* Ptr, DWORD BytesToCopy, int State); // Attach this serial port to a debug window //CSerialRaw *AttachWnd( CWnd *Wnd ); // Convert ascii hex into an int int HexToInt(char* Data, int Bytes); DWORD Send(LPCSTR buffer, int l, BOOL needsResponse = FALSE) override; //virtual DWORD Send(CString what); // Called when data is received on the serial port virtual void OnReceive(void); // Called when data has been sent using the Transmit() function virtual void OnTransmit(int Item, DWORD Error); private: // Private so no comment :-) void RegisterDebugWindow(void); void SendBuffer(int Next); void ReceiveTask(void); int ProgramPort(int Port, int Baud, char Parity, int Bits, int StopBits, int HandShake); int ReadBlock(BYTE* abIn, int MaxLength); // Attributes protected: int m_RXTimeout; int m_TXTimeout; // Attributes private: char m_Parity; // char m_DebugData[CS_DEBUG_SIZE]; // char m_DebugState[CS_DEBUG_SIZE]; // char *m_RXTempPtr; int m_Port; int m_Baud; int m_Bits; int m_StopBits; int m_HandShake; int m_MaxTXRetries; int m_DebugInPtr; int m_DebugCount; int m_Item; // struct SerialList *m_TXHead; // struct SerialList *m_TXTail; // struct SerialList *m_RXHead; // struct SerialList *m_RXTail; OVERLAPPED m_ReceiveOLap; OVERLAPPED m_TransmitOLap; OVERLAPPED m_ReadOLap; OVERLAPPED m_WriteOLap; HANDLE m_PortHandle; HANDLE m_ThreadHandle; HANDLE m_ReceiveTaskEvent; private: friend unsigned int WINAPI CSerialTask(LPVOID CSerialPtr); //Buffer for incomming commands: int CurrentPointer; BOOL m_IsWrtingData; public: HANDLE m_hWaitCMMResponse; HANDLE m_hNewRx; // BV Nov 2001: Made public // CRITICAL_SECTION m_QueueLock; BOOL m_iRecvState; INT m_iRecvBytes; INT m_iRecvCount; unsigned char m_RecvData[MAX_RECIEVE_BUFFER_SIZE]; }; #endif // CMMIO_SERIAL_H