• [转]WM/WINCE代码研读系列之Power Management(6)


    下面在对UpdateDeviceState(pds)做具体说明
    UpdateDeviceState
    {
         //获取当前设备的电源级别最大值(ceilingDx)和最小值(floorDx)
         GetNewDeviceStateInfo
         {
              1.对于newCeilingDx
              //首先每个系统电源状态都对应一个默认的所有设备的最大电源级别
              newCeilingDx = psps->defaultCeilingDx;
     
             //在链表gpCeilingDx里查找特定的一类设备的最大电源级别
              devId.pGuid = pds->pListHead->pGuid;
              devId.pszName = NULL;
              if((pdpr = PowerRestrictionFindList(pCeilingDxList,&devId,NULL))!= NULL)
              {
                      newCeilingDx = pdpr->devDx;
              }
     
             //在链表gpCeilingDx里寻找特定的某个设备的最大电源级别
              devId.pszName = pds->pszName;
              if((pdpr = PowerRestrictionFindList(pCeilingDxList,&devId,NULL)) != NULL)
              {
                    newCeilingDx = pdpr->devDx;
              }
     
              2.对于newFloorDx
              newFloorDx = D4;//先设置为最小电源级别D4
             //在链表gpFloorDx 里去查找某一类设备的最小电源级别
              devId.pszName = NULL;
              pdpr = pFloorDxList;
              while((pdpr = PowerRestrictionFindList(pdpr,&devId,NULL))!= NULL)
              {
                   if(pdpr->devDx < newFloorDx) != 0))
                       newFloorDx = pdpr->devDx;
                   pdpr = pdpr->pNext;
               }

             //在链表gpFloorDx里寻找在特定系统电源状态下的某一类设备的最小电源级别
              devId.pszName = NULL;
              pdpr = pFloorDxList;
              while((pdpr = PowerRestrictionFindList(pdpr,&devId,psps->pszName))!= NULL)
              {
                   if(pdpr->devDx < newFloorDx)
                       newFloorDx = pdpr->devDx;
                   pdpr = pdpr->pNext;
              }
     
             //在链表gpFloorDx 里去查找某个设备的最小电源级别
              devId.pszName = pds->pszName;
              pdpr = pFloorDxList;
              while((pdpr = PowerRestrictionFindList(pdpr,&devId,NULL))!= NULL)
              {
                   if(pdpr->devDx < newFloorDx)
                        newFloorDx = pdpr->devDx;
                   pdpr = pdpr->pNext;
              }

             //在链表gpFloorDx里寻找在特定系统电源状态下的某个设备的最小电源级别
              devId.pszName = pds->pszName;
              pdpr = pFloorDxList;
              while((pdpr = PowerRestrictionFindList(pdpr,&devId,psps->pszName)) != NULL) 
              {
                   if(pdpr->devDx < newFloorDx)
                        newFloorDx = pdpr->devDx;
                   pdpr = pdpr->pNext;
               }
          }
     
         //决定设备电源级别最终是什么
          GetNewDeviceDx
          {
              //如果setDx不是PwrDeviceUnspecified,则设备的最终电源级别就等于setDx。
               if(setDx != PwrDeviceUnspecified)
               {
                    newDx = setDx;
               }
               else{
                   //设备的最终电源级别由reqDx 来确定,但最终电源级别必须在最小值(floorDx)和最大值(ceilingDx)之间
                    newDx = reqDx;
                    if(newDx < ceilingDx)
                         newDx = ceilingDx;
                    if(floorDx < newDx)
                         newDx = floorDx;
               }
     
               //如果电源级别没有改变或是无效
               if(curDx == newDx || ! VALID_DX(newDx))
               {
                     newDx = PwrDeviceUnspecified;
                }
          }
     
          //调用各个驱动的IOCTL_POWER_SET去设置电源级别
          SetDevicePower
          {
                //根据设备支持电源级别的情况来重影射一下电源级别
                reqDx = MapDevicePowerState(newDx,pds->caps.DeviceDx);
     
               //如果要设置的电源级别与当前级别不一样就设置
               if(reqDx != pds->actualDx || pds->dwNumPending != 0 || fForceSet)
                    fDoSet = TRUE;
     
               //打开设备驱动并调用驱动的IOCTL_POWER_SET
               hDevice = pds->pInterface->pfnOpenDevice(pds);
               pds->pInterface->pfnRequestDevice(hDevice,IOCTL_POWER_SET,ppr,ppr == NULL?0:sizeof(*ppr),&reqDx,sizeof(reqDx),&dwBytesReturned);
     
              //如果Backlight 在D0和非D0状态下转换
               if(fOnToOther||fOtherToOn)
               {
                     if(!memcmp(pds->pszName,TEXT("bkl1"),sizeof(TCHAR)*4))
                     {
                           gBacklightMs = GetTickCount()-gBacklightMs;
                           if(fOnToOther)
                           {

                               //在日志里记录Backlight 开启的时间
                                gBacklightMsTotal += gBacklightMs;
                                PMSQM_Set(PMSQM_DATAID_POWER_BKL_TOTAL,gBacklightMsTotal);
                                PMSQM_Set(PMSQM_DATAID_POWER_BKL_ON,gBacklightMs);
                           }
                           else if(fOtherToOn) {
                               //在日志里记录Backlight 关闭的时间
                                PMSQM_Set(PMSQM_DATAID_POWER_BKL_OFF,gBacklightMs);
                            }
                            gBacklightMs = GetTickCount();
                      }
                }
           }
    }

  • 相关阅读:
    2017《Java技术》预备作业 计科1501 杨柳
    Java技术预备作业02 计科1501杨柳
    H2O.ai初步使用
    Vue.Js加入bootstrap及jquery,或加入其他插件vueresource,vuex等
    初次使用git上传代码(转)
    svg绘图工具raphael.js的使用
    EF6添加mysql的edmx实体时报错:无法生成模型:“System.Data.StrongTypingException: 表“TableDetails”中列“IsPrimaryKey”的值为 DBNull
    在window下搭建Vue.Js开发环境
    SQL Server: 索引碎片产生及修复
    Windows注册表(regedit.exe)
  • 原文地址:https://www.cnblogs.com/answer/p/1956262.html
Copyright © 2020-2023  润新知