Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: chrome/browser/extensions/api/serial/serial_api.cc

Issue 22804008: Adds Serial API to set data bits, parity, stop bits. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/serial/serial_api.h ('k') | chrome/browser/extensions/api/serial/serial_apitest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698