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

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: removed #if 0 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 <inttypes.h>
8
7 #include "base/bind.h" 9 #include "base/bind.h"
8 #include "base/callback.h" 10 #include "base/callback.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/stringprintf.h"
13 #include "base/time.h"
14 #include "base/timer.h"
9 #include "chrome/browser/chromeos/system/runtime_environment.h" 15 #include "chrome/browser/chromeos/system/runtime_environment.h"
10 #include "dbus/bus.h" 16 #include "dbus/bus.h"
11 #include "dbus/message.h" 17 #include "dbus/message.h"
12 #include "dbus/object_proxy.h" 18 #include "dbus/object_proxy.h"
13 #include "third_party/cros_system_api/dbus/service_constants.h" 19 #include "third_party/cros_system_api/dbus/service_constants.h"
14 20
15 namespace chromeos { 21 namespace chromeos {
16 22
23 const std::string& PowerSupplyStatus::ToString() const {
24 static std::string result = "";
25 base::StringAppendF(&result,
26 "line_power_on = %s ",
27 line_power_on ? "true" : "false");
28 base::StringAppendF(&result,
29 "battery_is_present = %s ",
30 battery_is_present ? "true" : "false");
31 base::StringAppendF(&result,
32 "battery_is_full = %s ",
33 battery_is_full ? "true" : "false");
34 base::StringAppendF(&result,
35 "battery_percentage = %f ",
36 battery_percentage);
37 base::StringAppendF(&result,
38 "battery_seconds_to_empty = %"PRId64" ",
39 battery_seconds_to_empty);
40 base::StringAppendF(&result,
41 "battery_seconds_to_full = %"PRId64" ",
42 battery_seconds_to_full);
43 return result;
44 }
45
17 // The PowerManagerClient implementation used in production. 46 // The PowerManagerClient implementation used in production.
18 class PowerManagerClientImpl : public PowerManagerClient { 47 class PowerManagerClientImpl : public PowerManagerClient {
19 public: 48 public:
20 explicit PowerManagerClientImpl(dbus::Bus* bus) 49 explicit PowerManagerClientImpl(dbus::Bus* bus)
21 : power_manager_proxy_(NULL), 50 : power_manager_proxy_(NULL),
22 weak_ptr_factory_(this) { 51 weak_ptr_factory_(this) {
23 power_manager_proxy_ = bus->GetObjectProxy( 52 power_manager_proxy_ = bus->GetObjectProxy(
24 power_manager::kPowerManagerServiceName, 53 power_manager::kPowerManagerServiceName,
25 power_manager::kPowerManagerServicePath); 54 power_manager::kPowerManagerServicePath);
26 55
27 // Monitor the D-Bus signal for brightness changes. Only the power 56 // Monitor the D-Bus signal for brightness changes. Only the power
28 // manager knows the actual brightness level. We don't cache the 57 // manager knows the actual brightness level. We don't cache the
29 // brightness level in Chrome as it'll make things less reliable. 58 // brightness level in Chrome as it'll make things less reliable.
30 power_manager_proxy_->ConnectToSignal( 59 power_manager_proxy_->ConnectToSignal(
31 power_manager::kPowerManagerInterface, 60 power_manager::kPowerManagerInterface,
32 power_manager::kBrightnessChangedSignal, 61 power_manager::kBrightnessChangedSignal,
33 base::Bind(&PowerManagerClientImpl::BrightnessChangedReceived, 62 base::Bind(&PowerManagerClientImpl::BrightnessChangedReceived,
34 weak_ptr_factory_.GetWeakPtr()), 63 weak_ptr_factory_.GetWeakPtr()),
35 base::Bind(&PowerManagerClientImpl::BrightnessChangedConnected, 64 base::Bind(&PowerManagerClientImpl::SignalConnected,
65 weak_ptr_factory_.GetWeakPtr()));
66
67 // Monitor the D-Bus signal for power supply polling signals.
68 power_manager_proxy_->ConnectToSignal(
69 power_manager::kPowerManagerInterface,
70 power_manager::kPowerSupplyPollSignal,
71 base::Bind(&PowerManagerClientImpl::PowerSupplyPollReceived,
72 weak_ptr_factory_.GetWeakPtr()),
73 base::Bind(&PowerManagerClientImpl::SignalConnected,
36 weak_ptr_factory_.GetWeakPtr())); 74 weak_ptr_factory_.GetWeakPtr()));
37 } 75 }
38 76
39 virtual ~PowerManagerClientImpl() { 77 virtual ~PowerManagerClientImpl() {
40 } 78 }
41 79
42 // PowerManagerClient override. 80 // PowerManagerClient override.
43 virtual void AddObserver(Observer* observer) { 81 virtual void AddObserver(Observer* observer) {
44 observers_.AddObserver(observer); 82 observers_.AddObserver(observer);
45 } 83 }
(...skipping 23 matching lines...) Expand all
69 dbus::MethodCall method_call( 107 dbus::MethodCall method_call(
70 power_manager::kPowerManagerInterface, 108 power_manager::kPowerManagerInterface,
71 power_manager::kIncreaseScreenBrightness); 109 power_manager::kIncreaseScreenBrightness);
72 power_manager_proxy_->CallMethod( 110 power_manager_proxy_->CallMethod(
73 &method_call, 111 &method_call,
74 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, 112 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
75 base::Bind(&PowerManagerClientImpl::OnIncreaseScreenBrightness, 113 base::Bind(&PowerManagerClientImpl::OnIncreaseScreenBrightness,
76 weak_ptr_factory_.GetWeakPtr())); 114 weak_ptr_factory_.GetWeakPtr()));
77 } 115 }
78 116
117 virtual void RequestStatusUpdate() {}
118
119 private:
120 // Called when a dbus signal is initially connected.
121 void SignalConnected(const std::string& interface_name,
122 const std::string& signal_name,
123 bool success) {
124 LOG_IF(WARNING, !success) << "Failed to connect to signal "
125 << signal_name << ".";
126 }
127
79 // Called when a brightness change signal is received. 128 // Called when a brightness change signal is received.
80 void BrightnessChangedReceived(dbus::Signal* signal) { 129 void BrightnessChangedReceived(dbus::Signal* signal) {
81 dbus::MessageReader reader(signal); 130 dbus::MessageReader reader(signal);
82 int32 brightness_level = 0; 131 int32 brightness_level = 0;
83 bool user_initiated = 0; 132 bool user_initiated = 0;
84 if (!(reader.PopInt32(&brightness_level) && 133 if (!(reader.PopInt32(&brightness_level) &&
85 reader.PopBool(&user_initiated))) { 134 reader.PopBool(&user_initiated))) {
86 LOG(ERROR) << "Brightness changed signal had incorrect parameters: " 135 LOG(ERROR) << "Brightness changed signal had incorrect parameters: "
87 << signal->ToString(); 136 << signal->ToString();
88 return; 137 return;
89 } 138 }
90 VLOG(1) << "Brightness changed to " << brightness_level 139 VLOG(1) << "Brightness changed to " << brightness_level
91 << ": user initiated " << user_initiated; 140 << ": user initiated " << user_initiated;
92 FOR_EACH_OBSERVER(Observer, observers_, 141 FOR_EACH_OBSERVER(Observer, observers_,
93 BrightnessChanged(brightness_level, user_initiated)); 142 BrightnessChanged(brightness_level, user_initiated));
94 } 143 }
95 144
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. 145 // Called when a response for DecreaseScreenBrightness() is received.
105 void OnDecreaseScreenBrightness(dbus::Response* response) { 146 void OnDecreaseScreenBrightness(dbus::Response* response) {
106 if (!response) { 147 if (!response) {
107 LOG(ERROR) << "Failed to decrease screen brightness"; 148 LOG(ERROR) << "Failed to decrease screen brightness";
108 return; 149 return;
109 } 150 }
110 VLOG(1) << "screen brightness increased: " << response->ToString(); 151 VLOG(1) << "screen brightness increased: " << response->ToString();
111 } 152 }
112 153
113 // Called when a response for IncreaseScreenBrightness() is received. 154 // Called when a response for IncreaseScreenBrightness() is received.
114 void OnIncreaseScreenBrightness(dbus::Response* response) { 155 void OnIncreaseScreenBrightness(dbus::Response* response) {
115 if (!response) { 156 if (!response) {
116 LOG(ERROR) << "Failed to increase screen brightness"; 157 LOG(ERROR) << "Failed to increase screen brightness";
117 return; 158 return;
118 } 159 }
119 VLOG(1) << "screen brightness increased: " << response->ToString(); 160 VLOG(1) << "screen brightness increased: " << response->ToString();
120 } 161 }
121 162
163 // Called when a power supply polling signal is received.
164 void PowerSupplyPollReceived(dbus::Signal* signal) {
165 dbus::MessageReader reader(signal);
166 VLOG(1) << "Received power supply poll signal.";
167 GetPowerSupplyInfo();
168 }
169
170 // Gets the state of the power supply (line power and battery) from power
171 // manager.
172 void GetPowerSupplyInfo() {
173 dbus::MethodCall method_call(power_manager::kPowerManagerInterface,
174 power_manager::kGetAllPropertiesMethod);
175 power_manager_proxy_->CallMethod(
176 &method_call,
177 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
178 base::Bind(&PowerManagerClientImpl::OnGetAllPropertiesMethod,
179 weak_ptr_factory_.GetWeakPtr()));
180 }
181
182 void OnGetAllPropertiesMethod(dbus::Response* response) {
183 // Called when GetAllPropertiesMethod call is complete.
satorux1 2011/10/28 17:36:23 Move the function comment to the out of the functi
Simon Que 2011/10/29 02:20:11 Done.
184 if (!response) {
185 LOG(ERROR) << "Error calling " << power_manager::kGetAllPropertiesMethod;
186 return;
187 }
188 dbus::MessageReader reader(response);
189 PowerSupplyStatus status;
190 double battery_voltage;
191 double battery_energy;
192 double battery_energy_rate;
satorux1 2011/10/28 17:36:23 Let's initialize the doubles with 0.0; These seem
Simon Que 2011/10/29 02:20:11 Done.
193 if (!reader.PopBool(&status.line_power_on) ||
194 !reader.PopDouble(&battery_energy) ||
195 !reader.PopDouble(&battery_energy_rate) ||
196 !reader.PopDouble(&battery_voltage) ||
197 !reader.PopInt64(&status.battery_seconds_to_empty) ||
198 !reader.PopInt64(&status.battery_seconds_to_full) ||
199 !reader.PopDouble(&status.battery_percentage) ||
200 !reader.PopBool(&status.battery_is_present) ||
201 !reader.PopBool(&status.battery_is_full)) {
202 LOG(ERROR) << "Error reading response from powerd: "
203 << response->ToString();
204 return;
205 }
206
207 VLOG(1) << "Power status: " << status.ToString();
208 FOR_EACH_OBSERVER(Observer, observers_, PowerChanged(status));
209 }
210
122 dbus::ObjectProxy* power_manager_proxy_; 211 dbus::ObjectProxy* power_manager_proxy_;
123 ObserverList<Observer> observers_; 212 ObserverList<Observer> observers_;
124 base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_; 213 base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_;
125 214
126 DISALLOW_COPY_AND_ASSIGN(PowerManagerClientImpl); 215 DISALLOW_COPY_AND_ASSIGN(PowerManagerClientImpl);
127 }; 216 };
128 217
129 // The PowerManagerClient implementation used on Linux desktop, 218 // The PowerManagerClient implementation used on Linux desktop,
130 // which does nothing. 219 // which does nothing.
131 class PowerManagerClientStubImpl : public PowerManagerClient { 220 class PowerManagerClientStubImpl : public PowerManagerClient {
221 public:
222 PowerManagerClientStubImpl()
223 : discharging_(true),
224 battery_percentage_(80),
225 pause_count_(0) {
226 }
227
228 virtual ~PowerManagerClientStubImpl() {}
229
132 // PowerManagerClient override. 230 // PowerManagerClient override.
133 virtual void AddObserver(Observer* observer) { 231 virtual void AddObserver(Observer* observer) OVERRIDE {
232 observers_.AddObserver(observer);
134 } 233 }
135 234
136 // PowerManagerClient override. 235 // PowerManagerClient override.
137 virtual void RemoveObserver(Observer* observer) { 236 virtual void RemoveObserver(Observer* observer) OVERRIDE {
237 observers_.RemoveObserver(observer);
138 } 238 }
139 239
140 // PowerManagerClient override. 240 // PowerManagerClient override.
141 virtual void DecreaseScreenBrightness(bool allow_off) { 241 virtual void DecreaseScreenBrightness(bool allow_off) OVERRIDE {
142 VLOG(1) << "Requested to descrease screen brightness"; 242 VLOG(1) << "Requested to descrease screen brightness";
143 } 243 }
144 244
145 // PowerManagerClient override. 245 // PowerManagerClient override.
146 virtual void IncreaseScreenBrightness() { 246 virtual void IncreaseScreenBrightness() OVERRIDE {
147 VLOG(1) << "Requested to increase screen brightness"; 247 VLOG(1) << "Requested to increase screen brightness";
148 } 248 }
249
250 virtual void RequestStatusUpdate() OVERRIDE {
251 if (!timer_.IsRunning()) {
252 timer_.Start(
253 FROM_HERE,
254 base::TimeDelta::FromMilliseconds(100),
255 this,
256 &PowerManagerClientStubImpl::Update);
257 } else {
258 timer_.Stop();
259 }
260 }
261
262 private:
263 void Update() {
264 // We pause at 0 and 100% so that it's easier to check those conditions.
265 if (pause_count_ > 1) {
266 pause_count_--;
267 return;
268 }
269
270 if (battery_percentage_ == 0 || battery_percentage_ == 100) {
271 if (pause_count_) {
272 pause_count_ = 0;
273 discharging_ = !discharging_;
274 } else {
275 pause_count_ = 20;
276 return;
277 }
278 }
279 battery_percentage_ += (discharging_ ? -1 : 1);
280
281 PowerSupplyStatus status;
282 status.line_power_on = !discharging_;
283 status.battery_is_present = true;
284 status.battery_percentage = battery_percentage_;
285 status.battery_seconds_to_empty =
286 std::max(1, battery_percentage_ * 180 / 100);
287 status.battery_seconds_to_full =
288 std::max(static_cast<int64>(1), 180 - status.battery_seconds_to_empty);
289
290 FOR_EACH_OBSERVER(Observer, observers_, PowerChanged(status));
291 }
292
293 bool discharging_;
294 int battery_percentage_;
295 int pause_count_;
296 ObserverList<Observer> observers_;
297 base::RepeatingTimer<PowerManagerClientStubImpl> timer_;
149 }; 298 };
150 299
151 PowerManagerClient::PowerManagerClient() { 300 PowerManagerClient::PowerManagerClient() {
152 } 301 }
153 302
154 PowerManagerClient::~PowerManagerClient() { 303 PowerManagerClient::~PowerManagerClient() {
155 } 304 }
156 305
157 PowerManagerClient* PowerManagerClient::Create(dbus::Bus* bus) { 306 PowerManagerClient* PowerManagerClient::Create(dbus::Bus* bus) {
158 if (system::runtime_environment::IsRunningOnChromeOS()) { 307 if (system::runtime_environment::IsRunningOnChromeOS()) {
159 return new PowerManagerClientImpl(bus); 308 return new PowerManagerClientImpl(bus);
160 } else { 309 } else {
161 return new PowerManagerClientStubImpl(); 310 return new PowerManagerClientStubImpl();
162 } 311 }
163 } 312 }
164 313
165 } // namespace chromeos 314 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698