nt9856x/code/application/source/cardv/SrcCode/System/SysLock.c
2023-03-28 15:07:53 +08:00

156 lines
4.0 KiB
C
Executable File

/*
System Lock
System Lock for SxInput.
@file SysLock.c
@ingroup mIPRJSYS
@note 這個檔案負責三件事
1.管理AutoSleep detect機制的介面
UI_LockAutoSleep()
暫停
UI_UnlockAutoSleep()
恢復
UI_IsForceLockSleep(void)
詢問狀態
2.管理AutoPowerOff detect機制的介面
UI_LockAutoPWROff()
暫停
UI_UnlockAutoPWROff()
恢復
UI_IsForceLockAutoPWROff()
詢問狀態
3.管理所有與UI Event有關的detect機制的介面 (除了Timer之外)
UI_LockEvent()
暫停
UI_UnlockEvent()
恢復
UI_IsForceLock()
詢問狀態
Copyright Novatek Microelectronics Corp. 2010. All rights reserved.
*/
#include "PrjInc.h"
#include "UICommon.h"
//---------------------SysLockCB Debug Definition -----------------------------
//---------------------SysLockCB Global Variables -----------------------------
//---------------------SysLockCB Prototype Declaration -----------------------
//---------------------SysLockCB Public API ----------------------------------
//---------------------SysLockCB Private API ----------------------------------
/*
/// Force Lock of Input Dectection /////////////////////////
注意!!! SxJob執行的工作使用時, 需要暫停某些SxTimer的detection
原因:
由於某些SxJob執行的工作使用時,
另有某些SxTimer的detect function同時會發出 Ux_PostEvent()
如此一來, SxJob/SxTimer兩個task之間就會發生循環lock造成當機
(A等B的SxJob finish, B等A的UI framework window samphore)
==> 範例: TV插拔的同時, 按下Playback Key造成當機
執行:
power_on flow (第一次change mode完成前)
power_off flow
sleep_enter flow
sleep_leave flow
change_dispdev flow
change_dispmode flow
change_mode flow
暫停: (凡是會PostEvent給上層的, 都要暫停)
SX_TIMER_DET_PWR_ID //Key輸入
SX_TIMER_DET_KEY_ID //Key輸入
SX_TIMER_DET_MODE_ID //Key輸入
SX_TIMER_DET_USB_ID //USB連接
SX_TIMER_DET_TV_ID //TV連接
SX_TIMER_DET_BATT_ID //Batt偵測
SX_TIMER_DET_SLEEP_ID //Sleep偵測
SX_TIMER_DET_AUTOPOWEROFF_ID //PowerOff偵測
不會用SxTimer_SetFuncActive()來做,
而是直接在detect function內加入條件, 不符合條件即bypass detect
此法可避免其他UI flow的SxTimer_SetFuncActive()設定被破壞
層次上:
UI Flow code -> 請使用設定SxTimer_SetFuncActive()來暫停
SxJob Flow code -> 設定force lock來暫停 (算是在更低階的地方攔截)
*/
UINT32 bDetect_ForceLockStatus = FALSE; //defalt can not lock
UINT32 bDetect_ForceLock = TRUE;
BOOL g_bPostponeTVChange = FALSE; //#NT#TV change action should be postponed from movie play start to first video frame decoded
static UINT32 bDetect_LockSleep = FALSE;
static UINT32 bDetect_LockAutoPWROff = FALSE;
UINT32 UI_IsForceLockAutoSleep(void)
{
return bDetect_LockSleep;
}
UINT32 UI_IsForceLockAutoPWROff(void)
{
return bDetect_LockAutoPWROff;
}
void UI_LockAutoSleep(void)
{
bDetect_LockSleep = TRUE;
}
void UI_LockAutoPWROff(void)
{
bDetect_LockAutoPWROff = TRUE;
}
void UI_UnlockAutoSleep(void)
{
bDetect_LockSleep = FALSE;
}
void UI_UnlockAutoPWROff(void)
{
bDetect_LockAutoPWROff = FALSE;
}
UINT32 UI_IsForceLockStatus(void)
{
return bDetect_ForceLockStatus;
}
UINT32 UI_IsForceLock(void)
{
return bDetect_ForceLock;
}
//lock mode key,before Sx job start to change mode
void UI_LockStatusEvent()
{
bDetect_ForceLockStatus = TRUE;
}
void UI_LockEvent(void)
{
bDetect_ForceLock = TRUE;
//PwrKey,NormalKey,StatusKey: 避免event queue裡面的key event還是會被執行
//注意!!! 不能flush release key, 否則很可能會造成UI異常
// ==> 範例: TV插拔的同時, 按下S1再放開S1, UI的對焦框不消失(機率性)
// ==> 不過UI也要做到確保Press/Release成對處理的程序(如果沒有收到Press,就不要管Release)
//Ux_FlushEventByRange(NVTEVT_KEY_PRESS_START,NVTEVT_KEY_PRESS_END); //不能flush release key
//TV
//USB
//Battery
//Sleep
//AutoPoweroff
}
//unlock mode key,after Sx job end change mode
void UI_UnlockEvent(void)
{
bDetect_ForceLock = FALSE;
bDetect_ForceLockStatus = FALSE;
}