/** \file
 *
 *  Contains the UartStream class declaration.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#ifndef UARTSTREAM_H_
#define UARTSTREAM_H_

#include "io/UartStreamBase.h"
#include "data/ElementURI.h"
#include "logger/Logger.h"

/**
 *  Implements both InStream and OutStream for
 *  the LPC3XXX Standard UART
 *
 *  \ingroup io
 */
class UartStream: public UartStreamBase
{
public:

    /// Baudrates as per termios
    using UartStreamBase::Baudrate;

    /// UARTS
    using UartStreamBase::UartId;

    /// UART Errors
    using UartStreamBase::UartError;

    /// Constructor
    UartStream( const ConfigURI& uartCfg, const ConfigURI& baudCfg, const double timeoutSec,
                Logger& logger, size_t bufferSize = 1, bool blocking = false, bool debug = false );

    // Alternate constructor, for debugging, etc.
    UartStream( const Str& filename, Baudrate baudrate, const double timeoutSec,
                Logger& logger, size_t bufferSize = 1, bool blocking = false, bool debug = false );

    /// Destructor
    ~UartStream();

    virtual void waitForBufferEmpty();

    virtual void enableUART( void );

    virtual void disableUART( void );

private:

    // Note that the copy constructor below is private and not given a body.
    // Any attempt to call it will return a compiler error.
    UartStream( const UartStream& old ); // disallow copy constructor

    virtual void initializePort( UartStreamBase::UartId );

    static Str LookupFilename( const ConfigURI& uartCfg, Logger& logger );
    static Baudrate LookupBaudrate( const ConfigURI& baudCfg, Logger& logger );

};

#endif /*UARTSTREAM_H_*/

