Hi:

the attatchment is vala's bingding vapi file and a patch which make the library support vala's iterator for ports list...

    best regards...
using GLib;

[CCode (lower_case_cprefix = "", cheader_filename = "libserialport.h")]
namespace LibSerialPort
{   
    [CCode (cname = "int", cprefix = "SP_", has_type_id = "false")]
    public enum Return
    {
        OK,
        ERR_ARG,
        ERR_FAIL,
        ERR_MEM,
        ERR_SUPP
    }
    
    [CCode (cname = "int", cprefix = "SP_PARITY_", has_type_id = "false")]
    public enum Parity
    {
        INVALID,
        NONE,
        ODD,
        EVEN,
        MARK,
        SPACE
    }
    
    [CCode (cname = "int", cprefix = "SP_RTS_", has_type_id = "false")]
    public enum Rts
    {
        INVALID,
        OFF,
        ON,
        FLOW_CONTROL
    }
    
    [CCode (cname = "int", cprefix = "SP_CTS_", has_type_id = "false")]
    public enum Cts
    {
        INVALID,
        IGNORE,
        FLOW_CONTROL
    }
    
    [CCode (cname = "int", cprefix = "SP_DTR_", has_type_id = "false")]
    public enum Dtr
    {
        INVALID,
        OFF,
        ON,
        FLOW_CONTROL
    }
    
    [CCode (cname = "int", cprefix = "SP_DSR_", has_type_id = "false")]
    public enum Dsr
    {
        INVALID,
        IGNORE,
        FLOW_CONTROL
    }
    
    [CCode (cname = "int", cprefix = "SP_XONXOFF_", has_type_id = "false")]
    public enum XonXoff
    {
        INVALID,
        DISABLED,
        IN,
        OUT,
        INOUT
    }
    
    [CCode (cname = "int", cprefix = "SP_FLOWCONTROL_", has_type_id = "false")]
    public enum FlowControl
    {
        NONE,
        XONXOFF,
        RTSCTS,
        DTRDSR
    }
    
    [CCode (cname = "int", cprefix = "SP_MODE_", has_type_id = "false")]
    public enum OpenMode
    {
        READ,
        WRITE,
        READ_WRITE
    }
    
    [CCode (cname = "int", cprefix = "SP_EVENT_", has_type_id = "false")]
    public enum EventMask
    {
        RX_READY,
        TX_READY,
        ERROR
    }
    
    [CCode (cname = "enum sp_signal", cprefix = "SP_SIG_", has_type_id = "false")]
    public enum Signal
    {
        CTS,
        DSR,
        DCD,
        RI
    }
    
    [CCode (cname = "enum sp_transport", cprefix = "SP_TRANSPORT_", has_type_id = "false")]
    public enum Transport
    {
        NATIVE,
        USB,
        BLUETOOTH
    }
    
    [CCode (cname = "struct sp_port_config", free_function = "sp_free_config", has_type_id = "false")]
    [Compact]
    public class Config
    {
        [CCode (cname = "sp_new_config", has_type_id = "false")]
        public static Return @new(out Config? config);
        [CCode (cname = "sp_get_config_baudrate", has_type_id = "false")]
        public Return get_baudrate(out int baudrate);
        [CCode (cname = "sp_set_config_baudrate", has_type_id = "false")]
        public Return set_baudrate(int baudrate);
        [CCode (cname = "sp_get_config_bits", has_type_id = "false")]
        public Return get_bits(out int bits);
        [CCode (cname = "sp_set_config_bits", has_type_id = "false")]
        public Return set_bits(int bits);
        [CCode (cname = "sp_get_config_stopbits", has_type_id = "false")]
        public Return get_stopbits(out int stopbits);
        [CCode (cname = "sp_set_config_stopbits", has_type_id = "false")]
        public Return set_stopbits(int stopbits);
        [CCode (cname = "sp_get_config_parity", has_type_id = "false")]
        public Return get_parity(out Parity parity);
        [CCode (cname = "sp_set_config_parity", has_type_id = "false")]
        public Return set_parity(Parity parity);
        [CCode (cname = "sp_get_config_rts", has_type_id = "false")]
        public Return get_rts(out Rts rts);
        [CCode (cname = "sp_set_config_rts", has_type_id = "false")]
        public Return set_rts(Rts rts);
        [CCode (cname = "sp_get_config_cts", has_type_id = "false")]
        public Return get_cts(out Cts cts);
        [CCode (cname = "sp_set_config_cts", has_type_id = "false")]
        public Return set_cts(Cts cts);
        [CCode (cname = "sp_get_config_dtr", has_type_id = "false")]
        public Return get_dtr(out Dtr dtr);
        [CCode (cname = "sp_set_config_dtr", has_type_id = "false")]
        public Return set_dtr(Dtr dtr);
        [CCode (cname = "sp_get_config_dsr", has_type_id = "false")]
        public Return get_dsr(out Dsr dsr);
        [CCode (cname = "sp_set_config_dsr", has_type_id = "false")]
        public Return set_dsr(Dsr xonxoff);
        [CCode (cname = "sp_get_config_xon_xoff", has_type_id = "false")]
        public Return get_xonxoff(out XonXoff xonxoff);
        [CCode (cname = "sp_set_config_xon_xoff", has_type_id = "false")]
        public Return set_xonxoff(XonXoff xonxoff);
        [CCode (cname = "sp_set_config_flowcontrol", has_type_id = "false")]
        public Return set_flowcontrol(FlowControl flowcontrol);
    }
    
    [CCode (cname = "struct sp_event_set", free_function = "sp_free_event_set", has_type_id = "false")]
    [Compact]
    public class EventSet
    {
        [CCode (cname = "sp_new_event_set", has_type_id = "false")]
        public static Return @new(out EventSet? event_set);
        [CCode (cname = "sp_add_port_events", has_type_id = "false")]
        public Return add_port(Port port, EventMask mask);
        [CCode (cname = "sp_wait", has_type_id = "false")]
        public Return wait(uint timeout = 0);
    }
    
    [CCode (cname = "struct sp_port", free_function = "sp_free_port", has_type_id = "false")]
    [Compact]
    public class Port
    {
        [CCode (cname = "sp_get_port_by_name", has_type_id = "false")]
        public static Return new_by_name(string name, out Port? port);
        [CCode (cname = "sp_list_ports", has_type_id = "false")]
        public static int _enum ([CCode (array_length = false)] out Port[] a);
        public static Port[] @enum () 
        {
            Port[] temp;
            var len = _enum (out temp);
            temp.length = len;
            return (owned) temp;
        }
        [CCode (cname = "sp_open", has_type_id = "false")]
        public Return open(OpenMode mode);
        [CCode (cname = "sp_close", has_type_id = "false")]
        public Return close();
        [CCode (cname = "sp_get_port_transport", has_type_id = "false")]
        public Transport get_transport();
        [CCode (cname = "sp_get_port_usb_bus_address", has_type_id = "false")]
        public Return get_usb_bus_address(out int usb_bus, out int usb_address);
        [CCode (cname = "sp_get_port_usb_vid_pid", has_type_id = "false")]
        public Return get_usb_vid_pid(out int usb_vid, out int usb_pid);
        [CCode (cname = "sp_get_port_usb_manufacturer", has_type_id = "false")]
        public unowned string get_usb_manufacturer();
        [CCode (cname = "sp_get_port_usb_product", has_type_id = "false")]
        public unowned string get_usb_product();
        [CCode (cname = "sp_get_port_usb_serial", has_type_id = "false")]
        public unowned string get_usb_serial();
        [CCode (cname = "sp_get_port_bluetooth_address", has_type_id = "false")]
        public unowned string get_bluetooth_address();
        [CCode (cname = "sp_get_port_handle", has_type_id = "false")]
        public Return get_fd(out int fd);
        [CCode (cname = "sp_get_port_name", has_type_id = "false")]
        public unowned string name();
        [CCode (cname = "sp_get_config", has_type_id = "false")]
        public Return get_config(Config config);
        [CCode (cname = "sp_set_config", has_type_id = "false")]
        public Return set_config(Config config);
        [CCode (cname = "sp_set_baudrate", has_type_id = "false")]
        public Return set_baudrate(int baudrate);
        [CCode (cname = "sp_set_bits", has_type_id = "false")]
        public Return set_bits(int bits);
        [CCode (cname = "sp_set_parity", has_type_id = "false")]
        public Return set_parity(Parity parity);
        [CCode (cname = "sp_set_stopbits", has_type_id = "false")]
        public Return set_stopbits(int stopbits);
        [CCode (cname = "sp_set_rts", has_type_id = "false")]
        public Return set_rts(Rts rts);
        [CCode (cname = "sp_set_cts", has_type_id = "false")]
        public Return set_cts(Cts cts);
        [CCode (cname = "sp_set_dtr", has_type_id = "false")]
        public Return set_dtr(Dtr dtr);
        [CCode (cname = "sp_set_dsr", has_type_id = "false")]
        public Return set_dsr(Dsr dsr);
        [CCode (cname = "sp_set_xon_xoff", has_type_id = "false")]
        public Return set_xon_xoff(XonXoff xon_xoff);
        [CCode (cname = "sp_set_flowcontrol", has_type_id = "false")]
        public Return set_flowcontrol(FlowControl flowControl);
        [CCode (cname = "sp_blocking_read", has_type_id = "false")]
        public Return blocking_read(uint8[] buffer, uint timeout);
        [CCode (cname = "sp_nonblocking_read", has_type_id = "false")]
        public Return nonblocking_read(uint8[] buffer);
        [CCode (cname = "sp_blocking_write", has_type_id = "false")]
        public Return blocking_write(uint8[] buffer, uint timeout);
        [CCode (cname = "sp_nonblocking_write", has_type_id = "false")]
        public Return nonblocking_write(uint8[] buffer);
        [CCode (cname = "sp_input_waiting", has_type_id = "false")]
        public Return input_waiting();
        [CCode (cname = "sp_output_waiting", has_type_id = "false")]
        public Return output_waiting();
        [CCode (cname = "sp_get_signals", has_type_id = "false")]
        public Return get_signal(out Signal signals);
        [CCode (cname = "sp_flush", has_type_id = "false")]
        public Return flush(int mode);
        [CCode (cname = "sp_drain", has_type_id = "false")]
        public Return drain();
        [CCode (cname = "sp_start_break", has_type_id = "false")]
        public Return start_break();
        [CCode (cname = "sp_end_break", has_type_id = "false")]
        public Return end_break();
    }
}
diff -rupN libserialport/linux.c libserialport_new/linux.c
--- libserialport/linux.c	2014-10-31 15:25:43.261039272 +0800
+++ libserialport_new/linux.c	2014-10-31 16:28:34.493049124 +0800
@@ -169,6 +169,7 @@ SP_PRIV enum sp_return list_ports(struct
 	int len, fd;
 	DIR *dir;
 	int ret = SP_OK;
+	int count = 0;
 
 	DEBUG("Enumerating tty devices");
 	if (!(dir = opendir("/sys/class/tty")))
@@ -215,8 +216,11 @@ SP_PRIV enum sp_return list_ports(struct
 			SET_ERROR(ret, SP_ERR_MEM, "list append failed");
 			break;
 		}
+		
+		count++;
 	}
+	
 	closedir(dir);
 
-	return ret;
+	return (count > 0 ? count : ret);
 }
diff -rupN libserialport/serialport.c libserialport_new/serialport.c
--- libserialport/serialport.c	2014-10-31 15:25:43.261039272 +0800
+++ libserialport_new/serialport.c	2014-10-31 16:34:58.553050127 +0800
@@ -337,15 +337,15 @@ SP_API enum sp_return sp_list_ports(stru
 #endif
 
 	switch (ret) {
-	case SP_OK:
-		*list_ptr = list;
-		RETURN_OK();
 	case SP_ERR_SUPP:
 		DEBUG_ERROR(SP_ERR_SUPP, "Enumeration not supported on this platform");
 	default:
-		if (list)
+	    if(ret > 0) {
+	        *list_ptr = list;
+		} else if (list) {
 			sp_free_port_list(list);
-		*list_ptr = NULL;
+		    *list_ptr = NULL;
+		}
 		return ret;
 	}
 }
diff -rupN libserialport/windows.c libserialport_new/windows.c
--- libserialport/windows.c	2014-10-31 15:25:43.261039272 +0800
+++ libserialport_new/windows.c	2014-10-31 17:08:50.953055437 +0800
@@ -533,5 +533,5 @@ out_close:
 	RegCloseKey(key);
 out_done:
 
-	return ret;
+	return (index > 0 ? index : ret);
 }
------------------------------------------------------------------------------
_______________________________________________
sigrok-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to