* Copyright (C) 2010-2012 Bert Vermeulen <bert@biot.com>
* Copyright (C) 2010-2012 Uwe Hermann <uwe@hermann-uwe.de>
* Copyright (C) 2012 Alexandru Gagniuc <mr.nuke.me@gmail.com>
+ * Copyright (C) 2014 Uffe Jakobsen <uffe@uffe.org>
*
* 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
return SR_OK;
}
+/**
+ * Drain serial port buffers.
+ *
+ * @param serial Previously initialized serial port structure.
+ *
+ * @retval SR_OK Success.
+ * @retval SR_ERR Failure.
+ */
+SR_PRIV int serial_drain(struct sr_serial_dev_inst *serial)
+{
+ int ret;
+ char *error;
+
+ if (!serial) {
+ sr_dbg("Invalid serial port.");
+ return SR_ERR;
+ }
+
+ if (!serial->data) {
+ sr_dbg("Cannot drain unopened serial port %s.", serial->port);
+ return SR_ERR;
+ }
+
+ sr_spew("Draining serial port %s.", serial->port);
+
+ ret = sp_drain(serial->data);
+
+ if (ret == SP_ERR_FAIL) {
+ error = sp_last_error_message();
+ sr_err("Error draining port (%d): %s.",
+ sp_last_error_code(), error);
+ sp_free_error_message(error);
+ return SR_ERR;
+ }
+
+ return SR_OK;
+}
+
static int _serial_write(struct sr_serial_dev_inst *serial,
const void *buf, size_t count, int nonblocking, unsigned int timeout_ms)
{
sp_free_port_list(ports);
return tty_devs;
}
+
+SR_PRIV int serial_timeout(struct sr_serial_dev_inst *port, int num_bytes)
+{
+ struct sp_port_config *config;
+ int timeout_ms, bits, baud, tmp;
+
+ /* Default to 1s. */
+ timeout_ms = 1000;
+
+ if (sp_new_config(&config) < 0)
+ return timeout_ms;
+
+ bits = baud = 0;
+ do {
+ if (sp_get_config(port->data, config) < 0)
+ break;
+
+ /* Start bit. */
+ bits = 1;
+ if (sp_get_config_bits(config, &tmp) < 0)
+ break;
+ bits += tmp;
+ if (sp_get_config_stopbits(config, &tmp) < 0)
+ break;
+ bits += tmp;
+ if (sp_get_config_baudrate(config, &tmp) < 0)
+ break;
+ baud = tmp;
+ } while (FALSE);
+
+ if (bits && baud) {
+ /* Throw in 10ms for misc OS overhead. */
+ timeout_ms = 10;
+ timeout_ms += ((1000.0 / baud) * bits) * num_bytes;
+ }
+
+ sp_free_config(config);
+
+ return timeout_ms;
+}