WCE PPC 实现PDA电源/背光管理

WCE PPC 实现PDA电源/背光管理
一般的嵌入式项目通常采用sometimes offline的设计思想, 这样的设计必将有数据同步的功能, 然而数据同步时如果本地没有数据库,加之项目数据的复杂性和无线通讯的带宽等方面的制约, 常常使得同步时间非常漫长, 数据同步这样的操作往往又不能采用单独的线程在后台完成, 恰巧我正在开发的项目就是具备了这些特点.
         通过我们版本发布后对用户使用的调查发现, 同步失败的原因有一半以上是由于PDA在常时间闲置时会自动关闭电源, 以导致网络连接断开, 而由于用户对PDA的使用并不熟悉, 我们没理由要求用户到控制面板中去进行电源设置. 程序中解决掉电问题成为必然. 到微软查找了相关的资料找到了一些解决办法. 要防止PDA闲置时电源自动关闭,可以从两种角度去思考, 常规做法是更改WinCE配置, 也就是修改电源闲置关闭时间的注册表键值, 然后激发一个事件重新加载这些配置, 这样做存在一个恢复的问题, 当我们的工作(同步)完成后需要恢复用户原来的配置, 那么我们换一角度去思考, 既然WinCE允许设置自动关闭时间, 那么WinCE系统中必然存在一个线程在指定时间后挂起系统(关闭电源), 这个线程一定有一个定时器, 那么我们是否可以不断的刷新这个定时器,让永远到达不到用户设置的自动关闭时间呢? 事实证明这个思路是可行的.
        查阅相关资料可以知道在WinCE核心API库(coredll.dll)中存在一个函数SystemIdleTimerReset, 正是这个函数实现了系统自动挂起的定时功能.
系统在设置了自动关闭时间会调用这个函数开始记时, 这样我们只要在系统尚未达到关闭时间之前调用他就OK, 通过控制面板查看电源管理中的自动关闭设置发现, 最短关闭时间为一分钟.那么就是说只要我们每59秒调用一次SystemIdleTimerReset即可实现电源永不关闭. 有了思路就很简单了。

        这样我们只要在同步前调用DisableDeviceSleep方法,在同步后调用EnableDeviceSleep就OK了, 在也不用担心用户PDA电源自动关闭引起同步失败了.

       可是事情远比我们想象的要复杂, 大家都PDA的背光也会自动关闭, 你可以想象一用户在同步时候的情形, 他在等待漫长的同步过程时背光突然关闭了, 可是我们让他电源不断, 这时候他以为电源关闭了, 结果按下了电源键盘, 结果不用我说了吧.

      背光我们同样要处理, 是否也是有个线程作为背光定时器内, 答案是肯定的, 不过为了强调我们研究的技术性, 背光我用修改WinCE注册表方式搞定. 通过查阅资料我找到了这四个注册表键:

     [HKEY_CURRENT_USER/ControlPanel/Backlight/BatteryTimeout] 使用电池时PDA自动关闭背光时间

     [HKEY_CURRENT_USER/ControlPanel/Backlight/AcTimeout] 使用外接电源时PDA自动关闭背光时间

 

       我们要做就是修改这些键值, 然后激发一个能让这些新值生效的事件。 思路很简单,直接看代码了:


void CeSetBatBackLightTime( DWORD dwKeyValue )
{
    HKEY hOpenKey;
    DWORD lResult=0;
    TCHAR *keyName=L"ControlPanel//Backlight";
   
    lResult=RegOpenKeyEx(HKEY_CURRENT_USER,keyName,0,0,&hOpenKey);
    ASSERT(lResult==ERROR_SUCCESS);
   
    //设置时间
    TCHAR *dwKeyName1=L"BatteryTimeout";
    lResult=RegSetValueEx(hOpenKey,dwKeyName1,0,REG_DWORD,(BYTE*)&dwKeyValue,sizeof(dwKeyValue));
    ASSERT(lResult==ERROR_SUCCESS);

    HANDLE hEvent=CreateEvent(NULL,FALSE,FALSE,L"BackLightChangeEvent");
    if(hEvent){
        SetEvent(hEvent);
    }
}

void CeSetAcBackLightTime( DWORD dwKeyValue )
{
    HKEY hOpenKey;
    DWORD lResult=0;
    TCHAR *keyName=L"ControlPanel//Backlight";
   
    lResult=RegOpenKeyEx(HKEY_CURRENT_USER,keyName,0,0,&hOpenKey);
    ASSERT(lResult==ERROR_SUCCESS);
   
    //设置时间
    TCHAR *dwKeyName1=L"ACTimeout";
    lResult=RegSetValueEx(hOpenKey,dwKeyName1,0,REG_DWORD,(BYTE*)&dwKeyValue,sizeof(dwKeyValue));
    ASSERT(lResult==ERROR_SUCCESS);

    HANDLE hEvent=CreateEvent(NULL,FALSE,FALSE,L"BackLightChangeEvent");
    if(hEvent){
        SetEvent(hEvent);
    }
}

DWORD CeGetBatBackLightTime()
{
    HKEY hOpenKey;
    DWORD dwKeyValue;

    DWORD lResult=0;
    TCHAR *keyName=L"ControlPanel//Backlight";
   
    DWORD dwKeyValueType=0;
    DWORD dwKeyValueLength=sizeof(dwKeyValue);
   
    lResult=RegOpenKeyEx(HKEY_CURRENT_USER,keyName,0,0,&hOpenKey);
    ASSERT(lResult==ERROR_SUCCESS);
   
    TCHAR *dwKeyName=L"BatteryTimeout";
    lResult=RegQueryValueEx(hOpenKey,dwKeyName,NULL,&dwKeyValueType,(BYTE*)&dwKeyValue,&dwKeyValueLength);
    ASSERT(lResult==ERROR_SUCCESS);
   
    RegCloseKey(hOpenKey);
    return dwKeyValue;
}

DWORD CeGetAcBackLightTime()
{
    HKEY hOpenKey;
    DWORD dwKeyValue;

    DWORD lResult=0;
    TCHAR *keyName=L"ControlPanel//Backlight";
   
    DWORD dwKeyValueType=0;
    DWORD dwKeyValueLength=sizeof(dwKeyValue);
   
    lResult=RegOpenKeyEx(HKEY_CURRENT_USER,keyName,0,0,&hOpenKey);
    ASSERT(lResult==ERROR_SUCCESS);
   
    TCHAR *dwKeyName=L"ACTimeout";
    lResult=RegQueryValueEx(hOpenKey,dwKeyName,NULL,&dwKeyValueType,(BYTE*)&dwKeyValue,&dwKeyValueLength);
    ASSERT(lResult==ERROR_SUCCESS);
   
    RegCloseKey(hOpenKey);
    return dwKeyValue;
}

void CeEnableBackLightOper( BOOL enable )
{
    HKEY hOpenKey;
    DWORD lResult=0,dwKeyValue;
    (enable==TRUE)?(dwKeyValue=1):(dwKeyValue=0);

    TCHAR *keyName=L"ControlPanel//Backlight";
    lResult=RegOpenKeyEx(HKEY_CURRENT_USER,keyName,0,0,&hOpenKey);
    ASSERT(lResult==ERROR_SUCCESS);
   
    //设置时间
    TCHAR *dwKeyName1=L"BatteryTimeout";
    lResult=RegSetValueEx(hOpenKey,dwKeyName1,0,REG_DWORD,(BYTE*)&dwKeyValue,sizeof(dwKeyValue));
    ASSERT(lResult==ERROR_SUCCESS);
   
    TCHAR *dwKeyName2=L"ACTimeout";
    lResult=RegSetValueEx(hOpenKey,dwKeyName2,0,REG_DWORD,(BYTE*)&dwKeyValue,sizeof(dwKeyValue));
    ASSERT(lResult==ERROR_SUCCESS);
    RegCloseKey(hOpenKey);

    HANDLE hEvent=CreateEvent(NULL,FALSE,FALSE,L"BackLightChangeEvent");
    if(hEvent){
        SetEvent(hEvent);
    }
}

 

http://hi.baidu.com/kaikaiban/blog/item/6c007523dade47a24623e8d6.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值