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"
24 #include <PlatformException.h>
30 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 LoggerE("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");
104 case PowerState::SCREENDIM :
105 case PowerState::SCREENNORMAL :
106 case PowerState::CPUAWAKE :
108 int native_state = POWER_STATE_SCREEN_OFF;
109 if( state == PowerState::SCREENDIM )
110 native_state = POWER_STATE_SCREEN_DIM;
111 else if( state == PowerState::SCREENNORMAL )
112 native_state = POWER_STATE_NORMAL;
114 native_state = POWER_STATE_SCREEN_OFF;
116 ret = power_lock_state( (power_state_e)native_state , 0);
117 if( POWER_ERROR_NONE!=ret ){
118 LoggerE("power_lock_state(%d) error %d",native_state, ret);
119 throw UnknownException("power_lock_state error");
123 case PowerState::SCREENBRIGHT :
126 ret = device_get_max_brightness(0, &maxBrightness);
127 if( DEVICE_ERROR_NONE!=ret) {
128 LoggerE("Platform error while getting max brightness: %d", ret);
129 throw UnknownException("Platform error while getting max brightness");
132 setPlatformBrightness( maxBrightness );
134 LOGI("Succeeded setting the brightness to a max level: %d", maxBrightness);
135 ret = power_lock_state(POWER_STATE_NORMAL, 0);
136 if( POWER_ERROR_NONE!=ret ){
137 LoggerE("Platform error while locking state %d", ret);
138 throw UnknownException("Platform error while locking state");
141 mBrightStateEnable = true;
142 power_state_e platform_state = power_get_state();
143 if( platform_state == POWER_STATE_NORMAL)
144 broadcastScreenState(PowerState::SCREENBRIGHT);
147 case PowerState::SCREENOFF:
148 LoggerE("SCREEN_OFF state cannot be requested");
149 throw InvalidValuesException("SCREEN_OFF state cannot be requested");
152 throw UnknownException("Platform error while locking state");
156 void PowerManager::release(PowerResource resource){
158 if( PowerResource::SCREEN == resource ) {
159 ret = power_unlock_state(POWER_STATE_SCREEN_DIM);
160 if( POWER_ERROR_NONE!=ret )
161 LOGI("Platform return value from dim unlock: %d", ret);
163 ret = power_unlock_state(POWER_STATE_NORMAL);
164 if( POWER_ERROR_NONE!=ret )
165 LOGI("Platform return value from dim unlock: %d", ret);
167 if( mBrightStateEnable ){
168 ret = device_set_brightness_from_settings(0);
169 if( DEVICE_ERROR_NONE!=ret){
170 LoggerE("Platform error while setting restore brightness %d", ret);
171 throw UnknownException("Platform error while setting restore brightness");
175 mBrightStateEnable = false;
176 power_state_e platform_state = power_get_state();
177 if( platform_state == POWER_STATE_NORMAL)
178 broadcastScreenState(PowerState::SCREENNORMAL);
180 } else if( PowerResource::CPU == resource ) {
181 ret = power_unlock_state(POWER_STATE_SCREEN_OFF);
182 if( POWER_ERROR_NONE!=ret )
183 LOGI("Platform return value from off unlock: %d", ret);
187 double PowerManager::getScreenBrightness(){
189 brightness = getPlatformBrightness();
190 LOGI("Brightness value: %d", brightness);
191 return brightness/100.0;
194 void PowerManager::setScreenBrightness(double brightness){
196 if( brightness > 1 || brightness < 0 )
197 throw InvalidValuesException("brightness should be 0 <= brightness <= 1");
199 ret = device_get_max_brightness(0, &maxBrightness);
201 LoggerE("Platform error while setting restore brightness: %d", ret);
202 throw UnknownException("Platform error while getting max brightness");
204 int nativeBrightness = (int)(brightness*maxBrightness);
206 if (nativeBrightness == 0)
207 nativeBrightness = 1;
209 setPlatformBrightness(nativeBrightness);
210 LOGI("Set the brightness value: %d", nativeBrightness);
213 bool PowerManager::isScreenOn(){
214 power_state_e state = power_get_state();
215 if(POWER_STATE_SCREEN_OFF==state)
221 void PowerManager::setScreenState(bool onoff){
224 ret = pm_change_state(LCD_NORMAL);
226 ret = pm_change_state(LCD_OFF);
229 LoggerE("Platform error while changing screen state %d", ret);
230 throw UnknownException("Platform error while changing screen state");
235 if( isScreenOn() == onoff )
242 void PowerManager::restoreScreenBrightness(){
244 ret = device_set_brightness_from_settings(0);
245 if( DEVICE_ERROR_NONE!=ret){
246 LoggerE("Platform error while restoring brightness %d", ret);
247 throw UnknownException("Platform error while restoring brightness");
251 PowerManager* PowerManager::getInstance(){
252 static PowerManager instance;
256 void PowerManager::addScreenStateChangedCallback(Common::CallbackUserData * callback){
257 list<CallbackUserData*>::iterator itr;
258 itr = find(mListener.begin(), mListener.end(), callback);
259 if( itr == mListener.end() )
260 mListener.push_back(callback);
263 void PowerManager::removeScreenStateChangedCallback(Common::CallbackUserData * callback){
264 mListener.remove(callback);
267 void PowerManager::setPlatformBrightness(int brightness){
270 if( mCurrentState.mState == PowerState::SCREENDIM ){
271 mCurrentBrightness = brightness;
272 LOGI("Current state is not normal state the value is saved in cache: %d", brightness);
273 mShouldBeReadFromCache = true;
276 mShouldBeReadFromCache = false;
278 int ret = device_set_brightness(0, brightness);
280 LoggerE("Platform error while setting %d brightness: %d", brightness, ret);
281 throw UnknownException("Platform error while setting brightness.");
283 mCurrentBrightness = brightness;
286 int PowerManager::getPlatformBrightness(){
287 int currentPowerState = 1;
289 int isCustomMode = 0;
290 int isAutoBrightness = 0;
293 vconf_get_int(VCONFKEY_PM_STATE, ¤tPowerState);
294 if( currentPowerState == VCONFKEY_PM_STATE_NORMAL){
295 vconf_get_int(VCONFKEY_PM_CURRENT_BRIGHTNESS, &brightness);
296 LOGD("[PM_STATE_NORMAL] return VCONFKEY_PM_CURRENT_BRIGHTNESS %d", brightness);
300 vconf_get_int(VCONFKEY_PM_CUSTOM_BRIGHTNESS_STATUS, &isCustomMode);
301 if( (isCustomMode && mCurrentBrightness != -1) || mShouldBeReadFromCache ){
302 LOGD("return custom brightness %d", mCurrentBrightness);
303 return mCurrentBrightness;
306 vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &isAutoBrightness);
307 if( isAutoBrightness == 1 ){
308 ret = vconf_get_int(VCONFKEY_SETAPPL_PREFIX"/automatic_brightness_level" /*prevent RSA build error*/, &brightness);
309 if( ret != 0 ) //RSA binary has no AUTOMATIC_BRIGHTNESS
310 vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &brightness);
312 vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &brightness);
314 LOGD("BRIGHTNESS(%s) %d", isAutoBrightness == 1 ? "auto" : "fix" , brightness);
320 void PowerManager::restoreSettedBrightness(){
321 int isCustomMode = 0;
322 vconf_get_int(VCONFKEY_PM_CUSTOM_BRIGHTNESS_STATUS, &isCustomMode);
323 if( isCustomMode || mShouldBeReadFromCache ){
324 if( mCurrentBrightness == -1 ){
325 // brightness was changed in other process
326 restoreScreenBrightness();
328 setPlatformBrightness(mCurrentBrightness);
331 mShouldBeReadFromCache = false;
334 void PowerManager::broadcastScreenState(PowerState current){
335 if( mCurrentState == current)
338 PowerState PreviousState = mCurrentState;
339 mCurrentState = current;
341 if( mCurrentState.mState == PowerState::SCREENNORMAL && PreviousState.mState == PowerState::SCREENDIM ){
342 //restore ScreenBrightness
344 restoreSettedBrightness();
346 catch( const BasePlatformException& err){
347 LoggerE("Error restore custom brightness %s", err.getMessage().c_str());
350 if( mCurrentState.mState == PowerState::SCREENNORMAL && PreviousState.mState == PowerState::SCREENOFF){
351 mShouldBeReadFromCache = false;
354 list<CallbackUserData*> tmplist(mListener);
355 list<CallbackUserData*>::iterator itr = tmplist.begin();
357 while( itr != tmplist.end() ){
358 CallbackUserData *callback = *itr;
359 if( callback != NULL ){
360 JSValueRef previousState = JSUtil::toJSValueRef(callback->getContext(), PreviousState.toString());
361 JSValueRef currentState = JSUtil::toJSValueRef(callback->getContext(), mCurrentState.toString());
362 JSValueRef args[2] = { previousState, currentState };
363 callback->callSuccessCallback(2, args);
370 PowerManager::PowerManager():mCurrentState(PowerState::SCREENNORMAL),mBrightStateEnable(false),mCurrentBrightness(-1),mShouldBeReadFromCache(false){
371 power_state_e platform_state = power_get_state();
372 switch( platform_state ){
373 case POWER_STATE_NORMAL :
374 mCurrentState.mState = PowerState::SCREENNORMAL;
376 case POWER_STATE_SCREEN_DIM :
377 mCurrentState.mState = PowerState::SCREENDIM;
379 case POWER_STATE_SCREEN_OFF :
380 mCurrentState.mState = PowerState::SCREENOFF;
383 power_set_changed_cb(PowerManager::onPlatformStateChangedCB, this);
385 PowerManager::~PowerManager(){
386 power_unset_changed_cb();