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

/// A value to indicate which type of subsystem an Actor connection represents. The Controller may
/// leverage this extra information to thermally limit only specific subsystems as needed.
@available(
        deprecated=7,
        removed=8,
        note="fuchsia.thermal.Controller and supporting protocols/types replaced by fuchsia.thermal.ClientStateWatcher")
type ActorType = strict enum {
    UNSPECIFIED = 1;
    AUDIO = 2;
};

/// Error codes for the thermal protocol.
@available(
        deprecated=7,
        removed=8,
        note="fuchsia.thermal.Controller and supporting protocols/types replaced by fuchsia.thermal.ClientStateWatcher")
type Error = strict enum {
    /// The component encountered an unspecified error while performing the operation.
    INTERNAL = 1;

    /// At least one argument was invalid.
    INVALID_ARGUMENTS = 2;
};

/// The maximum number of trip points that may be specified in the `trip_points` vector argument to
/// `Subscribe`.
@available(
        deprecated=7,
        removed=8,
        note="fuchsia.thermal.Controller and supporting protocols/types replaced by fuchsia.thermal.ClientStateWatcher")
const MAX_TRIP_POINT_COUNT uint32 = 100;

/// The maximum value of the normalized thermal load. This value bounds the width (and therefore
/// also the precision) of the normalized thermal limiting range starting from 0. Trip points must
/// be specified within this range.
const MAX_THERMAL_LOAD uint32 = 100;

/// Configuration for a single trip point. The trip point will be activated when the thermal load
/// is greater than or equal to `activate_at`, and deactivated when it is less than
/// `deactivate_below`.
///
/// See [fuchsia.thermal/Controller.Subscribe] for the relationship between trip points and thermal
/// states.
@available(
        deprecated=7,
        removed=8,
        note="fuchsia.thermal.Controller and supporting protocols/types replaced by fuchsia.thermal.ClientStateWatcher")
type TripPoint = struct {
    /// The trip point will be deactivated when thermal load drops below this value.
    deactivate_below uint32;

    /// The trip point will be activated when thermal load is greater than or equal to this value.
    activate_at uint32;
};

/// A protocol providing the API for a client service to subscribe to receive thermal state updates.
@discoverable
@available(
        deprecated=7,
        removed=8,
        note="fuchsia.thermal.Controller and supporting protocols/types replaced by fuchsia.thermal.ClientStateWatcher")
protocol Controller {
    /// Subscribes with the Controller to receive thermal state changes on the specified
    /// [fuchsia.thermal/Actor] proxy handle.
    ///
    /// The current thermal state will be sent immediately, with all subsequent state changes
    /// occuring based on the changing system thermal load and specified `trip_points`.
    ///
    /// A TripPoint is activated when the thermal load is greater than or equal to its `activate_at`
    /// value and deactivated when the thermal load drops below its `deactivate_below` value. The
    /// Actor's thermal state is set to 1 greater than the index of the highest active trip point,
    /// or 0 if none are active.
    ///
    /// + request `actor` a [fuchsia.thermal/Actor] proxy to handle the SetThermalState callbacks
    /// + request `actor_type` a [fuchsia.thermal/ActorType] value to indicate the type of
    ///     subsystem this actor is representing. The Controller may leverage this extra
    ///     information to thermally limit only specific subsystems as needed.
    /// + request `trip_points` a vector of `TripPoint`s specifying when the Actor should be
    ///     transitioned between thermal states. The vector must:
    ///     - have length in the range [1 - MAX_TRIP_POINT_COUNT]
    ///     - elementwise satisfy `low` <= `high`
    ///     - be monotonically increasing: `high[i]` < `low[i+1]`
    ///     - elementwise have `low` and `high` values in the range [1 - MAX_THERMAL_LOAD]
    ///   Failure to meet these conditions will cause [fuchsia.thermal/Error].INVALID_ARGUMENTS to
    ///   be returned.
    /// * error a [fuchsia.thermal/Error] value indicating the reason (if any) that Subscribe failed
    Subscribe(resource struct {
        actor client_end:Actor;
        actor_type ActorType;
        trip_points vector<TripPoint>:MAX_TRIP_POINT_COUNT;
    }) -> (struct {}) error Error;
};

/// The protocol to receive thermal state updates from the fuchsia.thermal/Controller.
@available(
        deprecated=7,
        removed=8,
        note="fuchsia.thermal.Controller and supporting protocols/types replaced by fuchsia.thermal.ClientStateWatcher")
protocol Actor {
    /// Sets the Actor's thermal state.
    ///
    /// The Actor is expected to ACK each call before subsequent calls will be made. `state` is
    /// defined as an index into the Actor's reported thermal ranges. The Actor's thermal ranges
    /// are defined by dividing the normalized thermal limiting range [0 - `MAX_THERMAL_LOAD`] at
    /// the locations specified by the `trip_points` argument to Subscribe. `state` is therefore in
    /// the range [0 - len(trip_points)]. For each value of `state`, the subsystem should remain
    /// operational. The value of `state` should be interpreted as:
    ///     0: "normal operation"
    ///     1..[len(trip_points) - 1]: The subsystem is operating in such a way that each state
    ///                                produces less heat than the previous state
    ///     len(trip_points): max thermal limiting while still operational
    ///
    /// As a simple example, consider that Subscribe was called with a vector of two trip points:
    /// [50, 90]. We can think of these trip points as boundaries within the normalized range
    /// [0 - `MAX_THERMAL_LOAD`] such that three thermal ranges are created: [0 - 49], [50 - 89],
    /// and [90 - `MAX_THERMAL_LOAD`]. Now, as the Controller observes the system thermal load
    /// increase through the normalized range, it calls SetThermalState at the specified trip
    /// points and indicates the index of which thermal range is now active. In this example, the
    /// Controller would initially call `SetThermalState(0)` when there is no thermal limiting
    /// required. As the device heats up, the Controller would call `SetThermalState(1)` and finally
    /// `SetThermalState(2)` as the Controller observes the system thermal load cross 50 and 90,
    /// respectively.
    ///
    /// + request `state` the new thermal state as an index into the Actor's reported thermal
    ///     ranges, which are defined based on the Actor's specified `trip_points`.
    SetThermalState(struct {
        state uint32;
    }) -> ();
};
