• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "chre/platform/power_control_manager.h"
18 
19 #include "chre/platform/fatal_error.h"
20 #include "chre/platform/log.h"
21 #include "chre/platform/slpi/power_control_util.h"
22 
23 namespace chre {
24 
PowerControlManagerBase()25 PowerControlManagerBase::PowerControlManagerBase() {
26 #ifdef CHRE_SLPI_UIMG_ENABLED
27   char kClientName[] = "CHRE";
28   sns_pm_err_code_e result = sns_pm_client_init(
29       &mClientHandle, apSuspendCallback, kClientName, SNS_PM_CLIENT_ID_CHRE);
30   if (result != SNS_PM_SUCCESS) {
31     FATAL_ERROR("Power manager client init failed");
32   }
33 #endif // CHRE_SLPI_UIMG_ENABLED
34 }
35 
~PowerControlManagerBase()36 PowerControlManagerBase::~PowerControlManagerBase() {
37 #ifdef CHRE_SLPI_UIMG_ENABLED
38   sns_pm_client_close(mClientHandle);
39 #endif // CHRE_SLPI_UIMG_ENABLED
40 }
41 
voteBigImage(bool bigImage)42 bool PowerControlManagerBase::voteBigImage(bool bigImage) {
43 #ifdef CHRE_SLPI_UIMG_ENABLED
44   sns_pm_img_mode_e mode = bigImage ? SNS_IMG_MODE_BIG : SNS_IMG_MODE_NOCLIENT;
45   sns_pm_err_code_e result = sns_pm_vote_img_mode(mClientHandle, mode);
46   if (result != SNS_PM_SUCCESS) {
47     // Note that FATAL_ERROR must not be used here, because this can be called
48     // from preFatalError() (not that we should use it here regardless)
49     LOGE("Failed to vote for power mode %d with result %d", mode, result);
50   }
51 
52   return (result == SNS_PM_SUCCESS);
53 #else
54   return true;
55 #endif // CHRE_SLPI_UIMG_ENABLED
56 }
57 
postEventLoopProcess(size_t numPendingEvents)58 void PowerControlManager::postEventLoopProcess(size_t numPendingEvents) {
59   if (numPendingEvents == 0 && !slpiInUImage()) {
60     voteBigImage(false);
61   }
62 }
63 
apSuspendCallback(bool apSuspended)64 void PowerControlManagerBase::apSuspendCallback(bool apSuspended) {
65   EventLoopManagerSingleton::get()->getEventLoop()
66       .getPowerControlManager().mHostIsAwake = !apSuspended;
67   if (apSuspended) {
68     EventLoopManagerSingleton::get()->getEventLoop()
69         .postEvent(CHRE_EVENT_HOST_ASLEEP, nullptr, nullptr);
70   } else {
71     EventLoopManagerSingleton::get()->getEventLoop()
72         .postEvent(CHRE_EVENT_HOST_AWAKE, nullptr, nullptr);
73   }
74 }
75 
hostIsAwake()76 bool PowerControlManager::hostIsAwake() {
77   return mHostIsAwake;
78 }
79 
80 } // namespace chre
81