]> sigrok.org Git - libsigrok.git/blobdiff - src/serial_libsp.c
output/csv: use intermediate time_t var, silence compiler warning
[libsigrok.git] / src / serial_libsp.c
index 0ceb8b0d8ff291def4983180d3290e972a21e772..7cf5a4602efbea26aef1a58886ca1667625bed8c 100644 (file)
@@ -31,9 +31,7 @@
 #include <windows.h> /* for HANDLE */
 #endif
 
-/** @cond PRIVATE */
 #define LOG_PREFIX "serial-libsp"
-/** @endcond */
 
 /**
  * @file
@@ -41,6 +39,8 @@
  * Serial port handling, wraps the external libserialport dependency.
  */
 
+#ifdef HAVE_LIBSERIALPORT
+
 /**
  * @defgroup grp_serial_libsp Serial port handling, libserialport group
  *
  * @{
  */
 
-SR_PRIV int sr_ser_libsp_open(struct sr_serial_dev_inst *serial, int flags)
+static int sr_ser_libsp_open(struct sr_serial_dev_inst *serial, int flags)
 {
        int ret;
        char *error;
        int sp_flags;
 
-       sp_get_port_by_name(serial->port, &serial->sp_data);
+       ret = sp_get_port_by_name(serial->port, &serial->sp_data);
+       if (ret != SP_OK) {
+               error = sp_last_error_message();
+               sr_err("Error getting port from name %s: (%d) %s.",
+                       serial->port, sp_last_error_code(), error);
+               sp_free_error_message(error);
+               return SR_ERR;
+       }
 
        sp_flags = 0;
        if (flags & SERIAL_RDWR)
@@ -80,7 +87,7 @@ SR_PRIV int sr_ser_libsp_open(struct sr_serial_dev_inst *serial, int flags)
        return SR_OK;
 }
 
-SR_PRIV int sr_ser_libsp_close(struct sr_serial_dev_inst *serial)
+static int sr_ser_libsp_close(struct sr_serial_dev_inst *serial)
 {
        int ret;
        char *error;
@@ -110,7 +117,7 @@ SR_PRIV int sr_ser_libsp_close(struct sr_serial_dev_inst *serial)
        return SR_OK;
 }
 
-SR_PRIV int sr_ser_libsp_flush(struct sr_serial_dev_inst *serial)
+static int sr_ser_libsp_flush(struct sr_serial_dev_inst *serial)
 {
        int ret;
        char *error;
@@ -137,7 +144,7 @@ SR_PRIV int sr_ser_libsp_flush(struct sr_serial_dev_inst *serial)
        return SR_OK;
 }
 
-SR_PRIV int sr_ser_libsp_drain(struct sr_serial_dev_inst *serial)
+static int sr_ser_libsp_drain(struct sr_serial_dev_inst *serial)
 {
        int ret;
        char *error;
@@ -160,7 +167,7 @@ SR_PRIV int sr_ser_libsp_drain(struct sr_serial_dev_inst *serial)
        return SR_OK;
 }
 
-SR_PRIV int sr_ser_libsp_write(struct sr_serial_dev_inst *serial,
+static int sr_ser_libsp_write(struct sr_serial_dev_inst *serial,
        const void *buf, size_t count,
        int nonblocking, unsigned int timeout_ms)
 {
@@ -191,7 +198,7 @@ SR_PRIV int sr_ser_libsp_write(struct sr_serial_dev_inst *serial,
        return ret;
 }
 
-SR_PRIV int sr_ser_libsp_read(struct sr_serial_dev_inst *serial,
+static int sr_ser_libsp_read(struct sr_serial_dev_inst *serial,
        void *buf, size_t count,
        int nonblocking, unsigned int timeout_ms)
 {
@@ -222,7 +229,7 @@ SR_PRIV int sr_ser_libsp_read(struct sr_serial_dev_inst *serial,
        return ret;
 }
 
-SR_PRIV int sr_ser_libsp_set_params(struct sr_serial_dev_inst *serial,
+static int sr_ser_libsp_set_params(struct sr_serial_dev_inst *serial,
        int baudrate, int bits, int parity, int stopbits,
        int flowcontrol, int rts, int dtr)
 {
@@ -280,13 +287,35 @@ SR_PRIV int sr_ser_libsp_set_params(struct sr_serial_dev_inst *serial,
        return SR_OK;
 }
 
-/** @cond PRIVATE */
+static int sr_ser_libsp_set_handshake(struct sr_serial_dev_inst *serial,
+       int rts, int dtr)
+{
+       int ret;
+
+       if (!serial->sp_data) {
+               sr_dbg("Cannot configure unopened serial port %s.", serial->port);
+               return SR_ERR;
+       }
+
+       if (rts >= 0) {
+               ret = sp_set_rts(serial->sp_data, rts ? SP_RTS_ON : SP_RTS_OFF);
+               if (ret != SP_OK)
+                       return SR_ERR;
+       }
+       if (dtr >= 0) {
+               ret = sp_set_dtr(serial->sp_data, dtr ? SP_DTR_ON : SP_DTR_OFF);
+               if (ret != SP_OK)
+                       return SR_ERR;
+       }
+
+       return SR_OK;
+}
+
 #ifdef G_OS_WIN32
 typedef HANDLE event_handle;
 #else
 typedef int event_handle;
 #endif
-/** @endcond */
 
 static int sr_ser_libsp_source_add_int(struct sr_serial_dev_inst *serial,
        int events,
@@ -354,7 +383,7 @@ static int sr_ser_libsp_source_add_int(struct sr_serial_dev_inst *serial,
        return SR_OK;
 }
 
-SR_PRIV int sr_ser_libsp_source_add(struct sr_session *session,
+static int sr_ser_libsp_source_add(struct sr_session *session,
        struct sr_serial_dev_inst *serial, int events, int timeout,
        sr_receive_data_callback cb, void *cb_data)
 {
@@ -373,7 +402,7 @@ SR_PRIV int sr_ser_libsp_source_add(struct sr_session *session,
                timeout, cb, cb_data);
 }
 
-SR_PRIV int sr_ser_libsp_source_remove(struct sr_session *session,
+static int sr_ser_libsp_source_remove(struct sr_session *session,
        struct sr_serial_dev_inst *serial)
 {
        void *key;
@@ -382,7 +411,7 @@ SR_PRIV int sr_ser_libsp_source_remove(struct sr_session *session,
        return sr_session_source_remove_internal(session, key);
 }
 
-SR_PRIV GSList *sr_ser_libsp_list(GSList *list, sr_ser_list_append_t append)
+static GSList *sr_ser_libsp_list(GSList *list, sr_ser_list_append_t append)
 {
        struct sp_port **ports;
        size_t i;
@@ -403,7 +432,7 @@ SR_PRIV GSList *sr_ser_libsp_list(GSList *list, sr_ser_list_append_t append)
        return list;
 }
 
-SR_PRIV GSList *sr_ser_libsp_find_usb(GSList *list, sr_ser_find_append_t append,
+static GSList *sr_ser_libsp_find_usb(GSList *list, sr_ser_find_append_t append,
        uint16_t vendor_id, uint16_t product_id)
 {
        struct sp_port **ports;
@@ -429,7 +458,7 @@ SR_PRIV GSList *sr_ser_libsp_find_usb(GSList *list, sr_ser_find_append_t append,
        return list;
 }
 
-SR_PRIV int sr_ser_libsp_get_frame_format(struct sr_serial_dev_inst *serial,
+static int sr_ser_libsp_get_frame_format(struct sr_serial_dev_inst *serial,
        int *baud, int *bits)
 {
        struct sp_port_config *config;
@@ -473,3 +502,41 @@ SR_PRIV int sr_ser_libsp_get_frame_format(struct sr_serial_dev_inst *serial,
 
        return ret;
 }
+
+static size_t sr_ser_libsp_get_rx_avail(struct sr_serial_dev_inst *serial)
+{
+       int rc;
+
+       if (!serial)
+               return 0;
+
+       rc = sp_input_waiting(serial->sp_data);
+       if (rc < 0)
+               return 0;
+
+       return rc;
+}
+
+static struct ser_lib_functions serlib_sp = {
+       .open = sr_ser_libsp_open,
+       .close = sr_ser_libsp_close,
+       .flush = sr_ser_libsp_flush,
+       .drain = sr_ser_libsp_drain,
+       .write = sr_ser_libsp_write,
+       .read = sr_ser_libsp_read,
+       .set_params = sr_ser_libsp_set_params,
+       .set_handshake = sr_ser_libsp_set_handshake,
+       .setup_source_add = sr_ser_libsp_source_add,
+       .setup_source_remove = sr_ser_libsp_source_remove,
+       .list = sr_ser_libsp_list,
+       .find_usb = sr_ser_libsp_find_usb,
+       .get_frame_format = sr_ser_libsp_get_frame_format,
+       .get_rx_avail = sr_ser_libsp_get_rx_avail,
+};
+SR_PRIV struct ser_lib_functions *ser_lib_funcs_libsp = &serlib_sp;
+
+#else
+
+SR_PRIV struct ser_lib_functions *ser_lib_funcs_libsp = NULL;
+
+#endif