1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CHROMEOS_POWER_POWER_DATA_COLLECTOR_H_ 6 #define CHROME_BROWSER_CHROMEOS_POWER_POWER_DATA_COLLECTOR_H_ 7 8 #include <deque> 9 10 #include "base/basictypes.h" 11 #include "base/compiler_specific.h" 12 #include "base/time/time.h" 13 #include "chrome/browser/chromeos/power/cpu_data_collector.h" 14 #include "chromeos/chromeos_export.h" 15 #include "chromeos/dbus/power_manager_client.h" 16 17 namespace power_manager { 18 class PowerSupplyProperties; 19 } 20 21 namespace chromeos { 22 23 // A class which starts collecting power metrics, like the battery charge, as 24 // soon as it is initialized via Initialize(). 25 // 26 // This class is implemented as a global singleton, initialized after 27 // DBusThreadManager which it depends on. 28 class CHROMEOS_EXPORT PowerDataCollector : public PowerManagerClient::Observer { 29 public: 30 struct PowerSupplySample { 31 PowerSupplySample(); 32 33 // Time when the sample was captured. We use base::Time instead of 34 // base::TimeTicks because the latter does not advance when the system is 35 // suspended. 36 base::Time time; 37 38 // True if connected to external power at the time of the sample. 39 bool external_power; 40 41 // The battery charge as a percentage of full charge in range [0.0, 100.00]. 42 double battery_percent; 43 44 // The battery discharge rate in W. Positive if the battery is being 45 // discharged and negative if it's being charged. 46 double battery_discharge_rate; 47 }; 48 49 struct SystemResumedSample { 50 SystemResumedSample(); 51 52 // Time when the system resumed. 53 base::Time time; 54 55 // The duration for which the system was in sleep/suspend state. 56 base::TimeDelta sleep_duration; 57 }; 58 59 const std::deque<PowerSupplySample>& power_supply_data() const { 60 return power_supply_data_; 61 } 62 63 const std::deque<SystemResumedSample>& system_resumed_data() const { 64 return system_resumed_data_; 65 } 66 67 const CpuDataCollector& cpu_data_collector() const { 68 return cpu_data_collector_; 69 } 70 71 // Can be called only after DBusThreadManager is initialized. 72 static void Initialize(); 73 74 // Same as Initialize, but does not start the CpuDataCollector. 75 static void InitializeForTesting(); 76 77 // Can be called only if initialized via Initialize, and before 78 // DBusThreadManager is destroyed. 79 static void Shutdown(); 80 81 // Returns the global instance of PowerDataCollector. 82 static PowerDataCollector* Get(); 83 84 // PowerManagerClient::Observer implementation: 85 virtual void PowerChanged( 86 const power_manager::PowerSupplyProperties& prop) OVERRIDE; 87 virtual void SuspendDone(const base::TimeDelta& sleep_duration) OVERRIDE; 88 89 // Only those power data samples which fall within the last 90 // |kSampleTimeLimitSec| are stored in memory. 91 static const int kSampleTimeLimitSec; 92 93 private: 94 explicit PowerDataCollector(const bool start_cpu_data_collector); 95 96 virtual ~PowerDataCollector(); 97 98 std::deque<PowerSupplySample> power_supply_data_; 99 std::deque<SystemResumedSample> system_resumed_data_; 100 CpuDataCollector cpu_data_collector_; 101 102 DISALLOW_COPY_AND_ASSIGN(PowerDataCollector); 103 }; 104 105 // Adds |sample| to |sample_deque|. 106 // It dumps samples |PowerDataCollector::kSampleTimeLimitSec| or more older than 107 // |sample|. 108 template <typename SampleType> 109 void AddSample(std::deque<SampleType>* sample_queue, const SampleType& sample) { 110 while (!sample_queue->empty()) { 111 const SampleType& first = sample_queue->front(); 112 if (sample.time - first.time > 113 base::TimeDelta::FromSeconds(PowerDataCollector::kSampleTimeLimitSec)) { 114 sample_queue->pop_front(); 115 } else { 116 break; 117 } 118 } 119 sample_queue->push_back(sample); 120 } 121 122 } // namespace chromeos 123 124 #endif // CHROME_BROWSER_CHROMEOS_POWER_POWER_DATA_COLLECTOR_H_ 125