// Copyright 2020 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.test;

/// Errors associated with TemperatureLogger methods.
enum TemperatureLoggerError : uint32 {
    /// Indicates that an invalid argument was provided.
    INVALID_ARGUMENT = 1;
    /// Requests to start logging will fail if logging is already active.
    ALREADY_LOGGING = 2;
};

/// A protocol for managing on-demand temperature logging.
[Discoverable]
protocol TemperatureLogger {
    /// Initiates logging at the specified interval, for the provided duration. Logging may be
    /// terminated early with a call to `StopLogging`.
    ///
    /// This call will fail if logging is already active. For this reason, a client may wish to
    /// precede a `StartLogging` call with a `StopLogging` call, after which the only reason for the
    /// logger to be active would be a conflict with another client.
    ///
    /// + request `interval_ms` Length of the polling interval in milliseconds; must be positive.
    ///     All configured sensors will be polled, and temperatures logged to Inspect and trace, at
    ///     this interval.
    /// + request `duration_ms` Duration of logging in milliseconds; must be positive and larger
    ///     than `interval_ms`. After this duration, temperature polling and logging will cease.
    /// + error a [fuchsia.thermal.test/TemperatureLoggerError] value indicating why the request
    ///     failed.
    StartLogging(uint32 interval_ms, uint32 duration_ms) -> () error TemperatureLoggerError;

    /// Initiates logging at the specifed interval. Logging will only end upon a `StopLogging` call.
    ///
    /// `StartLogging` should be preferred for usage in automated tests to ensure that logging
    /// terminates even if the test crashes.
    ///
    /// + request `interval_ms` Length of the polling interval in milliseconds; must be positive.
    ///     All configured sensors will be polled, and temperatures logged to Inspect and trace, at
    ///     this interval.
    /// + error a [fuchsia.thermal.test/TemperatureLoggerError] value indicating why the request
    ///     failed.
    StartLoggingForever(uint32 interval_ms) -> () error TemperatureLoggerError;

    /// Terminates logging if active. It is valid to call this method when logging is inactive.
    StopLogging();
};
