The ports message now outputs index / path pairs on the status outlet.
svn path=/trunk/externals/iem/comport/; revision=8209
This commit is contained in:
parent
419fbce170
commit
f423522228
1 changed files with 190 additions and 66 deletions
|
|
@ -58,7 +58,7 @@ typedef struct comport
|
||||||
struct termios com_termio; /* for the new com config */
|
struct termios com_termio; /* for the new com config */
|
||||||
#endif
|
#endif
|
||||||
t_symbol *serial_device;
|
t_symbol *serial_device;
|
||||||
char serial_device_name[FILENAME_MAX];
|
char serial_device_prefix[FILENAME_MAX];/* the device name without the number */
|
||||||
short comport; /* holds the comport # */
|
short comport; /* holds the comport # */
|
||||||
t_float baud; /* holds the current baud rate */
|
t_float baud; /* holds the current baud rate */
|
||||||
t_float data_bits; /* holds the current number of data bits */
|
t_float data_bits; /* holds the current number of data bits */
|
||||||
|
|
@ -407,21 +407,31 @@ static int set_serial(t_comport *x)
|
||||||
|
|
||||||
static HANDLE open_serial(unsigned int com_num, t_comport *x)
|
static HANDLE open_serial(unsigned int com_num, t_comport *x)
|
||||||
{
|
{
|
||||||
HANDLE fd;
|
HANDLE fd;
|
||||||
COMMTIMEOUTS timeouts;
|
COMMTIMEOUTS timeouts;
|
||||||
char buffer[MAX_PATH];
|
char buffer[MAX_PATH];
|
||||||
float *baud = &(x->baud);
|
float *baud = &(x->baud);
|
||||||
DWORD dw;
|
DWORD dw;
|
||||||
|
int i;
|
||||||
|
char *errStr;
|
||||||
|
|
||||||
if(com_num < 1 || com_num >= COMPORT_MAX)
|
if (com_num != USE_DEVICENAME)
|
||||||
{
|
{
|
||||||
post("comport number %d out of range (0-%d)", com_num, COMPORT_MAX);
|
if(com_num < 1 || com_num >= COMPORT_MAX)
|
||||||
return INVALID_HANDLE_VALUE;
|
{
|
||||||
}
|
post("comport number %d out of range (1-%d)", com_num, COMPORT_MAX);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
sprintf(buffer, "%s%d", x->serial_device_name, com_num);
|
sprintf(buffer, "%s%d", x->serial_device_prefix, com_num);
|
||||||
x->serial_device = gensym(buffer);
|
x->serial_device = gensym(buffer);
|
||||||
post("Opening %s",x->serial_device->s_name);
|
}
|
||||||
|
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,
|
fd = CreateFile( x->serial_device->s_name,
|
||||||
GENERIC_READ | GENERIC_WRITE,
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
0,
|
0,
|
||||||
|
|
@ -433,8 +443,29 @@ static HANDLE open_serial(unsigned int com_num, t_comport *x)
|
||||||
if(fd == INVALID_HANDLE_VALUE)
|
if(fd == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
dw = GetLastError();
|
dw = GetLastError();
|
||||||
post("** ERROR ** could not open device %s:\n failure(%d)\n",
|
switch (dw)
|
||||||
x->serial_device->s_name,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;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -443,7 +474,7 @@ static HANDLE open_serial(unsigned int com_num, t_comport *x)
|
||||||
if (!GetCommState(fd, &(x->dcb_old)))
|
if (!GetCommState(fd, &(x->dcb_old)))
|
||||||
{
|
{
|
||||||
post("** ERROR ** could not get old dcb of device %s\n",
|
post("** ERROR ** could not get old dcb of device %s\n",
|
||||||
x->serial_device->s_name);
|
&x->serial_device->s_name[4]);
|
||||||
CloseHandle(fd);
|
CloseHandle(fd);
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
@ -453,7 +484,7 @@ static HANDLE open_serial(unsigned int com_num, t_comport *x)
|
||||||
if (!GetCommState(fd, &(x->dcb)))
|
if (!GetCommState(fd, &(x->dcb)))
|
||||||
{
|
{
|
||||||
post("** ERROR ** could not get new dcb of device %s\n",
|
post("** ERROR ** could not get new dcb of device %s\n",
|
||||||
x->serial_device->s_name);
|
&x->serial_device->s_name[4]);
|
||||||
|
|
||||||
CloseHandle(fd);
|
CloseHandle(fd);
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
|
|
@ -484,15 +515,22 @@ static HANDLE open_serial(unsigned int com_num, t_comport *x)
|
||||||
|
|
||||||
x->comhandle = fd;
|
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))
|
if(set_serial(x))
|
||||||
{
|
{
|
||||||
post("[comport] opened serial line device %d (%s)\n",
|
post("[comport] opened serial line device %d (%s)\n",
|
||||||
com_num,x->serial_device->s_name);
|
com_num, &x->serial_device->s_name[4]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
error("[comport] ** ERROR ** could not set params to control dcb of device %s\n",
|
error("[comport] ** ERROR ** could not set params to control dcb of device %s\n",
|
||||||
x->serial_device->s_name);
|
&x->serial_device->s_name[4]);
|
||||||
CloseHandle(fd);
|
CloseHandle(fd);
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
@ -518,7 +556,6 @@ static HANDLE open_serial(unsigned int com_num, t_comport *x)
|
||||||
{
|
{
|
||||||
post("[comport] Couldn't do SetupComm (%d)", GetLastError());
|
post("[comport] Couldn't do SetupComm (%d)", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
x->comport = com_num;/* output on next tick */
|
x->comport = com_num;/* output on next tick */
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
@ -530,14 +567,14 @@ static HANDLE close_serial(t_comport *x)
|
||||||
if (!SetCommState(x->comhandle, &(x->dcb_old)))
|
if (!SetCommState(x->comhandle, &(x->dcb_old)))
|
||||||
{
|
{
|
||||||
post("[comport] ** ERROR ** couldn't reset params to DCB of device %s\n",
|
post("[comport] ** ERROR ** couldn't reset params to DCB of device %s\n",
|
||||||
x->serial_device->s_name);
|
&x->serial_device->s_name[4]);
|
||||||
}
|
}
|
||||||
if (!SetCommTimeouts(x->comhandle, &(x->old_timeouts)))
|
if (!SetCommTimeouts(x->comhandle, &(x->old_timeouts)))
|
||||||
{
|
{
|
||||||
post("[comport] Couldn't reset old_timeouts for serial device");
|
post("[comport] Couldn't reset old_timeouts for serial device");
|
||||||
}
|
}
|
||||||
CloseHandle(x->comhandle);
|
CloseHandle(x->comhandle);
|
||||||
post("[comport] closed %s",x->serial_device->s_name);
|
post("[comport] closed %s", &x->serial_device->s_name[4]);
|
||||||
}
|
}
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
@ -774,21 +811,21 @@ static int open_serial(unsigned int com_num, t_comport *x)
|
||||||
com_num, COMPORT_MAX - 1);
|
com_num, COMPORT_MAX - 1);
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
/* post("[comport] globbing %s",x->serial_device_name);*/
|
/* post("[comport] globbing %s",x->serial_device_prefix);*/
|
||||||
/* get the device path based on the port# and the glob pattern */
|
/* get the device path based on the port# and the glob pattern */
|
||||||
switch( glob( x->serial_device_name, 0, NULL, &glob_buffer ) )
|
switch( glob( x->serial_device_prefix, 0, NULL, &glob_buffer ) )
|
||||||
{
|
{
|
||||||
case GLOB_NOSPACE:
|
case GLOB_NOSPACE:
|
||||||
error("[comport] out of memory for \"%s\"",x->serial_device_name);
|
error("[comport] out of memory for \"%s\"",x->serial_device_prefix);
|
||||||
break;
|
break;
|
||||||
#ifdef GLOB_ABORTED
|
#ifdef GLOB_ABORTED
|
||||||
case GLOB_ABORTED:
|
case GLOB_ABORTED:
|
||||||
error("[comport] aborted \"%s\"",x->serial_device_name);
|
error("[comport] aborted \"%s\"",x->serial_device_prefix);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef GLOB_NOMATCH
|
#ifdef GLOB_NOMATCH
|
||||||
case GLOB_NOMATCH:
|
case GLOB_NOMATCH:
|
||||||
error("[comport] no serial devices found for \"%s\"",x->serial_device_name);
|
error("[comport] no serial devices found for \"%s\"",x->serial_device_prefix);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -1024,15 +1061,22 @@ static void *comport_new(t_floatarg com_num, t_floatarg fbaud)
|
||||||
|
|
||||||
/* for UNIX, this is a glob pattern for matching devices */
|
/* for UNIX, this is a glob pattern for matching devices */
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
const char *serial_device_name = "COM";
|
/*
|
||||||
|
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
|
#else
|
||||||
# ifdef __APPLE__
|
# ifdef __APPLE__
|
||||||
const char *serial_device_name = "/dev/tty.*";
|
const char *serial_device_prefix = "/dev/tty.*";
|
||||||
# else
|
# else
|
||||||
# ifdef IRIX
|
# ifdef IRIX
|
||||||
const char *serial_device_name = "/dev/ttyd*";
|
const char *serial_device_prefix = "/dev/ttyd*";
|
||||||
# else
|
# else
|
||||||
const char *serial_device_name = "/dev/tty[SU]*";
|
const char *serial_device_prefix = "/dev/tty[SU]*";
|
||||||
# endif /* IRIX */
|
# endif /* IRIX */
|
||||||
# endif /* __APPLE__ */
|
# endif /* __APPLE__ */
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
@ -1040,7 +1084,7 @@ static void *comport_new(t_floatarg com_num, t_floatarg fbaud)
|
||||||
|
|
||||||
/* Open the Comport for RD and WR and get a handle */
|
/* Open the Comport for RD and WR and get a handle */
|
||||||
/* this line should use a real serial device */
|
/* this line should use a real serial device */
|
||||||
strncpy(test.serial_device_name, serial_device_name, strlen(serial_device_name)+1);
|
strncpy(test.serial_device_prefix, serial_device_prefix, strlen(serial_device_prefix)+1);
|
||||||
test.baud = fbaud;
|
test.baud = fbaud;
|
||||||
test.data_bits = 8; /* default 8 data bits */
|
test.data_bits = 8; /* default 8 data bits */
|
||||||
test.parity_bit = 0;/* default no parity bit */
|
test.parity_bit = 0;/* default no parity bit */
|
||||||
|
|
@ -1053,7 +1097,7 @@ static void *comport_new(t_floatarg com_num, t_floatarg fbaud)
|
||||||
x = (t_comport *)pd_new(comport_class);
|
x = (t_comport *)pd_new(comport_class);
|
||||||
|
|
||||||
x->comport = test.comport;/* com_num */
|
x->comport = test.comport;/* com_num */
|
||||||
strncpy(x->serial_device_name,serial_device_name,strlen(serial_device_name)+1);
|
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 */
|
x->serial_device = test.serial_device; /* we need this so 'help' doesn't crash */
|
||||||
|
|
||||||
x->baud = test.baud;
|
x->baud = test.baud;
|
||||||
|
|
@ -1067,7 +1111,7 @@ static void *comport_new(t_floatarg com_num, t_floatarg fbaud)
|
||||||
if(fd == INVALID_HANDLE_VALUE )
|
if(fd == INVALID_HANDLE_VALUE )
|
||||||
{
|
{
|
||||||
/* postings in open routine */
|
/* postings in open routine */
|
||||||
post("[comport] invalid handle for %s",x->serial_device_name);
|
post("[comport] invalid handle for %s", x->serial_device_prefix);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -1123,10 +1167,19 @@ static void comport_baud(t_comport *x,t_floatarg f)
|
||||||
if(set_serial(x) == 0)
|
if(set_serial(x) == 0)
|
||||||
{
|
{
|
||||||
error("[comport] ** ERROR ** could not set baudrate of device %s\n",
|
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);
|
x->serial_device->s_name);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if(x->verbose > 0)
|
else if(x->verbose > 0)
|
||||||
post("set baudrate of %s to %f\n",x->serial_device->s_name,x->baud);
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
static void comport_bits(t_comport *x,t_floatarg f)
|
static void comport_bits(t_comport *x,t_floatarg f)
|
||||||
|
|
@ -1138,11 +1191,20 @@ static void comport_bits(t_comport *x,t_floatarg f)
|
||||||
if(set_serial(x) == 0)
|
if(set_serial(x) == 0)
|
||||||
{
|
{
|
||||||
error("[comport] ** ERROR ** could not set bits of device %s\n",
|
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);
|
x->serial_device->s_name);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if(x->verbose > 0)
|
else if(x->verbose > 0)
|
||||||
post("set bits of %s to %f\n",x->serial_device->s_name,f);
|
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;
|
x->data_bits = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1156,11 +1218,20 @@ static void comport_parity(t_comport *x,t_floatarg f)
|
||||||
if(set_serial(x) == 0)
|
if(set_serial(x) == 0)
|
||||||
{
|
{
|
||||||
error("[comport] ** ERROR ** could not set extra paritybit of device %s\n",
|
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);
|
x->serial_device->s_name);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if(x->verbose > 0)
|
else if(x->verbose > 0)
|
||||||
post("[comport] set extra paritybit of %s to %f\n",x->serial_device->s_name,f);
|
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;
|
x->parity_bit = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1173,11 +1244,20 @@ static void comport_stopbit(t_comport *x,t_floatarg f)
|
||||||
if(set_serial(x) == 0)
|
if(set_serial(x) == 0)
|
||||||
{
|
{
|
||||||
error("[comport] ** ERROR ** could not set extra stopbit of device %s\n",
|
error("[comport] ** ERROR ** could not set extra stopbit of device %s\n",
|
||||||
x->serial_device->s_name);
|
#ifdef _WIN32
|
||||||
|
&x->serial_device->s_name[4]);
|
||||||
|
#else
|
||||||
|
x->serial_device->s_name);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if(x->verbose > 0)
|
else if(x->verbose > 0)
|
||||||
post("[comport] set extra stopbit of %s to %f\n",x->serial_device->s_name,f);
|
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;
|
x->stop_bits = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1190,11 +1270,20 @@ static void comport_rtscts(t_comport *x,t_floatarg f)
|
||||||
if(set_serial(x) == 0)
|
if(set_serial(x) == 0)
|
||||||
{
|
{
|
||||||
error("[comport] ** ERROR ** could not set rts_cts of device %s\n",
|
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);
|
x->serial_device->s_name);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if(x->verbose > 0)
|
else if(x->verbose > 0)
|
||||||
post("[comport] set rts-cts of %s to %f\n",x->serial_device->s_name,f);
|
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;
|
x->ctsrts = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1207,10 +1296,19 @@ static void comport_dtr(t_comport *x,t_floatarg f)
|
||||||
if(f < 0)
|
if(f < 0)
|
||||||
{
|
{
|
||||||
error("[comport] ** ERROR ** could not set dtr of device %s\n",
|
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);
|
x->serial_device->s_name);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if(x->verbose > 0)
|
else if(x->verbose > 0)
|
||||||
post("[comport] set dtr of %s to %f\n",x->serial_device->s_name,f);
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
static void comport_rts(t_comport *x,t_floatarg f)
|
static void comport_rts(t_comport *x,t_floatarg f)
|
||||||
|
|
@ -1222,10 +1320,19 @@ static void comport_rts(t_comport *x,t_floatarg f)
|
||||||
if(f < 0)
|
if(f < 0)
|
||||||
{
|
{
|
||||||
error("[comport] ** ERROR ** could not set rts of device %s\n",
|
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);
|
x->serial_device->s_name);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if(x->verbose > 0)
|
else if(x->verbose > 0)
|
||||||
post("[comport] set rts of %s to %f\n",x->serial_device->s_name,f);
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
static void comport_xonxoff(t_comport *x,t_floatarg f)
|
static void comport_xonxoff(t_comport *x,t_floatarg f)
|
||||||
|
|
@ -1237,11 +1344,20 @@ static void comport_xonxoff(t_comport *x,t_floatarg f)
|
||||||
if(set_serial(x) == 0)
|
if(set_serial(x) == 0)
|
||||||
{
|
{
|
||||||
error("[comport] ** ERROR ** could not set xonxoff of device %s\n",
|
error("[comport] ** ERROR ** could not set xonxoff of device %s\n",
|
||||||
x->serial_device->s_name);
|
#ifdef _WIN32
|
||||||
|
&x->serial_device->s_name[4]);
|
||||||
|
#else
|
||||||
|
x->serial_device->s_name);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if(x->verbose > 0)
|
else if(x->verbose > 0)
|
||||||
post("[comport] set xonxoff of %s to %f\n",x->serial_device->s_name,f);
|
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;
|
x->xonxoff = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1272,6 +1388,9 @@ static void comport_open(t_comport *x, t_floatarg f)
|
||||||
static void comport_devicename(t_comport *x, t_symbol *s)
|
static void comport_devicename(t_comport *x, t_symbol *s)
|
||||||
{
|
{
|
||||||
x->serial_device = s;
|
x->serial_device = s;
|
||||||
|
if(x->comhandle != INVALID_HANDLE_VALUE)
|
||||||
|
comport_close(x);
|
||||||
|
|
||||||
x->comhandle = open_serial(USE_DEVICENAME,x);
|
x->comhandle = open_serial(USE_DEVICENAME,x);
|
||||||
clock_delay(x->x_clock, x->x_deltime);
|
clock_delay(x->x_clock, x->x_deltime);
|
||||||
}
|
}
|
||||||
|
|
@ -1302,10 +1421,9 @@ static void comport_enum(t_comport *x)
|
||||||
char device_name[10];
|
char device_name[10];
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
DWORD dw;
|
DWORD dw;
|
||||||
|
|
||||||
for(i = 1; i < COMPORT_MAX; i++)
|
for(i = 1; i < COMPORT_MAX; i++)
|
||||||
{
|
{
|
||||||
sprintf(device_name, "\\\\.\\COM%d", i);/* the recommended way to specify COMs above 9 */
|
sprintf(device_name, "%s%d", x->serial_device_prefix, i);
|
||||||
fd = CreateFile( device_name,
|
fd = CreateFile( device_name,
|
||||||
GENERIC_READ | GENERIC_WRITE,
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
0,
|
0,
|
||||||
|
|
@ -1328,19 +1446,19 @@ static void comport_enum(t_comport *x)
|
||||||
struct termios test;
|
struct termios test;
|
||||||
|
|
||||||
/* first look for registered devices in the filesystem */
|
/* first look for registered devices in the filesystem */
|
||||||
switch( glob( x->serial_device_name, 0, NULL, &glob_buffer ) )
|
switch( glob( x->serial_device_prefix, 0, NULL, &glob_buffer ) )
|
||||||
{
|
{
|
||||||
case GLOB_NOSPACE:
|
case GLOB_NOSPACE:
|
||||||
error("[comport] out of memory for \"%s\"",x->serial_device_name);
|
error("[comport] out of memory for \"%s\"",x->serial_device_prefix);
|
||||||
break;
|
break;
|
||||||
# ifdef GLOB_ABORTED
|
# ifdef GLOB_ABORTED
|
||||||
case GLOB_ABORTED:
|
case GLOB_ABORTED:
|
||||||
error("[comport] aborted \"%s\"",x->serial_device_name);
|
error("[comport] aborted \"%s\"",x->serial_device_prefix);
|
||||||
break;
|
break;
|
||||||
# endif /* GLOB_ABORTED */
|
# endif /* GLOB_ABORTED */
|
||||||
# ifdef GLOB_NOMATCH
|
# ifdef GLOB_NOMATCH
|
||||||
case GLOB_NOMATCH:
|
case GLOB_NOMATCH:
|
||||||
error("[comport] no serial devices found for \"%s\"",x->serial_device_name);
|
error("[comport] no serial devices found for \"%s\"",x->serial_device_prefix);
|
||||||
break;
|
break;
|
||||||
# endif /* GLOB_NOMATCH */
|
# endif /* GLOB_NOMATCH */
|
||||||
}
|
}
|
||||||
|
|
@ -1361,7 +1479,7 @@ static void comport_enum(t_comport *x)
|
||||||
static void comport_ports(t_comport *x)
|
static void comport_ports(t_comport *x)
|
||||||
{ /* the same as comport_enum except outputs list of available ports on status outlet */
|
{ /* the same as comport_enum except outputs list of available ports on status outlet */
|
||||||
unsigned int i, j = 0;
|
unsigned int i, j = 0;
|
||||||
int ports[COMPORT_MAX]; /* we don't know how many there might be but 99 is probably safe */
|
t_atom output_atom[2];
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
HANDLE fd;
|
HANDLE fd;
|
||||||
char device_name[10];
|
char device_name[10];
|
||||||
|
|
@ -1369,7 +1487,7 @@ static void comport_ports(t_comport *x)
|
||||||
|
|
||||||
for(i = 1; i < COMPORT_MAX; i++)
|
for(i = 1; i < COMPORT_MAX; i++)
|
||||||
{
|
{
|
||||||
sprintf(device_name, "\\\\.\\COM%d", i);/* the recommended way to specify COMs above 9 */
|
sprintf(device_name, "%s%d", x->serial_device_prefix, i);
|
||||||
fd = CreateFile( device_name,
|
fd = CreateFile( device_name,
|
||||||
GENERIC_READ | GENERIC_WRITE,
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
0,
|
0,
|
||||||
|
|
@ -1382,7 +1500,12 @@ static void comport_ports(t_comport *x)
|
||||||
dw = GetLastError();
|
dw = GetLastError();
|
||||||
else
|
else
|
||||||
CloseHandle(fd);
|
CloseHandle(fd);
|
||||||
if ((dw == 0)||(dw == ERROR_ACCESS_DENIED)) ports[j++]=i;
|
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
|
#else
|
||||||
glob_t glob_buffer;
|
glob_t glob_buffer;
|
||||||
|
|
@ -1390,19 +1513,19 @@ static void comport_ports(t_comport *x)
|
||||||
struct termios test;
|
struct termios test;
|
||||||
|
|
||||||
/* first look for registered devices in the filesystem */
|
/* first look for registered devices in the filesystem */
|
||||||
switch( glob( x->serial_device_name, 0, NULL, &glob_buffer ) )
|
switch( glob( x->serial_device_prefix, 0, NULL, &glob_buffer ) )
|
||||||
{
|
{
|
||||||
case GLOB_NOSPACE:
|
case GLOB_NOSPACE:
|
||||||
error("[comport] out of memory for \"%s\"",x->serial_device_name);
|
error("[comport] out of memory for \"%s\"",x->serial_device_prefix);
|
||||||
break;
|
break;
|
||||||
# ifdef GLOB_ABORTED
|
# ifdef GLOB_ABORTED
|
||||||
case GLOB_ABORTED:
|
case GLOB_ABORTED:
|
||||||
error("[comport] aborted \"%s\"",x->serial_device_name);
|
error("[comport] aborted \"%s\"",x->serial_device_prefix);
|
||||||
break;
|
break;
|
||||||
# endif /* GLOB_ABORTED */
|
# endif /* GLOB_ABORTED */
|
||||||
# ifdef GLOB_NOMATCH
|
# ifdef GLOB_NOMATCH
|
||||||
case GLOB_NOMATCH:
|
case GLOB_NOMATCH:
|
||||||
error("[comport] no serial devices found for \"%s\"",x->serial_device_name);
|
error("[comport] no serial devices found for \"%s\"",x->serial_device_prefix);
|
||||||
break;
|
break;
|
||||||
# endif /* GLOB_NOMATCH */
|
# endif /* GLOB_NOMATCH */
|
||||||
}
|
}
|
||||||
|
|
@ -1413,18 +1536,15 @@ static void comport_ports(t_comport *x)
|
||||||
{
|
{
|
||||||
/* now see if it has attributes */
|
/* now see if it has attributes */
|
||||||
if ((tcgetattr(fd, &test)) != -1)
|
if ((tcgetattr(fd, &test)) != -1)
|
||||||
ports[j++] = i;/* this one really exists */
|
{ /* 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);
|
close (fd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* _WIN32 */
|
#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)
|
static void comport_output_print(t_comport *x)
|
||||||
|
|
@ -1526,7 +1646,11 @@ static void comport_help(t_comport *x)
|
||||||
post("[comport] serial port %d (baud %f):", x->comport, x->baud);
|
post("[comport] serial port %d (baud %f):", x->comport, x->baud);
|
||||||
if(x->comport >= 0 && x->comport < COMPORT_MAX)
|
if(x->comport >= 0 && x->comport < COMPORT_MAX)
|
||||||
{
|
{
|
||||||
post("\tdevicename: %s",x->serial_device->s_name);
|
#ifdef WIN32
|
||||||
|
post("\tdevicename: %s", &x->serial_device->s_name[4]);
|
||||||
|
#else
|
||||||
|
post("\tdevicename: %s", x->serial_device->s_name);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
post(" Methods:");
|
post(" Methods:");
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue