Hi,

See my previous mail regarding the libserialport patch.

About the Vala binding:

I'm not very familiar with the language or with vapi files - I know of
Vala and I like the idea of it, but have yet to use it for a project. So
excuse my ignorance in the following comments:

Firstly one comment reading through is that I note you have all methods
returning a Return enum. Is it possible to implement these as exceptions
instead, by declaring Return as an errordomain rather than an enum? By
my understanding of the documentation, this would allow writing
libserialport calls within a try/catch block rather than having to check
the result of each one.

Secondly, what should be done with this file? Should we integrate it
into the libserialport repository or is there somewhere else that makes
sense for it to be maintained?

Regards,


Martin

On Fri, Oct 31, 2014 at 06:01:57PM +0800, Matrix wrote:
> 
> 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




------------------------------------------------------------------------------
_______________________________________________
sigrok-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to