#ifndef __INC_POS_DEVICE_SERIAL_H
#define __INC_POS_DEVICE_SERIAL_H
/*******************************************************************
 Includes Release 24
 (C) Copyright 1995-1997 proDAD
     All Rights Reserved

 $AUT Holger Burkarth
 $DAT >>Serial.h<<   19 Nov 1996    11:23:44 - (C) ProDAD
*******************************************************************/
#ifndef __INC_POS_PEXEC_DEVICE_H
#include <pExec/Device.h>
#endif
#ifndef __INC_POS_DEVICE_IOTERM_H
#include <pDevice/IOTerm.h>
#endif


/*----------------------------------
-----------------------------------*/
struct pOS_SerialIO
{
/* struct pOS_IOStdReq */

  struct pOS_Message  sio_Message;
  struct pOS_Device  *sio_Device;    /* device node pointer  */
  struct pOS_Unit    *sio_Unit;      /* unit (driver private)*/
  UWORD               sio_Command;   /* (enum pOS_IOReqCommands) */
  UBYTE               sio_Flags;     /* (enum pOS_IOReqFlags) */
  SBYTE               sio_Error;     /* (enum pOS_IOReqErrors) */
  ULONG               sio_Actual;    /* actual number of bytes transferred */
  ULONG               sio_Length;    /* requested number bytes transferred */
  APTR                sio_Data;      /* points to data area */
  ULONG               sio_Offset;    /* unused */

  ULONG               sio_CtlChar;   /* control char's (order = xON,xOFF,INQ,ACK) 0x11130000 */
  ULONG               sio_RBufLen;   /* length in bytes of serial port's read buffer */
  ULONG               sio_ExtFlags;  /* (enum pOS_SerialExtFlags) */
  ULONG               sio_Baud;      /* baud rate requested (true baud) */
  ULONG               sio_BrkTime;   /* duration of break signal in MICROseconds */
  struct pOS_IOTArray sio_TArray;    /* termination character array */
  UBYTE               sio_ReadLen;   /* bits per read character (# of bits) */
  UBYTE               sio_WriteLen;  /* bits per write character (# of bits) */
  UBYTE               sio_StopBits;  /* stopbits for read (# of bits) */
  UBYTE               sio_SerFlags;  /* (enum pOS_SerialFlags) */
  UWORD               sio_Status;    /* (enum pOS_SerialStatus) */
};


enum pOS_SerialFlags
{
  SERB_XDisabled = 7,       /* xOn-xOff feature disabled bit */
  SERF_XDisabled = (1<<7),  /* xOn-xOff feature disabled mask */
  SERB_EOFMode   = 6,       /* EOF mode enabled bit */
  SERF_EOFMode   = (1<<6),  /* EOF mode enabled mask */
  SERB_Shared    = 5,       /* non-exclusive access bit */
  SERF_Shared    = (1<<5),  /* non-exclusive access mask */
  SERB_RADBoogie = 4,       /* high-speed mode active bit */
  SERF_RADBoogie = (1<<4),  /* high-speed mode active mask */
  SERB_QueuedBrk = 3,       /* queue this Break ioRqst */
  SERF_QueuedBrk = (1<<3),  /* queue this Break ioRqst */
  SERB_7Wire     = 2,       /* RS232 7-wire protocol */
  SERF_7Wire     = (1<<2),  /* RS232 7-wire protocol */
  SERB_PartyOdd  = 1,       /* parity feature enabled bit */
  SERF_PartyOdd  = (1<<1),  /* parity feature enabled mask */
  SERB_PartyOn   = 0,       /* parity-enabled bit */
  SERF_PartyOn   = (1<<0)   /* parity-enabled mask */
};



/* status of serial port, as follows:
*        BIT  ACTIVE  FUNCTION
*         0    ---    reserved
*         1    ---    reserved
*         2    ---    reserved
*         3    low    Data Set Ready
*         4    low    Clear To Send
*         5    low    Carrier Detect
*         6    low    Ready To Send
*         7    low    Data Terminal Ready
*         8    high   read overrun
*         9    high   break sent
*        10    high   break received
*        11    high   transmit x-OFFed
*        12    high   receive x-OFFed
*     13-15    ---    reserved
*/

enum pOS_SerialStatus
{
  SERSTAB_XOffRead   = 12,       /* receive currently xOFF'ed bit */
  SERSTAF_XOffRead   = (1<<12),  /* receive currently xOFF'ed mask */
  SERSTAB_XOffWrite  = 11,       /* transmit currently xOFF'ed bit */
  SERSTAF_XOffWrite  = (1<<11),  /* transmit currently xOFF'ed mask */
  SERSTAB_ReadBreak  = 10,       /* break was latest input bit */
  SERSTAF_ReadBreak  = (1<<10),  /* break was latest input mask */
  SERSTAB_WroteBreak = 9,        /* break was latest output bit */
  SERSTAF_WroteBreak = (1<<9),   /* break was latest output mask */
  SERSTAB_Overrun    = 8,        /* status word RBF overrun bit */
  SERSTAF_Overrun    = (1<<8),   /* status word RBF overrun mask */
  SERSTAB_nDTR       = 7,
  SERSTAF_nDTR       = (1<<7),
  SERSTAB_nRTS       = 6,
  SERSTAF_nRTS       = (1<<6),
  SERSTAB_nCD        = 5,
  SERSTAF_nCD        = (1<<5),
  SERSTAB_nCTS       = 4,
  SERSTAF_nCTS       = (1<<4),
  SERSTAB_nDSR       = 3,
  SERSTAF_nDST       = (1<<3)
};


enum pOS_SerialExtFlags
{
  SEXTB_MSPOn = 1,       /* Use mark-space parity, instead of odd-even. */
  SEXTF_MSPOn = (1<<1),  /* mark-space parity mask */
  SEXTB_Mark  = 0,       /* if mark-space, use mark */
  SEXTF_Mark  = (1<<0)   /* if mark-space, use mark mask */
};



enum pOS_SerialIOReqCommands
{
  SERCMD_Query = CMD_NONSTD,
  SERCMD_Break,
  SERCMD_SetParams
};


enum pOS_SerialIOReqErrors
{
  SERIOERR_DevBusy       =1,
  SERIOERR_BaudMismatch,      /* baud rate not supported by hardware */
  SERIOERR_BufErr        =4,  /* Failed to allocate new read buffer */
  SERIOERR_InvParam,
  SERIOERR_LineErr,
  SERIOERR_ParityErr     =9,
  SERIOERR_TimerErr      =11,
  SERIOERR_BufOverflow,
  SERIOERR_NoDSR,
  SERIOERR_DetectedBreak =15
};

#endif
