#pragma once

/*! \file soft_uart.h
 *  Software UART implementation. */
/*
 * (C) 2022 by Harald Welte <laforge@gnumonks.org>
 *
 * All Rights Reserved
 *
 * SPDX-License-Identifier: GPL-2.0+
 *
 * 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 2 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.
 *
 */

#include <stdint.h>
#include <osmocom/core/bits.h>
#include <osmocom/core/msgb.h>

enum osmo_soft_uart_parity_mode {
	OSMO_SUART_PARITY_NONE,
	OSMO_SUART_PARITY_EVEN,
	OSMO_SUART_PARITY_ODD,
	OSMO_SUART_PARITY_MARK,		/* always 1 */
	OSMO_SUART_PARITY_SPACE,	/* always 0 */
	_OSMO_SUART_PARITY_NUM
};

enum osmo_soft_uart_flags {
	OSMO_SUART_F_FRAMING_ERROR	= (1 << 0),
	OSMO_SUART_F_PARITY_ERROR	= (1 << 1),
	OSMO_SUART_F_BREAK		= (1 << 2),
};

#if 0
enum osmo_soft_uart_status {
	/* RTS, CTS, ... */
	_fixme,
};
#endif

/* configuration for a soft-uart */
struct osmo_soft_uart_cfg {
	/*! number of data bits (typically 5, 6, 7 or 8) */
	uint8_t num_data_bits;
	/*! number of stop bots (typically 1 or 2) */
	uint8_t num_stop_bits;
	/*! parity mode (none, even, odd) */
	enum osmo_soft_uart_parity_mode parity_mode;
	/*! size of receive buffer; UART will buffer up to that number of characters
	 *  before calling the receive call-back */
	unsigned int rx_buf_size;
	/*! receive timeout; UART will flush receive buffer via the receive call-back
	 * after indicated number of milli-seconds even if it is not full yet */
	unsigned int rx_timeout_ms;

	/*! opaque application-private data; passed to call-backs */
	void *priv;

	/*! receive call-back. Either rx_buf_size characters were received or rx_timeout_ms
	 * expired, or an error flag was detected (related to last byte received).
	 * 'flags' is a bit-mask of osmo_soft_uart_flags,  */
	void (*rx_cb)(void *priv, struct msgb *rx_data, unsigned int flags);

	/*! transmit call-back. The implementation is expected to provide at most
	 * tx_data->data_len characters (the actual amount is detetmined by the
	 * number of requested bits and the effective UART configuration). */
	void (*tx_cb)(void *priv, struct msgb *tx_data);

	/*! modem status line change call-back. gets bitmask of osmo_soft_uart_status */
	void (*status_change_cb)(void *priv, unsigned int status);
};

extern const struct osmo_soft_uart_cfg osmo_soft_uart_default_cfg;

struct osmo_soft_uart;

struct osmo_soft_uart *osmo_soft_uart_alloc(void *ctx, const char *name,
					    const struct osmo_soft_uart_cfg *cfg);
void osmo_soft_uart_free(struct osmo_soft_uart *suart);
int osmo_soft_uart_configure(struct osmo_soft_uart *suart, const struct osmo_soft_uart_cfg *cfg);
int osmo_soft_uart_set_rx(struct osmo_soft_uart *suart, bool enable);
int osmo_soft_uart_set_tx(struct osmo_soft_uart *suart, bool enable);

int osmo_soft_uart_rx_ubits(struct osmo_soft_uart *suart, const ubit_t *ubits, size_t n_ubits);
int osmo_soft_uart_tx_ubits(struct osmo_soft_uart *suart, ubit_t *ubits, size_t n_ubits);

int osmo_soft_uart_set_status(struct osmo_soft_uart *suart, unsigned int status);
void osmo_soft_uart_flush_rx(struct osmo_soft_uart *suart);
