// C++/WinRT v2.0.250303.1

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

#pragma once
#ifndef WINRT_Windows_Devices_I2c_0_H
#define WINRT_Windows_Devices_I2c_0_H
WINRT_EXPORT namespace winrt::Windows::Devices::I2c::Provider
{
    struct II2cProvider;
}
WINRT_EXPORT namespace winrt::Windows::Devices::I2c
{
    enum class I2cBusSpeed : int32_t
    {
        StandardMode = 0,
        FastMode = 1,
    };
    enum class I2cSharingMode : int32_t
    {
        Exclusive = 0,
        Shared = 1,
    };
    enum class I2cTransferStatus : int32_t
    {
        FullTransfer = 0,
        PartialTransfer = 1,
        SlaveAddressNotAcknowledged = 2,
        ClockStretchTimeout = 3,
        UnknownError = 4,
    };
    struct II2cConnectionSettings;
    struct II2cConnectionSettingsFactory;
    struct II2cController;
    struct II2cControllerStatics;
    struct II2cDevice;
    struct II2cDeviceStatics;
    struct I2cConnectionSettings;
    struct I2cController;
    struct I2cDevice;
    struct I2cTransferResult;
}
namespace winrt::impl
{
    template <> struct category<winrt::Windows::Devices::I2c::II2cConnectionSettings>{ using type = interface_category; };
    template <> struct category<winrt::Windows::Devices::I2c::II2cConnectionSettingsFactory>{ using type = interface_category; };
    template <> struct category<winrt::Windows::Devices::I2c::II2cController>{ using type = interface_category; };
    template <> struct category<winrt::Windows::Devices::I2c::II2cControllerStatics>{ using type = interface_category; };
    template <> struct category<winrt::Windows::Devices::I2c::II2cDevice>{ using type = interface_category; };
    template <> struct category<winrt::Windows::Devices::I2c::II2cDeviceStatics>{ using type = interface_category; };
    template <> struct category<winrt::Windows::Devices::I2c::I2cConnectionSettings>{ using type = class_category; };
    template <> struct category<winrt::Windows::Devices::I2c::I2cController>{ using type = class_category; };
    template <> struct category<winrt::Windows::Devices::I2c::I2cDevice>{ using type = class_category; };
    template <> struct category<winrt::Windows::Devices::I2c::I2cBusSpeed>{ using type = enum_category; };
    template <> struct category<winrt::Windows::Devices::I2c::I2cSharingMode>{ using type = enum_category; };
    template <> struct category<winrt::Windows::Devices::I2c::I2cTransferStatus>{ using type = enum_category; };
    template <> struct category<winrt::Windows::Devices::I2c::I2cTransferResult>{ using type = struct_category<winrt::Windows::Devices::I2c::I2cTransferStatus, uint32_t>; };
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::I2cConnectionSettings> = L"Windows.Devices.I2c.I2cConnectionSettings";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::I2cController> = L"Windows.Devices.I2c.I2cController";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::I2cDevice> = L"Windows.Devices.I2c.I2cDevice";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::I2cBusSpeed> = L"Windows.Devices.I2c.I2cBusSpeed";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::I2cSharingMode> = L"Windows.Devices.I2c.I2cSharingMode";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::I2cTransferStatus> = L"Windows.Devices.I2c.I2cTransferStatus";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::I2cTransferResult> = L"Windows.Devices.I2c.I2cTransferResult";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::II2cConnectionSettings> = L"Windows.Devices.I2c.II2cConnectionSettings";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::II2cConnectionSettingsFactory> = L"Windows.Devices.I2c.II2cConnectionSettingsFactory";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::II2cController> = L"Windows.Devices.I2c.II2cController";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::II2cControllerStatics> = L"Windows.Devices.I2c.II2cControllerStatics";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::II2cDevice> = L"Windows.Devices.I2c.II2cDevice";
    template <> inline constexpr auto& name_v<winrt::Windows::Devices::I2c::II2cDeviceStatics> = L"Windows.Devices.I2c.II2cDeviceStatics";
    template <> inline constexpr guid guid_v<winrt::Windows::Devices::I2c::II2cConnectionSettings>{ 0xF2DB1307,0xAB6F,0x4639,{ 0xA7,0x67,0x54,0x53,0x6D,0xC3,0x46,0x0F } }; // F2DB1307-AB6F-4639-A767-54536DC3460F
    template <> inline constexpr guid guid_v<winrt::Windows::Devices::I2c::II2cConnectionSettingsFactory>{ 0x81B586B3,0x9693,0x41B1,{ 0xA2,0x43,0xDE,0xD4,0xF6,0xE6,0x69,0x26 } }; // 81B586B3-9693-41B1-A243-DED4F6E66926
    template <> inline constexpr guid guid_v<winrt::Windows::Devices::I2c::II2cController>{ 0xC48AB1B2,0x87A0,0x4166,{ 0x8E,0x3E,0xB4,0xB8,0xF9,0x7C,0xD7,0x29 } }; // C48AB1B2-87A0-4166-8E3E-B4B8F97CD729
    template <> inline constexpr guid guid_v<winrt::Windows::Devices::I2c::II2cControllerStatics>{ 0x40FC0365,0x5F05,0x4E7E,{ 0x84,0xBD,0x10,0x0D,0xB8,0xE0,0xAE,0xC5 } }; // 40FC0365-5F05-4E7E-84BD-100DB8E0AEC5
    template <> inline constexpr guid guid_v<winrt::Windows::Devices::I2c::II2cDevice>{ 0x8636C136,0xB9C5,0x4F70,{ 0x94,0x49,0xCC,0x46,0xDC,0x6F,0x57,0xEB } }; // 8636C136-B9C5-4F70-9449-CC46DC6F57EB
    template <> inline constexpr guid guid_v<winrt::Windows::Devices::I2c::II2cDeviceStatics>{ 0x91A33BE3,0x7334,0x4512,{ 0x96,0xBC,0xFB,0xAE,0x94,0x59,0xF5,0xF6 } }; // 91A33BE3-7334-4512-96BC-FBAE9459F5F6
    template <> struct default_interface<winrt::Windows::Devices::I2c::I2cConnectionSettings>{ using type = winrt::Windows::Devices::I2c::II2cConnectionSettings; };
    template <> struct default_interface<winrt::Windows::Devices::I2c::I2cController>{ using type = winrt::Windows::Devices::I2c::II2cController; };
    template <> struct default_interface<winrt::Windows::Devices::I2c::I2cDevice>{ using type = winrt::Windows::Devices::I2c::II2cDevice; };
    template <> struct abi<winrt::Windows::Devices::I2c::II2cConnectionSettings>
    {
        struct WINRT_IMPL_NOVTABLE type : inspectable_abi
        {
            virtual int32_t __stdcall get_SlaveAddress(int32_t*) noexcept = 0;
            virtual int32_t __stdcall put_SlaveAddress(int32_t) noexcept = 0;
            virtual int32_t __stdcall get_BusSpeed(int32_t*) noexcept = 0;
            virtual int32_t __stdcall put_BusSpeed(int32_t) noexcept = 0;
            virtual int32_t __stdcall get_SharingMode(int32_t*) noexcept = 0;
            virtual int32_t __stdcall put_SharingMode(int32_t) noexcept = 0;
        };
    };
    template <> struct abi<winrt::Windows::Devices::I2c::II2cConnectionSettingsFactory>
    {
        struct WINRT_IMPL_NOVTABLE type : inspectable_abi
        {
            virtual int32_t __stdcall Create(int32_t, void**) noexcept = 0;
        };
    };
    template <> struct abi<winrt::Windows::Devices::I2c::II2cController>
    {
        struct WINRT_IMPL_NOVTABLE type : inspectable_abi
        {
            virtual int32_t __stdcall GetDevice(void*, void**) noexcept = 0;
        };
    };
    template <> struct abi<winrt::Windows::Devices::I2c::II2cControllerStatics>
    {
        struct WINRT_IMPL_NOVTABLE type : inspectable_abi
        {
            virtual int32_t __stdcall GetControllersAsync(void*, void**) noexcept = 0;
            virtual int32_t __stdcall GetDefaultAsync(void**) noexcept = 0;
        };
    };
    template <> struct abi<winrt::Windows::Devices::I2c::II2cDevice>
    {
        struct WINRT_IMPL_NOVTABLE type : inspectable_abi
        {
            virtual int32_t __stdcall get_DeviceId(void**) noexcept = 0;
            virtual int32_t __stdcall get_ConnectionSettings(void**) noexcept = 0;
            virtual int32_t __stdcall Write(uint32_t, uint8_t*) noexcept = 0;
            virtual int32_t __stdcall WritePartial(uint32_t, uint8_t*, struct struct_Windows_Devices_I2c_I2cTransferResult*) noexcept = 0;
            virtual int32_t __stdcall Read(uint32_t, uint8_t*) noexcept = 0;
            virtual int32_t __stdcall ReadPartial(uint32_t, uint8_t*, struct struct_Windows_Devices_I2c_I2cTransferResult*) noexcept = 0;
            virtual int32_t __stdcall WriteRead(uint32_t, uint8_t*, uint32_t, uint8_t*) noexcept = 0;
            virtual int32_t __stdcall WriteReadPartial(uint32_t, uint8_t*, uint32_t, uint8_t*, struct struct_Windows_Devices_I2c_I2cTransferResult*) noexcept = 0;
        };
    };
    template <> struct abi<winrt::Windows::Devices::I2c::II2cDeviceStatics>
    {
        struct WINRT_IMPL_NOVTABLE type : inspectable_abi
        {
            virtual int32_t __stdcall GetDeviceSelector(void**) noexcept = 0;
            virtual int32_t __stdcall GetDeviceSelectorFromFriendlyName(void*, void**) noexcept = 0;
            virtual int32_t __stdcall FromIdAsync(void*, void*, void**) noexcept = 0;
        };
    };
    template <typename D>
    struct consume_Windows_Devices_I2c_II2cConnectionSettings
    {
        [[nodiscard]] auto SlaveAddress() const;
        auto SlaveAddress(int32_t value) const;
        [[nodiscard]] auto BusSpeed() const;
        auto BusSpeed(winrt::Windows::Devices::I2c::I2cBusSpeed const& value) const;
        [[nodiscard]] auto SharingMode() const;
        auto SharingMode(winrt::Windows::Devices::I2c::I2cSharingMode const& value) const;
    };
    template <> struct consume<winrt::Windows::Devices::I2c::II2cConnectionSettings>
    {
        template <typename D> using type = consume_Windows_Devices_I2c_II2cConnectionSettings<D>;
    };
    template <typename D>
    struct consume_Windows_Devices_I2c_II2cConnectionSettingsFactory
    {
        auto Create(int32_t slaveAddress) const;
    };
    template <> struct consume<winrt::Windows::Devices::I2c::II2cConnectionSettingsFactory>
    {
        template <typename D> using type = consume_Windows_Devices_I2c_II2cConnectionSettingsFactory<D>;
    };
    template <typename D>
    struct consume_Windows_Devices_I2c_II2cController
    {
        auto GetDevice(winrt::Windows::Devices::I2c::I2cConnectionSettings const& settings) const;
    };
    template <> struct consume<winrt::Windows::Devices::I2c::II2cController>
    {
        template <typename D> using type = consume_Windows_Devices_I2c_II2cController<D>;
    };
    template <typename D>
    struct consume_Windows_Devices_I2c_II2cControllerStatics
    {
        auto GetControllersAsync(winrt::Windows::Devices::I2c::Provider::II2cProvider const& provider) const;
        auto GetDefaultAsync() const;
    };
    template <> struct consume<winrt::Windows::Devices::I2c::II2cControllerStatics>
    {
        template <typename D> using type = consume_Windows_Devices_I2c_II2cControllerStatics<D>;
    };
    template <typename D>
    struct consume_Windows_Devices_I2c_II2cDevice
    {
        [[nodiscard]] auto DeviceId() const;
        [[nodiscard]] auto ConnectionSettings() const;
        auto Write(array_view<uint8_t const> buffer) const;
        auto WritePartial(array_view<uint8_t const> buffer) const;
        auto Read(array_view<uint8_t> buffer) const;
        auto ReadPartial(array_view<uint8_t> buffer) const;
        auto WriteRead(array_view<uint8_t const> writeBuffer, array_view<uint8_t> readBuffer) const;
        auto WriteReadPartial(array_view<uint8_t const> writeBuffer, array_view<uint8_t> readBuffer) const;
    };
    template <> struct consume<winrt::Windows::Devices::I2c::II2cDevice>
    {
        template <typename D> using type = consume_Windows_Devices_I2c_II2cDevice<D>;
    };
    template <typename D>
    struct consume_Windows_Devices_I2c_II2cDeviceStatics
    {
        auto GetDeviceSelector() const;
        auto GetDeviceSelector(param::hstring const& friendlyName) const;
        auto FromIdAsync(param::hstring const& deviceId, winrt::Windows::Devices::I2c::I2cConnectionSettings const& settings) const;
    };
    template <> struct consume<winrt::Windows::Devices::I2c::II2cDeviceStatics>
    {
        template <typename D> using type = consume_Windows_Devices_I2c_II2cDeviceStatics<D>;
    };
    struct struct_Windows_Devices_I2c_I2cTransferResult
    {
        int32_t Status;
        uint32_t BytesTransferred;
    };
    template <> struct abi<Windows::Devices::I2c::I2cTransferResult>
    {
        using type = struct_Windows_Devices_I2c_I2cTransferResult;
    };
}
#endif
