/**
 * FreeRDP: A Remote Desktop Protocol client.
 * Serial Port Device Service Virtual Channel
 *
 * Copyright 2011 O.S. Systems Software Ltda.
 * Copyright 2011 Eduardo Fiss Beloni <beloni@ossystems.com.br>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __SERIAL_CONSTANTS_H
#define __SERIAL_CONSTANTS_H

/* http://www.codeproject.com/KB/system/chaiyasit_t.aspx */
#define SERIAL_TIMEOUT_MAX 4294967295u

/* DR_CONTROL_REQ.IoControlCode */
enum DR_PORT_CONTROL_REQ
{
	IOCTL_SERIAL_SET_BAUD_RATE = 0x001B0004,
	IOCTL_SERIAL_GET_BAUD_RATE = 0x001B0050,
	IOCTL_SERIAL_SET_LINE_CONTROL = 0x001B000C,
	IOCTL_SERIAL_GET_LINE_CONTROL = 0x001B0054,
	IOCTL_SERIAL_SET_TIMEOUTS = 0x001B001C,
	IOCTL_SERIAL_GET_TIMEOUTS = 0x001B0020,

/* GET_CHARS and SET_CHARS are swapped in the RDP docs [MS-RDPESP] */
	IOCTL_SERIAL_GET_CHARS = 0x001B0058,
	IOCTL_SERIAL_SET_CHARS = 0x001B005C,

	IOCTL_SERIAL_SET_DTR = 0x001B0024,
	IOCTL_SERIAL_CLR_DTR = 0x001B0028,
	IOCTL_SERIAL_RESET_DEVICE = 0x001B002C,
	IOCTL_SERIAL_SET_RTS = 0x001B0030,
	IOCTL_SERIAL_CLR_RTS = 0x001B0034,
	IOCTL_SERIAL_SET_XOFF = 0x001B0038,
	IOCTL_SERIAL_SET_XON = 0x001B003C,
	IOCTL_SERIAL_SET_BREAK_ON = 0x001B0010,
	IOCTL_SERIAL_SET_BREAK_OFF = 0x001B0014,
	IOCTL_SERIAL_SET_QUEUE_SIZE = 0x001B0008,
	IOCTL_SERIAL_GET_WAIT_MASK = 0x001B0040,
	IOCTL_SERIAL_SET_WAIT_MASK = 0x001B0044,
	IOCTL_SERIAL_WAIT_ON_MASK = 0x001B0048,
	IOCTL_SERIAL_IMMEDIATE_CHAR = 0x001B0018,
	IOCTL_SERIAL_PURGE = 0x001B004C,
	IOCTL_SERIAL_GET_HANDFLOW = 0x001B0060,
	IOCTL_SERIAL_SET_HANDFLOW = 0x001B0064,
	IOCTL_SERIAL_GET_MODEMSTATUS = 0x001B0068,
	IOCTL_SERIAL_GET_DTRRTS = 0x001B0078,

/* according to [MS-RDPESP] it should be 0x001B0084, but servers send 0x001B006C */
	IOCTL_SERIAL_GET_COMMSTATUS = 0x001B006C,

	IOCTL_SERIAL_GET_PROPERTIES = 0x001B0074,
	IOCTL_SERIAL_XOFF_COUNTER = 0x001B0070,
	IOCTL_SERIAL_LSRMST_INSERT = 0x001B007C,
	IOCTL_SERIAL_CONFIG_SIZE = 0x001B0080,
	IOCTL_SERIAL_GET_STATS = 0x001B008C,
	IOCTL_SERIAL_CLEAR_STATS = 0x001B0090,
	IOCTL_SERIAL_GET_MODEM_CONTROL = 0x001B0094,
	IOCTL_SERIAL_SET_MODEM_CONTROL = 0x001B0098,
	IOCTL_SERIAL_SET_FIFO_CONTROL = 0x001B009C,
};

enum SERIAL_PURGE_MASK
{
	SERIAL_PURGE_TXABORT = 0x00000001,
	SERIAL_PURGE_RXABORT = 0x00000002,
	SERIAL_PURGE_TXCLEAR = 0x00000004,
	SERIAL_PURGE_RXCLEAR = 0x00000008,
};

enum SERIAL_WAIT_MASK
{
	SERIAL_EV_RXCHAR = 0x0001,	/* Any Character received */
	SERIAL_EV_RXFLAG = 0x0002,	/* Received certain character */
	SERIAL_EV_TXEMPTY = 0x0004,	/* Transmitt Queue Empty */
	SERIAL_EV_CTS = 0x0008,		/* CTS changed state */
	SERIAL_EV_DSR = 0x0010,		/* DSR changed state */
	SERIAL_EV_RLSD = 0x0020,	/* RLSD changed state */
	SERIAL_EV_BREAK = 0x0040,	/* BREAK received */
	SERIAL_EV_ERR = 0x0080,		/* Line status error occurred */
	SERIAL_EV_RING = 0x0100,	/* Ring signal detected */
	SERIAL_EV_PERR = 0x0200,	/* Printer error occured */
	SERIAL_EV_RX80FULL = 0x0400,/* Receive buffer is 80 percent full */
	SERIAL_EV_EVENT1 = 0x0800,	/* Provider specific event 1 */
	SERIAL_EV_EVENT2 = 0x1000,	/* Provider specific event 2 */
};

enum SERIAL_MODEM_STATUS
{
	SERIAL_MS_DTR = 0x01,
	SERIAL_MS_RTS = 0x02,
	SERIAL_MS_CTS = 0x10,
	SERIAL_MS_DSR = 0x20,
	SERIAL_MS_RNG = 0x40,
	SERIAL_MS_CAR = 0x80,
};

enum SERIAL_HANDFLOW
{
	SERIAL_DTR_CONTROL = 0x01,
	SERIAL_CTS_HANDSHAKE = 0x08,
	SERIAL_ERROR_ABORT = 0x80000000,
};

enum SERIAL_FLOW_CONTROL
{
	SERIAL_XON_HANDSHAKE = 0x01,
	SERIAL_XOFF_HANDSHAKE = 0x02,
	SERIAL_DSR_SENSITIVITY = 0x40,
};

enum SERIAL_CHARS
{
	SERIAL_CHAR_EOF = 0,
	SERIAL_CHAR_ERROR = 1,
	SERIAL_CHAR_BREAK = 2,
	SERIAL_CHAR_EVENT = 3,
	SERIAL_CHAR_XON = 4,
	SERIAL_CHAR_XOFF = 5,
};

enum SERIAL_ABORT_IO
{
	SERIAL_ABORT_IO_NONE = 0,
	SERIAL_ABORT_IO_WRITE = 1,
	SERIAL_ABORT_IO_READ = 2,
};

enum SERIAL_STOP_BITS
{
	SERIAL_STOP_BITS_1 = 0,
	SERIAL_STOP_BITS_2 = 2,
};

enum SERIAL_PARITY
{
	SERIAL_NO_PARITY = 0,
	SERIAL_ODD_PARITY = 1,
	SERIAL_EVEN_PARITY = 2,
};

#endif
