Update of /cvsroot/pure-data/externals/iem/comport/comport In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29117
Modified Files: comport.c Log Message: Correctly set port index when opened by name on linux & OSX.
Index: comport.c =================================================================== RCS file: /cvsroot/pure-data/externals/iem/comport/comport/comport.c,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** comport.c 12 Oct 2007 02:56:08 -0000 1.33 --- comport.c 13 Nov 2007 18:31:45 -0000 1.34 *************** *** 17,20 **** --- 17,21 ---- MP 20070719 added "ports" method to output list of available ports on status outlet MP 20071011 added comport_list and write_serials for list processing based on code by Thomas O Fredericks tof@danslchamp.org + MP 20071113 modified non-windows open_serial to set the index of the port when it's opened by name */
*************** *** 436,440 **** return INVALID_HANDLE_VALUE; } ! sprintf(buffer, "%s%d", x->serial_device_prefix, com_num); x->serial_device = gensym(buffer); --- 437,441 ---- return INVALID_HANDLE_VALUE; } ! sprintf(buffer, "%s%d", x->serial_device_prefix, com_num); x->serial_device = gensym(buffer); *************** *** 529,533 **** x->comhandle = fd;
! if (com_num == USE_DEVICENAME) { /* extract index from device name */ --- 530,534 ---- x->comhandle = fd;
! if (com_num == USE_DEVICENAME) { /* extract index from device name */ *************** *** 566,573 **** return INVALID_HANDLE_VALUE; } ! if (!SetupComm(x->comhandle, 4096L, 4096L))/* try to get big buffers to avoid overruns*/ ! { ! post("[comport] Couldn't do SetupComm (%d)", GetLastError()); ! } x->comport = com_num;/* output on next tick */ return fd; --- 567,574 ---- return INVALID_HANDLE_VALUE; } ! if (!SetupComm(x->comhandle, 4096L, 4096L))/* try to get big buffers to avoid overruns*/ ! { ! post("[comport] Couldn't do SetupComm (%d)", GetLastError()); ! } x->comport = com_num;/* output on next tick */ return fd; *************** *** 600,604 **** DWORD dwToWrite = 1L; DWORD dwErr; ! DWORD numTransferred = 0L;
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); --- 601,605 ---- DWORD dwToWrite = 1L; DWORD dwErr; ! DWORD numTransferred = 0L;
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); *************** *** 618,626 **** } } ! if (!GetOverlappedResult(x->comhandle, &osWrite, &numTransferred, TRUE)) ! {/* wait for the character to be sent */ dwErr = GetLastError(); ! post("WriteFile:GetOverlappedResult error: %d", (int)dwErr); ! } CloseHandle(osWrite.hEvent); return 1; --- 619,627 ---- } } ! if (!GetOverlappedResult(x->comhandle, &osWrite, &numTransferred, TRUE)) ! {/* wait for the character to be sent */ dwErr = GetLastError(); ! post("WriteFile:GetOverlappedResult error: %d", (int)dwErr); ! } CloseHandle(osWrite.hEvent); return 1; *************** *** 633,637 **** DWORD dwToWrite = (DWORD)buf_length; DWORD dwErr; ! DWORD numTransferred = 0L;
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); --- 634,638 ---- DWORD dwToWrite = (DWORD)buf_length; DWORD dwErr; ! DWORD numTransferred = 0L;
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); *************** *** 651,659 **** } } ! if (!GetOverlappedResult(x->comhandle, &osWrite, &numTransferred, TRUE)) ! {/* wait for the character(s) to be sent */ dwErr = GetLastError(); ! post("WriteFile:GetOverlappedResult error: %d", (int)dwErr); ! } CloseHandle(osWrite.hEvent); return 1; --- 652,660 ---- } } ! if (!GetOverlappedResult(x->comhandle, &osWrite, &numTransferred, TRUE)) ! {/* wait for the character(s) to be sent */ dwErr = GetLastError(); ! post("WriteFile:GetOverlappedResult error: %d", (int)dwErr); ! } CloseHandle(osWrite.hEvent); return 1; *************** *** 709,715 **** while(i < BAUDRATETABLE_LEN && baudratetable[i] > *baud) i++;
! if(baudratetable[i] != *baud) ! post("[comport]: %d not valid, using closest value: ", *baud, baudratetable[i]); ! /* nearest Baudrate finding */ if(i==BAUDRATETABLE_LEN || baudspeedbittable[i] < 0) --- 710,716 ---- while(i < BAUDRATETABLE_LEN && baudratetable[i] > *baud) i++;
! if(baudratetable[i] != *baud) ! post("[comport]: %d not valid, using closest value: ", *baud, baudratetable[i]); ! /* nearest Baudrate finding */ if(i==BAUDRATETABLE_LEN || baudspeedbittable[i] < 0) *************** *** 719,723 **** } *baud = baudratetable[i]; ! post("get_baud_ratebits: %f", *baud);
return baudspeedbittable[i]; --- 720,724 ---- } *baud = baudratetable[i]; ! post("get_baud_ratebits: %f", *baud);
return baudspeedbittable[i]; *************** *** 727,736 **** { struct termios *tio = &(x->com_termio); ! speed_t baudbits = get_baud_ratebits(&baud); ! post("set_baudrate baudbits: %d", baudbits); if( cfsetispeed(tio, baudbits) != 0 ) ! post("[comport]: ERROR failed to set bitrate: %d", baudbits); if( cfsetospeed(tio, baudbits) != 0 ) ! post("[comport]: ERROR failed to set bitrate: %d", baudbits);
return baud; --- 728,737 ---- { struct termios *tio = &(x->com_termio); ! speed_t baudbits = get_baud_ratebits(&baud); ! post("set_baudrate baudbits: %d", baudbits); if( cfsetispeed(tio, baudbits) != 0 ) ! post("[comport]: ERROR failed to set bitrate: %d", baudbits); if( cfsetospeed(tio, baudbits) != 0 ) ! post("[comport]: ERROR failed to set bitrate: %d", baudbits);
return baud; *************** *** 849,921 **** static int set_hupcl(t_comport *x, int nr) { ! struct termios settings; ! int result;
! result = tcgetattr(x->comhandle, &settings); ! if (result < 0) { ! perror ("error in tcgetattr"); ! return 0; } ! settings.c_iflag &= ~HUPCL; ! if(nr) ! settings.c_iflag |= HUPCL; ! result = tcsetattr(x->comhandle, TCSANOW, &settings); ! if (result < 0) { ! pd_error(x,"[comport] could not set HUPCL"); ! return 0; ! } ! x->hupcl = nr; ! return 1; }
static int open_serial(unsigned int com_num, t_comport *x) { ! int fd; ! struct termios *old = &(x->oldcom_termio); ! struct termios *new = &(x->com_termio); ! float *baud = &(x->baud); ! glob_t glob_buffer;
/* if com_num == USE_DEVICENAME, use device name directly, else try port # */ ! if(com_num != USE_DEVICENAME) { ! if(com_num >= COMPORT_MAX) ! { ! post("[comport] ** WARNING ** port %d not valid, must be between 0 and %d", ! com_num, COMPORT_MAX - 1); ! 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 ! } ! if(com_num < glob_buffer.gl_pathc) ! { ! x->serial_device = gensym(glob_buffer.gl_pathv[com_num]); ! } ! else { ! post("[comport] ** WARNING ** port #%d does not exist! (max == %d)", ! com_num,glob_buffer.gl_pathc - 1); ! return INVALID_HANDLE_VALUE; } - globfree( &(glob_buffer) ); } if((fd = open(x->serial_device->s_name, OPENPARAMS)) == INVALID_HANDLE_VALUE) { --- 850,930 ---- static int set_hupcl(t_comport *x, int nr) { ! struct termios settings; ! int result;
! result = tcgetattr(x->comhandle, &settings); ! if (result < 0) { ! perror ("error in tcgetattr"); ! return 0; } ! settings.c_iflag &= ~HUPCL; ! if(nr) ! settings.c_iflag |= HUPCL; ! result = tcsetattr(x->comhandle, TCSANOW, &settings); ! if (result < 0) { ! pd_error(x,"[comport] could not set HUPCL"); ! return 0; ! } ! x->hupcl = nr; ! return 1; }
static int open_serial(unsigned int com_num, t_comport *x) { ! int fd; ! unsigned int i; ! struct termios *old = &(x->oldcom_termio); ! struct termios *new = &(x->com_termio); ! float *baud = &(x->baud); ! glob_t glob_buffer;
/* if com_num == USE_DEVICENAME, use device name directly, else try port # */ ! if((com_num != USE_DEVICENAME)&&(com_num >= COMPORT_MAX)) { ! post("[comport] ** WARNING ** port %d not valid, must be between 0 and %d", ! com_num, COMPORT_MAX - 1); ! 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 ! } ! if (com_num == USE_DEVICENAME) ! { /* if possible, find the index of the devicename */ ! for (i = 0; i < glob_buffer.gl_pathc; ++i) { ! if (0 == strcmp(x->serial_device->s_name, glob_buffer.gl_pathv[i])) ! { ! com_num = i; ! break; ! } } } + else if(com_num < glob_buffer.gl_pathc) + x->serial_device = gensym(glob_buffer.gl_pathv[com_num]); + else + { + post("[comport] ** WARNING ** port #%d does not exist! (max == %d)", + com_num,glob_buffer.gl_pathc - 1); + return INVALID_HANDLE_VALUE; + } + globfree( &(glob_buffer) ); + if((fd = open(x->serial_device->s_name, OPENPARAMS)) == INVALID_HANDLE_VALUE) { *************** *** 972,976 **** else { ! error("[comport] ** ERROR ** could not set params to ioctl of device %s\n", x->serial_device->s_name); close(fd); --- 981,985 ---- else { ! error("[comport] ** ERROR ** could not set params to ioctl of device %s\n", x->serial_device->s_name); close(fd); *************** *** 1065,1071 **** { #ifdef _WIN32 ! HANDLE fd = x->comhandle; #else ! int fd = x->comhandle; #endif /* _WIN32 */ int err; --- 1074,1080 ---- { #ifdef _WIN32 ! HANDLE fd = x->comhandle; #else ! int fd = x->comhandle; #endif /* _WIN32 */ int err; *************** *** 1104,1110 **** #else { ! unsigned char serial_byte; ! fd_set com_rfds; ! int count = 0;
FD_ZERO(&com_rfds); --- 1113,1119 ---- #else { ! unsigned char serial_byte; ! fd_set com_rfds; ! int count = 0;
FD_ZERO(&com_rfds); *************** *** 1116,1123 **** /* while( (err = read(fd,(char *) &serial_byte,1)) > 0){ */ outlet_float(x->x_data_outlet, (t_float) serial_byte); ! ++count; } ! // if( count > 0) ! // post("--- %d", count); } #endif --- 1125,1132 ---- /* while( (err = read(fd,(char *) &serial_byte,1)) > 0){ */ outlet_float(x->x_data_outlet, (t_float) serial_byte); ! ++count; } ! // if( count > 0) ! // post("--- %d", count); } #endif *************** *** 1536,1543 **** HANDLE fd; char device_name[10]; ! 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, --- 1545,1552 ---- HANDLE fd; char device_name[10]; ! 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, *************** *** 1732,1748 **** { if(x->comhandle == INVALID_HANDLE_VALUE) ! comport_output_status(x, gensym("open"), 0); ! else ! comport_output_status(x, gensym("open"), 1); }
static void comport_devices(t_comport *x) { ! comport_output_print(x); }
static void comport_info(t_comport *x) { ! comport_output_open_status(x); comport_output_port_status(x); comport_output_baud_rate(x); --- 1741,1757 ---- { if(x->comhandle == INVALID_HANDLE_VALUE) ! comport_output_status(x, gensym("open"), 0); ! else ! comport_output_status(x, gensym("open"), 1); }
static void comport_devices(t_comport *x) { ! comport_output_print(x); }
static void comport_info(t_comport *x) { ! comport_output_open_status(x); comport_output_port_status(x); comport_output_baud_rate(x);