int main() { printf("[LPMTd] :: Linux Power Management Tool v1.0\n"); signal(SIGTERM, signal_term); if(LoadConfig(CONFIG_FILE_PATH) || UPowerConnect() || FetchBacklightInfo() || FetchCpuInfo() || UpdatePowerState() || SetBacklight() || SetHDD_APM() || SetCpuFreq()) { printf("[LPMTd] :: Exit status (-1)\n"); return -1; } int new_pstate = WaitUPowerStateChange(); while(new_pstate >= 0) { if(new_pstate != GetPowerState()) { SetPowerState(new_pstate); if(SetBacklight() || SetHDD_APM() || SetCpuFreq()) { printf("[LPMTd] :: Exit status (-1)\n"); return -1; } } new_pstate = WaitUPowerStateChange(); } UPowerDisconnect(); ClearConfig(); printf("[LPMTd] :: Exit status (0)\n"); return 0; }
//*************************************************************************** // Function Name: PowerNotificationThread // // Purpose: listens for power change notifications // DWORD PowerNotificationThread(LPVOID pVoid) { // size of a POWER_BROADCAST message DWORD cbPowerMsgSize = sizeof POWER_BROADCAST + (MAX_PATH * sizeof TCHAR); // Initialize our MSGQUEUEOPTIONS structure MSGQUEUEOPTIONS mqo; mqo.dwSize = sizeof(MSGQUEUEOPTIONS); mqo.dwFlags = MSGQUEUE_NOPRECOMMIT; mqo.dwMaxMessages = 4; mqo.cbMaxMessage = cbPowerMsgSize; mqo.bReadAccess = TRUE; // Create a message queue to receive power notifications HANDLE hPowerMsgQ = CreateMsgQueue(NULL, &mqo); if (NULL == hPowerMsgQ) { RETAILMSG(1, (L"CreateMsgQueue failed: %x\n", GetLastError())); goto Error; } // Request power notifications HANDLE hPowerNotifications = RequestPowerNotifications(hPowerMsgQ, PBT_TRANSITION | PBT_RESUME | PBT_POWERINFOCHANGE); if (NULL == hPowerNotifications) { RETAILMSG(1, (L"RequestPowerNotifications failed: %x\n", GetLastError())); goto Error; } HANDLE rgHandles[2] = {0}; rgHandles[0] = hPowerMsgQ; rgHandles[1] = g_hEventShutDown; // Wait for a power notification or for the app to exit while(WaitForMultipleObjects(2, rgHandles, FALSE, INFINITE) == WAIT_OBJECT_0) { DWORD cbRead; DWORD dwFlags; POWER_BROADCAST *ppb = (POWER_BROADCAST*) new BYTE[cbPowerMsgSize]; // loop through in case there is more than 1 msg while(ReadMsgQueue(hPowerMsgQ, ppb, cbPowerMsgSize, &cbRead, 0, &dwFlags)) { switch (ppb->Message) { case PBT_TRANSITION: RETAILMSG(1,(L"Power Notification Message: PBT_TRANSITION\n")); RETAILMSG(1,(L"Flags: %lx", ppb->Flags)); RETAILMSG(1,(L"Length: %d", ppb->Length)); if (ppb->Length) { RETAILMSG(1,(L"SystemPowerState: %s\n", ppb->SystemPowerState)); } break; case PBT_RESUME: RETAILMSG(1,(L"Power Notification Message: PBT_RESUME\n")); break; case PBT_POWERINFOCHANGE: { RETAILMSG(1,(L"Power Notification Message: PBT_POWERINFOCHANGE\n")); // PBT_POWERINFOCHANGE message embeds a // POWER_BROADCAST_POWER_INFO structure into the // SystemPowerState field PPOWER_BROADCAST_POWER_INFO ppbpi = (PPOWER_BROADCAST_POWER_INFO) ppb->SystemPowerState; if (ppbpi) { RETAILMSG(1,(L"Length: %d", ppb->Length)); RETAILMSG(1,(L"BatteryLifeTime = %d\n",ppbpi->dwBatteryLifeTime)); RETAILMSG(1,(L"BatterFullLifeTime = %d\n", ppbpi->dwBatteryFullLifeTime)); RETAILMSG(1,(L"BackupBatteryLifeTime = %d\n", ppbpi->dwBackupBatteryLifeTime)); RETAILMSG(1,(L"BackupBatteryFullLifeTime = %d\n", ppbpi->dwBackupBatteryFullLifeTime)); RETAILMSG(1,(L"ACLineStatus = %d\n",ppbpi->bACLineStatus)); RETAILMSG(1,(L"BatteryFlag = %d\n",ppbpi->bBatteryFlag)); RETAILMSG(1,(L"BatteryLifePercent = %d\n", ppbpi->bBatteryLifePercent)); RETAILMSG(1,(L"BackupBatteryFlag = %d\n", ppbpi->bBackupBatteryFlag)); RETAILMSG(1,(L"BackupBatteryLifePercent = %d\n", ppbpi->bBackupBatteryLifePercent)); } break; } default: break; } UpdatePowerState(); } delete[] ppb; } Error: if (hPowerNotifications) StopPowerNotifications(hPowerNotifications); if (hPowerMsgQ) CloseMsgQueue(hPowerMsgQ); return NULL; }