#ifndef _SERIAL_H
#define _SERIAL_H
//============================================================================
//
//  SERIAL.H
//
//  Source include file for class SerialPort
//  Serial++ Library SPP.LIB Ver. 1.10
//
//  Copyright (c) 1991, 1992 Cortlandt Technologies, All rights reserved.
//
//  Cortlandt Technologies, P.O. Box 195, Pleasantville NY 10570
//
//  Please direct all inquiries to the above address,
//  or via Compuserve: 71066,155
//
//============================================================================

#ifndef __STDLIB_H
#include <stdlib.h>
#endif

	enum CommPort
		{
		COM_1,
		COM_2,
		CommPort_Ct
		};

	enum Baud
		{			// divisors for selected rates
		B_50      = 2304,
		B_75      = 1536,
		B_110     = 1047,
		B_134_5   = 857,
		B_150     = 768,
		B_300     = 384,
		B_600     = 192,
		B_1200    = 96,
		B_1800    = 64,
		B_2000    = 58,
		B_2400    = 48,
		B_3600    = 32,
		B_4800    = 24,
		B_7200    = 16,
		B_9600    = 12,
		B_19200   = 6,
		B_38400   = 3,
		B_57600   = 2,
		B_115200  = 1
		};

	enum Parity
		{			// bit pattern for parity set
		P_N = 0,		// none
		P_O = 0x0008,		// odd
		P_E = 0x0018,		// even
		P_M = 0x0028,		// mark
		P_S = 0x0038		// space
		};

	enum DataBits
		{			// bit pattern for data bits set
		D_5 = 0,
		D_6 = 1,
		D_7 = 2,
		D_8 = 3 
		};

	enum StopBits
		{			// bit pattern for stop bits set
		S_1,
		S_2 
		};

	enum CommRegs
		{              // Comm port registers:
		RBR,           // Receive Buffer
		THR,           // Transmit Hold
		DLR,           // Divisor LSB
		DMR,           // Divisor MSB
		IER,           // Interrupt Enable
		IIR,           // Interrupt Id
		LCR,           // Line Control
		MCR,           // Modem Control
		LSR,           // Line Status
		MSR,           // Modem Status
		CommRegs_Ct    // last enum has value == ct
		};

	enum LSR_Masks
		{
		DR       =  0x0001,   // data ready
		OE       =  0x0002,   // overrun error
		PE       =  0x0004,   // parity error
		FE       =  0x0008,   // framing error
		BI       =  0x0010,   // break indication
		THRE     =  0x0020,   // THR empty
		TSRE     =  0x0040    // Transmit Shift empty
		};

	enum MSR_Masks
		{
		DCTS     =  0x0001,   // delta clear to send
		DDSR     =  0x0002,   // delta data set ready
		TERI     =  0x0004,   // trailing edge ring ind
		DDCD     =  0x0008,   // delta data carrier detect
		CTS      =  0x0010,   // clear to send
		DSR      =  0x0020,   // data set ready
		RI       =  0x0040,   // ring indicator
		DCD      =  0x0080    // data carrier detect
		};

	enum MCR_Masks
		{
		DTR      =  0x0001,   // data terminal ready
		RTS      =  0x0002,   // req to sent
		OUT1     =  0x0004,   // aux user o/p 1
		OUT2     =  0x0008,   // aux user o/p 2
		LOOP     =  0x0010    // enable loopback
		};

	const size_t SERIALPORT_STD_BUF_SIZE = 2048;

//===========================================================================

	struct PortAnchor;

	class SerialPort
		{
		private:

			PortAnchor		*pa;

			Baud			speed;
			DataBits		data_bits;
			StopBits		stop_bits;
			Parity			parity;
			CommPort       		c_port;

			void open(size_t b_size, int irq, unsigned int io_addr);

			static void close(PortAnchor *anc);
			static void breakCheck(void);

		public:

			SerialPort(CommPort     cp,
				   Baud         sp=B_1200,
				   DataBits     db=D_8,
				   Parity       ps=P_N,
				   StopBits     sb=S_1,
				   size_t       b_size=SERIALPORT_STD_BUF_SIZE,
				   int          brk_off = 0,
				   int	        irq = 0,
				   unsigned int io_addr = 0);

			virtual ~SerialPort(void);

//       		input routines
			virtual int inbyte(unsigned char &cc, unsigned int timeout=0);
			virtual void unbyte(unsigned char cc);

			virtual size_t inmem(void *mp,
					     size_t msize,
					     unsigned int timeout=0);

			virtual char *instr(char *buf,
					    size_t maxlen,
					    unsigned int timeout=0);

//       		output routines
			virtual void outbyte(unsigned char cc);

			virtual void outmem(const void *mp, size_t msize);

			virtual void outstr(const char *buf);

//			line status and control routines
			int checkLSR(unsigned char &cc);
			int getLSR(LSR_Masks mm);
			int readLSR(void);

			int checkMSR(unsigned char &cc);
			int getMSR(MSR_Masks mm);
			int readMSR(void);

			int setMCR(MCR_Masks mm, int state);

			void sendBreak(int dur=750);

//			SerialPort status routines
			int lineOK(void);

			int isOwner(void);

			Baud getSpeed(void);

			DataBits getDataBits(void);

			StopBits getStopBits(void);

			Parity getParity(void);

			int getBreakOff(void);

			CommPort getCommPort(void);

	};

//===========================================================================
#endif