Chromium Code Reviews| 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 |