diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h index aa0cfb0..d0aa603 100644 --- a/include/mraa_adv_func.h +++ b/include/mraa_adv_func.h @@ -110,4 +110,14 @@ typedef struct { mraa_result_t (*uart_init_pre) (int index); mraa_result_t (*uart_init_post) (mraa_uart_context uart); + mraa_result_t (*uart_init_raw_replace) (mraa_uart_context dev, const char* path); + mraa_result_t (*uart_flush_replace) (mraa_uart_context dev); + mraa_result_t (*uart_set_baudrate_replace) (mraa_uart_context dev, unsigned int baud); + mraa_result_t (*uart_set_mode_replace) (mraa_uart_context dev, int bytesize, mraa_uart_parity_t parity, int stopbits); + mraa_result_t (*uart_set_flowcontrol_replace) (mraa_uart_context dev, mraa_boolean_t xonxoff, mraa_boolean_t rtscts); + mraa_result_t (*uart_set_timeout_replace) (mraa_uart_context dev, int read, int write, int interchar); + mraa_result_t (*uart_set_non_blocking_replace) (mraa_uart_context dev, mraa_boolean_t nonblock); + int (*uart_read_replace) (mraa_uart_context dev, char* buf, size_t len); + int (*uart_write_replace)(mraa_uart_context dev, const char* buf, size_t len); + mraa_boolean_t (*uart_data_available_replace) (mraa_uart_context dev, unsigned int millis); } mraa_adv_func_t; diff --git a/src/uart/uart.c b/src/uart/uart.c index 428142e..97153e7 100644 --- a/src/uart/uart.c +++ b/src/uart/uart.c @@ -217,6 +217,15 @@ mraa_uart_init_raw(const char* path) } dev->path = path; + if (IS_FUNC_DEFINED(dev, uart_init_raw_replace)) { + status = dev->advance_func->uart_init_raw_replace(dev, path); + if (status == MRAA_SUCCESS) { + return dev; + } else { + goto init_raw_cleanup; + } + } + // now open the device if ((dev->fd = open(dev->path, O_RDWR)) == -1) { syslog(LOG_ERR, "uart: open(%s) failed: %s", path, strerror(errno)); @@ -289,6 +298,10 @@ mraa_uart_flush(mraa_uart_context dev) return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, uart_flush_replace)) { + return dev->advance_func->uart_flush_replace(dev); + } + if (tcdrain(dev->fd) == -1) { return MRAA_ERROR_FEATURE_NOT_SUPPORTED; } @@ -304,6 +317,10 @@ mraa_uart_set_baudrate(mraa_uart_context dev, unsigned int baud) return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, uart_set_baudrate_replace)) { + return dev->advance_func->uart_set_baudrate_replace(dev, baud); + } + struct termios termio; if (tcgetattr(dev->fd, &termio)) { syslog(LOG_ERR, "uart%i: set_baudrate: tcgetattr() failed: %s", dev->index, strerror(errno)); @@ -336,6 +353,10 @@ mraa_uart_set_mode(mraa_uart_context dev, int bytesize, mraa_uart_parity_t parit return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, uart_set_mode_replace)) { + return dev->advance_func->uart_set_mode_replace(dev, bytesize, parity, stopbits); + } + struct termios termio; if (tcgetattr(dev->fd, &termio)) { syslog(LOG_ERR, "uart%i: set_mode: tcgetattr() failed: %s", dev->index, strerror(errno)); @@ -408,6 +429,10 @@ mraa_uart_set_flowcontrol(mraa_uart_context dev, mraa_boolean_t xonxoff, mraa_bo return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, uart_set_flowcontrol_replace)) { + return dev->advance_func->uart_set_flowcontrol_replace(dev, xonxoff, rtscts); + } + // hardware flow control int action = TCIOFF; if (xonxoff) { @@ -448,6 +473,10 @@ mraa_uart_set_timeout(mraa_uart_context dev, int read, int write, int interchar) return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, uart_set_timeout_replace)) { + return dev->advance_func->uart_set_timeout_replace(dev, read, write, interchar); + } + struct termios termio; // get current modes if (tcgetattr(dev->fd, &termio)) { @@ -477,6 +506,10 @@ mraa_uart_set_non_blocking(mraa_uart_context dev, mraa_boolean_t nonblock) return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, uart_set_non_blocking_replace)) { + return dev->advance_func->uart_set_non_blocking_replace(dev, nonblock); + } + // get current flags int flags = fcntl(dev->fd, F_GETFL); @@ -517,6 +550,10 @@ mraa_uart_read(mraa_uart_context dev, char* buf, size_t len) return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, uart_read_replace)) { + return dev->advance_func->uart_read_replace(dev, buf, len); + } + if (dev->fd < 0) { syslog(LOG_ERR, "uart%i: read: port is not open", dev->index); return MRAA_ERROR_INVALID_RESOURCE; @@ -533,6 +570,10 @@ mraa_uart_write(mraa_uart_context dev, const char* buf, size_t len) return MRAA_ERROR_INVALID_HANDLE; } + if (IS_FUNC_DEFINED(dev, uart_write_replace)) { + return dev->advance_func->uart_write_replace(dev, buf, len); + } + if (dev->fd < 0) { syslog(LOG_ERR, "uart%i: write: port is not open", dev->index); return MRAA_ERROR_INVALID_RESOURCE; @@ -549,6 +590,10 @@ mraa_uart_data_available(mraa_uart_context dev, unsigned int millis) return 0; } + if (IS_FUNC_DEFINED(dev, uart_data_available_replace)) { + return dev->advance_func->uart_data_available_replace(dev, millis); + } + if (dev->fd < 0) { syslog(LOG_ERR, "uart%i: data_available: port is not open", dev->index); return 0;