blob: ea2910222820e398ba79d32445f34fd2c7a2e676 [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "power_manager/powerd/system/display/display_power_setter.h"
#include <memory>
#include <string>
#include <base/bind.h>
#include <base/logging.h>
#include <dbus/message.h>
#include "power_manager/common/util.h"
#include "power_manager/powerd/system/dbus_wrapper.h"
namespace power_manager {
namespace system {
namespace {
// Timeout for D-Bus method calls to Chrome.
const int kDisplayServiceDBusTimeoutMs = 5000;
std::string DisplayPowerStateToString(chromeos::DisplayPowerState state) {
switch (state) {
case chromeos::DISPLAY_POWER_ALL_ON:
return "all displays on";
case chromeos::DISPLAY_POWER_ALL_OFF:
return "all displays off";
case chromeos::DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON:
return "internal display off and external displays on";
case chromeos::DISPLAY_POWER_INTERNAL_ON_EXTERNAL_OFF:
return "internal display on and external displays off";
default:
return "[unknown]";
}
}
} // namespace
DisplayPowerSetter::DisplayPowerSetter()
: dbus_wrapper_(nullptr), display_service_proxy_(nullptr) {}
DisplayPowerSetter::~DisplayPowerSetter() {}
void DisplayPowerSetter::Init(DBusWrapperInterface* dbus_wrapper) {
DCHECK(dbus_wrapper);
dbus_wrapper_ = dbus_wrapper;
display_service_proxy_ = dbus_wrapper_->GetObjectProxy(
chromeos::kDisplayServiceName, chromeos::kDisplayServicePath);
}
void DisplayPowerSetter::SetDisplayPower(chromeos::DisplayPowerState state,
base::TimeDelta delay) {
if (delay.InMilliseconds() == 0) {
timer_.Stop();
SendStateToDisplayService(state);
} else {
timer_.Start(FROM_HERE, delay,
base::Bind(&DisplayPowerSetter::SendStateToDisplayService,
base::Unretained(this), state));
}
}
void DisplayPowerSetter::SetDisplaySoftwareDimming(bool dimmed) {
LOG(INFO) << "Asking DisplayService to " << (dimmed ? "dim" : "undim")
<< " the display in software";
dbus::MethodCall method_call(
chromeos::kDisplayServiceInterface,
chromeos::kDisplayServiceSetSoftwareDimmingMethod);
dbus::MessageWriter writer(&method_call);
writer.AppendBool(dimmed);
dbus_wrapper_->CallMethodSync(
display_service_proxy_, &method_call,
base::TimeDelta::FromMilliseconds(kDisplayServiceDBusTimeoutMs));
}
void DisplayPowerSetter::SendStateToDisplayService(
chromeos::DisplayPowerState state) {
LOG(INFO) << "Asking DisplayService to turn "
<< DisplayPowerStateToString(state);
dbus::MethodCall method_call(chromeos::kDisplayServiceInterface,
chromeos::kDisplayServiceSetPowerMethod);
dbus::MessageWriter writer(&method_call);
writer.AppendInt32(state);
dbus_wrapper_->CallMethodSync(
display_service_proxy_, &method_call,
base::TimeDelta::FromMilliseconds(kDisplayServiceDBusTimeoutMs));
}
} // namespace system
} // namespace power_manager