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:
device/serial
serial_io_handler.hserial_io_handler_posix.ccserial_io_handler_posix.hserial_io_handler_win.ccserial_io_handler_win.htest_serial_io_handler.cctest_serial_io_handler.h
extensions
tools/metrics/histograms
@@ -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">
|
||||
|
Reference in New Issue
Block a user