OLD | NEW |
---|---|
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 Loading... | |
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 |
OLD | NEW |