bak_hw.cpp
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:7k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. //
  2. // Copyright (c) Microsoft Corporation.  All rights reserved.
  3. //
  4. //
  5. // Use of this source code is subject to the terms of the Microsoft end-user
  6. // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
  7. // If you did not accept the terms of the EULA, you are not authorized to use
  8. // this source code. For a copy of the EULA, please see the LICENSE.RTF on your
  9. // install media.
  10. //
  11. /*
  12. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  13. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  14. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  15. PARTICULAR PURPOSE.
  16. */
  17. #include <windows.h>
  18. #include <nkintr.h>
  19. #include <pm.h>
  20. #include "s2440.h"
  21. #include <nkintr.h>
  22. #include "oalintr.h"
  23. #include "drv_glob.h"
  24. #include "pmplatform.h"
  25. #include "bak_hw.h"
  26. //  Globals
  27. const TCHAR szevtBacklightChange[] = TEXT("BackLightChangeEvent");
  28. const TCHAR szevtPowerChanged[] = TEXT("PowerChangedEvent");
  29. const TCHAR szevtUserInput[] = TEXT("UserInputEvent");
  30. const TCHAR szregRootKey[] = TEXT("ControlPanel\Backlight");
  31. const TCHAR szregBatteryTimeout[] = TEXT("BatteryTimeout");
  32. const TCHAR szregACTimeout[] = TEXT("ACTimeout");
  33. const TCHAR szregBatteryAuto[] = TEXT("BacklightOnTap");
  34. const TCHAR szregACAuto[] = TEXT("ACBacklightOnTap");
  35. HANDLE   g_evtSignal[NUM_EVENTS];
  36. //  Global structure
  37. BLStruct g_BLInfo;
  38. //
  39. // Perform all one-time initialization of the backlight
  40. //
  41. BOOL 
  42. BacklightInitialize()
  43. {
  44.     BOOL    bRet = TRUE;
  45.     RETAILMSG(1, (TEXT("BacklightInitializern")));
  46. BL_PowerOn(TRUE);
  47.     return bRet;
  48. }
  49. //  Utility function to read from registry for the parameters
  50. void BL_ReadRegistry(BLStruct *pBLInfo)
  51. {
  52.     HKEY    hKey;
  53.     LONG    lResult;
  54.     DWORD   dwType;
  55.     DWORD   dwVal;
  56.     DWORD   dwLen;
  57.     lResult = RegOpenKeyEx(HKEY_CURRENT_USER, szregRootKey, 0, KEY_ALL_ACCESS, &hKey);
  58.     if(ERROR_SUCCESS == lResult) {
  59.         dwType = REG_DWORD;
  60.         dwLen = sizeof(DWORD);
  61.         lResult = RegQueryValueEx(hKey, szregBatteryTimeout, NULL, &dwType, 
  62.                                   (LPBYTE)&dwVal, &dwLen);
  63.         if(ERROR_SUCCESS == lResult) {
  64.             pBLInfo->m_dwBatteryTimeout = dwVal;
  65.         }
  66.         lResult = RegQueryValueEx(hKey, szregACTimeout, NULL, &dwType, (LPBYTE)&dwVal,
  67.                                   &dwLen);
  68.         if(ERROR_SUCCESS == lResult) {
  69.             pBLInfo->m_dwACTimeout = dwVal;
  70.         }
  71.         lResult = RegQueryValueEx(hKey, szregBatteryAuto, NULL, &dwType, (LPBYTE)&dwVal,
  72.                                   &dwLen);
  73.         if(ERROR_SUCCESS == lResult) {
  74.             pBLInfo->m_bBatteryAuto = (BOOL) dwVal;
  75.         }
  76.         lResult = RegQueryValueEx(hKey, szregACAuto, NULL, &dwType, (LPBYTE)&dwVal,
  77.                                   &dwLen);
  78.         if(ERROR_SUCCESS == lResult) {
  79.             pBLInfo->m_bACAuto = (BOOL) dwVal;
  80.         }
  81.         RegCloseKey(hKey);
  82.     }
  83.     else {
  84.         RETAILMSG(1, (TEXT("BAK : HKEY_CURRENT_USER\%s key doesn't exist!rn"), szregRootKey));
  85.     }
  86. }
  87. // uninitialize the backlight
  88. void BL_Deinit()
  89. {
  90.     int i;
  91. RETAILMSG(1, (TEXT("BAK : BL_Deinit!rn")));
  92.     //  Clean up
  93.     for(i=0; i<NUM_EVENTS; i++) {
  94.         if(g_evtSignal[i]) {
  95.             CloseHandle(g_evtSignal[i]);
  96.         }
  97.     }
  98. }
  99. //
  100. // initialize the backlight
  101. //
  102. BOOL BL_Init()
  103. {
  104.     //  Set up all the events we need. 
  105.     g_evtSignal[0] = CreateEvent(NULL, FALSE, FALSE, szevtBacklightChange);
  106.     g_evtSignal[1] = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
  107.     g_evtSignal[BL_POWEREVT] = CreateEvent(NULL, FALSE, FALSE, szevtPowerChanged);
  108.     if(!g_evtSignal[0] || !g_evtSignal[1] || !g_evtSignal[2]) {
  109.         BL_Deinit();
  110.         return FALSE;
  111.     }
  112.     return TRUE;
  113. }
  114. //
  115. //  find out if AC power is plugged in
  116. //
  117. BOOL IsACOn()
  118. {
  119. //    if (g_pDriverGlobals->power.ACLineStatus == AC_LINE_ONLINE)
  120. // return TRUE;
  121. //    else
  122. return FALSE;
  123. }
  124. //
  125. // turn on/off the backlight
  126. //
  127. void BL_On(BOOL bOn)
  128. {
  129.     if(bOn) {
  130. if (g_BLInfo.m_dwStatus != BL_ON)
  131. {
  132. g_BLInfo.m_dwStatus = BL_ON;
  133. RETAILMSG(1,(TEXT("!!!!!!!!!!!! BACKLIGHT ON !!!!!!!!!!!!rn")));
  134. }
  135.     }
  136.     else {
  137. if (g_BLInfo.m_dwStatus != BL_OFF)
  138. {
  139. g_BLInfo.m_dwStatus = BL_OFF;
  140. RETAILMSG(1,(TEXT("!!!!!!!!!!!! BACKLIGHT OFF !!!!!!!!!!!!rn")));
  141. }
  142.     }
  143. }
  144. //
  145. // restore power to the backlight
  146. //
  147. void BL_PowerOn(BOOL bInit)
  148. {
  149.     //
  150.     //  Add power-on GPIO register setting
  151.     //
  152.     BL_On(TRUE);
  153. }
  154. // The backlight handling is done by a thread, which monitors those 
  155. // three event and performs some actions based on the parameters specified
  156. // in HKLM/ControlPanel/Backlight
  157. //
  158. // backlight service thread
  159. //
  160. DWORD BL_MonitorThread(PVOID pParms)
  161. {
  162.     DWORD   dwResult;
  163.     DWORD   dwTimeout;
  164.     
  165.     //  Initialization stuff is here
  166.     //
  167.     //  Initialize the events
  168.     //  Initialize the BLInfo data structure
  169.     //  Those are default values. Modify them if necessary
  170.     g_BLInfo.m_bACAuto = TRUE;
  171.     g_BLInfo.m_bBatteryAuto = TRUE;
  172.     g_BLInfo.m_dwBatteryTimeout = 20;   // 20 Seconds
  173.     g_BLInfo.m_dwACTimeout = 60;       // 1 minutes
  174.     //  Now read from the registry to see what they say
  175.     BL_ReadRegistry(&g_BLInfo);
  176.     //  Initialize BL
  177.     if(!BL_Init()) {
  178.         RETAILMSG(1, (TEXT("BL_Init() Failed! Exit from BL_MonitorThread!rn")));
  179.         return 0;
  180.     }
  181.     while(1) {
  182. __try { 
  183. //  If we are using AC now, use m_dwACTimeout as the timeout
  184. //  otherwise, use m_dwBatteryTimeout
  185. if(IsACOn()) {
  186. dwTimeout = g_BLInfo.m_dwACTimeout * 1000;
  187. }
  188. else {
  189. dwTimeout = g_BLInfo.m_dwBatteryTimeout * 1000;
  190. }
  191. //  However, if user wants BL on all the time, we have to let him
  192. //  do that. Or if we come back here, and BL is off, we want to 
  193. //  put this thread to sleep until other event happens.
  194. if(dwTimeout == 0 || g_BLInfo.m_dwStatus == BL_OFF) {
  195. dwTimeout = INFINITE;
  196. }
  197. //  Now let's wait for either there is an update on registry, or
  198. //  there is user action on the device, or there is activity on
  199. //  AC power supply.
  200. dwResult = WaitForMultipleObjects(NUM_EVENTS, &g_evtSignal[0], FALSE, dwTimeout);
  201. //  If we are signaled by registry event
  202. if(WAIT_OBJECT_0 == dwResult) {
  203. //  All we need to do is to read from registry and update the tick count
  204. BL_ReadRegistry(&g_BLInfo);
  205. //  Always turn on the Backlight after a change to registry
  206. BL_On(TRUE);
  207. }
  208. else if(dwResult == WAIT_OBJECT_0+1) {
  209. //  User activity, depending on the situation, we may / may not update 
  210. //  the tick count
  211. if(IsACOn()) {
  212. if(g_BLInfo.m_bACAuto) {
  213. //  Turn on backlight
  214. BL_On(TRUE);
  215. }
  216. }
  217. else {
  218. if(g_BLInfo.m_bBatteryAuto) {
  219. BL_On(TRUE);
  220. }
  221. }  
  222. }
  223. else if(dwResult == WAIT_OBJECT_0+2) {
  224. //  When AC is plugged or un-plugged, we don't really need to do anything
  225. //  We continue the loop. The correct timeout value will be assigned at
  226. //  the top of the while loop.
  227. RETAILMSG(1, (TEXT("BackLight Thread: power changed!rn")));
  228. }
  229. else if(dwResult == WAIT_TIMEOUT) {
  230. //  Time out, let's turn the device off
  231. RETAILMSG(1, (TEXT("Timeout, turn off the backlight!rn")));
  232. BL_On(FALSE);
  233. }
  234. }
  235. __except(EXCEPTION_EXECUTE_HANDLER){
  236. // do nothing
  237. RETAILMSG(1, (TEXT("an exception is raised in BL_MonitorThread... rn")));
  238. }
  239. }
  240. }