0

Implement break signal for serial api.

`Break` is somewhat related to control signaling and holds tx line low for n milliseconds.
Adding platform specific implementation.

BUG=461169
TEST=Manual with attached application on crbug.com/461169

Review URL: https://codereview.chromium.org/1128943005

Cr-Commit-Position: refs/heads/master@{#334111}
This commit is contained in:
limasdf
2015-06-11 19:06:16 -07:00
committed by Commit bot
parent 336363eca1
commit d169ad87e2
14 changed files with 166 additions and 0 deletions

@@ -83,6 +83,14 @@ class SerialIoHandler : public base::NonThreadSafe,
// successfully retrieved.
virtual serial::ConnectionInfoPtr GetPortInfo() const = 0;
// Initiates a BREAK signal. Places the transmission line in a break state
// until the |ClearBreak| is called.
virtual bool SetBreak() = 0;
// Terminates the BREAK signal. Places the transmission line in a nonbreak
// state.
virtual bool ClearBreak() = 0;
protected:
explicit SerialIoHandler(
scoped_refptr<base::SingleThreadTaskRunner> file_thread_task_runner,

@@ -472,6 +472,23 @@ serial::ConnectionInfoPtr SerialIoHandlerPosix::GetPortInfo() const {
return info.Pass();
}
bool SerialIoHandlerPosix::SetBreak() {
if (ioctl(file().GetPlatformFile(), TIOCSBRK, 0) != 0) {
VPLOG(1) << "Failed to set break";
return false;
}
return true;
}
bool SerialIoHandlerPosix::ClearBreak() {
if (ioctl(file().GetPlatformFile(), TIOCCBRK, 0) != 0) {
VPLOG(1) << "Failed to clear break";
return false;
}
return true;
}
std::string SerialIoHandler::MaybeFixUpPortName(const std::string& port_name) {
return port_name;
}

@@ -26,6 +26,8 @@ class SerialIoHandlerPosix : public SerialIoHandler,
bool SetControlSignals(
const serial::HostControlSignals& control_signals) override;
serial::ConnectionInfoPtr GetPortInfo() const override;
bool SetBreak() override;
bool ClearBreak() override;
void RequestAccess(
const std::string& port,
scoped_refptr<base::SingleThreadTaskRunner> file_task_runner,

@@ -391,6 +391,22 @@ serial::ConnectionInfoPtr SerialIoHandlerWin::GetPortInfo() const {
return info.Pass();
}
bool SerialIoHandlerWin::SetBreak() {
if (!SetCommBreak(file().GetPlatformFile())) {
VPLOG(1) << "Failed to set break";
return false;
}
return true;
}
bool SerialIoHandlerWin::ClearBreak() {
if (!ClearCommBreak(file().GetPlatformFile())) {
VPLOG(1) << "Failed to clear break";
return false;
}
return true;
}
std::string SerialIoHandler::MaybeFixUpPortName(const std::string& port_name) {
// For COM numbers less than 9, CreateFile is called with a string such as
// "COM1". For numbers greater than 9, a prefix of "\\\\.\\" must be added.

@@ -27,6 +27,8 @@ class SerialIoHandlerWin : public SerialIoHandler,
bool SetControlSignals(
const serial::HostControlSignals& control_signals) override;
serial::ConnectionInfoPtr GetPortInfo() const override;
bool SetBreak() override;
bool ClearBreak() override;
bool PostOpen() override;
private:

@@ -101,6 +101,14 @@ bool TestSerialIoHandler::SetControlSignals(
return true;
}
bool TestSerialIoHandler::SetBreak() {
return true;
}
bool TestSerialIoHandler::ClearBreak() {
return true;
}
TestSerialIoHandler::~TestSerialIoHandler() {
}

@@ -32,6 +32,8 @@ class TestSerialIoHandler : public SerialIoHandler {
serial::ConnectionInfoPtr GetPortInfo() const override;
bool Flush() const override;
bool SetControlSignals(const serial::HostControlSignals& signals) override;
bool SetBreak() override;
bool ClearBreak() override;
serial::ConnectionInfo* connection_info() { return &info_; }
serial::DeviceControlSignals* device_control_signals() {

@@ -422,6 +422,53 @@ void SerialSetControlSignalsFunction::Work() {
results_ = serial::SetControlSignals::Results::Create(success);
}
SerialSetBreakFunction::SerialSetBreakFunction() {
}
SerialSetBreakFunction::~SerialSetBreakFunction() {
}
bool SerialSetBreakFunction::Prepare() {
params_ = serial::SetBreak::Params::Create(*args_);
EXTENSION_FUNCTION_VALIDATE(params_.get());
return true;
}
void SerialSetBreakFunction::Work() {
SerialConnection* connection = GetSerialConnection(params_->connection_id);
if (!connection) {
error_ = kErrorSerialConnectionNotFound;
return;
}
bool success = connection->SetBreak();
results_ = serial::SetBreak::Results::Create(success);
}
SerialClearBreakFunction::SerialClearBreakFunction() {
}
SerialClearBreakFunction::~SerialClearBreakFunction() {
}
bool SerialClearBreakFunction::Prepare() {
params_ = serial::ClearBreak::Params::Create(*args_);
EXTENSION_FUNCTION_VALIDATE(params_.get());
return true;
}
void SerialClearBreakFunction::Work() {
SerialConnection* connection = GetSerialConnection(params_->connection_id);
if (!connection) {
error_ = kErrorSerialConnectionNotFound;
return;
}
bool success = connection->ClearBreak();
results_ = serial::ClearBreak::Results::Create(success);
}
} // namespace core_api
} // namespace extensions

@@ -239,6 +239,38 @@ class SerialSetControlSignalsFunction : public SerialAsyncApiFunction {
scoped_ptr<serial::SetControlSignals::Params> params_;
};
class SerialSetBreakFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.setBreak", SERIAL_SETBREAK)
SerialSetBreakFunction();
protected:
~SerialSetBreakFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void Work() override;
private:
scoped_ptr<serial::SetBreak::Params> params_;
};
class SerialClearBreakFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.clearBreak", SERIAL_CLEARBREAK)
SerialClearBreakFunction();
protected:
~SerialClearBreakFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void Work() override;
private:
scoped_ptr<serial::ClearBreak::Params> params_;
};
} // namespace core_api
} // namespace extensions

@@ -360,6 +360,14 @@ bool SerialConnection::SetControlSignals(
*device::serial::HostControlSignals::From(control_signals));
}
bool SerialConnection::SetBreak() {
return io_handler_->SetBreak();
}
bool SerialConnection::ClearBreak() {
return io_handler_->ClearBreak();
}
void SerialConnection::OnReceiveTimeout() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
io_handler_->CancelRead(device::serial::RECEIVE_ERROR_TIMEOUT);

@@ -112,6 +112,12 @@ class SerialConnection : public ApiResource,
bool SetControlSignals(
const core_api::serial::HostControlSignals& control_signals);
// Suspend character transmission. Known as setting/sending 'Break' signal.
bool SetBreak();
// Restore character transmission. Known as clear/stop sending 'Break' signal.
bool ClearBreak();
// Overrides |io_handler_| for testing.
void SetIoHandlerForTest(scoped_refptr<device::SerialIoHandler> handler);

@@ -1111,6 +1111,8 @@ enum HistogramValue {
PRINTERPROVIDERINTERNAL_REPORTUSBPRINTERINFO,
WEBCAMPRIVATE_OPENSERIALWEBCAM,
WEBCAMPRIVATE_CLOSEWEBCAM,
SERIAL_SETBREAK,
SERIAL_CLEARBREAK,
// Last entry: Add new entries above and ensure to update
// tools/metrics/histograms/histograms.xml.
ENUM_BOUNDARY

@@ -171,6 +171,10 @@ namespace serial {
callback FlushCallback = void (boolean result);
callback SetBreakCallback = void (boolean result);
callback ClearBreakCallback = void (boolean result);
// The set of control signals which may be sent to a connected serial device
// using <code>setControlSignals</code>. Note that support for these signals
// is device-dependent.
@@ -307,6 +311,16 @@ namespace serial {
static void setControlSignals(long connectionId,
HostControlSignals signals,
SetControlSignalsCallback callback);
// Suspends character transmission on a given connection and places the
// transmission line in a break state until the clearBreak is called.
// |connectionId| : The id of the connection.
static void setBreak(long connectionId, SetBreakCallback callback);
// Restore character transmission on a given connection and place the
// transmission line in a nonbreak state.
// |connectionId| : The id of the connection.
static void clearBreak(long connectionId, ClearBreakCallback callback);
};
interface Events {

@@ -54360,6 +54360,8 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
<int value="1050" label="PRINTERPROVIDERINTERNAL_REPORTUSBPRINTERINFO"/>
<int value="1051" label="WEBCAMPRIVATE_OPENSERIALWEBCAM"/>
<int value="1052" label="WEBCAMPRIVATE_CLOSEWEBCAM"/>
<int value="1053" label="SERIAL_SETBREAK"/>
<int value="1054" label="SERIAL_CLEARBREAK"/>
</enum>
<enum name="ExtensionInstallCause" type="int">