[PD-cvs] externals/iem/comport/comport comport.c,1.28,1.29
Martin Peach
mrpeach at users.sourceforge.net
Sun Jul 22 21:10:52 CEST 2007
Update of /cvsroot/pure-data/externals/iem/comport/comport
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29655
Modified Files:
comport.c
Log Message:
The ports message now outputs index / path pairs on the status outlet.
Index: comport.c
===================================================================
RCS file: /cvsroot/pure-data/externals/iem/comport/comport/comport.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -C2 -d -r1.28 -r1.29
*** comport.c 19 Jul 2007 15:26:57 -0000 1.28
--- comport.c 22 Jul 2007 19:10:50 -0000 1.29
***************
*** 59,63 ****
#endif
t_symbol *serial_device;
! char serial_device_name[FILENAME_MAX];
short comport; /* holds the comport # */
t_float baud; /* holds the current baud rate */
--- 59,63 ----
#endif
t_symbol *serial_device;
! char serial_device_prefix[FILENAME_MAX];/* the device name without the number */
short comport; /* holds the comport # */
t_float baud; /* holds the current baud rate */
***************
*** 408,426 ****
static HANDLE open_serial(unsigned int com_num, t_comport *x)
{
! HANDLE fd;
! COMMTIMEOUTS timeouts;
! char buffer[MAX_PATH];
! float *baud = &(x->baud);
! DWORD dw;
! if(com_num < 1 || com_num >= COMPORT_MAX)
{
! post("comport number %d out of range (0-%d)", com_num, COMPORT_MAX);
! return INVALID_HANDLE_VALUE;
}
!
! sprintf(buffer, "%s%d", x->serial_device_name, com_num);
! x->serial_device = gensym(buffer);
! post("Opening %s",x->serial_device->s_name);
fd = CreateFile( x->serial_device->s_name,
GENERIC_READ | GENERIC_WRITE,
--- 408,436 ----
static HANDLE open_serial(unsigned int com_num, t_comport *x)
{
! HANDLE fd;
! COMMTIMEOUTS timeouts;
! char buffer[MAX_PATH];
! float *baud = &(x->baud);
! DWORD dw;
! int i;
! char *errStr;
! if (com_num != USE_DEVICENAME)
{
! if(com_num < 1 || com_num >= COMPORT_MAX)
! {
! post("comport number %d out of range (1-%d)", com_num, COMPORT_MAX);
! return INVALID_HANDLE_VALUE;
! }
!
! sprintf(buffer, "%s%d", x->serial_device_prefix, com_num);
! x->serial_device = gensym(buffer);
}
! else
! {
! sprintf(buffer, "\\\\.\\%s", x->serial_device->s_name); /* assume the slashes were not prefixed by user */
! x->serial_device = gensym(buffer);
! }
! post("Opening %s", &x->serial_device->s_name[4]);/* skip slashes and dot */
fd = CreateFile( x->serial_device->s_name,
GENERIC_READ | GENERIC_WRITE,
***************
*** 434,439 ****
{
dw = GetLastError();
! post("** ERROR ** could not open device %s:\n failure(%d)\n",
! x->serial_device->s_name,dw);
return INVALID_HANDLE_VALUE;
}
--- 444,470 ----
{
dw = GetLastError();
! switch (dw)
! {
! case 2:
! errStr = "ERROR_FILE_NOT_FOUND";
! break;
! case 3:
! errStr = "ERROR_PATH_NOT_FOUND";
! break;
! case 5:
! errStr = "ERROR_ACCESS_DENIED";
! break;
! case 53:
! errStr = "ERROR_BAD_NETPATH";
! break;
! case 123:
! errStr = "ERROR_INVALID_NAME";
! break;
! default:
! errStr = " ";
! break;
! }
! post("** ERROR ** could not open device %s:\n failure(%d) %s\n",
! &x->serial_device->s_name[4], dw, errStr);
return INVALID_HANDLE_VALUE;
}
***************
*** 444,448 ****
{
post("** ERROR ** could not get old dcb of device %s\n",
! x->serial_device->s_name);
CloseHandle(fd);
return INVALID_HANDLE_VALUE;
--- 475,479 ----
{
post("** ERROR ** could not get old dcb of device %s\n",
! &x->serial_device->s_name[4]);
CloseHandle(fd);
return INVALID_HANDLE_VALUE;
***************
*** 454,458 ****
{
post("** ERROR ** could not get new dcb of device %s\n",
! x->serial_device->s_name);
CloseHandle(fd);
--- 485,489 ----
{
post("** ERROR ** could not get new dcb of device %s\n",
! &x->serial_device->s_name[4]);
CloseHandle(fd);
***************
*** 485,497 ****
x->comhandle = fd;
if(set_serial(x))
{
post("[comport] opened serial line device %d (%s)\n",
! com_num,x->serial_device->s_name);
}
else
{
error("[comport] ** ERROR ** could not set params to control dcb of device %s\n",
! x->serial_device->s_name);
CloseHandle(fd);
return INVALID_HANDLE_VALUE;
--- 516,535 ----
x->comhandle = fd;
+ if (com_num == USE_DEVICENAME)
+ {
+ /* extract index from device name */
+ for (i = 0; x->serial_device->s_name[i] != 0; ++i)
+ if ((x->serial_device->s_name[i] >= '0') && (x->serial_device->s_name[i] <= '9'))
+ com_num = atoi(&x->serial_device->s_name[i]);
+ }
if(set_serial(x))
{
post("[comport] opened serial line device %d (%s)\n",
! com_num, &x->serial_device->s_name[4]);
}
else
{
error("[comport] ** ERROR ** could not set params to control dcb of device %s\n",
! &x->serial_device->s_name[4]);
CloseHandle(fd);
return INVALID_HANDLE_VALUE;
***************
*** 519,523 ****
post("[comport] Couldn't do SetupComm (%d)", GetLastError());
}
-
x->comport = com_num;/* output on next tick */
return fd;
--- 557,560 ----
***************
*** 531,535 ****
{
post("[comport] ** ERROR ** couldn't reset params to DCB of device %s\n",
! x->serial_device->s_name);
}
if (!SetCommTimeouts(x->comhandle, &(x->old_timeouts)))
--- 568,572 ----
{
post("[comport] ** ERROR ** couldn't reset params to DCB of device %s\n",
! &x->serial_device->s_name[4]);
}
if (!SetCommTimeouts(x->comhandle, &(x->old_timeouts)))
***************
*** 538,542 ****
}
CloseHandle(x->comhandle);
! post("[comport] closed %s",x->serial_device->s_name);
}
return INVALID_HANDLE_VALUE;
--- 575,579 ----
}
CloseHandle(x->comhandle);
! post("[comport] closed %s", &x->serial_device->s_name[4]);
}
return INVALID_HANDLE_VALUE;
***************
*** 775,793 ****
return INVALID_HANDLE_VALUE;
}
! /* post("[comport] globbing %s",x->serial_device_name);*/
/* get the device path based on the port# and the glob pattern */
! 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
#ifdef GLOB_NOMATCH
case GLOB_NOMATCH:
! error("[comport] no serial devices found for \"%s\"",x->serial_device_name);
break;
#endif
--- 812,830 ----
return INVALID_HANDLE_VALUE;
}
! /* post("[comport] globbing %s",x->serial_device_prefix);*/
/* get the device path based on the port# and the glob pattern */
! switch( glob( x->serial_device_prefix, 0, NULL, &glob_buffer ) )
{
case GLOB_NOSPACE:
! error("[comport] out of memory for \"%s\"",x->serial_device_prefix);
break;
#ifdef GLOB_ABORTED
case GLOB_ABORTED:
! error("[comport] aborted \"%s\"",x->serial_device_prefix);
break;
#endif
#ifdef GLOB_NOMATCH
case GLOB_NOMATCH:
! error("[comport] no serial devices found for \"%s\"",x->serial_device_prefix);
break;
#endif
***************
*** 1025,1037 ****
/* for UNIX, this is a glob pattern for matching devices */
#ifdef _WIN32
! const char *serial_device_name = "COM";
#else
# ifdef __APPLE__
! const char *serial_device_name = "/dev/tty.*";
# else
# ifdef IRIX
! const char *serial_device_name = "/dev/ttyd*";
# else
! const char *serial_device_name = "/dev/tty[SU]*";
# endif /* IRIX */
# endif /* __APPLE__ */
--- 1062,1081 ----
/* for UNIX, this is a glob pattern for matching devices */
#ifdef _WIN32
! /*
! According to http://msdn2.microsoft.com/en-us/library/aa363858.aspx
! To specify a COM port number greater than 9,
! use the following syntax: "\\\\.\\COM10".
! This syntax works for all port numbers and hardware
! that allows COM port numbers to be specified.
! */
! const char *serial_device_prefix = "\\\\.\\COM";
#else
# ifdef __APPLE__
! const char *serial_device_prefix = "/dev/tty.*";
# else
# ifdef IRIX
! const char *serial_device_prefix = "/dev/ttyd*";
# else
! const char *serial_device_prefix = "/dev/tty[SU]*";
# endif /* IRIX */
# endif /* __APPLE__ */
***************
*** 1041,1045 ****
/* Open the Comport for RD and WR and get a handle */
/* this line should use a real serial device */
! strncpy(test.serial_device_name, serial_device_name, strlen(serial_device_name)+1);
test.baud = fbaud;
test.data_bits = 8; /* default 8 data bits */
--- 1085,1089 ----
/* Open the Comport for RD and WR and get a handle */
/* this line should use a real serial device */
! strncpy(test.serial_device_prefix, serial_device_prefix, strlen(serial_device_prefix)+1);
test.baud = fbaud;
test.data_bits = 8; /* default 8 data bits */
***************
*** 1054,1058 ****
x->comport = test.comport;/* com_num */
! strncpy(x->serial_device_name,serial_device_name,strlen(serial_device_name)+1);
x->serial_device = test.serial_device; /* we need this so 'help' doesn't crash */
--- 1098,1102 ----
x->comport = test.comport;/* com_num */
! strncpy(x->serial_device_prefix,serial_device_prefix,strlen(serial_device_prefix)+1);
x->serial_device = test.serial_device; /* we need this so 'help' doesn't crash */
***************
*** 1068,1072 ****
{
/* postings in open routine */
! post("[comport] invalid handle for %s",x->serial_device_name);
}
else
--- 1112,1116 ----
{
/* postings in open routine */
! post("[comport] invalid handle for %s", x->serial_device_prefix);
}
else
***************
*** 1124,1131 ****
{
error("[comport] ** ERROR ** could not set baudrate of device %s\n",
x->serial_device->s_name);
}
else if(x->verbose > 0)
! post("set baudrate of %s to %f\n",x->serial_device->s_name,x->baud);
}
--- 1168,1184 ----
{
error("[comport] ** ERROR ** could not set baudrate of device %s\n",
+ #ifdef _WIN32
+ &x->serial_device->s_name[4]);
+ #else
x->serial_device->s_name);
+ #endif
}
else if(x->verbose > 0)
! post("set baudrate of %s to %f\n",
! #ifdef _WIN32
! &x->serial_device->s_name[4], x->baud);
! #else
! x->serial_device->s_name, x->baud);
! #endif
}
***************
*** 1139,1147 ****
{
error("[comport] ** ERROR ** could not set bits of device %s\n",
x->serial_device->s_name);
return;
}
else if(x->verbose > 0)
! post("set bits of %s to %f\n",x->serial_device->s_name,f);
x->data_bits = f;
}
--- 1192,1209 ----
{
error("[comport] ** ERROR ** could not set bits of device %s\n",
+ #ifdef _WIN32
+ &x->serial_device->s_name[4]);
+ #else
x->serial_device->s_name);
+ #endif
return;
}
else if(x->verbose > 0)
! post("set bits of %s to %f\n",
! #ifdef _WIN32
! &x->serial_device->s_name[4], f);
! #else
! x->serial_device->s_name, f);
! #endif
x->data_bits = f;
}
***************
*** 1157,1165 ****
{
error("[comport] ** ERROR ** could not set extra paritybit of device %s\n",
x->serial_device->s_name);
return;
}
else if(x->verbose > 0)
! post("[comport] set extra paritybit of %s to %f\n",x->serial_device->s_name,f);
x->parity_bit = f;
}
--- 1219,1236 ----
{
error("[comport] ** ERROR ** could not set extra paritybit of device %s\n",
+ #ifdef _WIN32
+ &x->serial_device->s_name[4]);
+ #else
x->serial_device->s_name);
+ #endif
return;
}
else if(x->verbose > 0)
! post("[comport] set extra paritybit of %s to %f\n",
! #ifdef _WIN32
! &x->serial_device->s_name[4], f);
! #else
! x->serial_device->s_name, f);
! #endif
x->parity_bit = f;
}
***************
*** 1174,1182 ****
{
error("[comport] ** ERROR ** could not set extra stopbit of device %s\n",
! x->serial_device->s_name);
return;
}
else if(x->verbose > 0)
! post("[comport] set extra stopbit of %s to %f\n",x->serial_device->s_name,f);
x->stop_bits = f;
}
--- 1245,1262 ----
{
error("[comport] ** ERROR ** could not set extra stopbit of device %s\n",
! #ifdef _WIN32
! &x->serial_device->s_name[4]);
! #else
! x->serial_device->s_name);
! #endif
return;
}
else if(x->verbose > 0)
! post("[comport] set extra stopbit of %s to %f\n",
! #ifdef _WIN32
! &x->serial_device->s_name[4], f);
! #else
! x->serial_device->s_name, f);
! #endif
x->stop_bits = f;
}
***************
*** 1191,1199 ****
{
error("[comport] ** ERROR ** could not set rts_cts of device %s\n",
x->serial_device->s_name);
return;
}
else if(x->verbose > 0)
! post("[comport] set rts-cts of %s to %f\n",x->serial_device->s_name,f);
x->ctsrts = f;
}
--- 1271,1288 ----
{
error("[comport] ** ERROR ** could not set rts_cts of device %s\n",
+ #ifdef _WIN32
+ &x->serial_device->s_name[4]);
+ #else
x->serial_device->s_name);
+ #endif
return;
}
else if(x->verbose > 0)
! post("[comport] set rts-cts of %s to %f\n",
! #ifdef _WIN32
! &x->serial_device->s_name[4], f);
! #else
! x->serial_device->s_name, f);
! #endif
x->ctsrts = f;
}
***************
*** 1208,1215 ****
{
error("[comport] ** ERROR ** could not set dtr of device %s\n",
x->serial_device->s_name);
}
else if(x->verbose > 0)
! post("[comport] set dtr of %s to %f\n",x->serial_device->s_name,f);
}
--- 1297,1313 ----
{
error("[comport] ** ERROR ** could not set dtr of device %s\n",
+ #ifdef _WIN32
+ &x->serial_device->s_name[4]);
+ #else
x->serial_device->s_name);
+ #endif
}
else if(x->verbose > 0)
! post("[comport] set dtr of %s to %f\n",
! #ifdef _WIN32
! &x->serial_device->s_name[4], f);
! #else
! x->serial_device->s_name, f);
! #endif
}
***************
*** 1223,1230 ****
{
error("[comport] ** ERROR ** could not set rts of device %s\n",
x->serial_device->s_name);
}
else if(x->verbose > 0)
! post("[comport] set rts of %s to %f\n",x->serial_device->s_name,f);
}
--- 1321,1337 ----
{
error("[comport] ** ERROR ** could not set rts of device %s\n",
+ #ifdef _WIN32
+ &x->serial_device->s_name[4]);
+ #else
x->serial_device->s_name);
+ #endif
}
else if(x->verbose > 0)
! post("[comport] set rts of %s to %f\n",
! #ifdef _WIN32
! &x->serial_device->s_name[4], f);
! #else
! x->serial_device->s_name, f);
! #endif
}
***************
*** 1238,1246 ****
{
error("[comport] ** ERROR ** could not set xonxoff of device %s\n",
! x->serial_device->s_name);
return;
}
else if(x->verbose > 0)
! post("[comport] set xonxoff of %s to %f\n",x->serial_device->s_name,f);
x->xonxoff = f;
}
--- 1345,1362 ----
{
error("[comport] ** ERROR ** could not set xonxoff of device %s\n",
! #ifdef _WIN32
! &x->serial_device->s_name[4]);
! #else
! x->serial_device->s_name);
! #endif
return;
}
else if(x->verbose > 0)
! post("[comport] set xonxoff of %s to %f\n",
! #ifdef _WIN32
! &x->serial_device->s_name[4], f);
! #else
! x->serial_device->s_name, f);
! #endif
x->xonxoff = f;
}
***************
*** 1273,1276 ****
--- 1389,1395 ----
{
x->serial_device = s;
+ if(x->comhandle != INVALID_HANDLE_VALUE)
+ comport_close(x);
+
x->comhandle = open_serial(USE_DEVICENAME,x);
clock_delay(x->x_clock, x->x_deltime);
***************
*** 1303,1310 ****
unsigned int i;
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,
--- 1422,1428 ----
unsigned int i;
DWORD dw;
for(i = 1; i < COMPORT_MAX; i++)
{
! sprintf(device_name, "%s%d", x->serial_device_prefix, i);
fd = CreateFile( device_name,
GENERIC_READ | GENERIC_WRITE,
***************
*** 1329,1345 ****
/* 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 */
--- 1447,1463 ----
/* first look for registered devices in the filesystem */
! switch( glob( x->serial_device_prefix, 0, NULL, &glob_buffer ) )
{
case GLOB_NOSPACE:
! error("[comport] out of memory for \"%s\"",x->serial_device_prefix);
break;
# ifdef GLOB_ABORTED
case GLOB_ABORTED:
! error("[comport] aborted \"%s\"",x->serial_device_prefix);
break;
# endif /* GLOB_ABORTED */
# ifdef GLOB_NOMATCH
case GLOB_NOMATCH:
! error("[comport] no serial devices found for \"%s\"",x->serial_device_prefix);
break;
# endif /* GLOB_NOMATCH */
***************
*** 1362,1366 ****
{ /* 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;
--- 1480,1484 ----
{ /* the same as comport_enum except outputs list of available ports on status outlet */
unsigned int i, j = 0;
! t_atom output_atom[2];
#ifdef _WIN32
HANDLE fd;
***************
*** 1370,1374 ****
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,
--- 1488,1492 ----
for(i = 1; i < COMPORT_MAX; i++)
{
! sprintf(device_name, "%s%d", x->serial_device_prefix, i);
fd = CreateFile( device_name,
GENERIC_READ | GENERIC_WRITE,
***************
*** 1383,1387 ****
else
CloseHandle(fd);
! if ((dw == 0)||(dw == ERROR_ACCESS_DENIED)) ports[j++]=i;
}
#else
--- 1501,1510 ----
else
CloseHandle(fd);
! if ((dw == 0)||(dw == ERROR_ACCESS_DENIED))
! { /* output index and name as a list */
! SETFLOAT(&output_atom[0], i);
! SETSYMBOL(&output_atom[1], gensym(&device_name[4]));/* strip the slashes and dot */
! outlet_anything( x->x_status_outlet, gensym("ports"), 2, output_atom);
! }
}
#else
***************
*** 1391,1407 ****
/* 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 */
--- 1514,1530 ----
/* first look for registered devices in the filesystem */
! switch( glob( x->serial_device_prefix, 0, NULL, &glob_buffer ) )
{
case GLOB_NOSPACE:
! error("[comport] out of memory for \"%s\"",x->serial_device_prefix);
break;
# ifdef GLOB_ABORTED
case GLOB_ABORTED:
! error("[comport] aborted \"%s\"",x->serial_device_prefix);
break;
# endif /* GLOB_ABORTED */
# ifdef GLOB_NOMATCH
case GLOB_NOMATCH:
! error("[comport] no serial devices found for \"%s\"",x->serial_device_prefix);
break;
# endif /* GLOB_NOMATCH */
***************
*** 1414,1429 ****
/* 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));
- }
}
--- 1537,1549 ----
/* now see if it has attributes */
if ((tcgetattr(fd, &test)) != -1)
! { /* output index and name as a list */
! SETFLOAT(&output_atom[0], i);
! SETSYMBOL(&output_atom[1], gensym(glob_buffer.gl_pathv[i]));
! outlet_anything( x->x_status_outlet, gensym("ports"), 2, output_atom);
! }
close (fd);
}
}
#endif /* _WIN32 */
}
***************
*** 1527,1531 ****
if(x->comport >= 0 && x->comport < COMPORT_MAX)
{
! post("\tdevicename: %s",x->serial_device->s_name);
}
--- 1647,1655 ----
if(x->comport >= 0 && x->comport < COMPORT_MAX)
{
! #ifdef WIN32
! post("\tdevicename: %s", &x->serial_device->s_name[4]);
! #else
! post("\tdevicename: %s", x->serial_device->s_name);
! #endif
}
More information about the Pd-cvs
mailing list