// 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;

struct PwmConfig {
   bool polarity;
   uint32 period_ns;
   /// duty_cycle range: [0.0, 100.0]
   float32 duty_cycle;
   /// 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] vector<uint8> mode_config;
};

[Transport = "Banjo", BanjoLayout = "ddk-protocol"]
protocol Pwm {
    /// Gets the current config of the PWM.
    /// @Returns : |s| : ZX_OK if success.
    /// @Returns : |config| : current config of PWM.
    GetConfig() -> (zx.status s, PwmConfig config);

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

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

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

[Transport = "Banjo", BanjoLayout = "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(uint32 idx) -> (zx.status s, PwmConfig config);

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

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

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