/****************************************************************************/
/* Copyright 1995 MBARI                                                     */
/****************************************************************************/
/* Summary  : IBC Quad Serial Inferface Board Definitions                   */
/* Filename : quad_ser.h                                                    */
/* Author   : Andrew Pearce                                                 */
/* Project  : New ROV Data Concentrator                                     */
/* Version  : 1.0                                                           */
/* Created  : 06/14/93                                                      */
/* Modified : 01/31/95                                                      */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/* $Header: /usr/tiburon/.cvsroot/micro/h/quad_ser.h,v 1.2 1997/05/07 15:58:42 pean Exp $
 * $Log: quad_ser.h,v $
 * Revision 1.2  1997/05/07 15:58:42  pean
 * Cleaned up Include files and makefile for new directory structure.
 *
 * Revision 1.1  96/02/06  11:54:34  11:54:34  pean (Andrew Pearce)
 * Initial revision
 *
 * Revision 1.3  94/02/04  14:29:20  14:29:20  pean (Andrew Pearce)
 * Fixed problem with RS485 transmitter not disabling after bytes sent
 *
 * Revision 1.2  93/07/02  09:39:49  09:39:49  pean (Andrew Pearce)
 * Minor bug fixes and enhancements for Prototype Vehicle Tests
 *
 * Revision 1.1  93/06/17  15:22:46  15:22:46  pean (Andrew Pearce)
 * Initial revision
 *
*/
/****************************************************************************/

#define SCC_BASE_ADDR         0x00      /* Octal UART Base Address          */
#define LED_TOGGLE_ADDR       0x0c      /* Led Control Register Address     */

#define QUAD_SER_BUF_SIZE      220      /* Transmit & Receive Buffer Sizes  */
#define QUAD_SER_RX_IDLE_TIME    1      /* Wait 10 msec for receiver idle   */
#define QUAD_SER_PSU_CHAN        2      /* Channel for PSU Status Monitoring*/

#define SCC_CHAN_PER_UART        4      /* No of serial channels per UART   */
#define SCC_CT_PER_UART          4      /* No of counter/timers per UART    */

#define SCC_CHAN_OFFSET       0x08      /* Each channel occupies 0x08 bytes */
#define LINE_FEED             0x0a      /* Line feed character              */

                                        /* Return register absolute address */
                                        /* given channel number and reg ID  */
#define UART_REG(baseAddr, chan, reg) \
    ((Byte *) (baseAddr + (chan * SCC_CHAN_OFFSET + reg) ))

#define PS1_FLT_BIT     0x01
#define FGND1_FLT_BIT   0x04

#define NELEMENTS(array)              /* number of elements in an array     */\
                 (sizeof (array) / sizeof ((array) [0]))

#define VSP_TIME_PERIOD  5            /* 50 msec period between SRQ's       */
                                      /* if bytes in buf                    */

#define MAX_PACKET_LEN   256          /* maximum data packet size           */

typedef struct
{
    struct                              /* Status Flag bits                 */
    {
        unsigned errorStatus  : 8;      /* Uart error status                */

        unsigned chanOpen     : 1;      /* TRUE if channel is currently open*/
        unsigned protocol     : 1;      /* Selects RS232/RS485 protocol mode*/
        unsigned handshake    : 1;      /* Selects HandShake Mode           */
        unsigned txBusy       : 1;      /* Transmitter busy for TxStartUp   */
        unsigned rxIdle       : 1;      /* Receiver Idle flag               */
        unsigned vspEnabled   : 1;      /* VSP Services Enabled             */
        unsigned rxDataSRQPend: 1;      /* Receive Data SRQ send to host    */
        unsigned txingBreak   : 1;      /* Transmitting Break Flag          */
    } flags;

    Nat16 baudRate;                     /* BaudRate                         */
    Nat16 dataBits;                     /* Data Bits                        */
    Nat16 stopBits;                     /* Number of stop bits              */
    Nat16 parity;                       /* parity                           */

    Byte rxTerm;                        /* Receive termination character    */
    Byte termRecvd;                     /* Termination Character Count      */

    Ring readBuf;                       /* Ring buffer for serial read      */
    Ring writeBuf;                      /* Ring buffer for serial write     */

    Byte readBuffer[QUAD_SER_BUF_SIZE]; /* Read buffer                      */
    Byte writeBuffer[QUAD_SER_BUF_SIZE];/* Write buffer                     */
} sccUartChan;

typedef struct                          /* Quad Serial Board Data Structure */
{
    IBC_BoardEntry IBC_Board;           /* IBC Board Entry structure        */
    struct                              /* Warning and alarm status bits    */
    {
        unsigned psuFault  : 1;         /* Power Supply Rail Failure        */
        unsigned psuGndFlt : 1;         /* Power Supply Ground Failure      */
    } alarms;

    Nat16 vspTimer;                     /* Copy of sysclock for VSP timer   */

    sccUartChan uart[SCC_CHAN_PER_UART];/* UART Channel Data Strcutures     */
} serialBoardEntry;

typedef struct
{
    Nat16 channel;
    serialBoardEntry *boardEntry;
} quadSerialChan;

typedef enum                            /* Serial Protocol Modes            */
{
    RS232_MODE,
    RS485_MODE
} protocol;

typedef struct
{
    Word    status;                      /* Status Word                      */
    Byte    buffer[QUAD_SER_BUF_SIZE];   /* Pointer to Buffer                */
}sendStruct;



#define HANDSHAKE_ON    TRUE            /* RS232 Handshake Modes            */
#define HANDSHAKE_OFF   FALSE

#ifdef __STDC__

Int16 serialBoardSearch( IBC_BoardEntry *IBC_Boards[], Int16 maxCards );

Void serialBoardInterruptOn( serialBoardEntry *serialBoard );
Void serialBoardInterruptOff( serialBoardEntry *serialBoard );

Int16 serialBoardOpenChan(serialBoardEntry *serialBoard, Nat16 chan);
Void serialBoardCloseChan(serialBoardEntry *serialBoard, Nat16 chan);

Int16 serialBoardRead(serialBoardEntry *serialBoard, Nat16 chan,
                 Byte *buffer, Int16 nBytes);

Int16 serialBoardWrite(serialBoardEntry *serialBoard, Nat16 chan,
                 Byte *buffer, Int16 nBytes);

Void serialBoardRxFlush(serialBoardEntry *serialBoard, Nat16 chan);

Void sccSetLineFormat(serialBoardEntry *serialBoard, Nat16 chan,
    Nat16 baudRate, Nat16 dataBits, Nat16 stopBits, Nat16 parity,
    Boolean handshake, protocol proto);

Void sccSetTermChar(serialBoardEntry *serialBoard, Nat16 chan, Nat16 termChar);

Int16 serialBoardTermRecvd(serialBoardEntry *serialBoard, Nat16 chan);
Int16 serialBoardRxBytes(serialBoardEntry *serialBoard, Nat16 chan);

Void serialBoardIsr(Reg serialBoardEntry *serialBoard);

Void serialBoardFunctions(serialBoardEntry *serialBoard );

Void quadSerGetLineParmCmd(IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                            Byte *commandBuf );

Void quadSerSetLineParmCmd(IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                            Byte *commandBuf );

Void quadSerSetTermCharCmd(IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                            Byte *commandBuf );

Void quadSerOpenCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                     Byte *commandBuf );

Void quadSerCloseCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                     Byte *commandBuf );

Void quadSerReadCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                     Byte *commandBuf );

Void quadSerWriteCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                      Byte *commandBuf );

Void quadSerFlushCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                      Byte *commandBuf );

Void quadSerRxBytesCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                        Byte *commandBuf );

Void quadSerTxBytesCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                        Byte *commandBuf );

Void quadSerTermCharsCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                        Byte *commandBuf );

Void quadSerSendBreakCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                        Byte *commandBuf );

Void vspOpenCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                     Byte *commandBuf );

Void quadSerGetPsuStatusCmd(IBC_BoardEntry* IBC_CardTable[],
                                       Int16 IBC_CardCount, Byte *commandBuf );

Void qsProtoOpenCmd( IBC_BoardEntry* IBC_CardTable[], Int16 IBC_CardCount,
                     Byte *commandBuf );

Void quadSerFwdCmd(IBC_BoardEntry* IBC_CardTable[],
                                       Int16 IBC_CardCount, Byte *commandBuf );


#endif














