/* 
 * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
 * 
 * This software may be freely used, copied, modified, and distributed
 * provided that the above copyright notice is preserved in all copies of the
 * software.
 */

/* -*-C-*-
 *
 * $Revision: 1.2 $
 *     $Date: 1998/01/08 11:12:39 $
 *
 */
#ifndef angsd_unixcomm_h
#define angsd_unixcomm_h

#include <errno.h>

#if defined(BSD)
#  define ERRNO_FOR_BLOCKED_IO EWOULDBLOCK
#else
#  define ERRNO_FOR_BLOCKED_IO EAGAIN
#endif

/*
 *  Function: Unix_MatchValidSerialDevice
 *   Purpose: check that the serial driver/port name is valid
 *            and return the actual device name if it is.
 *
 *    Params:
 *       Input: name    Name of device going to be used
 *
 *   Returns: 
 *          OK: Pointer to name of the device matched
 *       Error or unrecognised deivce: 0
 */
extern const char *Unix_MatchValidSerialDevice(const char *name);

/*
 *  Function: Unix_IsSerialInUse
 *   Purpose: check whether the serial port is in use
 *
 *    Params:
 *       Input: Nothing
 *
 *   Returns: 
 *          OK: 0       Serial device not in use
 *       Error: -1      Serial device in use
 */
extern int Unix_IsSerialInUse(void);

/*
 *  Function: Unix_OpenSerial
 *   Purpose: open the serial port
 *
 *    Params:
 *       Input: name    Name of device to open
 *
 *   Returns: Unix 'open' returns
 */
extern int Unix_OpenSerial(const char *name);

/*
 *  Function: Unix_CloseSerial
 *   Purpose: close the serial port
 *
 *    Params:
 *       Input: Nothing
 *
 *   Returns: Nothing
 */
extern void Unix_CloseSerial(void);

/*
 *  Function: Unix_ReadSerial
 *   Purpose: reads a specified number of bytes (or less) from the serial port
 *
 *    Params:
 *       Input: buf     Buffer to store read bytes
 *              n       Maximum number of bytes to read
 *
 *   Returns: Unix 'read' returns
 */
extern int Unix_ReadSerial(unsigned char *buf, int n, bool block);

/*
 *  Function: Unix_WriteSerial
 *   Purpose: writes a specified number of bytes (or less) to the serial port
 *
 *    Params:
 *       Input: buf     Buffer to write bytes from
 *              n       Maximum number of bytes to write
 *
 *   Returns: Unix 'write' returns
 */
extern int Unix_WriteSerial(unsigned char *buf, int n);

/*
 *  Function: Unix_ResetSerial
 *   Purpose: resets the serial port for another operation
 *
 *    Params:
 *       Input: Nothing
 *
 *   Returns: Nothing
 */
extern void Unix_ResetSerial(void);

/*
 *  Function: Unix_SetSerialBaudRate
 *   Purpose: check that the serial driver/port name is valid
 *
 *    Params:
 *       Input: baudrate    termios value for baud rate
 *
 *   Returns: Nothing
 */
extern void Unix_SetSerialBaudRate(int baudrate);

/*
 *  Function: Unix_ioctlNonBlocking
 *   Purpose: sets the serial port to non-blocking IO
 *
 *    Params:
 *       Input: Nothing
 *
 *   Returns: Nothing
 */
extern void Unix_ioctlNonBlocking(void);

/*
 *  Function: Unix_IsValidParallelDevice
 *   Purpose: check whether the combined serial and parallel device specification
 *            is ok, and return the ports selected
 *
 *    Params:
 *       Input: portstring - is a string which specifies which serial
 *                           and parallel ports are to be used. Can
 *                           include s=<val> and p=<val> separated by a
 *                           comma.
 *
 *   Returns: 
 *       Output: *sername  - returns the device name of the chosen serial port
 *               *parname  - returns the device name of the chosen parallel port
 *               If either of these is NULL on return then the match failed.
 */
extern void Unix_IsValidParallelDevice(
  const char *portstring, char **sername, char **parname
);

/*
 *  Function: Unix_IsParallelInUse
 *   Purpose: check whether the parallel port is in use
 *
 *    Params:
 *       Input: Nothing
 *
 *   Returns: 
 *          OK: 0       Parallel device not in use
 *       Error: -1      Parallel device in use
 */
extern int Unix_IsParallelInUse(void);

/*
 *  Function: Unix_OpenParallel
 *   Purpose: open the parallel port
 *
 *    Params:
 *       Input: name    Name of device to open
 *
 *   Returns: Unix 'open' returns
 */
extern int Unix_OpenParallel(const char *name);

/*
 *  Function: Unix_CloseParallel
 *   Purpose: close the parallel port
 *
 *    Params:
 *       Input: Nothing
 *
 *   Returns: Nothing
 */
extern void Unix_CloseParallel(void);

/*
 *  Function: Unix_WriteParallel
 *   Purpose: writes a specified number of bytes (or less) to the parallel port
 *
 *    Params:
 *       Input: buf     Buffer to write bytes from
 *              n       Maximum number of bytes to write
 *
 *   Returns: Unix 'write' returns
 */
extern unsigned int Unix_WriteParallel(unsigned char *buf, int n);

/*
 *  Function: Unix_ResetParallel
 *   Purpose: resets the parallel port for another operation
 *
 *    Params:
 *       Input: Nothing
 *
 *   Returns: Nothing
 */
extern void Unix_ResetParallel(void);

#endif /* ndef angsd_unixcomm_h */

/* EOF unixcomm.h */
