11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/power/light_bar.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <cstring> // needed for strlen() 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/command_line.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/message_loop/message_loop.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/chromeos_switches.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/dbus/dbus_thread_manager.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromeos { 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kDarkSuspendDelaySeconds = 4; 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kLightBarControlPath[] = 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "/sys/devices/platform/cros_ec_lpc.0/cros-ec-dev.0/chromeos/cros_ec/" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "lightbar/sequence"; 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kKonamiCommand[] = "KONAMI"; 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(chirantan): These are used by a temporary workaround for lucid sleep and 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// should be removed once the proper implementation is ready (crbug.com/414949). 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kDarkResumeAlwaysFile[] = "/sys/power/dark_resume_always"; 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kEnableDarkResumeAlways[] = "1"; 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciLightBar::LightBar() 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : control_path_(base::FilePath(kLightBarControlPath)), 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci has_light_bar_(base::PathIsWritable(control_path_)) { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Until the kernel can properly detect the wakeup source, we need to use a 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // hack to tell the kernel to always enter dark resume. Chrome can then 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // detect any user activity and have the power manager transition out of dark 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // resume into regular resume. We don't care if the write succeeds or not 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // because most devices will not have this file. 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(chirantan): Remove this once we can properly detect the wakeup 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // source (crbug.com/414949). 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WriteFile(base::FilePath(kDarkResumeAlwaysFile), 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kEnableDarkResumeAlways, 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci strlen(kEnableDarkResumeAlways)); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciLightBar::~LightBar() { 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid LightBar::DarkSuspendImminent() { 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The plan is to track the progress of push events and then re-suspend as 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // soon as we know they have been processed. In the meanwhile, we can hack 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // around this by just having the light bar delay for a long time so that 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // people can at least start playing around with this feature for their apps. 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(chirantan): Remove this once we can accurately track the progress of 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // push events. 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->PostDelayedTask( 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FROM_HERE, 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DBusThreadManager::Get() 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->GetPowerManagerClient() 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->GetSuspendReadinessCallback(), 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta::FromSeconds(kDarkSuspendDelaySeconds)); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!has_light_bar_) 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (base::WriteFile(control_path_, kKonamiCommand, strlen(kKonamiCommand)) != 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<int>(strlen(kKonamiCommand))) 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PLOG(WARNING) << "Unable to flash light bar during dark resume."; 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace chromeos 78