// Copyright 2018 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.power;
using zx;

enum PowerType : uint8 {
    AC = 0;
    BATTERY = 1;
};

const uint8 POWER_STATE_ONLINE = 0x1;
const uint8 POWER_STATE_DISCHARGING = 0x2;
const uint8 POWER_STATE_CHARGING = 0x4;
const uint8 POWER_STATE_CRITICAL = 0x8;

struct SourceInfo {
    PowerType type;
    uint8 state;
};

enum BatteryUnit {
    /// Milliwatts
    MW = 0;
    /// Milliamps
    MA = 1;
};

struct BatteryInfo {
    /// capacity unit. all voltage fields are in millivolts
    BatteryUnit unit;
    /// nominal capacity of a new battery
    uint32 design_capacity;
    /// predicted battery capacity when fully charged
    uint32 last_full_capacity;
    /// nominal voltage of a new battery
    uint32 design_voltage;
    /// capacity when the device will generate a warning notification
    uint32 capacity_warning;
    /// capacity when the device will generate a low battery notification
    uint32 capacity_low;
    /// the smallest increment the battery is capable of measuring between the
    /// low and warning capacities
    uint32 capacity_granularity_low_warning;
    /// the smallest increment the battery is capable of measuring between the low
    /// and warning capacities
    uint32 capacity_granularity_warning_full;

    /// below fields are in units specified the `unit` field.
    /// charging/discharging rate in the capacity unit. positive is charging,
    /// negative is discharging
    int32 present_rate;
    uint32 remaining_capacity;
    uint32 present_voltage;
};

[ForDeprecatedCBindings]
protocol Source {
    /// Get device info.
    GetPowerInfo() -> (zx.status status, SourceInfo info);

    /// Get an event to receive state change notifications on. ZX_USER_SIGNAL_0 is
    /// asserted when power_info_t.state is changed. It is deasserted when the
    /// state is read via `GetPowerInfo`.
    GetStateChangeEvent() -> (zx.status status, zx.handle:EVENT handle);

    /// Get battery info. Only supported if type == PowerType::BATTERY.
    GetBatteryInfo() -> (zx.status status, BatteryInfo info);
};
