// 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_IDENTIFIER_LENGTH uint32 = 256;
const MAX_CONFIGURATIONS_PER_CAMERA uint32 = 256;
const MAX_STREAMS_PER_CONFIGURATION uint32 = 256;

/// A Device represents a unique physical camera present in the system. Only one client may connect
/// to an unbound physical camera, however the "Rebind" method can be used to create multiple
/// connections to it to be used by a coordinated set of clients.
protocol Device {
    /// Returns an identifier for the camera. If present, identical devices on different systems
    /// will have the same identifier. Clients may use this to determine if additional semantics
    /// known a priori for a given device apply to the current camera.
    // TODO(fxbug.dev/43247): unify device identification
    // go/unified-device-discovery will eliminate the need for this protocol
    GetIdentifier() -> (struct {
        identifier string:<MAX_IDENTIFIER_LENGTH, optional>;
    });

    /// Returns a list of configurations supported by the camera. All cameras will have at least
    /// one configuration. The values returned are immutable - they will not change for the
    /// lifetime of the client's connection to the Camera.
    @transitional
    @deprecated("Use GetConfigurations2")
    GetConfigurations() -> (struct {
        configurations vector<Configuration>:MAX_CONFIGURATIONS_PER_CAMERA;
    });

    /// Returns a list of configurations supported by the camera. All cameras will have at least
    /// one configuration. The values returned are immutable - they will not change for the
    /// lifetime of the client's connection to the Camera.
    @transitional
    GetConfigurations2() -> (struct {
        configurations vector<Configuration2>:MAX_CONFIGURATIONS_PER_CAMERA;
    });

    /// Returns the index of the current configuration when it has changed from a previously
    /// returned configuration, or is called by a client for the first time.
    WatchCurrentConfiguration() -> (struct {
        index uint32;
    });

    /// Sets the configuration using the provided index. Calling this method disconnects any
    /// existing Stream clients associated with this camera. An epitaph of ZX_OK
    /// will be sent for any connected Stream clients on closing.
    SetCurrentConfiguration(struct {
        index uint32;
    });

    /// Returns the camera's current mute state when it has changed from a previously returned
    /// state, or is called by a client for the first time. A camera may be muted using
    /// SetSoftwareMuteState or by a physical switch. If either muted mode is active, stream
    /// clients associated with this physical camera will stop receiving new frames.
    WatchMuteState() -> (struct {
        software_muted bool;
        hardware_muted bool;
    });

    /// Sets the current camera's software mute state. When transitioning to the muted state, this
    /// method returns when the camera has successfully ceased sending new frames to stream
    /// clients. When transitioning to the unmuted state, this method returns immediately.
    SetSoftwareMuteState(struct {
        muted bool;
    }) -> ();

    /// Connects to the Stream at the provided index. If any clients already exist for this stream,
    /// the request is closed with the ZX_ERR_ALREADY_BOUND epitaph.
    ConnectToStream(resource struct {
        index uint32;
        request server_end:Stream;
    });

    /// Request another connection to this Device. This allows a client to delegate different
    /// operations to different coordinated clients.
    Rebind(resource struct {
        request server_end:Device;
    });
};

/// Describes a distinct configuration for the camera.
type Configuration = struct {
    /// Descriptions of streams that are concurrently available in the configuration.
    streams vector<StreamProperties>:MAX_STREAMS_PER_CONFIGURATION;
};

/// Describes a distinct configuration for the camera.
type Configuration2 = table {
    /// Descriptions of streams that are concurrently available in the configuration.
    1: streams vector<StreamProperties2>:MAX_STREAMS_PER_CONFIGURATION;
};
