2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 #include "PowerManager.h"
25 #include <PlatformException.h>
29 using namespace DeviceAPI::Common;
36 PowerResource::PowerResource(const char *resource)
38 if( strcmp(resource,"SCREEN") == 0 )
40 else if( strcmp(resource,"CPU") == 0 )
43 throw TypeMismatchException("value is not PowerResource type");
46 const std::string PowerResource::toString(){
47 static const char *table[] = {"SCREEN", "CPU"};
48 return std::string(table[mType]);
52 PowerState::PowerState(const char *str)
54 static const char *table[] = { "SCREEN_OFF", "SCREEN_DIM", "SCREEN_NORMAL", "SCREEN_BRIGHT", "CPU_AWAKE"};
55 static state state_table[] = { SCREENOFF, SCREENDIM, SCREENNORMAL, SCREENBRIGHT, CPUAWAKE };
56 for(unsigned int i =0; i < sizeof(table)/sizeof(char*) ; i++){
57 if( strcmp(str, table[i]) == 0 ){
58 mState = state_table[i];
62 throw TypeMismatchException("value is not PowerState type");
65 PowerState::PowerState(state in):mState(in){
68 const std::string PowerState::toString(){
69 static const char *table[] = { "SCREEN_OFF", "SCREEN_DIM", "SCREEN_NORMAL", "SCREEN_BRIGHT", "CPU_AWAKE"};
70 return std::string(table[mState]);
74 void PowerManager::onPlatformStateChangedCB(power_state_e state, void *user_data){
75 PowerManager* object = static_cast<PowerManager*>(user_data);
77 LOGE("User data is NULL");
80 PowerState current(PowerState::SCREENOFF);
82 case POWER_STATE_NORMAL :
83 current.mState = object->mBrightStateEnable ? PowerState::SCREENBRIGHT : PowerState::SCREENNORMAL;
85 case POWER_STATE_SCREEN_DIM :
86 current.mState = PowerState::SCREENDIM;
88 case POWER_STATE_SCREEN_OFF :
89 current.mState = PowerState::SCREENOFF;
92 object->broadcastScreenState(current);
96 void PowerManager::request(PowerResource resource, PowerState state){
97 if( resource == PowerResource::SCREEN && state == PowerState::CPUAWAKE)
98 throw InvalidValuesException("invalid PowerState");
99 if( resource == PowerResource::CPU && state != PowerState::CPUAWAKE)
100 throw InvalidValuesException("invalid PowerState");
103 int native_state = POWER_STATE_SCREEN_OFF;
105 case PowerState::SCREENDIM :
106 native_state = POWER_STATE_SCREEN_DIM;
107 case PowerState::SCREENNORMAL :
108 native_state = POWER_STATE_NORMAL;
109 case PowerState::CPUAWAKE :
110 ret = power_lock_state( state.mState == PowerState::SCREENDIM ? POWER_STATE_SCREEN_DIM : POWER_STATE_NORMAL, 0);
111 if( POWER_ERROR_NONE!=ret )
112 throw UnknownException("power_lock_state error");
114 case PowerState::SCREENBRIGHT :
117 ret = device_get_max_brightness(0, &maxBrightness);
118 if( DEVICE_ERROR_NONE!=ret) {
119 LOGE("Platform error while getting max brightness: %d", ret);
120 throw UnknownException("Platform error while getting max brightness");
123 ret = device_set_brightness(0, maxBrightness);
124 if( DEVICE_ERROR_NONE!=ret)
125 throw UnknownException("Platform error while setting max brightness:");
127 LOGI("Succeeded setting the brightness to a max level: %d", maxBrightness);
128 ret = power_lock_state(POWER_STATE_NORMAL, 0);
129 if( POWER_ERROR_NONE!=ret )
130 throw UnknownException("Platform error while locking state");
132 mBrightStateEnable = true;
133 power_state_e platform_state = power_get_state();
134 if( platform_state == POWER_STATE_NORMAL)
135 broadcastScreenState(PowerState::SCREENBRIGHT);
139 throw UnknownException("Platform error while locking state");
143 void PowerManager::release(PowerResource resource){
145 if( PowerResource::SCREEN == resource ) {
146 ret = power_unlock_state(POWER_STATE_SCREEN_DIM);
147 if( POWER_ERROR_NONE!=ret )
148 LOGI("Platform return value from dim unlock: %d", ret);
150 ret = power_unlock_state(POWER_STATE_NORMAL);
151 if( POWER_ERROR_NONE!=ret )
152 LOGI("Platform return value from dim unlock: %d", ret);
154 ret = device_set_brightness_from_settings(0);
155 if( DEVICE_ERROR_NONE!=ret)
156 throw UnknownException("Platform error while setting restore brightness");
158 mBrightStateEnable = false;
159 power_state_e platform_state = power_get_state();
160 if( platform_state == POWER_STATE_NORMAL)
161 broadcastScreenState(PowerState::SCREENNORMAL);
163 } else if( PowerResource::CPU == resource ) {
164 ret = power_unlock_state(POWER_STATE_SCREEN_OFF);
165 if( POWER_ERROR_NONE!=ret )
166 LOGI("Platform return value from off unlock: %d", ret);
170 double PowerManager::getScreenBrightness(){
172 ret = device_get_brightness(0, &brightness);
173 if( DEVICE_ERROR_NONE!=ret )
174 throw UnknownException("Platform error while get brightness");
175 LOGI("Brightness value: %d", brightness);
176 return brightness/100.0;
179 void PowerManager::setScreenBrightness(double brightness){
181 if( brightness > 1 || brightness < 0 )
182 throw InvalidValuesException("brightness should be 0 <= brightness <= 1");
184 ret = device_get_max_brightness(0, &maxBrightness);
186 LOGE("Platform error while setting restore brightness: %d", ret);
187 throw UnknownException("Platform error while getting max brightness");
190 ret = device_set_brightness(0, (int)(brightness*maxBrightness));
191 if( DEVICE_ERROR_NONE!=ret )
192 throw UnknownException("Platform error while setting brightness.");
193 LOGI("Set the brightness value: %d", (int)(brightness*maxBrightness));
196 bool PowerManager::isScreenOn(){
197 power_state_e state = power_get_state();
198 if(POWER_STATE_SCREEN_OFF==state)
204 void PowerManager::setScreenState(bool onoff){
207 ret = pm_change_state(LCD_NORMAL);
209 ret = pm_change_state(LCD_OFF);
212 throw UnknownException("Platform error while changing screen state");
215 void PowerManager::restoreScreenBrightness(){
217 ret = device_set_brightness_from_settings(0);
218 if( DEVICE_ERROR_NONE!=ret)
219 throw UnknownException("Platform error while restoring brightness");
222 PowerManager* PowerManager::getInstance(){
223 static PowerManager instance;
227 void PowerManager::addScreenStateChangedCallback(Common::CallbackUserData * callback){
228 list<CallbackUserData*>::iterator itr;
229 itr = find(mListener.begin(), mListener.end(), callback);
230 if( itr == mListener.end() )
231 mListener.push_back(callback);
234 void PowerManager::removeScreenStateChangedCallback(Common::CallbackUserData * callback){
235 mListener.remove(callback);
238 void PowerManager::broadcastScreenState(PowerState current){
239 if( mCurrentState == current)
242 list<CallbackUserData*> tmplist(mListener);
243 list<CallbackUserData*>::iterator itr = tmplist.begin();
245 while( itr != tmplist.end() ){
246 CallbackUserData *callback = *itr;
247 if( callback != NULL ){
248 JSValueRef previousState = JSUtil::toJSValueRef(callback->getContext(), mCurrentState.toString());
249 JSValueRef currentState = JSUtil::toJSValueRef(callback->getContext(), current.toString());
250 JSValueRef args[2] = { previousState, currentState };
251 callback->callSuccessCallback(2, args);
255 mCurrentState = current;
259 PowerManager::PowerManager():mCurrentState(PowerState::SCREENNORMAL),mBrightStateEnable(false){
260 power_state_e platform_state = power_get_state();
261 switch( platform_state ){
262 case POWER_STATE_NORMAL :
263 mCurrentState.mState = PowerState::SCREENNORMAL;
265 case POWER_STATE_SCREEN_DIM :
266 mCurrentState.mState = PowerState::SCREENDIM;
268 case POWER_STATE_SCREEN_OFF :
269 mCurrentState.mState = PowerState::SCREENOFF;
272 power_set_changed_cb(PowerManager::onPlatformStateChangedCB, this);
274 PowerManager::~PowerManager(){
275 power_unset_changed_cb();