// Copyright 2020 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.camera3;

const MAX_WATCH_DEVICES_EVENTS uint32 = 256;

alias DeviceId = uint64;

/// The DeviceWatcher provides clients a mechanism to discover camera devices present on the
/// system. This is a temporary mechanism intended to be replaced by go/drivers-as-components,
/// which will allow multiple instances of the same protocol to exist side-by-side. Clients are
/// not required to maintain a connection to the Watcher in order to use established Camera
/// connections.
@discoverable
protocol DeviceWatcher {
    /// Returns a list of available camera IDs when it has changed from the previously returned
    /// list of IDs, or when it is called by a client for the first time. The returned list may be
    /// empty, indicating no cameras are available. The IDs returned to the client will remain
    /// consistent with respect to the physical devices they represent for the duration of the
    /// client's connection. Events will be sorted first by event type - `existing`, `added`,
    /// `removed`. Within each event type range, IDs will be provided in ascending order. Events
    /// are coalesced by the server, so a given ID will only appear once in each list of events.
    ///
    /// Please note that it is entirely possible for the list returned to be temporarily empty even
    /// if the local camera hardware is hardwired (vs plug-in like USB). The empty list condition
    /// is temporary on such a platform.
    ///
    /// Camera applications should tolerate an empty list returned, and attempt to retry the
    /// `WatchDevices()` call.
    WatchDevices() -> (struct {
        events vector<WatchDevicesEvent>:MAX_WATCH_DEVICES_EVENTS;
    });

    /// Acquires a camera interface for the given ID. If any clients already exist for this camera,
    /// the request is closed with the ZX_ERR_ALREADY_BOUND epitaph.
    ConnectToDevice(resource struct {
        id DeviceId;
        request server_end:Device;
    });
};

type WatchDevicesEvent = strict union {
    /// Indicates an existing camera with the provided ID is still available.
    1: existing DeviceId;

    /// Indicates a new camera with the provided ID is now available.
    2: added DeviceId;

    /// Indicates an existing camera with the provided ID is no longer available.
    3: removed DeviceId;
};
