baud settings include all posix names, windows allows any divisor

svn path=/trunk/externals/iem/comport/; revision=6072
This commit is contained in:
Martin Peach 2006-10-04 01:24:20 +00:00
parent 509a44d087
commit 8aae014491

View file

@ -93,10 +93,11 @@ typedef struct comport
#define COMPORT_MAX 99 #define COMPORT_MAX 99
#ifdef _WIN32 #ifdef _WIN32
/* we don't use the table for windos cos we can set the number directly. */
/* This may result in more possible baud rates than the table contains. */
/*
static long baudspeedbittable[] = static long baudspeedbittable[] =
{ {
CBR_256000,
CBR_128000,
CBR_115200, CBR_115200,
CBR_57600, CBR_57600,
CBR_56000, CBR_56000,
@ -106,83 +107,114 @@ static long baudspeedbittable[] =
CBR_9600, CBR_9600,
CBR_4800, CBR_4800,
CBR_2400, CBR_2400,
CBR_1800,
CBR_1200, CBR_1200,
CBR_600, CBR_600,
CBR_300, CBR_300,
CBR_110 CBR_110
}; };
*/
#else /* _WIN32 */ #else /* _WIN32 */
#ifdef IRIX #ifdef IRIX
#define OPENPARAMS (O_RDWR|O_NDELAY|O_NOCTTY) #define OPENPARAMS (O_RDWR|O_NDELAY|O_NOCTTY)
#define TIONREAD FIONREAD /* re map the IOCTL function */ #define TIONREAD FIONREAD /* re map the IOCTL function */
#define BAUDRATE_256000 -1 #define BAUDRATE_230400 -1
#define BAUDRATE_128000 -1
#define BAUDRATE_115200 -1 #define BAUDRATE_115200 -1
#define BAUDRATE_57600 -1 #define BAUDRATE_57600 -1
#define BAUDRATE_56000 -1
#define BAUDRATE_38400 B38400 #define BAUDRATE_38400 B38400
#define BAUDRATE_14400 B19200 /* 14400 gibts nicht */
#else /* IRIX */ #else /* IRIX */
#define OPENPARAMS (O_RDWR|O_NDELAY|O_NOCTTY) #define OPENPARAMS (O_RDWR|O_NDELAY|O_NOCTTY)
#define BAUDRATE_256000 -1 #define BAUDRATE_230400 B230400
#define BAUDRATE_128000 -1
#define BAUDRATE_115200 B115200 #define BAUDRATE_115200 B115200
#define BAUDRATE_57600 B57600 #define BAUDRATE_57600 B57600
#define BAUDRATE_56000 B57600 /* 56000 gibts nicht */
#define BAUDRATE_38400 B38400 #define BAUDRATE_38400 B38400
#define BAUDRATE_14400 B19200 /* 14400 gibts nicht */
#endif /* else IRIX */ #endif /* else IRIX */
static static
short baudspeedbittable[] = long baudspeedbittable[] =
{ {
BAUDRATE_256000, /* CPU SPECIFIC */ BAUDRATE_230400,
BAUDRATE_128000, /* CPU SPECIFIC */
BAUDRATE_115200, /* CPU SPECIFIC */ BAUDRATE_115200, /* CPU SPECIFIC */
BAUDRATE_57600, /* CPU SPECIFIC */ BAUDRATE_57600, /* CPU SPECIFIC */
BAUDRATE_56000,
BAUDRATE_38400, /* CPU SPECIFIC */ BAUDRATE_38400, /* CPU SPECIFIC */
B19200, B19200,
BAUDRATE_14400,
B9600, B9600,
B4800, B4800,
B2400, B2400,
B1800,
B1200, B1200,
B600, B600,
B300, B300,
B110 B200,
B150,
B134,
B110,
B75,
B50,
B0
}; };
struct timeval null_tv; struct timeval null_tv;
#endif /* else _WIN32 */ #endif /* else _WIN32 */
#define BAUDRATETABLE_LEN 15 #define BAUDRATETABLE_LEN 19
static long baudratetable[] = static long baudratetable[] =
{ {
256000L, 230400L,
128000L,
115200L, 115200L,
57600L, 57600L,
56000L,
38400L, 38400L,
19200L, 19200L,
14400L,
9600L, 9600L,
4800L, 4800L,
2400L, 2400L,
1800L,
1200L, 1200L,
600L, 600L,
300L, 300L,
110L 200L,
150L,
134L,
110L,
75L,
50L,
0L
}; /* holds the baud rate selections */ }; /* holds the baud rate selections */
/* From man cfsetospeed:
cfsetospeed() sets the output baud rate stored in the
termios structure pointed to by termios_p to speed, which
must be one of these constants:
B0
B50
B75
B110
B134
B150
B200
B300
B600
B1200
B1800
B2400
B4800
B9600
B19200
B38400
B57600
B115200
B230400
The zero baud rate, B0, is used to terminate the connec­
tion. If B0 is specified, the modem control lines shall
no longer be asserted. Normally, this will disconnect the
line.*/
t_class *comport_class; t_class *comport_class;
static long get_baud_ratebits(t_float *baud);
static void comport_pollintervall(t_comport *x, t_floatarg g); static void comport_pollintervall(t_comport *x, t_floatarg g);
static void comport_tick(t_comport *x); static void comport_tick(t_comport *x);
static float set_baudrate(t_comport *x,t_float baud); static float set_baudrate(t_comport *x,t_float baud);
@ -203,6 +235,7 @@ static HANDLE close_serial(t_comport *x);
#else #else
static int open_serial(unsigned int com_num, t_comport *x); static int open_serial(unsigned int com_num, t_comport *x);
static int close_serial(t_comport *x); static int close_serial(t_comport *x);
static long get_baud_ratebits(t_float *baud);
#endif #endif
static void comport_pollintervall(t_comport *x, t_floatarg g); static void comport_pollintervall(t_comport *x, t_floatarg g);
static void comport_tick(t_comport *x); static void comport_tick(t_comport *x);
@ -240,22 +273,6 @@ void comport_setup(void);
/* --------- sys independent serial setup helpers ---------------- */ /* --------- sys independent serial setup helpers ---------------- */
static long get_baud_ratebits(t_float *baud)
{
int i = 0;
while(i < BAUDRATETABLE_LEN && baudratetable[i] > *baud) i++;
/* nearest Baudrate finding */
if(i==BAUDRATETABLE_LEN || baudspeedbittable[i] < 0)
{
post("*Warning* The baud rate %d is not supported or out of range, using 9600\n",*baud);
i = 8;
}
*baud = baudratetable[i];
return baudspeedbittable[i];
}
/* ------------ sys dependent serial setup helpers ---------------- */ /* ------------ sys dependent serial setup helpers ---------------- */
@ -267,7 +284,7 @@ static long get_baud_ratebits(t_float *baud)
static float set_baudrate(t_comport *x,t_float baud) static float set_baudrate(t_comport *x,t_float baud)
{ {
x->dcb.BaudRate = get_baud_ratebits(&baud); x->dcb.BaudRate = (DWORD)baud ;//!!!try directly setting any baud rate...was get_baud_ratebits(&baud);
return baud; return baud;
} }
@ -373,6 +390,14 @@ static int set_xonxoff(t_comport *x, int nr)
static int set_serial(t_comport *x) static int set_serial(t_comport *x)
{ {
if (SetCommState(x->comhandle, &(x->dcb))) return 1; if (SetCommState(x->comhandle, &(x->dcb))) return 1;
/* Didn't work. Get the actual state of the device */
GetCommState(x->comhandle, &(x->dcb));
x->baud = x->dcb.BaudRate;
x->data_bits = x->dcb.ByteSize;
x->parity_bit = x->dcb.fParity;
x->stop_bits = x->dcb.StopBits;
x->xonxoff = (x->dcb.fOutX)?1:0;
x->ctsrts = (x->dcb.fOutxCtsFlow)?1:0;
return 0; return 0;
} }
@ -582,10 +607,27 @@ int comport_get_cts(t_comport *x)
/* ----------------- POSIX - UNIX ------------------------------ */ /* ----------------- POSIX - UNIX ------------------------------ */
static float set_baudrate(t_comport *x,t_float baud) static long get_baud_ratebits(t_float *baud)
{
int i = 0;
while(i < BAUDRATETABLE_LEN && baudratetable[i] > *baud) i++;
/* nearest Baudrate finding */
if(i==BAUDRATETABLE_LEN || baudspeedbittable[i] < 0)
{
post("*Warning* The baud rate %d is not supported or out of range, using 9600\n",*baud);
i = 8;
}
*baud = baudratetable[i];
return baudspeedbittable[i];
}
static float set_baudrate(t_comport *x, t_float baud)
{ {
struct termios *tio = &(x->com_termio); struct termios *tio = &(x->com_termio);
long baudbits = get_baud_ratebits(&baud); speed_t baudbits = get_baud_ratebits(&baud);
cfsetispeed(tio, baudbits); cfsetispeed(tio, baudbits);
cfsetospeed(tio, baudbits); cfsetospeed(tio, baudbits);