blob: ee2f7cc40016415b56aebda3501b06dfeb4bb471 [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module device.mojom;
import "device/bluetooth/public/mojom/uuid.mojom";
import "mojo/public/mojom/base/file_path.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";
struct SerialPortInfo {
mojo_base.mojom.UnguessableToken token;
mojo_base.mojom.FilePath path;
// The backend implementation for the serial port.
SerialPortType type = PLATFORM_SERIAL;
// On macOS a serial device may have two paths, one for the call-out device
// and one for the dial-in device. The call-out device is preferred. If
// there is also an associated dial-in device its path is provided here. If
// the dial-in device is the only option its path will be in |path|.
[EnableIf=is_mac] mojo_base.mojom.FilePath? alternate_path;
// On macOS a single serial port can be enumerated by multiple drivers. This
// field permits disambiguation.
[EnableIf=is_mac] string? usb_driver_name;
// On Windows the "device instance ID" provides a stable identifier that can
// be used for device permissions.
[EnableIf=is_win] string device_instance_id;
// The USB device vendor and product IDs.
uint16 vendor_id;
bool has_vendor_id = false;
uint16 product_id;
bool has_product_id = false;
// The Bluetooth service class ID of the port if the port is from a Bluetooth
// device. It is a 128-bit canonical UUID.
bluetooth.mojom.UUID? bluetooth_service_class_id;
// A string suitable for display to the user for describing this device. May
// be, for example, the USB device product name string.
// If no display_name is provided, the path will be displayed to the user
// instead.
string? display_name;
// The USB device serial number.
// Note: This field is not populated on Windows nor for non-USB devices.
string? serial_number;
};
enum SerialSendError {
NONE,
DISCONNECTED,
SYSTEM_ERROR,
};
enum SerialReceiveError {
NONE,
DISCONNECTED,
DEVICE_LOST,
BREAK,
FRAME_ERROR,
OVERRUN,
BUFFER_OVERFLOW,
PARITY_ERROR,
SYSTEM_ERROR,
};
enum SerialDataBits {
NONE,
SEVEN,
EIGHT,
};
enum SerialParityBit {
NONE,
NO_PARITY,
ODD,
EVEN,
};
enum SerialStopBits {
NONE,
ONE,
TWO,
};
enum SerialPortFlushMode {
// Flushes both receive and transmit buffers without discarding any bytes in
// the data pipes. This is for compatibility with chrome.serial.flush().
kReceiveAndTransmit,
// Flushes the receive buffers and discards data in the data_pipe_producer by
// closing it.
kReceive,
// Flushes the send buffers and discards data in the data_pipe_consumer by
// closing it.
kTransmit,
};
enum SerialPortType {
// The serial port is implemented using the platform's serial device API.
PLATFORM_SERIAL,
// The serial port is implemented using the Bluetooth classic RFCOMM protocol.
BLUETOOTH_CLASSIC_RFCOMM,
};
struct SerialConnectionOptions {
uint32 bitrate = 0;
SerialDataBits data_bits = NONE;
SerialParityBit parity_bit = NONE;
SerialStopBits stop_bits = NONE;
bool cts_flow_control;
bool has_cts_flow_control = false;
};
struct SerialConnectionInfo {
uint32 bitrate = 0;
SerialDataBits data_bits = NONE;
SerialParityBit parity_bit = NONE;
SerialStopBits stop_bits = NONE;
bool cts_flow_control;
};
struct SerialHostControlSignals {
// DTR (Data Terminal Ready)
bool dtr;
bool has_dtr = false;
// RTS (Request to Send)
bool rts;
bool has_rts = false;
// BRK (Break)
bool brk;
bool has_brk = false;
};
struct SerialPortControlSignals {
bool dcd;
bool cts;
bool ri;
bool dsr;
};
// Discovers and enumerates serial devices available to the host.
interface SerialPortManager {
// Associates an interface the port manager can used to notify the client of
// events such as the addition or removal of serial ports from the host.
SetClient(pending_remote<SerialPortManagerClient> client);
// Returns the list of serial ports currently available on the host.
GetDevices() => (array<SerialPortInfo> devices);
// Opens the port represented by |token| using |options| and returns a
// connection to it as |port|. If |use_alternate_path| is specified then the
// |alternate_path| for the port will be used instead. When the pipe returned
// in |port| is closed the optional pipe passed in |watcher| will also be
// closed and vice a versa.
OpenPort(mojo_base.mojom.UnguessableToken token,
bool use_alternate_path,
SerialConnectionOptions options,
pending_remote<SerialPortClient> client,
pending_remote<SerialPortConnectionWatcher>? watcher)
=> (pending_remote<SerialPort>? port);
};
// Client interface for SerialPortManager.
interface SerialPortManagerClient {
// This message indicates that a port has been added to the host.
OnPortAdded(SerialPortInfo port_info);
// This message indicates that a port has been removed from the host.
OnPortRemoved(SerialPortInfo port_info);
};
// Performs asynchronous I/O on serial devices.
interface SerialPort {
// Start writing data from |consumer| to the port. This should be called after
// Open() or to restart data flow after when SerialPortClient#OnSendError is
// called on |client| to indicate an error.
StartWriting(handle<data_pipe_consumer> consumer);
// Start reading data from the port into |producer|. This should be called
// after Open() or to restart data flow when SerialPortClient#OnReadError is
// called on |client| to indicate an error.
StartReading(handle<data_pipe_producer> producer);
// Flushes buffers according to the selected |mode|.
Flush(SerialPortFlushMode mode) => ();
// Waits for the data_pipe_consumer passed to StartWriting() to be closed and
// all buffered data to be transmitted by the port.
Drain() => ();
// Reads current control signals (DCD, CTS, etc.). Returns null on failure.
GetControlSignals() => (SerialPortControlSignals? signals);
// Sets one or more control signals and returns result.
SetControlSignals(SerialHostControlSignals signals) => (bool success);
// Performs platform-specific port configuration and returns result.
ConfigurePort(SerialConnectionOptions options) => (bool success);
// Performs a platform-specific port configuration query and returns got info.
GetPortInfo() => (SerialConnectionInfo info);
// Closes the port and this pipe. Once this returns no more data will be sent
// or received from |consumer| and |producer|. If |flush| is true the port's
// transmit and receive buffers are flushed before closing.
Close(bool flush) => ();
};
interface SerialPortClient {
OnReadError(SerialReceiveError error);
OnSendError(SerialSendError error);
};
interface SerialPortConnectionWatcher {
};