| // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <gflags/gflags.h> |
| #include <inttypes.h> |
| |
| #include <iomanip> |
| #include <iostream> |
| #include <string> |
| |
| #include "base/file_path.h" |
| #include "base/file_util.h" |
| #include "base/logging.h" |
| #include "base/string_util.h" |
| #include "base/time.h" |
| #include "power_manager/power_constants.h" |
| #include "power_manager/power_supply.h" |
| |
| // power-supply-info: Displays info about battery and line power. |
| |
| using base::TimeDelta; |
| |
| namespace { |
| |
| // Path to power supply info. |
| const char kPowerStatusPath[] = "/sys/class/power_supply"; |
| |
| std::string BoolToString(bool value) { |
| return value ? "yes" : "no"; |
| } |
| |
| template <class T> |
| std::string ValueToString(T value) { |
| std::stringstream stream; |
| stream << value; |
| return stream.str(); |
| } |
| |
| std::string SecondsToString(int64 time_in_seconds) { |
| // Calculate hours, minutes, and seconds, then display in H:M:S format. |
| TimeDelta time = TimeDelta::FromSeconds(time_in_seconds); |
| int hours = time.InHours(); |
| time -= TimeDelta::FromHours(hours); |
| int minutes = time.InMinutes(); |
| time -= TimeDelta::FromMinutes(minutes); |
| int64 seconds = time.InSeconds(); |
| |
| std::stringstream stream; |
| stream << std::setfill('0'); |
| stream << hours << ":" |
| << std::setw(2) << minutes << ":" |
| << std::setw(2) << seconds; |
| return stream.str(); |
| } |
| |
| class InfoDisplay { |
| public: |
| InfoDisplay() : name_indent_(0), value_indent_(0) {} |
| |
| void SetIndent(int name_indent, int value_indent) { |
| name_indent_ = name_indent; |
| value_indent_ = value_indent; |
| } |
| |
| void PrintStringValue(const std::string& name_field, |
| const std::string& value_field) { |
| std::cout << std::setw(name_indent_) |
| << "" |
| << std::setw(value_indent_ - name_indent_) |
| << std::setiosflags(std::ios::left) |
| << std::resetiosflags(std::ios::right) |
| << name_field + ":" |
| << value_field |
| << std::endl; |
| } |
| |
| template <class T> |
| void PrintValue(const std::string& name_field, T value) { |
| PrintStringValue(name_field, ValueToString(value)); |
| } |
| |
| void PrintString(const std::string& string) { |
| std::cout << std::setw(name_indent_) |
| << "" |
| << string |
| << std::endl; |
| } |
| |
| private: |
| int name_indent_; |
| int value_indent_; |
| }; // class InfoDisplay |
| |
| } // namespace |
| |
| int main(int, char*[]) { |
| FilePath path(kPowerStatusPath); |
| power_manager::PowerSupply power_supply(path); |
| power_supply.Init(); |
| |
| power_manager::PowerInformation power_info; |
| power_manager::PowerStatus& power_status = power_info.power_status; |
| power_supply.GetPowerInformation(&power_info); |
| |
| InfoDisplay display; |
| display.SetIndent(0, 0); |
| display.PrintString("Device: Line Power"); |
| display.SetIndent(2, 20); |
| display.PrintValue("path", power_supply.line_power_path().value()); |
| display.PrintStringValue("online", |
| BoolToString(power_status.line_power_on)); |
| if (power_status.battery_is_present) { |
| display.SetIndent(0, 0); |
| display.PrintString("Device: Battery"); |
| display.SetIndent(2, 20); |
| display.PrintValue("path", power_supply.battery_path().value()); |
| display.PrintStringValue("vendor", power_info.battery_vendor); |
| display.PrintStringValue("model", power_info.battery_model); |
| display.PrintStringValue("serial number", power_info.battery_serial); |
| display.PrintStringValue("present", |
| BoolToString(power_status.battery_is_present)); |
| display.PrintValue("state", power_info.battery_state_string); |
| display.PrintValue("voltage (V)", power_status.battery_voltage); |
| display.PrintValue("energy (Wh)", power_status.battery_energy); |
| display.PrintValue("energy rate (W)", power_status.battery_energy_rate); |
| display.PrintValue("current (A)", power_status.battery_current); |
| display.PrintValue("charge (Ah)", power_status.battery_charge); |
| display.PrintValue("full charge (Ah)", power_status.battery_charge_full); |
| if (power_status.line_power_on) |
| display.PrintValue("time to full", |
| SecondsToString(power_status.battery_time_to_full)); |
| else |
| display.PrintValue("time to empty", |
| SecondsToString(power_status.battery_time_to_empty)); |
| display.PrintValue("percentage", power_status.battery_percentage); |
| display.PrintStringValue("technology", power_info.battery_technology); |
| } |
| return 0; |
| } |