// AUTOGENERATED FILE - DO NOT MODIFY!
// This file generated by Djinni from mynteye.djinni

#pragma once

#include "addon.hpp"
#include "capability.hpp"
#include "device_usb_info.hpp"
#include "extrinsics.hpp"
#include "info.hpp"
#include "intrinsics.hpp"
#include "model.hpp"
#include "motion_data.hpp"
#include "motion_intrinsics.hpp"
#include "option.hpp"
#include "option_info.hpp"
#include "source.hpp"
#include "stream.hpp"
#include "stream_data.hpp"
#include "stream_request.hpp"
#include <cstdint>
#include <memory>
#include <string>
#include <vector>

namespace mynteye_jni {

/** Device class to communicate with MYNT® EYE device */
class Device {
public:
    virtual ~Device() {}

    /** Create the device instance */
    static std::shared_ptr<Device> Create(const ::mynteye_jni::DeviceUsbInfo & info);

    /** Get the model */
    virtual ::mynteye_jni::Model GetModel() = 0;

    /** Supports the stream or not */
    virtual bool SupportsStream(::mynteye_jni::Stream stream) = 0;

    /** Supports the capability or not */
    virtual bool SupportsCapability(::mynteye_jni::Capability capabilities) = 0;

    /** Supports the option or not */
    virtual bool SupportsOption(::mynteye_jni::Option option) = 0;

    /** Supports the addon or not */
    virtual bool SupportsAddon(::mynteye_jni::Addon addon) = 0;

    /** Get all stream requests */
    virtual std::vector<::mynteye_jni::StreamRequest> GetStreamRequests() = 0;

    /** Config the stream request */
    virtual void ConfigStreamRequest(const ::mynteye_jni::StreamRequest & request) = 0;

    /** Get the device info */
    virtual std::string GetInfo(::mynteye_jni::Info info) = 0;

    /** Get the intrinsics of stream */
    virtual ::mynteye_jni::Intrinsics GetIntrinsics(::mynteye_jni::Stream stream) = 0;

    /** Get the extrinsics of stream */
    virtual ::mynteye_jni::Extrinsics GetExtrinsics(::mynteye_jni::Stream from, ::mynteye_jni::Stream to) = 0;

    /** Get the intrinsics of motion */
    virtual ::mynteye_jni::MotionIntrinsics GetMotionIntrinsics() = 0;

    /** Get the extrinsics from one stream to motion */
    virtual ::mynteye_jni::Extrinsics GetMotionExtrinsics(::mynteye_jni::Stream from) = 0;

    /** Get the option info */
    virtual ::mynteye_jni::OptionInfo GetOptionInfo(::mynteye_jni::Option option) = 0;

    /** Get the option value */
    virtual int32_t GetOptionValue(::mynteye_jni::Option option) = 0;

    /** Set the option value */
    virtual void SetOptionValue(::mynteye_jni::Option option, int32_t value) = 0;

    /** Run the option value */
    virtual bool RunOptionAction(::mynteye_jni::Option option) = 0;

    /** Start capturing the source */
    virtual void Start(::mynteye_jni::Source source) = 0;

    /** Stop capturing the source */
    virtual void Stop(::mynteye_jni::Source source) = 0;

    /** Wait the streams are ready */
    virtual void WaitForStreams() = 0;

    /** Get the latest data of stream */
    virtual std::shared_ptr<::mynteye_jni::StreamData> GetStreamData(::mynteye_jni::Stream stream) = 0;

    /** Get the datas of stream */
    virtual std::vector<std::shared_ptr<::mynteye_jni::StreamData>> GetStreamDatas(::mynteye_jni::Stream stream) = 0;

    /** Enable cache motion datas until get them, otherwise using callback instead */
    virtual void EnableMotionDatas(int32_t max_size) = 0;

    /** Get the motion datas */
    virtual std::vector<std::shared_ptr<::mynteye_jni::MotionData>> GetMotionDatas() = 0;
};

}  // namespace mynteye_jni
