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_api.h" | 5 #include "chrome/browser/extensions/api/serial/serial_api.h" |
6 | 6 |
7 #include "base/values.h" | 7 #include "base/values.h" |
8 #include "chrome/browser/extensions/extension_system.h" | 8 #include "chrome/browser/extensions/extension_system.h" |
9 #include "chrome/browser/extensions/api/serial/serial_connection.h" | 9 #include "chrome/browser/extensions/api/serial/serial_connection.h" |
10 #include "chrome/browser/extensions/api/serial/serial_port_enumerator.h" | 10 #include "chrome/browser/extensions/api/serial/serial_port_enumerator.h" |
11 #include "content/public/browser/browser_thread.h" | 11 #include "content/public/browser/browser_thread.h" |
12 | 12 |
13 using content::BrowserThread; | 13 using content::BrowserThread; |
14 | 14 |
| 15 namespace serial = extensions::api::serial; |
| 16 |
15 namespace extensions { | 17 namespace extensions { |
16 | 18 |
17 const char kConnectionIdKey[] = "connectionId"; | 19 const char kConnectionIdKey[] = "connectionId"; |
18 const char kDataKey[] = "data"; | 20 const char kDataKey[] = "data"; |
19 const char kBytesReadKey[] = "bytesRead"; | 21 const char kBytesReadKey[] = "bytesRead"; |
20 const char kBytesWrittenKey[] = "bytesWritten"; | 22 const char kBytesWrittenKey[] = "bytesWritten"; |
21 const char kBitrateKey[] = "bitrate"; | 23 const char kBitrateKey[] = "bitrate"; |
| 24 const char kDataBitKey[] = "dataBit"; |
| 25 const char kParityKey[] = "parityBit"; |
| 26 const char kStopBitKey[] = "stopBit"; |
22 const char kSuccessKey[] = "success"; | 27 const char kSuccessKey[] = "success"; |
23 const char kDcdKey[] = "dcd"; | 28 const char kDcdKey[] = "dcd"; |
24 const char kCtsKey[] = "cts"; | 29 const char kCtsKey[] = "cts"; |
25 | 30 |
26 const char kErrorGetControlSignalsFailed[] = "Failed to get control signals."; | 31 const char kErrorGetControlSignalsFailed[] = "Failed to get control signals."; |
27 const char kErrorSetControlSignalsFailed[] = "Failed to set control signals."; | 32 const char kErrorSetControlSignalsFailed[] = "Failed to set control signals."; |
28 const char kSerialReadInvalidBytesToRead[] = "Number of bytes to read must " | 33 const char kSerialReadInvalidBytesToRead[] = "Number of bytes to read must " |
29 "be a positive number less than 1,048,576."; | 34 "be a positive number less than 1,048,576."; |
30 | 35 |
31 SerialAsyncApiFunction::SerialAsyncApiFunction() | 36 SerialAsyncApiFunction::SerialAsyncApiFunction() |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 } | 81 } |
77 | 82 |
78 // It's a fool's errand to come up with a default bitrate, because we don't get | 83 // It's a fool's errand to come up with a default bitrate, because we don't get |
79 // to control both sides of the communication. Unless the other side has | 84 // to control both sides of the communication. Unless the other side has |
80 // implemented auto-bitrate detection (rare), if we pick the wrong rate, then | 85 // implemented auto-bitrate detection (rare), if we pick the wrong rate, then |
81 // you're gonna have a bad time. Close doesn't count. | 86 // you're gonna have a bad time. Close doesn't count. |
82 // | 87 // |
83 // But we'd like to pick something that has a chance of working, and 9600 is a | 88 // But we'd like to pick something that has a chance of working, and 9600 is a |
84 // good balance between popularity and speed. So 9600 it is. | 89 // good balance between popularity and speed. So 9600 it is. |
85 SerialOpenFunction::SerialOpenFunction() | 90 SerialOpenFunction::SerialOpenFunction() |
86 : bitrate_(9600) { | 91 : bitrate_(9600), databit_(serial::DATA_BIT_EIGHTBIT), |
| 92 parity_(serial::PARITY_BIT_NOPARITY), |
| 93 stopbit_(serial::STOP_BIT_ONESTOPBIT) { |
87 } | 94 } |
88 | 95 |
89 SerialOpenFunction::~SerialOpenFunction() { | 96 SerialOpenFunction::~SerialOpenFunction() { |
90 } | 97 } |
91 | 98 |
92 bool SerialOpenFunction::Prepare() { | 99 bool SerialOpenFunction::Prepare() { |
93 set_work_thread_id(BrowserThread::FILE); | 100 set_work_thread_id(BrowserThread::FILE); |
94 | 101 |
95 params_ = api::serial::Open::Params::Create(*args_); | 102 params_ = api::serial::Open::Params::Create(*args_); |
96 EXTENSION_FUNCTION_VALIDATE(params_.get()); | 103 EXTENSION_FUNCTION_VALIDATE(params_.get()); |
97 | 104 |
98 if (params_->options.get()) { | 105 if (params_->options.get()) { |
99 scoped_ptr<base::DictionaryValue> options = params_->options->ToValue(); | 106 scoped_ptr<base::DictionaryValue> options = params_->options->ToValue(); |
100 if (options->HasKey(kBitrateKey)) | 107 if (options->HasKey(kBitrateKey)) |
101 EXTENSION_FUNCTION_VALIDATE(options->GetInteger(kBitrateKey, &bitrate_)); | 108 EXTENSION_FUNCTION_VALIDATE(options->GetInteger(kBitrateKey, &bitrate_)); |
| 109 if (options->HasKey(kDataBitKey)) { |
| 110 std::string data; |
| 111 options->GetString(kDataBitKey, &data); |
| 112 if (!data.empty()) |
| 113 databit_ = serial::ParseDataBit(data); |
| 114 } |
| 115 if (options->HasKey(kParityKey)) { |
| 116 std::string parity; |
| 117 options->GetString(kParityKey, &parity); |
| 118 if (!parity.empty()) |
| 119 parity_ = serial::ParseParityBit(parity); |
| 120 } |
| 121 if (options->HasKey(kStopBitKey)) { |
| 122 std::string stopbit; |
| 123 options->GetString(kStopBitKey, &stopbit); |
| 124 if (!stopbit.empty()) |
| 125 stopbit_ = serial::ParseStopBit(stopbit); |
| 126 } |
102 } | 127 } |
103 | 128 |
104 return true; | 129 return true; |
105 } | 130 } |
106 | 131 |
107 void SerialOpenFunction::AsyncWorkStart() { | 132 void SerialOpenFunction::AsyncWorkStart() { |
108 Work(); | 133 Work(); |
109 } | 134 } |
110 | 135 |
111 void SerialOpenFunction::Work() { | 136 void SerialOpenFunction::Work() { |
112 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
113 const SerialPortEnumerator::StringSet name_set( | 138 const SerialPortEnumerator::StringSet name_set( |
114 SerialPortEnumerator::GenerateValidSerialPortNames()); | 139 SerialPortEnumerator::GenerateValidSerialPortNames()); |
115 if (DoesPortExist(params_->port)) { | 140 if (DoesPortExist(params_->port)) { |
116 SerialConnection* serial_connection = CreateSerialConnection( | 141 SerialConnection* serial_connection = CreateSerialConnection( |
117 params_->port, | 142 params_->port, |
118 bitrate_, | 143 bitrate_, |
| 144 databit_, |
| 145 parity_, |
| 146 stopbit_, |
119 extension_->id()); | 147 extension_->id()); |
120 CHECK(serial_connection); | 148 CHECK(serial_connection); |
121 int id = manager_->Add(serial_connection); | 149 int id = manager_->Add(serial_connection); |
122 CHECK(id); | 150 CHECK(id); |
123 | 151 |
124 bool open_result = serial_connection->Open(); | 152 bool open_result = serial_connection->Open(); |
125 if (!open_result) { | 153 if (!open_result) { |
126 serial_connection->Close(); | 154 serial_connection->Close(); |
127 RemoveSerialConnection(id); | 155 RemoveSerialConnection(id); |
128 id = -1; | 156 id = -1; |
129 } | 157 } |
130 | 158 |
131 base::DictionaryValue* result = new base::DictionaryValue(); | 159 base::DictionaryValue* result = new base::DictionaryValue(); |
132 result->SetInteger(kConnectionIdKey, id); | 160 result->SetInteger(kConnectionIdKey, id); |
133 SetResult(result); | 161 SetResult(result); |
134 AsyncWorkCompleted(); | 162 AsyncWorkCompleted(); |
135 } else { | 163 } else { |
136 base::DictionaryValue* result = new base::DictionaryValue(); | 164 base::DictionaryValue* result = new base::DictionaryValue(); |
137 result->SetInteger(kConnectionIdKey, -1); | 165 result->SetInteger(kConnectionIdKey, -1); |
138 SetResult(result); | 166 SetResult(result); |
139 AsyncWorkCompleted(); | 167 AsyncWorkCompleted(); |
140 } | 168 } |
141 } | 169 } |
142 | 170 |
143 SerialConnection* SerialOpenFunction::CreateSerialConnection( | 171 SerialConnection* SerialOpenFunction::CreateSerialConnection( |
144 const std::string& port, | 172 const std::string& port, |
145 int bitrate, | 173 int bitrate, |
| 174 serial::DataBit databit, |
| 175 serial::ParityBit parity, |
| 176 serial::StopBit stopbit, |
146 const std::string& owner_extension_id) { | 177 const std::string& owner_extension_id) { |
147 return new SerialConnection(port, bitrate, owner_extension_id); | 178 return new SerialConnection(port, bitrate, databit, parity, stopbit, |
| 179 owner_extension_id); |
148 } | 180 } |
149 | 181 |
150 bool SerialOpenFunction::DoesPortExist(const std::string& port) { | 182 bool SerialOpenFunction::DoesPortExist(const std::string& port) { |
151 const SerialPortEnumerator::StringSet name_set( | 183 const SerialPortEnumerator::StringSet name_set( |
152 SerialPortEnumerator::GenerateValidSerialPortNames()); | 184 SerialPortEnumerator::GenerateValidSerialPortNames()); |
153 return SerialPortEnumerator::DoesPortExist(name_set, params_->port); | 185 return SerialPortEnumerator::DoesPortExist(name_set, params_->port); |
154 } | 186 } |
155 | 187 |
156 bool SerialOpenFunction::Respond() { | 188 bool SerialOpenFunction::Respond() { |
157 return true; | 189 return true; |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 error_ = kSerialConnectionNotFoundError; | 410 error_ = kSerialConnectionNotFoundError; |
379 SetResult(new base::FundamentalValue(false)); | 411 SetResult(new base::FundamentalValue(false)); |
380 } | 412 } |
381 } | 413 } |
382 | 414 |
383 bool SerialSetControlSignalsFunction::Respond() { | 415 bool SerialSetControlSignalsFunction::Respond() { |
384 return true; | 416 return true; |
385 } | 417 } |
386 | 418 |
387 } // namespace extensions | 419 } // namespace extensions |
OLD | NEW |