Chromium Code Reviews| Index: chrome/browser/extensions/api/serial/serial_connection_posix.cc |
| =================================================================== |
| --- chrome/browser/extensions/api/serial/serial_connection_posix.cc (revision 218161) |
| +++ chrome/browser/extensions/api/serial/serial_connection_posix.cc (working copy) |
| @@ -9,103 +9,121 @@ |
| namespace extensions { |
| -bool SerialConnection::PostOpen() { |
| - struct termios options; |
| - |
| - // Start with existing options and modify. |
| - tcgetattr(file_, &options); |
| - |
| - // Bitrate (sometimes erroneously referred to as baud rate). |
| - if (bitrate_ >= 0) { |
| - int bitrate_opt_; |
| +namespace { |
| + int getBaudRate(int bitrate_) { |
| switch (bitrate_) { |
| case 0: |
| - bitrate_opt_ = B0; |
| - break; |
| + return B0; |
| case 50: |
| - bitrate_opt_ = B50; |
| - break; |
| + return B50; |
| case 75: |
| - bitrate_opt_ = B75; |
| - break; |
| + return B75; |
| case 110: |
| - bitrate_opt_ = B110; |
| - break; |
| + return B110; |
| case 134: |
| - bitrate_opt_ = B134; |
| - break; |
| + return B134; |
| case 150: |
| - bitrate_opt_ = B150; |
| - break; |
| + return B150; |
| case 200: |
| - bitrate_opt_ = B200; |
| - break; |
| + return B200; |
| case 300: |
| - bitrate_opt_ = B300; |
| - break; |
| + return B300; |
| case 600: |
| - bitrate_opt_ = B600; |
| - break; |
| + return B600; |
| case 1200: |
| - bitrate_opt_ = B1200; |
| - break; |
| + return B1200; |
| case 1800: |
| - bitrate_opt_ = B1800; |
| - break; |
| + return B1800; |
| case 2400: |
| - bitrate_opt_ = B2400; |
| - break; |
| + return B2400; |
| case 4800: |
| - bitrate_opt_ = B4800; |
| - break; |
| + return B4800; |
| case 9600: |
| - bitrate_opt_ = B9600; |
| - break; |
| + return B9600; |
| case 19200: |
| - bitrate_opt_ = B19200; |
| - break; |
| + return B19200; |
| case 38400: |
| - bitrate_opt_ = B38400; |
| - break; |
| + return B38400; |
| #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| case 57600: |
| - bitrate_opt_ = B57600; |
| - break; |
| + return B57600; |
| case 115200: |
| - bitrate_opt_ = B115200; |
| - break; |
| + return B115200; |
| case 230400: |
| - bitrate_opt_ = B230400; |
| - break; |
| + return B230400; |
| case 460800: |
| - bitrate_opt_ = B460800; |
| - break; |
| + return B460800; |
| case 576000: |
| - bitrate_opt_ = B576000; |
| - break; |
| + return B576000; |
| case 921600: |
| - bitrate_opt_ = B921600; |
| - break; |
| + return B921600; |
| default: |
| - bitrate_opt_ = B9600; |
| + return B9600; |
| #else |
| // MACOSX doesn't define constants bigger than 38400. |
| // So if it is MACOSX and the value doesn't fit any of the defined constants |
| // It will setup the bitrate with 'bitrate_' (just forwarding the value) |
| default: |
| - bitrate_opt_ = bitrate_; |
| + return bitrate_; |
| #endif |
| } |
| + } |
| + |
| +} |
| + |
| +bool SerialConnection::PostOpen() { |
| + struct termios options; |
| + |
| + // Start with existing options and modify. |
| + tcgetattr(file_, &options); |
| + |
| + // Bitrate (sometimes erroneously referred to as baud rate). |
| + if (bitrate_ >= 0) { |
| + int bitrate_opt_ = getBaudRate(bitrate_); |
| + |
| cfsetispeed(&options, bitrate_opt_); |
| cfsetospeed(&options, bitrate_opt_); |
| } |
| - // 8N1 |
| - options.c_cflag &= ~PARENB; |
| - options.c_cflag &= ~CSTOPB; |
| options.c_cflag &= ~CSIZE; |
| - options.c_cflag |= CS8; |
| + switch (databit_) { |
| + case serial::DATA_BIT_SEVENBIT: |
| + options.c_cflag |= CS7; |
| + break; |
| + case serial::DATA_BIT_EIGHTBIT: |
| + options.c_cflag |= CS8; |
| + break; |
| + default: |
| + options.c_cflag |= CS8; |
| + break; |
| + } |
| + switch (stopbit_) { |
| + case serial::STOP_BIT_ONESTOPBIT: |
| + options.c_cflag &= ~CSTOPB; |
| + break; |
| + case serial::STOP_BIT_TWOSTOPBIT: |
| + options.c_cflag |= CSTOPB; |
| + break; |
| + default: |
| + options.c_cflag &= ~CSTOPB; |
| + break; |
| + } |
| + switch (parity_) { |
| + case serial::PARITY_BIT_EVENPARITY: |
| + options.c_cflag |= PARENB; |
| + options.c_cflag &= ~PARODD; |
| + break; |
| + case serial::PARITY_BIT_NOPARITY: |
| + options.c_cflag &= ~(PARENB | PARODD); |
| + break; |
| + case serial::PARITY_BIT_ODDPARITY: |
| + options.c_cflag |= (PARENB | PARODD); |
| + break; |
| + default: |
| + options.c_cflag &= ~(PARENB | PARODD); |
|
miket_OOO
2013/08/21 19:43:44
rather than listing the no-parity code twice, you
limasdf
2013/08/24 15:46:24
Done.
|
| + break; |
| + } |
| options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); |
| // Enable receiver and set local mode |