//-----------------------------------------------------------------------------
//
//	SerialController.h
//
//	Cross-platform serial port handler
//
//	Copyright (c) 2010 Jason Frazier <frazierjason@gmail.com>
//
//	SOFTWARE NOTICE AND LICENSE
//
//	This file is part of OpenZWave.
//
//	OpenZWave is free software: you can redistribute it and/or modify
//	it under the terms of the GNU Lesser General Public License as published
//	by the Free Software Foundation, either version 3 of the License,
//	or (at your option) any later version.
//
//	OpenZWave 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 Lesser General Public License for more details.
//
//	You should have received a copy of the GNU Lesser General Public License
//	along with OpenZWave.  If not, see <http://www.gnu.org/licenses/>.
//
//-----------------------------------------------------------------------------

#ifndef _SerialController_H
#define _SerialController_H

#include <string>
#include "Defs.h"
#include "platform/Controller.h"

namespace OpenZWave
{
	class Driver;
	class Msg;
	class SerialControllerImpl;

	class SerialController: public Controller
	{
		friend class SerialControllerImpl;

	public:
		enum Parity
		{
			Parity_None = 0,
			Parity_Odd,
			Parity_Even,
			Parity_Mark,
			Parity_Space
		};

		enum StopBits
		{
			StopBits_One = 0,
			StopBits_OneAndAHalf = 1,
			StopBits_Two = 2
		};

		/**
		 * Constructor.
		 * Creates an object that represents a serial port.
		 */
		SerialController();

		/**
		 * Destructor.
		 * Destroys the serial port object.
		 */
		virtual ~SerialController();

		/**
		 * Set the serial port baud rate.  The serial port must be closed for the setting to be accepted.
		 * @param _baud Integer containing the expected baud-rate of the serial connection.  Most Z-Wave interfaces run at 115200 baud.
		 * @return True if the baud value was accepted.
		 * @see Open, Close
		 */
		bool SetBaud( uint32 const _baud );

		/**
		 * Set the serial port parity.  The serial port must be closed for the setting to be accepted.
		 * @param _parity Parity enum value indicating the serial data's expected type of parity bits, if any.
		 * @return True if the parity value was accepted.
		 * @see Open, Close
		 */
		bool SetParity( Parity const _parity );

		/**
		 * Set the serial port stop bits.  The serial port must be closed for the setting to be accepted.
 		 * @param _stopBits StopBits enum value indicating the serial data's expected number of stop-bits.
		 * @return True if the stop bits value was accepted.
		 * @see Open, Close
		 */
		bool SetStopBits( StopBits const _stopBits );

		/**
		 * Open a serial port.
		 * Attempts to open a serial port and initialize it with the specified paramters.
		 * @param _SerialControllerName The name of the port to open.  For example, ttyS1 on Linux, or \\.\COM2 in Windows.
		 * @return True if the port was opened and configured successfully.
		 * @see Close, Read, Write
		 */
		bool Open( string const& _SerialControllerName );

		/**
		 * Close a serial port.
		 * Closes the serial port.
		 * @return True if the port was closed successfully, or false if the port was already closed, or an error occurred.
		 * @see Open
		 */
		bool Close();

		/**
		 * Write to a serial port.
		 * Attempts to write data to an open serial port.
		 * @param _buffer Pointer to a block of memory containing the data to be written.
		 * @param _length Length in bytes of the data.
		 * @return The number of bytes written.
		 * @see Read, Open, Close
		 */
		uint32 Write( uint8* _buffer, uint32 _length );

   	private:
        uint32                      m_baud;
        SerialController::Parity    m_parity;
        SerialController::StopBits  m_stopBits;
		string						m_serialControllerName;

		SerialControllerImpl*	    m_pImpl;	// Pointer to an object that encapsulates the platform-specific implementation of the serial port.
		bool			            m_bOpen;
	};

} // namespace OpenZWave

#endif //_SerialController_H

