如何将内核事件与当前是否有程序运行关联

63745006   2008-7-15 19:06 楼主
在CE5.0的一个背光驱动中看到背光关了以后. 主要由三种事件重新打开背光.具体代码如下:
//  Globals
const TCHAR szevtBacklightChange[] = TEXT("BackLightChangeEvent");
const TCHAR szevtPowerChanged[] = TEXT("PowerChangedEvent");
const TCHAR szevtUserInput[] = TEXT("UserInputEvent");


const TCHAR szregRootKey[] = TEXT("ControlPanel\\Backlight");
const TCHAR szregBatteryTimeout[] = TEXT("BatteryTimeout");
const TCHAR szregACTimeout[] = TEXT("ACTimeout");
const TCHAR szregBatteryAuto[] = TEXT("BacklightOnTap");
const TCHAR szregACAuto[] = TEXT("ACBacklightOnTap");

HANDLE   g_evtSignal[NUM_EVENTS];

//
// initialize the backlight
//
BOOL BL_Init()
{
    //  Set up all the events we need.
    g_evtSignal[0] = CreateEvent(NULL, FALSE, FALSE, szevtBacklightChange);
    g_evtSignal[1] = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
    g_evtSignal[BL_POWEREVT] = CreateEvent(NULL, FALSE, FALSE, szevtPowerChanged);

    if(!g_evtSignal[0] || !g_evtSignal[1] || !g_evtSignal[2]) {
        BL_Deinit();
        return FALSE;
    }
    return TRUE;
}


//  Now let's wait for either there is an update on registry, or
//  there is user action on the device, or there is activity on
//  AC power supply.
dwResult = WaitForMultipleObjects(NUM_EVENTS, &g_evtSignal[0], FALSE, dwTimeout);

//  If we are signaled by registry event
if(WAIT_OBJECT_0 == dwResult) {
        //  All we need to do is to read from registry and update the tick count
        BL_ReadRegistry(&g_BLInfo);

        //  Always turn on the Backlight after a change to registry
        BL_On(TRUE);
        }
else if(dwResult == WAIT_OBJECT_0+1) {
        //  User activity, depending on the situation, we may / may not update
        //  the tick count

        if(IsACOn()) {
                if(g_BLInfo.m_bACAuto) {
                        //  Turn on backlight
                        BL_On(TRUE);
                }
        }
        else {
                if(g_BLInfo.m_bBatteryAuto) {
                        BL_On(TRUE);
                }
        }  
}
else if(dwResult == WAIT_OBJECT_0+2) {
        //  When AC is plugged or un-plugged, we don't really need to do anything
        //  We continue the loop. The correct timeout value will be assigned at
        //  the top of the while loop.
        RETAILMSG(1, (TEXT("BackLight Thread: power changed!\r\n")));
}
else if(dwResult == WAIT_TIMEOUT) {
        //  Time out, let's turn the device off
        RETAILMSG(1, (TEXT("Timeout, turn off the backlight!\r\n")));
        BL_On(FALSE);
}

现在情况是关掉背光后. 不会因为有操作事件打开背光. 请问如何将一个事件与有CE系统时候侦察到操作这一动作联系起来?

回复评论 (8)

用中断,比如键盘输入或者点击屏幕触发中断,关联UserInputEvent。
其实用什么事件触发中断,并点亮背光,都是由设计者自己定义的。
点赞  2008-7-15 20:36
你需要对WinCE power management的概念有个了解,再回来开这件事。自然就会有解
点赞  2008-7-15 23:39
简单来说,这个驱动能用才怪
点赞  2008-7-15 23:40
先处理BKL_IoControl,在来搞这些系统event的事情
点赞  2008-7-15 23:48
这个驱动只是一个框架.里面并没有如何关LCD背光的代码. 以下是输出信息.
从以下输出信息来看. 确实是执行了定时关掉背光(虽然时间不太准). 但却没有因为我点击了触摸屏而重新打开背光
BacklightInitialize
!!!!!!!!!!!! BACKLIGHT ON !!!!!!!!!!!!
+CS8900:DriverEntry
......
--S3C2440DISP::InitializeHardware
Lyg.p: Layout Manager successfully initialized to  2
Touch Init
Maximum Allowed Error 7:
Explorer(V2.0) taskbar thread started.
RasEntry '`USB Socket Default' Created
NDISPWR:: Found adapter [CS89001]
Timeout, turn off the backlight!
!!!!!!!!!!!! BACKLIGHT OFF !!!!!!!!!!!!

我现在只想知道如何能做到侦察是否有用户触发CE事件或更改电源. 从楼上两位来看. 是否在触摸屏幕驱动和键盘输入驱动中增加一个全局事件变量. 只要用户触发触摸屏或按键就set该事件. 那如何在触摸屏驱动/键盘驱动/背光驱动程序中共用一个事件变量呢?
点赞  2008-7-16 11:32
获取系统事件,并进行处理,不是在背光驱动里做的,而是系统层做的。
系统层获取了触摸屏点击事件,或者键盘输入事件,就会向背光驱动发出OPEN的控制指令,背光驱动就会按照指令打开背光。

这个操作流程别弄错。所有的驱动都只是向应用层提供事件信息,以及按照应用层的命令来动作,而不会直接向其他驱动提供任何信息,也不会直接被其他驱动所控制。
点赞  2008-7-16 15:15
shuiyan. 请教系统层是指哪个? 是在应用程序里面做的吗? 那我还的做一个应用程序时刻监视是否有定时/触摸/按键事件? 再调用背光驱动关掉/打开背光吗? 现在问题是背光驱动在定时到后关掉背光后.无论如何也无法打开背光. 也就是系统不向背光驱动发出OPEN的控制指令
点赞  2008-7-17 16:19
正在做这个东西,哈哈。有较大的收获。
点赞  2009-3-7 10:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复