aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--comport/comport-help.pd130
-rw-r--r--comport/comport.c73
2 files changed, 141 insertions, 62 deletions
diff --git a/comport/comport-help.pd b/comport/comport-help.pd
index c64e894..4b5b9b6 100644
--- a/comport/comport-help.pd
+++ b/comport/comport-help.pd
@@ -1,5 +1,5 @@
-#N canvas 95 38 746 619 10;
-#X obj 18 415 comport 1 9600;
+#N canvas 504 0 746 619 10;
+#X obj 18 436 comport 1 9600;
#X msg 13 189 66;
#X msg 7 147 64;
#X text 40 189 point;
@@ -14,17 +14,17 @@
#X msg 314 87 stopbit 0;
#X msg 314 113 parity 0;
#X text 381 112 parity 1=even \, -1=odd \, 0=off;
-#X text 392 86 extra stopbit 1=on \, 0=off;
+#X text 385 86 extra stopbit 1=on \, 0=off;
#X text 363 60 databits 5 \, 6 \, 7 \, 8;
-#X obj 43 394 r comctl;
-#X obj 199 447 s comctl;
+#X obj 56 414 r comctl;
+#X obj 245 438 s comctl;
#X text 394 138 use handshake xon/off 1=on 0=off;
-#X text 392 166 cts/rts hardwarehandshake 1=on 0=off;
+#X text 386 164 cts/rts hardwarehandshake 1=on 0=off;
#X msg 318 214 pollintervall 1;
-#X text 428 214 (default is 1 tick 1ms);
+#X text 428 213 (default is 1 tick 1ms);
#X msg 317 246 close;
#X msg 317 272 open 1;
-#X text 356 246 Close Serial port;
+#X text 356 245 Close Serial port;
#X msg 313 415 devicename /dev/ttyS1;
#X text 313 432 Danger !!! you can open every file in your system and
maybe if suid is root damage the system.;
@@ -34,50 +34,50 @@ maybe if suid is root damage the system.;
-1 -1 0 1;
#X floatatom 183 76 5 0 0 0 - - -;
#X text 60 35 you can send bytes directly (0-255):;
-#X text 360 272 Open serial port by number;
-#X text 473 416 open the serial port by name;
-#X msg 313 353 dtr \$1;
-#X obj 293 353 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
-1;
-#X obj 292 388 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
-1;
-#X msg 312 388 rts \$1;
-#X text 362 352 dtr output;
-#X text 361 388 rts output;
-#X msg 172 384 help;
-#X msg 313 323 verbose \$1;
-#X obj 294 323 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+#X text 364 271 Open serial port by number;
+#X text 473 414 open the serial port by name;
+#X msg 362 360 dtr \$1;
+#X obj 342 360 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -250685
+-1 0 1;
+#X obj 364 380 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -1 -1 0
1;
+#X msg 384 380 rts \$1;
+#X text 411 359 dtr output;
+#X text 433 379 rts output;
+#X msg 76 361 help;
+#X msg 342 339 verbose \$1;
+#X obj 323 339 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -250685
+-1 0 1;
#X text 377 197 set poll interval for read in ms;
#X msg 123 191 info;
#X floatatom 111 499 7 0 0 1 baud - -;
-#X floatatom 237 547 4 0 0 3 parity - -;
-#X floatatom 279 547 4 0 0 2 stop - -;
-#X floatatom 322 547 4 0 0 3 data - -;
-#X obj 526 498 print;
-#X floatatom 448 496 4 0 0 0 port - -;
-#X msg 136 291 devices;
+#X floatatom 214 540 4 0 0 3 parity - -;
+#X floatatom 249 540 4 0 0 2 stop - -;
+#X floatatom 283 539 4 0 0 3 data - -;
+#X obj 491 502 print;
+#X floatatom 387 502 4 0 0 0 port - -;
+#X msg 317 298 devices;
#X obj 141 74 % 255;
#X floatatom 149 95 5 0 0 0 - - -;
#X text 158 191 status list on right outlet;
-#X text 192 290 print available devices (wait for it...);
+#X text 375 297 print available devices (wait for it...);
#X text 393 -9 2006 Martin Peach;
#X obj 69 75 key;
#X obj 69 96 sel 0;
#X floatatom 58 119 5 0 0 0 ascii - -;
#X text 10 76 terminal:;
-#X msg 152 222 open 0;
-#X obj 364 514 tgl 15 0 empty empty rts/cts -10 20 1 11 -262144 -1
+#X msg 227 272 open 0;
+#X obj 318 505 tgl 15 0 empty empty rts/cts -10 20 1 11 -24198 -258699
-1 0 1;
-#X obj 406 514 tgl 15 0 empty empty xon/xoff -14 20 1 11 -262144 -1
+#X obj 352 530 tgl 15 0 empty empty xon/xoff -14 20 1 11 -24198 -258699
-1 0 1;
-#X text 87 546 serial packet format:;
-#X text 277 512 handshaking:;
-#X text 3 571 flow control inputs:;
-#X obj 153 572 tgl 15 0 empty empty dsr 0 20 1 11 -262144 -1 -1 0 1
-;
-#X obj 195 572 tgl 15 0 empty empty cts 0 20 1 11 -262144 -1 -1 0 1
-;
+#X text 64 539 serial packet format:;
+#X text 229 502 handshaking:;
+#X text 0 571 flow control inputs:;
+#X obj 145 571 tgl 15 0 empty empty dsr 0 20 1 11 -24198 -258699 -1
+0 1;
+#X obj 180 571 tgl 15 0 empty empty cts 0 20 1 11 -24198 -258699 -1
+0 1;
#N canvas 513 22 735 499 bauds 0;
#X msg 229 314 baud 57600;
#X msg 229 358 baud 230400;
@@ -143,18 +143,22 @@ maybe if suid is root damage the system.;
#X connect 33 0 24 0;
#X restore 622 72 pd bauds;
#X msg 314 139 xonxoff \$1;
-#X obj 275 139 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
-1;
-#X msg 314 167 rtscts \$1;
-#X obj 274 167 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
-1;
+#X obj 286 140 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -250685
+-1 0 1;
+#X msg 314 165 rtscts \$1;
+#X obj 286 167 tgl 15 0 empty empty empty 0 -6 0 8 -241291 -250685
+-1 0 1;
#X text 117 11 comport: a serial port interface;
#X msg 102 118 13;
-#X obj 111 470 route baud dsr cts parity stop data rtscts xonxoff port
-open;
-#X obj 484 499 tgl 15 0 empty empty open -6 20 1 11 -262144 -1 -1 0
-1;
-#X connect 0 1 76 0;
+#X obj 421 501 tgl 15 0 empty empty open -6 20 1 11 -24198 -258699
+-1 1 1;
+#X msg 317 320 ports;
+#X obj 111 462 route baud dsr cts parity stop data rtscts xonxoff port
+open ports;
+#X obj 456 530 print port_list;
+#X text 363 319 list available ports on right outlet;
+#X text 110 360 print usage info;
+#X connect 0 1 78 0;
#X connect 1 0 0 0;
#X connect 2 0 0 0;
#X connect 5 0 0 0;
@@ -174,30 +178,32 @@ open;
#X connect 35 0 34 0;
#X connect 36 0 37 0;
#X connect 37 0 18 0;
-#X connect 40 0 18 0;
+#X connect 40 0 0 0;
#X connect 41 0 18 0;
#X connect 42 0 41 0;
#X connect 44 0 0 0;
-#X connect 51 0 0 0;
+#X connect 51 0 18 0;
#X connect 52 0 0 0;
#X connect 52 0 53 0;
#X connect 57 0 58 0;
#X connect 58 1 59 0;
#X connect 58 1 0 0;
-#X connect 61 0 0 0;
+#X connect 61 0 18 0;
#X connect 70 0 18 0;
#X connect 71 0 70 0;
#X connect 72 0 18 0;
#X connect 73 0 72 0;
#X connect 75 0 0 0;
-#X connect 76 0 45 0;
-#X connect 76 1 67 0;
-#X connect 76 2 68 0;
-#X connect 76 3 46 0;
-#X connect 76 4 47 0;
-#X connect 76 5 48 0;
-#X connect 76 6 62 0;
-#X connect 76 7 63 0;
-#X connect 76 8 50 0;
-#X connect 76 9 77 0;
-#X connect 76 10 49 0;
+#X connect 77 0 18 0;
+#X connect 78 0 45 0;
+#X connect 78 1 67 0;
+#X connect 78 2 68 0;
+#X connect 78 3 46 0;
+#X connect 78 4 47 0;
+#X connect 78 5 48 0;
+#X connect 78 6 62 0;
+#X connect 78 7 63 0;
+#X connect 78 8 50 0;
+#X connect 78 9 76 0;
+#X connect 78 10 79 0;
+#X connect 78 11 49 0;
diff --git a/comport/comport.c b/comport/comport.c
index e326912..1293024 100644
--- a/comport/comport.c
+++ b/comport/comport.c
@@ -14,6 +14,7 @@ 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
MP 20061016 write_serial checks for GetOverlappedResult to avoid tx buffer overflow errors
+MP 20070719 added "ports" method to output list of available ports on status outlet
*/
#include "m_pd.h"
@@ -269,6 +270,7 @@ 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_ports(t_comport *x);
static void comport_verbose(t_comport *x, t_floatarg f);
static void comport_help(t_comport *x);
void comport_setup(void);
@@ -1356,6 +1358,75 @@ static void comport_enum(t_comport *x)
#endif /* _WIN32 */
}
+static void comport_ports(t_comport *x)
+{ /* the same as comport_enum except outputs list of available ports on status outlet */
+ unsigned int i, j = 0;
+ int ports[COMPORT_MAX]; /* we don't know how many there might be but 99 is probably safe */
+#ifdef _WIN32
+ HANDLE fd;
+ char device_name[10];
+ DWORD dw;
+
+ for(i = 1; i < COMPORT_MAX; i++)
+ {
+ sprintf(device_name, "\\\\.\\COM%d", i);/* the recommended way to specify COMs above 9 */
+ fd = CreateFile( device_name,
+ GENERIC_READ | GENERIC_WRITE,
+ 0,
+ 0,
+ OPEN_EXISTING,
+ FILE_FLAG_OVERLAPPED,
+ 0);
+ dw = 0L;
+ if(fd == INVALID_HANDLE_VALUE)
+ dw = GetLastError();
+ else
+ CloseHandle(fd);
+ if ((dw == 0)||(dw == ERROR_ACCESS_DENIED)) ports[j++]=i;
+ }
+#else
+ glob_t glob_buffer;
+ 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;
+# endif /* GLOB_ABORTED */
+# ifdef GLOB_NOMATCH
+ 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) && (j < COMPORT_MAX); 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)
+ ports[j++] = i;/* this one really exists */
+ close (fd);
+ }
+ }
+#endif /* _WIN32 */
+ if (j)
+ {
+ t_atom *output_atom = getbytes(j*sizeof(t_atom));
+ for (i = 0; i < j; ++i) SETFLOAT(&output_atom[i], ports[i]);
+ outlet_anything( x->x_status_outlet, gensym("ports"), j, output_atom);
+ freebytes(output_atom, j*sizeof(t_atom));
+ }
+}
+
static void comport_output_print(t_comport *x)
{
post("[comport]: available serial ports:");
@@ -1475,6 +1546,7 @@ static void comport_help(t_comport *x)
" verbose <level> ... for debug set verbosity to level\n"
" info ... output info on status outlet\n"
" devices ... post list of available devices\n"
+ " ports ... output list of available devices on status outlet\n"
" help ... post this help");
}
@@ -1508,6 +1580,7 @@ void comport_setup(void)
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);
+ class_addmethod(comport_class, (t_method)comport_ports, gensym("ports"), 0);
#ifndef _WIN32
null_tv.tv_sec = 0; /* no wait */