30 #ifdef ENABLE_DEEP_SLEEP
52 #include "pwrlogger.h"
53 #include "plat_power.h"
54 #include "deepSleepMgr.h"
55 #include "libIBusDaemon.h"
57 #include "comcastIrKeyCodes.h"
64 static IARM_Result_t _DeepSleepWakeup(
void *arg);
65 static IARM_Result_t _SetDeepSleepTimer(
void *arg);
66 static IARM_Result_t _GetDeepSleepStatus(
void *arg);
67 static IARM_Result_t _GetLastWakeupReason(
void *arg);
68 static IARM_Result_t _GetLastWakeupKeyCode(
void *arg);
70 IARM_Result_t GetPwrMgrDeepSleepStatus(
int *status);
71 IARM_Result_t PwrMgrDeepSleepWakeup(IARM_Bus_CommonAPI_PowerPreChange_Param_t *arg);
73 static gboolean heartbeatMsg(gpointer data);
74 static gboolean deep_sleep_delay_timer_fn(gpointer data);
77 static uint32_t deep_sleep_delay_timeout = 0;
78 static uint32_t deep_sleep_wakeup_timer = 0;
79 static bool nwStandbyMode_gs =
false;
80 GMainLoop *deepSleepMgr_Loop = NULL;
81 static GMainLoop *mainloop = NULL;
82 static guint dsleep_delay_event_src = 0;
84 static gboolean isLxcRestart = 0;
85 extern void _handleDeepsleepTimeoutWakeup ();
88 void IARM_Bus_PWRMGR_RegisterDeepSleepAPIs()
99 void PwrMgrDeepSleepTimeout()
101 #if !defined (_DISABLE_SCHD_REBOOT_AT_DEEPSLEEP)
103 system(
"echo 0 > /opt/.rebootFlag");
104 system(
" echo `/bin/timestamp` ------------- Reboot timer expired while in Deep Sleep --------------- >> /opt/logs/receiver.log");
105 system(
"sleep 5; /rebootNow.sh -s DeepSleepMgr -o 'Rebooting the box due to reboot timer expired while in Deep Sleep...'");
111 static void SetPwrMgrDeepSleepMode(
void *data)
113 LOG(
"[%s:%d] Entering...\n",__FUNCTION__,__LINE__);
118 LOG(
"Event IARM_BUS_PWRMGR_EVENT_MODECHANGED: State Changed %d -- > %d\r\n",
119 param->data.state.curState, param->data.state.newState);
121 if(IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP == param->data.state.newState)
124 LOG(
"GOT EVENT TO GO TO DEEP SLEEP \r\n");
129 deep_sleep_wakeup_timer = param->data.state.deep_sleep_timeout;
131 uint32_t SleepTimeInSec = 0;
136 fpST = fopen(
"/tmp/deepSleepTimer",
"r");
139 if(0 > fscanf(fpST,
"%d",&SleepTimeInSec)) {
141 LOG(
"Error: fscanf on SleepTimeInSec failed");
143 deep_sleep_delay_timeout = SleepTimeInSec ;
145 LOG(
" /tmp/ override Deep Sleep Time is %d \r\n",deep_sleep_delay_timeout);
150 LOG(
"Deep Sleep wakeup time value is %d Secs.. \r\n",deep_sleep_wakeup_timer);
151 if (deep_sleep_delay_timeout) {
153 LOG(
"Schedule Deep SLeep After %d Sec.. \r\n",deep_sleep_delay_timeout);
154 dsleep_delay_event_src = g_timeout_add_seconds ((guint) deep_sleep_delay_timeout,deep_sleep_delay_timer_fn,deepSleepMgr_Loop);
156 LOG(
"Enter to Deep sleep Mode..stop Receiver with sleep 10 before DS \r\n");
158 if ((stat(
"/lib/systemd/system/lxc.service", &buf) == 0) && (stat(
"/opt/lxc_service_disabled",&buf) !=0)) {
159 LOG(
"stopping lxc service\r\n");
160 system(
"systemctl stop lxc.service");
163 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
164 LOG(
"stopping xre-receiver service\r\n");
165 system(
"systemctl stop xre-receiver.service");
166 LOG(
"stopping wpeframework service\r\n");
167 system(
"systemctl stop wpeframework.service");
169 LOG(
"Skipping Stopping service while entering DEEPSLEEP.\n");
171 #ifndef ENABLE_LLAMA_PLATCO
172 LOG(
"Unmounting SDcard partition\r\n");
173 system(
"sh /lib/rdk/disk_checkV2 deepsleep ON");
175 LOG(
"Skipping Unmounting SDcard partition.\r\n");
178 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
179 LOG(
"Enter to Deep sleep Mode..stop fog service before DS \r\n");
180 system(
"systemctl stop fog.service");
185 while(retryCount< 5) {
186 LOG(
"Device entering Deep sleep Mode.. \r\n");
188 #ifdef ENABLE_LLAMA_PLATCO_SKY_XIONE
189 nwStandbyMode_gs = param->data.state.nwStandbyMode;
190 LOG(
"\nCalling PLAT_DS_SetDeepSleep with nwStandbyMode: %s\n",
191 nwStandbyMode_gs?(
"Enabled"):(
"Disabled"));
193 LOG(
"Device entered to Deep sleep Mode.. \r\n");
194 status = PLAT_DS_SetDeepSleep(deep_sleep_wakeup_timer,&userWakeup, nwStandbyMode_gs);
195 LOG(
"Device resumed from Deep sleep Mode. \r\n");
200 if(retryCount >= 5) {
201 LOG(
"ERROR: Device failed to enter into Deep sleep Mode.. \r\n");
216 LOG(
"Resumed due to user action. Sending KED_DEEPSLEEP_WAKEUP. \r\n");
218 eventData.data.irkey.keyType = KET_KEYDOWN;
219 eventData.data.irkey.keyCode = KED_DEEPSLEEP_WAKEUP;
220 eventData.data.irkey.isFP = 0;
224 eventData.data.irkey.keyType = KET_KEYUP;
227 LOG(
"Resumed without user action. Not sending KED_DEEPSLEEP_WAKEUP. \r\n");
230 #ifdef USE_WAKEUP_TIMER_EVT
231 DeepSleep_WakeupReason_t wakeupReason = DEEPSLEEP_WAKEUPREASON_UNKNOWN;
232 int reasonStatus = PLAT_DS_GetLastWakeupReason(&wakeupReason);
233 if (DEEPSLEEP_WAKEUPREASON_TIMER == wakeupReason){
234 LOG(
"Calling IARM_BUS_PWRMGR_API_handleDeepsleepTimeoutWakeup on wakeupReason:%d \n", wakeupReason);
235 _handleDeepsleepTimeoutWakeup();
241 LOG(
"[%s]DeepSleepStatus InProgress. Failed to Update DeepSleep ModeChange \r\n", __FUNCTION__);
248 LOG(
"[%s:%d] Exiting...\r\n",__FUNCTION__,__LINE__);
251 static void* DeepsleepStateChangeThread(
void* arg)
253 SetPwrMgrDeepSleepMode(arg);
257 void HandleDeepSleepStateChange(
void *data)
260 pthread_t pwrMgrDSEventThreadId;
264 LOG(
"Event IARM_BUS_PWRMGR_EVENT_MODECHANGED: State Changed %d -- > %d\r\n",
265 param->data.state.curState, param->data.state.newState);
267 int err = pthread_create(&pwrMgrDSEventThreadId, NULL, DeepsleepStateChangeThread, data);
269 LOG(
"DeepsleepStateChangeThread thread create failed \r\n");
271 err = pthread_detach(pwrMgrDSEventThreadId);
273 LOG(
"DeepsleepStateChangeThread thread detach failed \r\n");
278 static IARM_Result_t _DeepSleepWakeup(
void *arg)
280 IARM_Bus_CommonAPI_PowerPreChange_Param_t *param = (IARM_Bus_CommonAPI_PowerPreChange_Param_t *) arg;
282 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
283 const char* syscommand =
"systemctl restart mocadriver.service &";
286 LOG(
"RPC IARM_BUS_COMMON_API_DeepSleepWakeup : State Changed %d -- > %d\r", param->curState, param->newState);
289 if( (IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP == param->curState) &&
290 (IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP != param->newState)) {
291 LOG(
"GOT EVENT TO EXIT FROM DEEP SLEEP \r\n");
294 PLAT_DS_DeepSleepWakeup();
297 if(dsleep_delay_event_src) {
298 g_source_remove(dsleep_delay_event_src);
299 dsleep_delay_event_src = 0;
302 if(IsDeviceInDeepSleep) {
304 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
305 LOG(
"Restarting Moca Service After Waking up from Deep Sleep.. \r\n");
308 #ifndef ENABLE_LLAMA_PLATCO
309 LOG(
"Mounting SDcard partition After Waking up from Deep Sleep..\r\n");
310 system(
"sh /lib/rdk/disk_checkV2 deepsleep OFF");
312 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
313 LOG(
"Restarting fog Service After Waking up from Deep Sleep.. \r\n");
314 system(
"systemctl restart fog.service &");
317 LOG(
"Restarting Lxc Service After Waking up from Deep Sleep\r\n");
318 system(
"systemctl restart lxc.service");
321 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
322 LOG(
"Restarting WPEFramework Service After Waking up from Deep Sleep\r\n");
323 system(
"systemctl restart wpeframework.service");
324 LOG(
"Restarting Receiver Service After Waking up from Deep Sleep\r\n");
325 system(
"systemctl restart xre-receiver.service");
327 LOG(
"Skipping restart of Services in Sky Platform\n");
334 LOG(
"Device woke up from Deep sleep Mode.. \r\n");
336 return IARM_RESULT_SUCCESS;
341 IARM_Result_t PwrMgrDeepSleepWakeup(IARM_Bus_CommonAPI_PowerPreChange_Param_t *arg)
343 IARM_Bus_CommonAPI_PowerPreChange_Param_t *param = (IARM_Bus_CommonAPI_PowerPreChange_Param_t *) arg;
345 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
346 const char* syscommand =
"systemctl restart mocadriver.service &";
349 LOG(
"RPC IARM_BUS_COMMON_API_DeepSleepWakeup : State Changed %d -- > %d\r", param->curState, param->newState);
352 if( (IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP == param->curState) &&
353 (IARM_BUS_PWRMGR_POWERSTATE_STANDBY_DEEP_SLEEP != param->newState)) {
354 LOG(
"GOT EVENT TO EXIT FROM DEEP SLEEP \r\n");
357 PLAT_DS_DeepSleepWakeup();
360 if(dsleep_delay_event_src) {
361 g_source_remove(dsleep_delay_event_src);
362 dsleep_delay_event_src = 0;
365 if(IsDeviceInDeepSleep) {
367 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
368 LOG(
"Restarting Moca Service After Waking up from Deep Sleep.. \r\n");
371 #ifndef ENABLE_LLAMA_PLATCO
372 LOG(
"Mounting SDcard partition After Waking up from Deep Sleep..\r\n");
373 system(
"sh /lib/rdk/disk_checkV2 deepsleep OFF");
375 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
376 LOG(
"Restarting fog Service After Waking up from Deep Sleep.. \r\n");
377 system(
"systemctl restart fog.service &");
380 LOG(
"Restarting Lxc Service After Waking up from Deep Sleep\r\n");
381 system(
"systemctl restart lxc.service");
384 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
385 LOG(
"Restarting WPEFramework Service After Waking up from Deep Sleep\r\n");
386 system(
"systemctl restart wpeframework.service");
387 LOG(
"Restarting Receiver Service After Waking up from Deep Sleep\r\n");
388 system(
"systemctl restart xre-receiver.service");
390 LOG(
"Skipping restart of Services in Sky Platform\n");
397 LOG(
"Device woke up from Deep sleep Mode.. \r\n");
399 return IARM_RESULT_SUCCESS;
402 static IARM_Result_t _GetDeepSleepStatus(
void *arg)
404 int *status = (
int *)arg;
405 *status = IsDeviceInDeepSleep;
406 return IARM_RESULT_SUCCESS;
409 IARM_Result_t GetPwrMgrDeepSleepStatus(
int *status)
411 *status = IsDeviceInDeepSleep;
412 return IARM_RESULT_SUCCESS;
415 static IARM_Result_t _SetDeepSleepTimer(
void *arg)
417 IARM_Bus_DeepSleepMgr_SetDeepSleepTimer_Param_t *param = (IARM_Bus_DeepSleepMgr_SetDeepSleepTimer_Param_t *)arg;
420 LOG(
"Deep sleep timer set to : %d Seconds \r\n", param->timeout);
421 deep_sleep_delay_timeout = param->timeout;
422 return IARM_RESULT_SUCCESS;
424 return IARM_RESULT_IPCCORE_FAIL;
427 static gboolean deep_sleep_delay_timer_fn(gpointer data)
432 LOG(
"Deep Sleep Timer Expires :Enter to Deep sleep Mode..stop Receiver with sleep 10 before DS \r\n");
435 if ((stat(
"/lib/systemd/system/lxc.service", &buf) == 0) && (stat(
"/opt/lxc_service_disabled",&buf) !=0)) {
436 system(
"systemctl stop lxc.service");
439 #ifndef ENABLE_LLAMA_PLATCO_SKY_XIONE
440 system(
"systemctl stop xre-receiver.service");
441 system(
"systemctl stop wpeframework.service");
443 LOG(
"Skiping Stopping of services in Sky Llama Platform\n");
447 status = PLAT_DS_SetDeepSleep(deep_sleep_wakeup_timer,&userWakeup, nwStandbyMode_gs);
449 LOG(
"deep_sleep_delay_timer_fn: Failed to enter deepsleep state \n");
452 #ifdef USE_WAKEUP_TIMER_EVT
454 DeepSleep_WakeupReason_t wakeupReason = DEEPSLEEP_WAKEUPREASON_UNKNOWN;
455 int reasonStatus = PLAT_DS_GetLastWakeupReason(&wakeupReason);
456 if (DEEPSLEEP_WAKEUPREASON_TIMER == wakeupReason){
457 LOG(
"Calling IARM_BUS_PWRMGR_API_handleDeepsleepTimeoutWakeup on wakeupReason:%d \n", wakeupReason);
458 _handleDeepsleepTimeoutWakeup();
464 static IARM_Result_t _GetLastWakeupReason(
void *arg)
466 DeepSleep_WakeupReason_t *wakeupReason = (DeepSleep_WakeupReason_t *)arg;
467 int status = PLAT_DS_GetLastWakeupReason(wakeupReason);
468 return (IARM_Result_t) status;
471 static IARM_Result_t _GetLastWakeupKeyCode(
void *arg)
473 IARM_Bus_DeepSleepMgr_WakeupKeyCode_Param_t *wakeupKeyCode = (IARM_Bus_DeepSleepMgr_WakeupKeyCode_Param_t *)arg;
474 int status = PLAT_DS_GetLastWakeupKeyCode(wakeupKeyCode);
475 return (IARM_Result_t) status;