Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: chrome/browser/chromeos/dbus/power_manager_client.cc

Issue 8271024: chromeos: Add power supply info reading capability (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebased Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/dbus/power_manager_client.h" 5 #include "chrome/browser/chromeos/dbus/power_manager_client.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/format_macros.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/stringprintf.h"
12 #include "base/time.h"
13 #include "base/timer.h"
9 #include "chrome/browser/chromeos/system/runtime_environment.h" 14 #include "chrome/browser/chromeos/system/runtime_environment.h"
10 #include "dbus/bus.h" 15 #include "dbus/bus.h"
11 #include "dbus/message.h" 16 #include "dbus/message.h"
12 #include "dbus/object_proxy.h" 17 #include "dbus/object_proxy.h"
13 #include "third_party/cros_system_api/dbus/service_constants.h" 18 #include "third_party/cros_system_api/dbus/service_constants.h"
14 19
15 namespace chromeos { 20 namespace chromeos {
16 21
22 PowerSupplyStatus::PowerSupplyStatus()
23 : line_power_on(false),
24 battery_is_present(false),
25 battery_is_full(false),
26 battery_seconds_to_empty(0),
27 battery_seconds_to_full(0),
28 battery_percentage(0) {
29 }
30
31 const std::string& PowerSupplyStatus::ToString() const {
32 static std::string result = "";
33 base::StringAppendF(&result,
34 "line_power_on = %s ",
35 line_power_on ? "true" : "false");
36 base::StringAppendF(&result,
37 "battery_is_present = %s ",
38 battery_is_present ? "true" : "false");
39 base::StringAppendF(&result,
40 "battery_is_full = %s ",
41 battery_is_full ? "true" : "false");
42 base::StringAppendF(&result,
43 "battery_percentage = %f ",
44 battery_percentage);
45 base::StringAppendF(&result,
46 "battery_seconds_to_empty = %"PRId64" ",
47 battery_seconds_to_empty);
48 base::StringAppendF(&result,
49 "battery_seconds_to_full = %"PRId64" ",
50 battery_seconds_to_full);
Nico 2011/11/20 22:38:21 This will append "line_power_on" to result every t
satorux1 2011/11/21 17:28:05 Good catch! I wasn't able to catch this. Simon, pl
51 return result;
52 }
53
17 // The PowerManagerClient implementation used in production. 54 // The PowerManagerClient implementation used in production.
18 class PowerManagerClientImpl : public PowerManagerClient { 55 class PowerManagerClientImpl : public PowerManagerClient {
19 public: 56 public:
20 explicit PowerManagerClientImpl(dbus::Bus* bus) 57 explicit PowerManagerClientImpl(dbus::Bus* bus)
21 : power_manager_proxy_(NULL), 58 : power_manager_proxy_(NULL),
22 weak_ptr_factory_(this) { 59 weak_ptr_factory_(this) {
23 power_manager_proxy_ = bus->GetObjectProxy( 60 power_manager_proxy_ = bus->GetObjectProxy(
24 power_manager::kPowerManagerServiceName, 61 power_manager::kPowerManagerServiceName,
25 power_manager::kPowerManagerServicePath); 62 power_manager::kPowerManagerServicePath);
26 63
27 // Monitor the D-Bus signal for brightness changes. Only the power 64 // Monitor the D-Bus signal for brightness changes. Only the power
28 // manager knows the actual brightness level. We don't cache the 65 // manager knows the actual brightness level. We don't cache the
29 // brightness level in Chrome as it'll make things less reliable. 66 // brightness level in Chrome as it'll make things less reliable.
30 power_manager_proxy_->ConnectToSignal( 67 power_manager_proxy_->ConnectToSignal(
31 power_manager::kPowerManagerInterface, 68 power_manager::kPowerManagerInterface,
32 power_manager::kBrightnessChangedSignal, 69 power_manager::kBrightnessChangedSignal,
33 base::Bind(&PowerManagerClientImpl::BrightnessChangedReceived, 70 base::Bind(&PowerManagerClientImpl::BrightnessChangedReceived,
34 weak_ptr_factory_.GetWeakPtr()), 71 weak_ptr_factory_.GetWeakPtr()),
35 base::Bind(&PowerManagerClientImpl::BrightnessChangedConnected, 72 base::Bind(&PowerManagerClientImpl::SignalConnected,
73 weak_ptr_factory_.GetWeakPtr()));
74
75 // Monitor the D-Bus signal for power supply polling signals.
76 power_manager_proxy_->ConnectToSignal(
77 power_manager::kPowerManagerInterface,
78 power_manager::kPowerSupplyPollSignal,
79 base::Bind(&PowerManagerClientImpl::PowerSupplyPollReceived,
80 weak_ptr_factory_.GetWeakPtr()),
81 base::Bind(&PowerManagerClientImpl::SignalConnected,
36 weak_ptr_factory_.GetWeakPtr())); 82 weak_ptr_factory_.GetWeakPtr()));
37 } 83 }
38 84
39 virtual ~PowerManagerClientImpl() { 85 virtual ~PowerManagerClientImpl() {
40 } 86 }
41 87
42 // PowerManagerClient override. 88 // PowerManagerClient override.
43 virtual void AddObserver(Observer* observer) { 89 virtual void AddObserver(Observer* observer) {
44 observers_.AddObserver(observer); 90 observers_.AddObserver(observer);
45 } 91 }
(...skipping 23 matching lines...) Expand all
69 dbus::MethodCall method_call( 115 dbus::MethodCall method_call(
70 power_manager::kPowerManagerInterface, 116 power_manager::kPowerManagerInterface,
71 power_manager::kIncreaseScreenBrightness); 117 power_manager::kIncreaseScreenBrightness);
72 power_manager_proxy_->CallMethod( 118 power_manager_proxy_->CallMethod(
73 &method_call, 119 &method_call,
74 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 120 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
75 base::Bind(&PowerManagerClientImpl::OnIncreaseScreenBrightness, 121 base::Bind(&PowerManagerClientImpl::OnIncreaseScreenBrightness,
76 weak_ptr_factory_.GetWeakPtr())); 122 weak_ptr_factory_.GetWeakPtr()));
77 } 123 }
78 124
125 virtual void RequestStatusUpdate() OVERRIDE {
126 // TODO(stevenjb): chromeos::RetrievePowerInformation has been deprecated;
127 // we should add a mechanism to immediately request an update, probably
128 // when we migrate the DBus code from libcros to here.
129 }
130
131 private:
132 // Called when a dbus signal is initially connected.
133 void SignalConnected(const std::string& interface_name,
134 const std::string& signal_name,
135 bool success) {
136 LOG_IF(WARNING, !success) << "Failed to connect to signal "
137 << signal_name << ".";
138 }
139
79 // Called when a brightness change signal is received. 140 // Called when a brightness change signal is received.
80 void BrightnessChangedReceived(dbus::Signal* signal) { 141 void BrightnessChangedReceived(dbus::Signal* signal) {
81 dbus::MessageReader reader(signal); 142 dbus::MessageReader reader(signal);
82 int32 brightness_level = 0; 143 int32 brightness_level = 0;
83 bool user_initiated = 0; 144 bool user_initiated = 0;
84 if (!(reader.PopInt32(&brightness_level) && 145 if (!(reader.PopInt32(&brightness_level) &&
85 reader.PopBool(&user_initiated))) { 146 reader.PopBool(&user_initiated))) {
86 LOG(ERROR) << "Brightness changed signal had incorrect parameters: " 147 LOG(ERROR) << "Brightness changed signal had incorrect parameters: "
87 << signal->ToString(); 148 << signal->ToString();
88 return; 149 return;
89 } 150 }
90 VLOG(1) << "Brightness changed to " << brightness_level 151 VLOG(1) << "Brightness changed to " << brightness_level
91 << ": user initiated " << user_initiated; 152 << ": user initiated " << user_initiated;
92 FOR_EACH_OBSERVER(Observer, observers_, 153 FOR_EACH_OBSERVER(Observer, observers_,
93 BrightnessChanged(brightness_level, user_initiated)); 154 BrightnessChanged(brightness_level, user_initiated));
94 } 155 }
95 156
96 // Called when the brightness change signal is initially connected.
97 void BrightnessChangedConnected(const std::string& interface_name,
98 const std::string& signal_name,
99 bool success) {
100 LOG_IF(WARNING, !success)
101 << "Failed to connect to brightness changed signal.";
102 }
103
104 // Called when a response for DecreaseScreenBrightness() is received. 157 // Called when a response for DecreaseScreenBrightness() is received.
105 void OnDecreaseScreenBrightness(dbus::Response* response) { 158 void OnDecreaseScreenBrightness(dbus::Response* response) {
106 if (!response) { 159 if (!response) {
107 LOG(ERROR) << "Failed to decrease screen brightness"; 160 LOG(ERROR) << "Failed to decrease screen brightness";
108 return; 161 return;
109 } 162 }
110 VLOG(1) << "screen brightness increased: " << response->ToString(); 163 VLOG(1) << "screen brightness increased: " << response->ToString();
111 } 164 }
112 165
113 // Called when a response for IncreaseScreenBrightness() is received. 166 // Called when a response for IncreaseScreenBrightness() is received.
114 void OnIncreaseScreenBrightness(dbus::Response* response) { 167 void OnIncreaseScreenBrightness(dbus::Response* response) {
115 if (!response) { 168 if (!response) {
116 LOG(ERROR) << "Failed to increase screen brightness"; 169 LOG(ERROR) << "Failed to increase screen brightness";
117 return; 170 return;
118 } 171 }
119 VLOG(1) << "screen brightness increased: " << response->ToString(); 172 VLOG(1) << "screen brightness increased: " << response->ToString();
120 } 173 }
121 174
175 // Called when a power supply polling signal is received.
176 void PowerSupplyPollReceived(dbus::Signal* signal) {
177 dbus::MessageReader reader(signal);
178 VLOG(1) << "Received power supply poll signal.";
179 GetPowerSupplyInfo();
180 }
181
182 // Gets the state of the power supply (line power and battery) from power
183 // manager.
184 void GetPowerSupplyInfo() {
185 dbus::MethodCall method_call(power_manager::kPowerManagerInterface,
186 power_manager::kGetAllPropertiesMethod);
187 power_manager_proxy_->CallMethod(
188 &method_call,
189 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
190 base::Bind(&PowerManagerClientImpl::OnGetAllPropertiesMethod,
191 weak_ptr_factory_.GetWeakPtr()));
192 }
193
194 // Called when GetAllPropertiesMethod call is complete.
195 void OnGetAllPropertiesMethod(dbus::Response* response) {
196 if (!response) {
197 LOG(ERROR) << "Error calling " << power_manager::kGetAllPropertiesMethod;
198 return;
199 }
200 dbus::MessageReader reader(response);
201 PowerSupplyStatus status;
202 double unused_battery_voltage = 0.0;
203 double unused_battery_energy = 0.0;
204 double unused_battery_energy_rate = 0.0;
205 if (!reader.PopBool(&status.line_power_on) ||
206 !reader.PopDouble(&unused_battery_energy) ||
207 !reader.PopDouble(&unused_battery_energy_rate) ||
208 !reader.PopDouble(&unused_battery_voltage) ||
209 !reader.PopInt64(&status.battery_seconds_to_empty) ||
210 !reader.PopInt64(&status.battery_seconds_to_full) ||
211 !reader.PopDouble(&status.battery_percentage) ||
212 !reader.PopBool(&status.battery_is_present) ||
213 !reader.PopBool(&status.battery_is_full)) {
214 LOG(ERROR) << "Error reading response from powerd: "
215 << response->ToString();
216 return;
217 }
218
219 VLOG(1) << "Power status: " << status.ToString();
220 FOR_EACH_OBSERVER(Observer, observers_, PowerChanged(status));
221 }
222
122 dbus::ObjectProxy* power_manager_proxy_; 223 dbus::ObjectProxy* power_manager_proxy_;
123 ObserverList<Observer> observers_; 224 ObserverList<Observer> observers_;
124 base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_; 225 base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_;
125 226
126 DISALLOW_COPY_AND_ASSIGN(PowerManagerClientImpl); 227 DISALLOW_COPY_AND_ASSIGN(PowerManagerClientImpl);
127 }; 228 };
128 229
129 // The PowerManagerClient implementation used on Linux desktop, 230 // The PowerManagerClient implementation used on Linux desktop,
130 // which does nothing. 231 // which does nothing.
131 class PowerManagerClientStubImpl : public PowerManagerClient { 232 class PowerManagerClientStubImpl : public PowerManagerClient {
233 public:
234 PowerManagerClientStubImpl()
235 : discharging_(true),
236 battery_percentage_(80),
237 pause_count_(0) {
238 }
239
240 virtual ~PowerManagerClientStubImpl() {}
241
132 // PowerManagerClient override. 242 // PowerManagerClient override.
133 virtual void AddObserver(Observer* observer) { 243 virtual void AddObserver(Observer* observer) OVERRIDE {
244 observers_.AddObserver(observer);
134 } 245 }
135 246
136 // PowerManagerClient override. 247 // PowerManagerClient override.
137 virtual void RemoveObserver(Observer* observer) { 248 virtual void RemoveObserver(Observer* observer) OVERRIDE {
249 observers_.RemoveObserver(observer);
138 } 250 }
139 251
140 // PowerManagerClient override. 252 // PowerManagerClient override.
141 virtual void DecreaseScreenBrightness(bool allow_off) { 253 virtual void DecreaseScreenBrightness(bool allow_off) OVERRIDE {
142 VLOG(1) << "Requested to descrease screen brightness"; 254 VLOG(1) << "Requested to descrease screen brightness";
143 } 255 }
144 256
145 // PowerManagerClient override. 257 // PowerManagerClient override.
146 virtual void IncreaseScreenBrightness() { 258 virtual void IncreaseScreenBrightness() OVERRIDE {
147 VLOG(1) << "Requested to increase screen brightness"; 259 VLOG(1) << "Requested to increase screen brightness";
148 } 260 }
261
262 virtual void RequestStatusUpdate() OVERRIDE {
263 if (!timer_.IsRunning()) {
264 timer_.Start(
265 FROM_HERE,
266 base::TimeDelta::FromMilliseconds(100),
267 this,
268 &PowerManagerClientStubImpl::Update);
269 } else {
270 timer_.Stop();
271 }
272 }
273
274 private:
275 void Update() {
276 // We pause at 0 and 100% so that it's easier to check those conditions.
277 if (pause_count_ > 1) {
278 pause_count_--;
279 return;
280 }
281
282 if (battery_percentage_ == 0 || battery_percentage_ == 100) {
283 if (pause_count_) {
284 pause_count_ = 0;
285 discharging_ = !discharging_;
286 } else {
287 pause_count_ = 20;
288 return;
289 }
290 }
291 battery_percentage_ += (discharging_ ? -1 : 1);
292
293 PowerSupplyStatus status;
294 status.line_power_on = !discharging_;
295 status.battery_is_present = true;
296 status.battery_percentage = battery_percentage_;
297 status.battery_seconds_to_empty =
298 std::max(1, battery_percentage_ * 180 / 100);
299 status.battery_seconds_to_full =
300 std::max(static_cast<int64>(1), 180 - status.battery_seconds_to_empty);
301
302 FOR_EACH_OBSERVER(Observer, observers_, PowerChanged(status));
303 }
304
305 bool discharging_;
306 int battery_percentage_;
307 int pause_count_;
308 ObserverList<Observer> observers_;
309 base::RepeatingTimer<PowerManagerClientStubImpl> timer_;
149 }; 310 };
150 311
151 PowerManagerClient::PowerManagerClient() { 312 PowerManagerClient::PowerManagerClient() {
152 } 313 }
153 314
154 PowerManagerClient::~PowerManagerClient() { 315 PowerManagerClient::~PowerManagerClient() {
155 } 316 }
156 317
157 PowerManagerClient* PowerManagerClient::Create(dbus::Bus* bus) { 318 PowerManagerClient* PowerManagerClient::Create(dbus::Bus* bus) {
158 if (system::runtime_environment::IsRunningOnChromeOS()) { 319 if (system::runtime_environment::IsRunningOnChromeOS()) {
159 return new PowerManagerClientImpl(bus); 320 return new PowerManagerClientImpl(bus);
160 } else { 321 } else {
161 return new PowerManagerClientStubImpl(); 322 return new PowerManagerClientStubImpl();
162 } 323 }
163 } 324 }
164 325
165 } // namespace chromeos 326 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/dbus/power_manager_client.h ('k') | chrome/browser/chromeos/low_battery_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698