// Copyright 2019 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.hardware.pwm;

using zx;

type PwmConfig = struct {
    polarity bool;
    period_ns uint32;
    /// duty_cycle range: [0.0, 100.0]
    duty_cycle float32;
    // TODO(fxbug.dev/41256): Vendor extensions
    /// mode_config should be mode specific parameters. The first parameter should always be mode.
    /// For example, a PWM supporting regular mode and 2 timer mode should have:
    ///   struct mode_config_regular {};
    ///
    ///   struct mode_config_two_timer {
    ///     uint32_t period_ns2;
    ///     float duty_cycle2;
    ///     uint8_t timer1;
    ///     uint8_t timer2;
    ///   };
    ///
    ///   struct mode_config {
    ///     uint32_t mode;
    ///     union {
    ///       struct mode_config_regular regular;
    ///       struct mode_config_two_timer two_timer;
    ///     };
    ///   };
    @mutable
    @buffer
    mode_config vector<uint8>:MAX;
};

@transport("Banjo")
@banjo_layout("ddk-protocol")
protocol Pwm {
    /// Gets the current config of the PWM.
    /// @Returns : |s| : ZX_OK if success.
    /// @Returns : |config| : current config of PWM.
    GetConfig() -> (struct {
        s zx.status;
        config PwmConfig;
    });

    /// Sets the configurations of the PWM
    /// |config| : Configurations.
    /// @Returns : |s| : ZX_OK if success.
    SetConfig(struct {
        config PwmConfig;
    }) -> (struct {
        s zx.status;
    });

    /// Enables the PWM.
    /// @Returns : |s| : ZX_OK if success.
    Enable() -> (struct {
        s zx.status;
    });

    /// Disables the PWM.
    /// @Returns : |s| : ZX_OK  if success.
    Disable() -> (struct {
        s zx.status;
    });
};

@transport("Banjo")
@banjo_layout("ddk-protocol")
protocol PwmImpl {
    /// Gets the current config of the PWM.
    /// |idx| : Index of requested PWM.
    /// @Returns: |s| : ZX_OK if success.
    /// @Returns : |config| : current config of PWM.
    GetConfig(struct {
        idx uint32;
    }) -> (struct {
        s zx.status;
        config PwmConfig;
    });

    /// Sets the configurations of the PWM.
    /// |idx| : Index of requested PWM.
    /// |config| : Configurations.
    /// @Returns : |s| : ZX_OK if success.
    SetConfig(struct {
        idx uint32;
        config PwmConfig;
    }) -> (struct {
        s zx.status;
    });

    /// Enables the PWM.
    /// |idx| : Index of requested PWM.
    /// @Returns : |s| : ZX_OK if success.
    Enable(struct {
        idx uint32;
    }) -> (struct {
        s zx.status;
    });

    /// Disables the PWM.
    /// |idx| : Index of requested PWM.
    /// @Returns : |s| : ZX_OK  if success.
    Disable(struct {
        idx uint32;
    }) -> (struct {
        s zx.status;
    });
};
