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;
}
CN0357 - Toxic gas measurement
CN0216 - Weight Scale