OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/api/serial/serial_connection.h" | 5 #include "chrome/browser/extensions/api/serial/serial_connection.h" |
6 | 6 |
7 #include <sys/ioctl.h> | 7 #include <sys/ioctl.h> |
8 #include <termios.h> | 8 #include <termios.h> |
9 | 9 |
10 namespace extensions { | 10 namespace extensions { |
11 | 11 |
12 namespace { | |
13 int getBaudRate(int bitrate_) { | |
14 switch (bitrate_) { | |
15 case 0: | |
16 return B0; | |
17 case 50: | |
18 return B50; | |
19 case 75: | |
20 return B75; | |
21 case 110: | |
22 return B110; | |
23 case 134: | |
24 return B134; | |
25 case 150: | |
26 return B150; | |
27 case 200: | |
28 return B200; | |
29 case 300: | |
30 return B300; | |
31 case 600: | |
32 return B600; | |
33 case 1200: | |
34 return B1200; | |
35 case 1800: | |
36 return B1800; | |
37 case 2400: | |
38 return B2400; | |
39 case 4800: | |
40 return B4800; | |
41 case 9600: | |
42 return B9600; | |
43 case 19200: | |
44 return B19200; | |
45 case 38400: | |
46 return B38400; | |
47 #if defined(OS_POSIX) && !defined(OS_MACOSX) | |
48 case 57600: | |
49 return B57600; | |
50 case 115200: | |
51 return B115200; | |
52 case 230400: | |
53 return B230400; | |
54 case 460800: | |
55 return B460800; | |
56 case 576000: | |
57 return B576000; | |
58 case 921600: | |
59 return B921600; | |
60 default: | |
61 return B9600; | |
62 #else | |
63 // MACOSX doesn't define constants bigger than 38400. | |
64 // So if it is MACOSX and the value doesn't fit any of the defined constants | |
65 // It will setup the bitrate with 'bitrate_' (just forwarding the value) | |
66 default: | |
67 return bitrate_; | |
68 #endif | |
69 } | |
70 | |
71 } | |
72 | |
73 } | |
74 | |
12 bool SerialConnection::PostOpen() { | 75 bool SerialConnection::PostOpen() { |
13 struct termios options; | 76 struct termios options; |
14 | 77 |
15 // Start with existing options and modify. | 78 // Start with existing options and modify. |
16 tcgetattr(file_, &options); | 79 tcgetattr(file_, &options); |
17 | 80 |
18 // Bitrate (sometimes erroneously referred to as baud rate). | 81 // Bitrate (sometimes erroneously referred to as baud rate). |
19 if (bitrate_ >= 0) { | 82 if (bitrate_ >= 0) { |
20 int bitrate_opt_; | 83 int bitrate_opt_ = getBaudRate(bitrate_); |
21 switch (bitrate_) { | |
22 case 0: | |
23 bitrate_opt_ = B0; | |
24 break; | |
25 case 50: | |
26 bitrate_opt_ = B50; | |
27 break; | |
28 case 75: | |
29 bitrate_opt_ = B75; | |
30 break; | |
31 case 110: | |
32 bitrate_opt_ = B110; | |
33 break; | |
34 case 134: | |
35 bitrate_opt_ = B134; | |
36 break; | |
37 case 150: | |
38 bitrate_opt_ = B150; | |
39 break; | |
40 case 200: | |
41 bitrate_opt_ = B200; | |
42 break; | |
43 case 300: | |
44 bitrate_opt_ = B300; | |
45 break; | |
46 case 600: | |
47 bitrate_opt_ = B600; | |
48 break; | |
49 case 1200: | |
50 bitrate_opt_ = B1200; | |
51 break; | |
52 case 1800: | |
53 bitrate_opt_ = B1800; | |
54 break; | |
55 case 2400: | |
56 bitrate_opt_ = B2400; | |
57 break; | |
58 case 4800: | |
59 bitrate_opt_ = B4800; | |
60 break; | |
61 case 9600: | |
62 bitrate_opt_ = B9600; | |
63 break; | |
64 case 19200: | |
65 bitrate_opt_ = B19200; | |
66 break; | |
67 case 38400: | |
68 bitrate_opt_ = B38400; | |
69 break; | |
70 #if defined(OS_POSIX) && !defined(OS_MACOSX) | |
71 case 57600: | |
72 bitrate_opt_ = B57600; | |
73 break; | |
74 case 115200: | |
75 bitrate_opt_ = B115200; | |
76 break; | |
77 case 230400: | |
78 bitrate_opt_ = B230400; | |
79 break; | |
80 case 460800: | |
81 bitrate_opt_ = B460800; | |
82 break; | |
83 case 576000: | |
84 bitrate_opt_ = B576000; | |
85 break; | |
86 case 921600: | |
87 bitrate_opt_ = B921600; | |
88 break; | |
89 default: | |
90 bitrate_opt_ = B9600; | |
91 #else | |
92 // MACOSX doesn't define constants bigger than 38400. | |
93 // So if it is MACOSX and the value doesn't fit any of the defined constants | |
94 // It will setup the bitrate with 'bitrate_' (just forwarding the value) | |
95 default: | |
96 bitrate_opt_ = bitrate_; | |
97 #endif | |
98 } | |
99 | 84 |
100 cfsetispeed(&options, bitrate_opt_); | 85 cfsetispeed(&options, bitrate_opt_); |
101 cfsetospeed(&options, bitrate_opt_); | 86 cfsetospeed(&options, bitrate_opt_); |
102 } | 87 } |
103 | 88 |
104 // 8N1 | |
105 options.c_cflag &= ~PARENB; | |
106 options.c_cflag &= ~CSTOPB; | |
107 options.c_cflag &= ~CSIZE; | 89 options.c_cflag &= ~CSIZE; |
108 options.c_cflag |= CS8; | 90 switch (databit_) { |
91 case serial::DATA_BIT_SEVENBIT: | |
92 options.c_cflag |= CS7; | |
93 break; | |
94 case serial::DATA_BIT_EIGHTBIT: | |
95 options.c_cflag |= CS8; | |
96 break; | |
97 default: | |
98 options.c_cflag |= CS8; | |
99 break; | |
100 } | |
101 switch (stopbit_) { | |
102 case serial::STOP_BIT_ONESTOPBIT: | |
103 options.c_cflag &= ~CSTOPB; | |
104 break; | |
105 case serial::STOP_BIT_TWOSTOPBIT: | |
106 options.c_cflag |= CSTOPB; | |
107 break; | |
108 default: | |
109 options.c_cflag &= ~CSTOPB; | |
110 break; | |
111 } | |
112 switch (parity_) { | |
113 case serial::PARITY_BIT_EVENPARITY: | |
114 options.c_cflag |= PARENB; | |
115 options.c_cflag &= ~PARODD; | |
116 break; | |
117 case serial::PARITY_BIT_NOPARITY: | |
118 options.c_cflag &= ~(PARENB | PARODD); | |
119 break; | |
120 case serial::PARITY_BIT_ODDPARITY: | |
121 options.c_cflag |= (PARENB | PARODD); | |
122 break; | |
123 default: | |
124 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.
| |
125 break; | |
126 } | |
109 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); | 127 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); |
110 | 128 |
111 // Enable receiver and set local mode | 129 // Enable receiver and set local mode |
112 // See http://www.easysw.com/~mike/serial/serial.html to understand. | 130 // See http://www.easysw.com/~mike/serial/serial.html to understand. |
113 options.c_cflag |= (CLOCAL | CREAD); | 131 options.c_cflag |= (CLOCAL | CREAD); |
114 | 132 |
115 // Write the options. | 133 // Write the options. |
116 tcsetattr(file_, TCSANOW, &options); | 134 tcsetattr(file_, TCSANOW, &options); |
117 | 135 |
118 return true; | 136 return true; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
150 | 168 |
151 return ioctl(file_, TIOCMSET, &status) == 0; | 169 return ioctl(file_, TIOCMSET, &status) == 0; |
152 } | 170 } |
153 | 171 |
154 std::string SerialConnection::MaybeFixUpPortName( | 172 std::string SerialConnection::MaybeFixUpPortName( |
155 const std::string &port_name) { | 173 const std::string &port_name) { |
156 return port_name; | 174 return port_name; |
157 } | 175 } |
158 | 176 |
159 } // namespace extensions | 177 } // namespace extensions |
OLD | NEW |