/* Remote serial support interface definitions for GDB, the GNU Debugger.
   Copyright (C) 1992-2022 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef SERIAL_H
#define SERIAL_H

#ifdef USE_WIN32API
#include <winsock2.h>
#include <windows.h>
#endif

struct ui_file;

/* For most routines, if a failure is indicated, then errno should be
   examined.  */

/* Terminal state pointer.  This is specific to each type of
   interface.  */

typedef void *serial_ttystate;
struct serial;
struct serial_ops;

/* Speed in bits per second, or -1 which means don't mess with the speed.  */

extern int baud_rate;

/* Parity for serial port  */

extern int serial_parity;

/* Create a new serial for OPS.  The new serial is not opened.  */

/* Try to open NAME.  Returns a new `struct serial *' on success, NULL
   on failure.  The new serial object has a reference count of 1.
   Note that some open calls can block and, if possible, should be
   written to be non-blocking, with calls to ui_look_hook so they can
   be cancelled.  An async interface for open could be added to GDB if
   necessary.  */

extern struct serial *serial_open (const char *name);

/* Open a new serial stream using OPS.  */

extern struct serial *serial_open_ops (const struct serial_ops *ops);

/* Returns true if SCB is open.  */

extern int serial_is_open (struct serial *scb);

/* Find an already opened serial stream using a file handle.  */

extern struct serial *serial_for_fd (int fd);

/* Open a new serial stream using a file handle.  */

extern struct serial *serial_fdopen (const int fd);

/* Push out all buffers, close the device and unref SCB.  */

extern void serial_close (struct serial *scb);

/* Increment reference count of SCB.  */

extern void serial_ref (struct serial *scb);

/* Decrement reference count of SCB.  */

extern void serial_unref (struct serial *scb);

/* Create a pipe, and put the read end in FILDES[0], and the write end
   in FILDES[1].  Returns 0 for success, negative value for error (in
   which case errno contains the error).  */

extern int gdb_pipe (int fildes[2]);

/* Create a pipe with each end wrapped in a `struct serial' interface.
   Put the read end in scbs[0], and the write end in scbs[1].  Returns
   0 for success, negative value for error (in which case errno
   contains the error).  */

extern int serial_pipe (struct serial *scbs[2]);

/* Push out all buffers and destroy SCB without closing the device.  */

extern void serial_un_fdopen (struct serial *scb);

/* Read one char from the serial device with TIMEOUT seconds to wait
   or -1 to wait forever.  Use timeout of 0 to effect a poll.
   Infinite waits are not permitted.  Returns unsigned char if ok, else
   one of the following codes.  Note that all error return-codes are
   guaranteed to be < 0.  */

enum serial_rc {
  SERIAL_ERROR = -1,	/* General error.  */
  SERIAL_TIMEOUT = -2,	/* Timeout or data-not-ready during read.
			   Unfortunately, through
			   deprecated_ui_loop_hook (), this can also
			   be a QUIT indication.  */
  SERIAL_EOF = -3	/* General end-of-file or remote target
			   connection closed, indication.  Includes
			   things like the line dropping dead.  */
};

extern int serial_readchar (struct serial *scb, int timeout);

/* Write COUNT bytes from BUF to the port SCB.  Returns 0 for
   success, non-zero for failure.  */

extern int serial_write (struct serial *scb, const void *buf, size_t count);

/* Write a printf style string onto the serial port.  */

extern void serial_printf (struct serial *desc, 
			   const char *,...) ATTRIBUTE_PRINTF (2, 3);

/* Allow pending output to drain.  */

extern int serial_drain_output (struct serial *);

/* Flush (discard) pending output.  Might also flush input (if this
   system can't flush only output).  */

extern int serial_flush_output (struct serial *);

/* Flush pending input.  Might also flush output (if this system can't
   flush only input).  */

extern int serial_flush_input (struct serial *);

/* Send a break between 0.25 and 0.5 seconds long.  */

extern int serial_send_break (struct serial *scb);

/* Turn the port into raw mode.  */

extern void serial_raw (struct serial *scb);

/* Return a pointer to a newly malloc'd ttystate containing the state
   of the tty.  */

extern serial_ttystate serial_get_tty_state (struct serial *scb);

/* Return a pointer to a newly malloc'd ttystate containing a copy
   of the state in TTYSTATE.  */

extern serial_ttystate serial_copy_tty_state (struct serial *scb,
					      serial_ttystate ttystate);

/* Set the state of the tty to TTYSTATE.  The change is immediate.
   When changing to or from raw mode, input might be discarded.
   Returns 0 for success, negative value for error (in which case
   errno contains the error).  */

extern int serial_set_tty_state (struct serial *scb, serial_ttystate ttystate);

/* gdb_printf a user-comprehensible description of ttystate on
   the specified STREAM.  FIXME: At present this sends output to the
   default stream - GDB_STDOUT.  */

extern void serial_print_tty_state (struct serial *scb,
				    serial_ttystate ttystate,
				    struct ui_file *);

/* Set the baudrate to the decimal value supplied.  Returns 0 for
   success, -1 for failure.  */

extern int serial_setbaudrate (struct serial *scb, int rate);

/* Set the number of stop bits to the value specified.  Returns 0 for
   success, -1 for failure.  */

#define SERIAL_1_STOPBITS 1
#define SERIAL_1_AND_A_HALF_STOPBITS 2	/* 1.5 bits, snicker...  */
#define SERIAL_2_STOPBITS 3

extern int serial_setstopbits (struct serial *scb, int num);

#define GDBPARITY_NONE     0
#define GDBPARITY_ODD      1
#define GDBPARITY_EVEN     2

/* Set parity for serial port. Returns 0 for success, -1 for failure.  */

extern int serial_setparity (struct serial *scb, int parity);

/* Asynchronous serial interface: */

/* Can the serial device support asynchronous mode?  */

extern int serial_can_async_p (struct serial *scb);

/* Has the serial device been put in asynchronous mode?  */

extern int serial_is_async_p (struct serial *scb);

/* For ASYNC enabled devices, register a callback and enable
   asynchronous mode.  To disable asynchronous mode, register a NULL
   callback.  */

typedef void (serial_event_ftype) (struct serial *scb, void *context);
extern void serial_async (struct serial *scb,
			  serial_event_ftype *handler, void *context);

/* Trace/debug mechanism.

   serial_debug() enables/disables internal debugging.
   serial_debug_p() indicates the current debug state.  */

extern void serial_debug (struct serial *scb, int debug_p);

extern int serial_debug_p (struct serial *scb);


/* Details of an instance of a serial object.  */

struct serial
  {
    /* serial objects are ref counted (but not the underlying
       connection, just the object's lifetime in memory).  */
    int refcnt;

    int fd;			/* File descriptor */
    /* File descriptor for a separate error stream that should be
       immediately forwarded to gdb_stderr.  This may be -1.
       If != -1, this descriptor should be non-blocking or
       ops->avail should be non-NULL.  */
    int error_fd;               
    const struct serial_ops *ops; /* Function vector */
    void *state;       		/* Local context info for open FD */
    serial_ttystate ttystate;	/* Not used (yet) */
    int bufcnt;			/* Amount of data remaining in receive
				   buffer.  -ve for sticky errors.  */
    unsigned char *bufp;	/* Current byte */
    unsigned char buf[BUFSIZ];	/* Da buffer itself */
    char *name;			/* The name of the device or host */
    struct serial *next;	/* Pointer to the next `struct serial *' */
    int debug_p;		/* Trace this serial devices operation.  */
    int async_state;		/* Async internal state.  */
    void *async_context;	/* Async event thread's context */
    serial_event_ftype *async_handler;/* Async event handler */
  };

struct serial_ops
  {
    const char *name;
    int (*open) (struct serial *, const char *name);
    void (*close) (struct serial *);
    int (*fdopen) (struct serial *, int fd);
    int (*readchar) (struct serial *, int timeout);
    int (*write) (struct serial *, const void *buf, size_t count);
    /* Discard pending output */
    int (*flush_output) (struct serial *);
    /* Discard pending input */
    int (*flush_input) (struct serial *);
    int (*send_break) (struct serial *);
    void (*go_raw) (struct serial *);
    serial_ttystate (*get_tty_state) (struct serial *);
    serial_ttystate (*copy_tty_state) (struct serial *, serial_ttystate);
    int (*set_tty_state) (struct serial *, serial_ttystate);
    void (*print_tty_state) (struct serial *, serial_ttystate,
			     struct ui_file *);
    int (*setbaudrate) (struct serial *, int rate);
    int (*setstopbits) (struct serial *, int num);
    /* Set the value PARITY as parity setting for serial object.
       Return 0 in the case of success.  */
    int (*setparity) (struct serial *, int parity);
    /* Wait for output to drain.  */
    int (*drain_output) (struct serial *);
    /* Change the serial device into/out of asynchronous mode, call
       the specified function when ever there is something
       interesting.  */
    void (*async) (struct serial *scb, int async_p);
    /* Perform a low-level read operation, reading (at most) COUNT
       bytes into SCB->BUF.  Return zero at end of file.  */
    int (*read_prim)(struct serial *scb, size_t count);
    /* Perform a low-level write operation, writing (at most) COUNT
       bytes from BUF.  */
    int (*write_prim)(struct serial *scb, const void *buf, size_t count);
    /* Return that number of bytes that can be read from FD
       without blocking.  Return value of -1 means that the
       read will not block even if less that requested bytes
       are available.  */
    int (*avail)(struct serial *scb, int fd);

#ifdef USE_WIN32API
    /* Return a handle to wait on, indicating available data from SCB
       when signaled, in *READ.  Return a handle indicating errors
       in *EXCEPT.  */
    void (*wait_handle) (struct serial *scb, HANDLE *read, HANDLE *except);
    void (*done_wait_handle) (struct serial *scb);
#endif /* USE_WIN32API */
  };

/* Add a new serial interface to the interface list.  */

extern void serial_add_interface (const struct serial_ops * optable);

/* File in which to record the remote debugging session.  */

extern void serial_log_command (struct target_ops *self, const char *);

#ifdef USE_WIN32API

/* Windows-only: find or create handles that we can wait on for this
   serial device.  */
extern void serial_wait_handle (struct serial *, HANDLE *, HANDLE *);

/* Windows-only: signal that we are done with the wait handles.  */
extern void serial_done_wait_handle (struct serial *);

#endif /* USE_WIN32API */

#endif /* SERIAL_H */
