// 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(https://fxbug.dev/42117319): 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")
closed 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.
    strict 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.
    strict SetConfig(struct {
        idx uint32;
        config PwmConfig;
    }) -> (struct {
        s zx.Status;
    });

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

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