// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.device;

using zx;

/// Maxmium length for a device name
const MAX_DEVICE_NAME_LEN uint64 = 32;
/// Maximum length of a device path
const MAX_DEVICE_PATH_LEN uint64 = 1024;
/// Maxmium length for a driver name
const MAX_DRIVER_NAME_LEN uint64 = 32;
/// Maximum length for a driver path
const MAX_DRIVER_PATH_LEN uint64 = 1024;

@deprecated("devices will be services in the future")
type DeviceSignal = strict bits : uint32 {
    /// Indicates the device is ready for reading.
    READABLE = 0x01000000; // ZX_USER_SIGNAL_0
    /// Indicates an out-of-band state transition has occurred.
    OOB = 0x02000000; // ZX_USER_SIGNAL_1
    /// Indicates the device is ready for writing.
    WRITABLE = 0x04000000; // ZX_USER_SIGNAL_2
    /// Indicates the device has encountered an error state.
    ERROR = 0x08000000; // ZX_USER_SIGNAL_3
    /// Indicates the device has hung up on the current connection.
    HANGUP = 0x10000000; // ZX_USER_SIGNAL_4
};

/// Interface for manipulating a device in a devhost
closed protocol Controller {
    /// Connect to the underlying device's FIDL protocol.
    /// This connection will not be multiplexed with fuchsia.device.Controller
    /// or fuchsia.io.Node.
    strict ConnectToDeviceFidl(resource struct {
        server zx.Handle:CHANNEL;
    });

    /// Connect to the same Controller FIDL protocol.
    strict ConnectToController(resource struct {
        server server_end:Controller;
    });

    /// Attempt to bind a driver to this device.
    /// + request `driver` This represents the suffix of a driver URL (e.g: "fvm.cm").
    ///            If this is non-empty, then the only drivers that will try to bind
    ///            are ones that match this url suffix.
    strict Bind(struct {
        driver string:MAX_DRIVER_PATH_LEN;
    }) -> () error zx.Status;

    /// Unbind all the children of this device, and then attempt to bind a driver to the device.
    /// This will not return until the bind completes.
    /// + request `driver` This represents the suffix of a driver URL (e.g: "fvm.cm").
    ///            If this is non-empty, then the only drivers that will try to bind
    ///            are ones that match this url suffix.
    strict Rebind(struct {
        driver string:MAX_DRIVER_PATH_LEN;
    }) -> () error zx.Status;

    /// This api will unbind all the children of this device synchronously.
    /// This will avoid watching for device removal by the clients.
    strict UnbindChildren() -> () error zx.Status;

    /// Disconnect this device and allow its parent to be bound again.
    /// This may not complete before it returns.
    strict ScheduleUnbind() -> () error zx.Status;

    /// Return the topological path for this device
    strict GetTopologicalPath() -> (struct {
        path string:MAX_DEVICE_PATH_LEN;
    }) error zx.Status;
};
