// 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.camera.gym;

/// CommandError is the return status for the transactions between the camera-gym CLI front end and
/// the instance of camera-gym running.
type CommandError = strict enum {
    OUT_OF_RANGE = 1; // Argument value out of range
};

/// "set-config" command shall call SetCurrentConfiguration for current camera.
type SetConfigCommand = struct {
    config_id uint32; // Which configuration?
    async bool; // Do not wait until operation completes before returning
};

/// "add-stream" command shall add the specified stream to the collage.
type AddStreamCommand = struct {
    stream_id uint32; // Which stream?
    async bool; // Do not wait until operation completes before returning
};

/// "set-crop" command shall set the crop region for the specified stream.
type SetCropCommand = struct {
    stream_id uint32; // Which stream?
    x float32; // Crop region
    y float32; // Crop region
    width float32; // Crop region
    height float32; // Crop region
    async bool; // Do not wait until operation completes before returning
};

/// "set-resolution" command shall set the output resolution for the specified stream.
type SetResolutionCommand = struct {
    stream_id uint32; // Which stream?
    width uint32; // New resolution
    height uint32; // New resolution
    async bool; // Do not wait until operation completes before returning
};

/// "set-description" command shall turn on or off the text description on displayed streams
type SetDescriptionCommand = struct {
    enable bool;
};

/// "capture-frame" command shall attempt to capture a frame in the specified stream
type CaptureFrameCommand = struct {
    stream_id uint32; // Which stream?
};

type Command = strict union {
    1: set_config SetConfigCommand;
    2: add_stream AddStreamCommand;
    3: set_crop SetCropCommand;
    4: set_resolution SetResolutionCommand;
    5: set_description SetDescriptionCommand;
    6: capture_frame CaptureFrameCommand;
};

@discoverable
closed protocol Controller {
    // SendCommand sends a single Command to camera-gym to execute.
    //
    // The error return indicates the reason for failure of execution.
    strict SendCommand(struct {
        command Command;
    }) -> () error CommandError;
};
