// Copyright (c) 2004 David Muse
// See the COPYING file for more information.

#ifndef RUDIMENTS_SERIALPORTPROFILE_H
#define RUDIMENTS_SERIALPORTPROFILE_H

#include <rudiments/private/serialportprofileincludes.h>

// cfmakeraw, cfsetspeed???
// wraps struct termios

#ifdef RUDIMENTS_NAMESPACE
namespace rudiments {
#endif

class serialportprofileprivate;

class serialportprofile {
        public:

                enum  inputmode_t {
                        cannonical=0,
                        raw
                };

                enum  flowcontrol_t {
                        fc_none=0,
                        fc_software,
                        fc_hardware
                };

                enum  baudrate_t {
                        baud_0=B0,
                        baud_50=B50,
                        baud_75=B75,
                        baud_110=B110,
                        baud_134=B134,
                        baud_150=B150,
                        baud_200=B200,
                        baud_300=B300,
                        baud_600=B600,
                        baud_1200=B1200,
                        baud_1800=B1800,
                        baud_2400=B2400,
                        baud_4800=B4800,
                        baud_9600=B9600,
                        #if defined(B57600)
                        baud_19200=B19200,
                        #elif defined(EXTA)
                        baud_19200=EXTA,
                        #endif
                        #if defined(B38400)
                        baud_38400=B38400,
                        #elif defined(EXTB)
                        baud_38400=EXTB,
                        #endif
                        #ifdef B57600
                        baud_57600=B57600,
                        #endif
                        #ifdef B76800
                        baud_76800=B76800,
                        #endif
                        #ifdef B115200
                        baud_115200=B115200,
                        #endif
                        #ifdef B230400
                        baud_230400=B230400,
                        #endif
                        #ifdef B460800
                        baud_460800=B460800,
                        #endif
                        #ifdef B500000
                        baud_500000=B500000,
                        #endif
                        #ifdef B576000
                        baud_576000=B576000,
                        #endif
                        #ifdef B921600
                        baud_921600=B921600,
                        #endif
                        #ifdef B1000000
                        baud_1000000=B1000000,
                        #endif
                        #ifdef B1142000
                        baud_1152000=B1152000,
                        #endif
                        #ifdef B1500000
                        baud_1500000=B1500000,
                        #endif
                        #ifdef B2000000
                        baud_2000000=B2000000,
                        #endif
                        #ifdef B2500000
                        baud_2500000=B2500000,
                        #endif
                        #ifdef B3000000
                        baud_3000000=B3000000,
                        #endif
                        #ifdef B3500000
                        baud_3500000=B3500000,
                        #endif
                        #ifdef B4000000
                        baud_4000000=B4000000,
                        #endif
                };

                enum  charsize_t {
                        cs_5=CS5,
                        cs_6=CS6,
                        cs_7=CS7,
                        cs_8=CS8
                };

                #ifdef NLDLY
                enum  newlinedelay_t {
                        nl_none=NL0,
                        nl_100=NL1
                };
                #endif

                #ifdef CRDLY
                enum  carriagereturndelay_t {
                        cr_none=CR0,
                        cr_depends=CR1,
                        cr_100=CR2,
                        cr_150=CR3
                };
                #endif

                #ifdef TABDLY
                enum  tabdelay_t {
                        td_none=TAB0,
                        td_depends=TAB1,
                        td_100=TAB2
                };
                #endif

                #ifdef BSDLY
                enum  backspacedelay_t {
                        bs_none=BS0,
                        bs_50=BS1
                };
                #endif

                #ifdef VTDLY
                enum  verticaltabdelay_t {
                        vt_none=VT0,
                        vt_2=VT1
                };
                #endif

                #ifdef FFDLY
                enum  formfeeddelay_t {
                        ff_none=FF0,
                        ff_2=FF1
                };
                #endif

                        serialportprofile();
                        ~serialportprofile();

                void  setControlOptions(tcflag_t flags);
                        // set control options to "flags"
                void  setLocalOptions(tcflag_t flags);
                        // set local options to "flags"
                void  setInputOptions(tcflag_t flags);
                        // set input options to "flags"
                void  setOutputOptions(tcflag_t flags);
                        // set output options to "flags"
                void  setControlCharacters(const cc_t *c_cc);
                        // Set control characters to the values pointed to by
                        // "c_cc".  Note that c_cc must be an array of length
                        // NCCS.
                void  setOptions(const termios *newtio);
                        // set all options and control characters to
                        // the values set in "newtio"

                void  defaultControlOptions();
                        // set the control options to system defaults
                void  defaultLocalOptions();
                        // set the local options to system defaults
                void  defaultInputOptions();
                        // set the input options to system defaults
                void  defaultOutputOptions();
                        // set the output options to system defaults
                void  defaultControlCharacters();
                        // set the control characters to system defaults
                void  defaultOptions();
                        // set all options and control characters to
                        // system defaults

                void  evalOptionsString(const char *string);
                        // Serial port configuration requirements are often
                        // given as a 3 character string representing the
                        // number of bits-per-char, the parity and the number
                        // of stop bits such as "8n1", "7e2", etc.
                        // This methods parses such a string and sets the
                        // profile to match those values.

                void          inputMode(inputmode_t inputmode);
                                // set input mode to "inputmode"
                inputmode_t     inputMode();
                                // get the current input mode setting

                void          flowControl(flowcontrol_t flowcontrol);
                                // set flow control to "flowcontrol"
                flowcontrol_t   flowControl();
                                // get the current flow control setting

                // control options

                // setters...
                void  baud(const char *baudrate);
                void  baud(baudrate_t baudrate);
                        // set the (input and output) baud rate
                        // default is 0
                bool  inputBaud(const char *baudrate);
                bool  inputBaud(baudrate_t baudrate);
                        // set the input baud rate
                        // default is 0
                bool  outputBaud(const char *baudrate);
                bool  outputBaud(baudrate_t baudrate);
                        // set the output baud rate
                        // default is 0
                void  characterSize(charsize_t size);
                        // set the character size
                        // default is 5 bits
                        // termios flag: CSIZE
                void  twoStopBits(bool truefalse);
                        // use two stop bits if "truefalse" is true
                        // or one stop bit if "truefalse" is false
                        // default is one stop bit
                        // termios flag: CSTOPB
                void  receiverOn(bool truefalse);
                        // turn the receiver on/off
                        // (enables serial port to read incoming data)
                        // default is off
                        // (you probably always want to set this on)
                        // termios flag: CREAD
                void  parityCheck(bool truefalse);
                        // turn parity checking on/off
                        // default is off
                        // termios flag: CPARENB
                void  oddParity(bool truefalse);
                        // use odd parity if "truefalse" is true
                        // or even parity if "truefalse" is false
                        // default is even parity
                        // termios flag: PARODD
                void  hangupOnClose(bool truefalse);
                        // lower modem control lines after
                        // last process closes the device (hang up)
                        // default is not to hang up on close
                        // termios flag: HUPCL
                void  ignoreModemControlLines(bool truefalse);
                        // ignore (possibly sporadic) job control and hangup
                        // signals that could terminate or otherwise control
                        // the program
                        // default is not to ignore
                        // (this should be set to true when communicating
                        // with a device connected directly to the computer as
                        // opposed to over a modem)
                        // termios flag: CLOCAL
                #ifdef LOBLK
                void  blockJobControlOutput(bool truefalse);
                        // block output from a nonconcurrent shell layer
                        // default is not to block
                        // termios flag: LOBLK
                #endif
                void  hardwareFlowControl(bool truefalse);
                        // use RTS/CTS flow control
                        // default is not to use RTS/CTS flow control
                        // termios flag: CRTSCTS/NEW_CRTSCTS/
                        //                   CRTS_IFLOW/CRTS_OFLOW

                // getters...
                baudrate_t      baud();
                                // returns current (input and output) baud
                baudrate_t      inputBaud();
                                // returns current input baud
                baudrate_t      outputBaud();
                                // returns current output baud
                charsize_t      characterSize();
                                // returns current character size
                bool          twoStopBits();
                                // returns true if two stop bits are being used
                bool          receiverOn();
                                // returns true if the receiver is on
                bool          parityCheck();
                                // returns true if parity check is enabled
                bool          oddParity();
                                // returns true if odd parity is being used
                bool          hangupOnClose();
                                // returns true if the modem lines will be
                                // lowered when the last device closes the
                                // device
                bool          ignoreModemControlLines();
                                // returns true if (possibly sporadic) job
                                // control and hangup signals are being ignored
                bool          blockJobControlOutput();
                                // returns true if output from a nonconcurrent
                                // shell layer is being blocked
                bool          hardwareFlowControl();
                                // returns true if RTS/CTS hardware flow
                                // control is being used



                // local options
                // setters...
                void  generateSignals(bool truefalse);
                        // cause corresponding signals to be raised when any of
                        // the INTR, QUIT, SUSP or DSUSP characters are received
                        // default is not to raise signals
                        // termios flag: ISIG
                void  canonicalInput(bool truefalse);
                        // enable special characters EOF, EOL, EOL2, ERASE,
                        // KILL, LNEXT, REPRINT, STATUS and WERASE, buffer by
                        // lines
                        // default is not to enable the special characters and
                        // not buffer by lines
                        // termios flag: ICANON
                #ifdef XCASE
                void  escapedUpperCase(bool truefalse);
                        // If cannonicalInput() is also set true, converts
                        // characters from input to lower case unless they are
                        // preceeded by a \.  On output, preceeds each upper
                        // case character with a \ and converts all lower case
                        // characters to uppercase.
                        // default is not to use escaped upper case
                        // (this is used when communicating with terminals that
                        // can display upper or lower case, but only transmit/
                        // receive upper case)
                        // termios flag: XCASE
                #endif
                void  echoInput(bool truefalse);
                        // If cannonicalInput() is also set true then echo
                        // input.
                        // termios flag: ECHO
                void  eraseCharactersOn(bool truefalse);
                        // If cannonicalInput() is also set true, character
                        // set using eraseCharacter() erases the preceeding
                        // character and character set using
                        // wordEraseCharacter() erases the preceeding word.
                        // termios flag: ECHOE
                void  killCharacterOn(bool truefalse);
                        // If cannonicalInput() is also set true, character
                        // set using killCharacter() erases the current line.
                        // termios flag: ECHOK
                void  echoNewLine(bool truefalse);
                        // If cannonicalInput() is also set true, new line
                        // characters are echoed even if echoInput() is set
                        // false.
                        // termios flag: ECHONL
                void  extendedFunctions(bool truefalse);
                        // If cannonicalInput() is also set true, enables
                        // characters set by secondEndOfLineCharacter(),
                        // reprintCharacter() and wordEraseCharacter().  Also
                        // enables lowerCase().
                        // termios flag: IEXTEN
                void  echoControlCharacters(bool truefalse);
                        // If echoInput() is also set true, control characters
                        // are echoed as ^X where X is the ascii code for the
                        // character plus 0x40.
                        // termios flag: ECHOCTL
                #ifdef ECHOPRT
                void  echoErasedCharacter(bool truefalse);
                        // If cannonicalInput() and echoInput() are also set
                        // true, characters are printed as they are erased.
                        // termios flag: ECHOPRT
                #endif
                void  emulateKill(bool truefalse);
                        // If cannonicalInput() is also set, the character set
                        // using killCharacter() causes the line to be erased
                        // by erasing each character on the line.
                        // (useful when a terminal doesn't support the KILL
                        // character but does support the ERASE character)
                        // termios flag: ECHOKE
                void  noFlushAfterInterruptOrQuit(bool truefalse);
                        // Disables flushing of the input/output queues when
                        // generating SIGINT, SIGQUIT or SIGSUSP signals.
                        // termios flag: NOFLSH
                #ifdef PENDIN
                void  retypePendingCharacters(bool truefalse);
                        // All characters in the input queue are reprinted when
                        // the next character is read.
                        // termios flag: PENDIN
                #endif
                void  sendSignalForBackgroundOutput(bool truefalse);
                        // Send the SIGTTOU signal to the process group of a
                        // background process which tries to write to its
                        // controlling terminal.
                        // termios flag: TOSTOP

                // getters...
                bool  generateSignals();
                        // returns true if corresponding signals will be raised
                        // when any of the INTR, QUIT, SUSP or DSUSP characters
                        // are received default is not to raise signals
                bool  canonicalInput();
                        // returns true if special characters EOF, EOL, EOL2,
                        // ERASE, KILL, LNEXT, REPRINT, STATUS and WERASE are
                        // enabled and buffering is being done by lines
                #ifdef XCASE
                bool  escapedUpperCase();
                        // Returns true if on input, characters are being
                        // converted from upper to lower case unless they are
                        // preceeded by a \ and on output lower case characters
                        // are being converted to upper case and upper case
                        // characters are being preceeded with a \.
                #endif
                bool  echoInput();
                        // returns true if input characters are being echoed
                bool  eraseCharactersOn();
                        // returns true if the character set using
                        // eraseCharacter() erases the preceeding
                        // character and the character set using
                        // wordEraseCharacter() erases the preceeding word
                bool  killCharacterOn();
                        // returns true if the character set using
                        // killCharacter() erases the current line
                bool  echoNewLine();
                        // returns true if new line characters are being echoed
                        // even if echoInput() is set false
                bool  extendedFunctions();
                        // returns true if characters set by
                        // secondEndOfLineCharacter(), reprintCharacter() and
                        // wordEraseCharacter() are enabled and lowerCase() is
                        // enabled
                bool  echoControlCharacters();
                        // returns true if control characters are being echoed
                        // as ^X where X is the ascii code for the character
                        // plus 0x40
                #ifdef ECHOPRT
                bool  echoErasedCharacter();
                        // returns true if characters are being printed as they
                        // are erased
                #endif
                bool  emulateKill();
                        // returns true if the character set using
                        // killCharacter() causes the line to be erased
                        // by erasing each character on the line
                bool  noFlushAfterInterruptOrQuit();
                        // returns true if flushing of the input/output queues
                        // when generating SIGINT, SIGQUIT or SIGSUSP signals
                        // is enabled
                #ifdef PENDIN
                bool  retypePendingCharacters();
                        // returns true if all characters in the input queue
                        // are reprinted when the next character is read
                #endif
                bool  sendSignalForBackgroundOutput();
                        // returns true if the SIGTTOU signal is being sent
                        // to the process group of a background process which
                        // tries to write to its controlling terminal



                // input options
                void  inputParityCheck(bool truefalse);
                        // enable parity checking on input
                        // termios flag: INPCK
                void  ignoreParityErrors(bool truefalse);
                        // ignore parity errors (ie. if a character has a
                        // parity error, just return what we got, rather than
                        // marking or converting it)
                        // termios flag: IGNPAR
                void  markParityErrors(bool truefalse);
                        // Unless ignoreParityErrors() is set true, prefix a
                        // character with a parity error with \337 \0.  The
                        // default is to convert it to \0 unless
                        // ignoreParityErrors() is set true.
                        // termios flag: PARMRK
                void  stripParityBits(bool truefalse);
                        // set the 8th bit of each character (the parity bit)
                        // to 0
                        // termios flag: ISTRIP
                void  softwareFlowControlOnOutput(bool truefalse);
                        // enable XON/XOFF flow control on output.
                        // termios flag: IXON
                void  softwareFlowControlOnInput(bool truefalse);
                        // enable XON/XOFF flow control on input.
                        // termios flag: IXOFF
                void  anyCharacterStartsFlow(bool truefalse);
                        // enable any character to restart output
                        // termios flag: IXANY
                void  ignoreBreak(bool truefalse);
                        // ignore BREAK character
                        // termios flag: IGNBRK
                void  sendSignalOnBreak(bool truefalse);
                        // If ignoreBreak() isn't set true and a BREAK character
                        // is received, flush input and output queues and send a
                        // SIGINT if the serial port is the controlling terminal
                        // of the process group.  If ignoreBreak() is not set,
                        // the default is to return a \0 character or \377 \0
                        // if markParityErrors() is set true.
                        // termios flag: BRKINT
                void  mapNewLineToCarriageReturnOnInput(bool truefalse);
                        // translate new line to carriage return on input
                        // termios flag: INLCR
                #ifdef ONOEOT
                void  discardEndOfTransmission(bool truefalse);
                        // termios flat: ONOEOT
                #endif
                void  ignoreCarriageReturn(bool truefalse);
                        // ignore carriage return on input
                        // termios flag: IGNCR
                void  mapCarriageReturnToNewLineOnInput(bool truefalse);
                        // translate carriage return to new line on input
                        // termios flag: ICRNL
                #ifdef IUCLC
                void  lowerCase(bool truefalse);
                        // map uppercase characters to lowercase on input
                        // termios flag: IUCLC
                #endif
                void  bellIfLineTooLong(bool truefalse);
                        // ring bell when input queue is full
                        // termios flag: IMAXBEL

                // getters...
                bool  inputParityCheck();
                        // returns true if input parity checking is enabled
                bool  ignoreParityErrors();
                        // returns true if parity errors are being ignored
                bool  markParityErrors();
                        // returns true if characters with parity errors are
                        // prefixed with \377 \0
                bool  stripParityBits();
                        // returns true if the 8th bit (the parity bit) of
                        // each character is being set to 0
                bool  softwareFlowControlOnOutput();
                        // returns true if XON/XOFF flow control is enabled on
                        // output
                bool  softwareFlowControlOnInput();
                        // returns true if XON/XOFF flow control is enabled on
                        // input
                bool  anyCharacterStartsFlow();
                        // returns true if any character will restart output
                bool  ignoreBreak();
                        // returns true if the BREAK character is being ignored      
                bool  sendSignalOnBreak();
                        // returns true if input and output queues are flushed
                        // and a SIGINT is sent to the process group if the
                        // serial port is the controlling terminal when a BREAK
                        // character is received
                bool  mapNewLineToCarriageReturnOnInput();
                        // returns true if new lines are mapped to carriage
                        // returns on input
                #ifdef ONOEOT
                bool  discardEndOfTransmission();
                #endif
                bool  ignoreCarriageReturn();
                        // returns true if carriage returns are ignored on input
                bool  mapCarriageReturnToNewLineOnInput();
                        // returns true if carriage returns are mapped to new
                        // lines on input
                #ifdef IUCLC
                bool  lowerCase();
                        // returns true if uppercase characters are mapped to
                        // lowercase on input
                #endif
                bool  bellIfLineTooLong();
                        // returns true if the bell will be rung when the input
                        // queue is full




                // output options
                void  postProcessOutput(bool truefalse);
                        // enables implementation-defined output processing
                        // termios flag: OPOST
                #ifdef OLCUC
                void  outputUpperCase(bool truefalse);
                        // map lowercase characters to uppercase on output
                        // termios flag: OLCUC
                #endif
                void  mapNewLineToCarriageReturnNewLineOnOutput(
                                                        bool truefalse);
                        // map new line to carriage return/new line on
                        // output
                        // termios flag: ONLCR
                #ifdef OCRNL
                void  mapCarriageReturnToNewLineOnOutput(bool truefalse);
                        // map carriage return to new line on output
                        // termios flag: OCRNL
                #endif
                #ifdef ONOCR
                void  dontOutputCarriageReturnAtColumnZero(bool truefalse);
                        // don't output carriage return at column 0
                        // termios flag: ONOCR
                #endif
                #ifdef ONLRET
                void  mapNewLineToCarriageReturnOnOutput(bool truefalse);
                        // map new line to carriage return on output
                        // termios flag: ONLRET
                #endif
                #ifdef OFILL
                void  useFillCharactersForDelay(bool truefalse);
                        // send fill characters for delay instead of using a
                        // timed delay
                        // termios flag: OFILL
                #endif
                #ifdef OFDEL
                void  useDelForFill(bool truefalse);
                        // use the DEL character instead of NULL for the fill
                        // character
                        // termios flag: OFDEL
                #endif
                void  expandTabToSpaces(bool truefalse);
                        // map tabs to spaces
                        // termios flag: XTAGS/OXTABS/TAB3

                #ifdef NLDLY
                void  delayAfterNewLine(newlinedelay_t nldelay);
                        // send a delay after each new line character
                        // termios flag: NLDLY
                #endif
                #ifdef CRDLY
                void  delayAfterCarriageReturn(carriagereturndelay_t crdelay);
                        // send a delay after each carriage return character
                        // termios flag: CRDLY
                #endif
                #ifdef TABDLY
                void  delayAfterTab(tabdelay_t tabdelay);
                        // send a delay after each tab character
                        // termios flag: TABDLY
                #endif
                #ifdef BSDLY
                void  delayAfterBackSpace(backspacedelay_t bsdelay);
                        // send a delay after each backspace character
                        // termios flag: BSDLY
                #endif
                #ifdef VTDLY
                void  delayAfterVerticalTab(verticaltabdelay_t vtdelay);
                        // send a delay after each vertical tab character
                        // termios flag: VTDLY
                #endif
                #ifdef FFDLY
                void  delayAfterFormFeed(formfeeddelay_t ffdelay);
                        // send a delay after each form feed character
                        // termios flag: FFDLY
                #endif


                // getters...
                bool  postProcessOutput();
                        // returns true if implementation-defined output
                        // processing is enabled
                #ifdef OLCUC
                bool  outputUpperCase();
                        // returns true if lowercase characters are mapped to
                        // uppercase on output
                #endif
                bool  mapNewLineToCarriageReturnNewLineOnOutput();
                        // returns true if new lines are mapped to carriage
                        // return/new line on output
                #ifdef OCRNL
                bool  mapCarriageReturnToNewLineOnOutput();
                        // returns true if carriage returns are mapped to new
                        // lines on output
                #endif
                #ifdef ONOCR
                bool  dontOutputCarriageReturnAtColumnZero();
                        // returns true if carriage returns aren't sent at
                        // column 0
                #endif
                #ifdef ONLRET
                bool  mapNewLineToCarriageReturnOnOutput();
                        // returns true if new lines are mapped to carriage
                        // returns on output
                #endif
                #ifdef OFILL
                bool  useFillCharactersForDelay();
                        // returns true if fill characters are sent for delay
                        // instead of using a timed delay
                #endif
                #ifdef OFDEL
                bool  useDelForFill();
                        // returns true if the DEL character is used instead of
                        // NULL for the fill character
                #endif
                bool  expandTabToSpaces();
                        // returns true if the tabs are mapped to spaces
                #ifdef NLDLY
                newlinedelay_t          delayAfterNewLine();
                        // returns the delay that is sent after new line
                        // characters
                #endif
                #ifdef CRDLY
                carriagereturndelay_t   delayAfterCarriageReturn();
                        // returns the delay that is sent after carriage return
                        // characters
                #endif
                #ifdef TABDLY
                tabdelay_t              delayAfterTab();
                        // returns the delay that is sent after tab characters
                #endif
                #ifdef BSDLY
                backspacedelay_t        delayAfterBackSpace();
                        // returns the delay that is sent after backspace
                        // characters
                #endif
                #ifdef VTDLY
                verticaltabdelay_t      delayAfterVerticalTab();
                        // returns the delay that is sent after vertical tab
                        // characters
                #endif
                #ifdef FFDLY
                formfeeddelay_t         delayAfterFormFeed();
                        // returns the delay that is sent after form feed
                        // characters
                #endif



                // control characters
                void  interruptCharacter(cc_t character);
                        // set the character that will cause a SIGINT to be
                        // sent to the process when generateSignals() is set
                        // true
                        // termios flag: VINTR
                void  quitCharacter(cc_t character);
                        // set the character that will cause a SIGQUIT to be
                        // sent to the process when generateSignals() is set
                        // true
                        // termios flag: VQUIT
                void  eraseCharacter(cc_t character);
                        // set the character that will cause a character erase
                        // when canonicalInput() is set to true
                        // termios flag: VERASE
                void  killCharacter(cc_t character);
                        // set the character that will cause a line erase
                        // when canonicalInput() is set to true
                        // termios flag: VKILL
                void  endOfFileCharacter(cc_t character);
                        // set the character that will cause the pending tty
                        // buffer to be sent to the program without waiting for
                        // end-of-line and read()'s to return 0 when
                        // canonicalInput() is set to true
                        // termios flag: VEOF
                void  endOfLineCharacter(cc_t character);
                        // set the end-of-line character, recognized when 
                        // canonicalInput() is set to true
                        // termios flag: VEOL
                void  secondEndOfLineCharacter(cc_t character);
                        // set the "other" end-of-line character, recognized
                        // when canonicalInput() is set to true
                        // termios flag: VEOL2
                void  switchCharacer(cc_t character);
                        // set the switch character
                        // termios flag: VSWTCH/VSWTC
                void  startCharacter(cc_t character);
                        // set the start character for XON/XOFF flow control
                        // termios flag: VSTART
                void  stopCharacter(cc_t character);
                        // set the stop character for XON/XOFF flow control
                        // termios flag: VSTOP
                void  suspendCharacter(cc_t character);
                        // set the character that will cause a SIGSUSP to be
                        // sent to the process when generateSignals() is set
                        // true
                        // termios flag: VSUSP
                #ifdef VDSUSP
                void  delayedSuspendCharacter(cc_t character);
                        // set the character that will cause a SIGTSTP to be
                        // sent to the process when generateSignals() and
                        // extendedFunctions() are set true
                        // termios flag: VDSUSP
                #endif
                void  literalNextCharcter(cc_t character);
                        // set the character that "quotes" the next character,
                        // depriving it of special meaning, recognized when
                        // extendedFunctions() is set true
                        // termios flag: VLNEXT
                void  wordEraseCharcter(cc_t character);
                        // set the word erase character, recognized when
                        // canonicalInput() and extendedFunctions() are set true
                        // termios flag: VWERASE

                void  reprintCharacter(cc_t character);
                        // set the character that causes unread characters to
                        // be reprinted, recognized when canonicalInput() and
                        // extendedFunctions() are set true
                        // termios flag: VREPRINT
                void  discardPendingOutputCharacter(cc_t character);
                        // set the character that toggles discarding pending
                        // output, recognized when extendedFunctions() is set
                        // true
                        // termios flag: VDISCARD

                #ifdef VSTATUS
                void  statusRequestCharacter(cc_t character);
                        // set the status request character
                        // termios flag: VSTATUS
                #endif

                void  readThreshold(cc_t count);
                        // set the number of characters that must be read
                        // before a read() will begin waiting for readTimeout()
                        // deciseconds before falling through
                        // termios flag: VMIN
                void  readTimeout(cc_t deciseconds);
                        // set the number of deciseconds that a read() will
                        // wait after reading readThreshold() characters before
                        // falling through
                        // termios flag: VTIME


                // getters...
                cc_t    interruptCharacter();
                        // returns the character that will cause a SIGINT to be
                        // sent to the process when generateSignals() is set
                        // true
                cc_t    quitCharacter();
                        // returns the character that will cause a SIGQUIT to be
                        // sent to the process when generateSignals() is set
                        // true
                cc_t    eraseCharacter();
                        // returns the character that will cause a character
                        // erase when canonicalInput() is set to true
                cc_t    killCharacter();
                        // returns the character that will cause a line erase
                        // when canonicalInput() is set to true
                cc_t    endOfFileCharacter();
                        // returns the character that will cause the pending tty
                        // buffer to be sent to the program without waiting for
                        // end-of-line and read()'s to return 0 when
                        // canonicalInput() is set to true
                cc_t    endOfLineCharacter();
                        // returns the end-of-line character, recognized when 
                        // canonicalInput() is set to true
                cc_t    secondEndOfLineCharacter();
                        // returns the "other" end-of-line character, recognized
                        // when canonicalInput() is set to true
                cc_t    switchCharacer();
                        // returns the switch character
                cc_t    startCharacter();
                        // returns the start character for XON/XOFF flow control
                cc_t    stopCharacter();
                        // returns the stop character for XON/XOFF flow control
                cc_t    suspendCharacter();
                        // returns the character that will cause a SIGSUSP to be
                        // sent to the process when generateSignals() is set
                        // true
                #ifdef VDSUSP
                cc_t    delayedSuspendCharacter();
                        // returns the character that will cause a SIGTSTP to be
                        // sent to the process when generateSignals() and
                        // extendedFunctions() are set true
                #endif
                cc_t    literalNextCharcter();
                        // returns the character that "quotes" the next
                        // character, depriving it of special meaning,
                        // recognized when extendedFunctions() is set true
                cc_t    wordEraseCharcter();
                        // returns the word erase character, recognized when
                        // canonicalInput() and extendedFunctions() are set true


                cc_t    reprintCharacter();
                        // returns the character that causes unread characters
                        // to be reprinted, recognized when canonicalInput() and
                        // extendedFunctions() are set true
                cc_t    discardPendingOutputCharacter();
                        // returns the character that toggles discarding pending
                        // output, recognized when extendedFunctions() is set
                        // true

                cc_t    statusRequestCharacter();
                        // returns the status request character

                cc_t    readThreshold();
                        // returns the number of characters that must be read
                        // before a read() will begin waiting for readTimeout()
                        // deciseconds before falling through
                cc_t    readTimeout();
                        // returns the number of deciseconds that a read() will
                        // wait after reading readThreshold() characters before
                        // falling through




                termios *getTermios();
                        // returns the struct termios used internally

        #include <rudiments/private/serialportprofile.h>
};

#ifdef RUDIMENTS_NAMESPACE
}
#endif

#endif