diff options
author | Martin Peach <mrpeach@users.sourceforge.net> | 2006-09-26 04:12:11 +0000 |
---|---|---|
committer | Martin Peach <mrpeach@users.sourceforge.net> | 2006-09-26 04:12:11 +0000 |
commit | a746afaa35d46ff27a4c770142b6f0fa171e4470 (patch) | |
tree | e6f3f13fd642df2eee5891421af8578be7be8d66 /comport | |
parent | 766a32ebce6dce98c9bee04ed443a517d6e9ddc8 (diff) |
added devices message to enumerate available devices
info message outputs realtime status
svn path=/trunk/externals/iem/comport/; revision=6028
Diffstat (limited to 'comport')
-rw-r--r-- | comport/comport.c | 92 |
1 files changed, 54 insertions, 38 deletions
diff --git a/comport/comport.c b/comport/comport.c index 463e981..1992132 100644 --- a/comport/comport.c +++ b/comport/comport.c @@ -12,6 +12,7 @@ MP 20060621 Do all the above for Windows too. MP 20060709 All status goes out the status outlet when an info message is received MP 20060824 added clock_delay call in comport_devicename MP 20060924 added comport_enum to list available ports in Windows +MP 20060925 add devices message to enumerate actual devices, info just outputs current port state */ #include "m_pd.h" @@ -194,12 +195,11 @@ static int set_rts(t_comport *x, int nr); static int set_xonxoff(t_comport *x, int nr); static int set_serial(t_comport *x); static int write_serial(t_comport *x, unsigned char serial_byte); -int comport_get_dsr(t_comport *x); -int comport_get_cts(t_comport *x); +static int comport_get_dsr(t_comport *x); +static int comport_get_cts(t_comport *x); #ifdef _WIN32 static HANDLE open_serial(unsigned int com_num, t_comport *x); static HANDLE close_serial(t_comport *x); -static void comport_enum(void); #else static int open_serial(unsigned int com_num, t_comport *x); static int close_serial(t_comport *x); @@ -231,7 +231,9 @@ static void comport_output_stop_bits(t_comport *x); static void comport_output_data_bits(t_comport *x); static void comport_output_rtscts(t_comport *x); static void comport_output_xonxoff(t_comport *x); +static void comport_enum(t_comport *x); static void comport_info(t_comport *x); +static void comport_devices(t_comport *x); static void comport_verbose(t_comport *x, t_floatarg f); static void comport_help(t_comport *x); void comport_setup(void); @@ -537,7 +539,7 @@ static int write_serial(t_comport *x, unsigned char serial_byte) return 1; } -int comport_get_dsr(t_comport *x) +static int comport_get_dsr(t_comport *x) { short dsr_state = 0; if(x->comhandle != INVALID_HANDLE_VALUE) @@ -847,10 +849,10 @@ static int write_serial(t_comport *x, unsigned char serial_byte) */ } -int comport_get_dsr(t_comport *x) +static int comport_get_dsr(t_comport *x) { short dsr_state = 0; - + if (x->comhandle != INVALID_HANDLE_VALUE) { int status;/*dsr outlet*/ @@ -864,7 +866,7 @@ int comport_get_dsr(t_comport *x) int comport_get_cts(t_comport *x) { short cts_state = 0; - + if (x->comhandle != INVALID_HANDLE_VALUE) { int status;/*cts outlet*/ @@ -1239,9 +1241,9 @@ static void comport_print(t_comport *x, t_symbol *s, int argc, t_atom *argv) } } -#ifdef _WIN32 -static void comport_enum(void) +static void comport_enum(t_comport *x) { +#ifdef _WIN32 HANDLE fd; char device_name[10]; unsigned int i; @@ -1265,41 +1267,49 @@ static void comport_enum(void) if (dw == 0)post("\t%d - COM%d (free)", i, i); else if (dw == ERROR_ACCESS_DENIED)post("\t%d - COM%d (in use)", i, i); } -} -#endif // WIN32 - -static void comport_output_print(t_comport *x) -{ - unsigned int i; - - post("[comport]: available serial ports:"); -#ifdef _WIN32 - comport_enum(); -#else +#else + unsigned int i; glob_t glob_buffer; - switch( glob( x->serial_device_name, 0, NULL, &glob_buffer ) ) - { - case GLOB_NOSPACE: - error("[comport] out of memory for \"%s\"",x->serial_device_name); - break; + int fd; + struct termios test; + +/* first look for registered devices in the filesystem */ + switch( glob( x->serial_device_name, 0, NULL, &glob_buffer ) ) + { + case GLOB_NOSPACE: + error("[comport] out of memory for \"%s\"",x->serial_device_name); + break; # ifdef GLOB_ABORTED - case GLOB_ABORTED: - error("[comport] aborted \"%s\"",x->serial_device_name); - break; + case GLOB_ABORTED: + error("[comport] aborted \"%s\"",x->serial_device_name); + break; # endif /* GLOB_ABORTED */ # ifdef GLOB_NOMATCH - case GLOB_NOMATCH: - error("[comport] no serial devices found for \"%s\"",x->serial_device_name); - break; + case GLOB_NOMATCH: + error("[comport] no serial devices found for \"%s\"",x->serial_device_name); + break; # endif /* GLOB_NOMATCH */ - } - for(i=0; i<glob_buffer.gl_pathc; i++) - { - post("\t%d\t%s", i, glob_buffer.gl_pathv[i]); - } + } + for(i=0; i<glob_buffer.gl_pathc; i++) + { +/* now try to open the device */ + if((fd = open(glob_buffer.gl_pathv[i], OPENPARAMS)) != INVALID_HANDLE_VALUE) + { +/* now see if it has attributes */ + if ((tcgetattr(fd, &test)) != -1) + post("\t%d\t%s", i, glob_buffer.gl_pathv[i]);// this one really exists + close (fd); + } + } #endif /* _WIN32 */ } +static void comport_output_print(t_comport *x) +{ + post("[comport]: available serial ports:"); + comport_enum(x); +} + static void comport_output_status(t_comport *x, t_symbol *selector, t_float output_value) { @@ -1354,6 +1364,11 @@ static void comport_output_xonxoff(t_comport *x) comport_output_status(x, gensym("xonxoff"), x->xonxoff); } +static void comport_devices(t_comport *x) +{ + comport_output_print(x); +} + static void comport_info(t_comport *x) { comport_output_port_status(x); @@ -1365,7 +1380,6 @@ static void comport_info(t_comport *x) comport_output_data_bits(x); comport_output_rtscts(x); comport_output_xonxoff(x); - comport_output_print(x); } /* ---------------- HELPER ------------------------- */ @@ -1394,11 +1408,12 @@ static void comport_help(t_comport *x) " rts <0|1> ... set rts off|on\n" " close ... close device\n" " open <num> ... open device number num\n" - " devicename <d> ... set device name to s (eg. /dev/ttyS8)\n" + " devicename <d> ... set device name to d (eg. /dev/ttyS8)\n" " print <list> ... print list of atoms on serial\n" " pollintervall <t> ... set poll interval to t ticks\n" " verbose <level> ... for debug set verbosity to level\n" " info ... output info on status outlet\n" + " devices ... post list of available devices\n" " help ... post this help"); } @@ -1431,6 +1446,7 @@ void comport_setup(void) class_addmethod(comport_class, (t_method)comport_verbose, gensym("verbose"), A_FLOAT, 0); class_addmethod(comport_class, (t_method)comport_help, gensym("help"), 0); class_addmethod(comport_class, (t_method)comport_info, gensym("info"), 0); + class_addmethod(comport_class, (t_method)comport_devices, gensym("devices"), 0); #ifndef _WIN32 null_tv.tv_sec = 0; /* no wait */ |