A collection of Analog Devices drivers for the mbed platform

For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all

libraries/libserialport/libserialport_fake.c

Committer:
Paul Cercueil
Date:
2016-05-24
Revision:
27:3c32495708f4

File content as of revision 27:3c32495708f4:

/*
 * Libserialport-fake
 *
 * This program 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.
 *
 * 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.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <string.h>

#include <mbed/serial_api.h>

#include "libserialport.h"

struct sp_port {
	serial_t uart;
	int data_bits, stop_bits;
	SerialParity parity;
	char *name, *description;
};

static struct sp_port sp_ports[5];

static void init_port(struct sp_port *port, PinName tx, PinName rx,
		char *name, char *description)
{
	serial_init(&port->uart, tx, rx);
	serial_pinout_tx(tx);

	port->data_bits = 8;
	port->stop_bits = 1;
	port->parity = ParityNone;
	port->name = name;
	port->description = description;
}

enum sp_return sp_get_port_by_name(const char *portname,
		struct sp_port **port_ptr)
{
	if (!strcmp(portname, "USB") || !strcmp(portname, "UART0")) {
		init_port(&sp_ports[0], USBTX, USBRX, "UART0", "USB UART");
		*port_ptr = &sp_ports[0];
		return SP_OK;
	}

	if (!strcmp(portname, "UART3")) {
		init_port(&sp_ports[3], PTC17, PTC16, "UART3", "Arduino UART");
		*port_ptr = &sp_ports[3];
		return SP_OK;
	}

	return SP_ERR_ARG;
}

void sp_free_port(struct sp_port *port)
{
	serial_free(&port->uart);
}

enum sp_return sp_open(struct sp_port *port, enum sp_mode flags)
{
	if (flags != SP_MODE_READ_WRITE)
		return SP_ERR_SUPP;
	else
		return SP_OK;
}

enum sp_return sp_close(struct sp_port *port)
{
	return SP_OK;
}

enum sp_return sp_set_baudrate(struct sp_port *port, int baudrate)
{
	serial_baud(&port->uart, baudrate);
	return SP_OK;
}

enum sp_return sp_set_bits(struct sp_port *port, int bits)
{
	port->data_bits = bits;
	serial_format(&port->uart, bits, port->parity, port->stop_bits);
	return SP_OK;
}

enum sp_return sp_set_stopbits(struct sp_port *port, int stopbits)
{
	port->stop_bits = stopbits;
	serial_format(&port->uart, port->data_bits, port->parity, stopbits);
	return SP_OK;
}

enum sp_return sp_set_parity(struct sp_port *port, enum sp_parity parity)
{
	switch (parity) {
	case SP_PARITY_NONE:
		port->parity = ParityNone;
		break;
	case SP_PARITY_ODD:
		port->parity = ParityOdd;
		break;
	case SP_PARITY_EVEN:
		port->parity = ParityEven;
		break;
	default:
		return SP_ERR_SUPP;
	}

	serial_format(&port->uart, port->data_bits,
			port->parity, port->stop_bits);
	return SP_OK;
}

enum sp_return sp_set_flowcontrol(
		struct sp_port *port, enum sp_flowcontrol flow)
{
	if (flow != SP_FLOWCONTROL_NONE)
		return SP_ERR_SUPP;

#if 0
	/* This function is in serial_api.h, but it's not implemented anywhere */
	serial_set_flow_control(&port->uart, FlowControlNone, NC, NC);
#endif
	return SP_OK;
}

enum sp_return sp_flush(struct sp_port *port, enum sp_buffer buffers)
{
	if (buffers == SP_BUF_BOTH)
		serial_clear(&port->uart);
	return SP_OK;
}

char *sp_get_port_name(const struct sp_port *port)
{
	return port->name;
}

char *sp_get_port_description(const struct sp_port *port)
{
	return port->description;
}

enum sp_return sp_blocking_write(struct sp_port *port, const void *buf,
		size_t count, unsigned int timeout_ms)
{
	size_t i;
	const unsigned char *ptr = buf;

	for (i = 0; i < count; i++)
		serial_putc(&port->uart, (int) ptr[i]);

	return count;
}

enum sp_return sp_blocking_read_next(struct sp_port *port, void *buf,
		size_t count, unsigned int timeout_ms)
{
	if (count == 0)
		return SP_ERR_ARG;

	*(char *) buf = (char) serial_getc(&port->uart);
	return 1;
}

int sp_last_error_code(void)
{
	return 42;
}