📄 backlight.cpp
字号:
// FUNCTION: BKL_EventThread
//
// DESCRIPTION: THis is a thread to handle all events
// PARAMETERS:
//
// RETURNS:
//
//------------------------------------------------------------------------------
DWORD WINAPI BKL_EventThread(LPVOID lpParameter)
{
UCHAR buf[QUEUE_SIZE];
SYSTEM_POWER_STATUS_EX2 sps;
HANDLE hUserActivityEvent;
DWORD dwTimeout;
DWORD result;
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("BKL_InthThread !!\r\n")));
if (!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL))
{
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("PMAPI!CeSetThreadPriority ERROR:%d\n"), GetLastError()));
}
// Backup handle to user activity event.
hUserActivityEvent = hWaitList[bklUserActivityExistEvent];
dwTimeout = CalculateTimeout(&bklSettings);
while (fEventThreadLoop)
{
result = WaitForMultipleObjects(dim(hWaitList), hWaitList, FALSE, dwTimeout);
if (!fEventThreadLoop)
{
break;
}
switch (result)
{
case (WAIT_OBJECT_0 + bklControlPanelEvent): // EVENT COME FROM CONTROL PANEL
// GET backlight settings
GetBacklightTimeoutSettings(&bklSettings);
// Recalculate timeout by taking timeout value from registry
dwTimeout = CalculateTimeout(&bklSettings);
break;
case (WAIT_OBJECT_0 + bklPowerNotificationEvent):
DWORD dwSize;
DWORD dwStatus;
// Do not block on our message queue.
if(ReadMsgQueue(hMsgQ, &buf, QUEUE_SIZE, (LPDWORD)&dwSize, 0, &dwStatus))
{
GetSystemPowerStatusEx2(&sps, sizeof(sps), TRUE);
DEBUGMSG(TRUE, (_T("Line status is %s (0x%x)\r\n"),
sps.ACLineStatus == AC_LINE_ONLINE ? _T("AC") :
sps.ACLineStatus == AC_LINE_OFFLINE ? _T("Offline") :
sps.ACLineStatus == AC_LINE_BACKUP_POWER ? _T("Backup") :
sps.ACLineStatus == AC_LINE_UNKNOWN ? _T("Unknown") : _T("???"),
sps.ACLineStatus));
if (sps.ACLineStatus == AC_LINE_ONLINE)
{
if (fACOnline != TRUE)
{
fACOnline = TRUE;
BSPBacklightSetIntensity(bklSettings.dwACBacklightLevel);
}
}
else
{
if (fACOnline == TRUE)
{
fACOnline = FALSE;
BSPBacklightSetIntensity(bklSettings.dwBattBacklightLevel);
}
}
}
else
{
DEBUGMSG(1, (TEXT("ReadMsgQueue: ERROR:%d\n"), GetLastError()));
}
break;
case (WAIT_OBJECT_0 + bklUserActivityExistEvent):
BOOL fTurnOnBacklight;
if( (fACOnline && bklSettings.fACBacklightOnUser) ||
(!fACOnline && bklSettings.fBattBacklightOnUser) )
fTurnOnBacklight = TRUE;
else
fTurnOnBacklight = FALSE;
if (fTurnOnBacklight && (CurDx != D0))
{
DevicePowerNotify(szName, D0, POWER_NAME);
}
dwTimeout = CalculateTimeout(&bklSettings);
// The user activity event is an auto reset event used by power manager.
// Pulse the event so that power manager will get notified also.
// Make sure that bkl thread is not waiting on the event when pulsing it
// or a loop will take place.
hWaitList[bklUserActivityExistEvent] = hevDummy;
PulseEvent(hUserActivityEvent);
hWaitList[bklUserActivityExistEvent] = hUserActivityEvent;
break;
case (WAIT_OBJECT_0 + bklLevelChangeEvent):
// Event for change in backlight level
// Get backlight levels from registry
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("backlight batt level = %d\r\n"), bklSettings.dwBattBacklightLevel));
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("backlight ac level = %d\r\n"), bklSettings.dwACBacklightLevel));
GetBacklightLevelSettings(&bklSettings);
// Set backlight levels depending on currently on battery or AC.
if (fACOnline)
{
BSPBacklightSetIntensity(bklSettings.dwACBacklightLevel);
}
else
{
BSPBacklightSetIntensity(bklSettings.dwBattBacklightLevel);
}
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("new backlight batt level = %d\r\n"), bklSettings.dwBattBacklightLevel));
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("new backlight ac level = %d\r\n"), bklSettings.dwACBacklightLevel));
break;
case WAIT_TIMEOUT:
// Timeout. Request Power Manager to turn off backlight.
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("Timeout : BackLight Off\r\n")));
dwStatus = DevicePowerNotify(szName, D4, POWER_NAME);
if(dwStatus != ERROR_SUCCESS)
DEBUGMSG(BKL_ERROR_MSG, (_T("%s: DevicePowerNotify(D4) failed %d\r\n"), szName, dwStatus));
else
{
// Not need for inactivity timeout
dwTimeout = INFINITE;
}
break;
case WAIT_FAILED:
ERRORMSG(1, (TEXT("WAIT_FAILED!\r\n")));
break;
default:
break;
}
} // end while
return 0;
}
//------------------------------------------------------------------------------
//
// FUNCTION: BKL_IOControl
//
// DESCRIPTION:
// PARAMETERS:
//
// RETURNS:
//
//------------------------------------------------------------------------------
BOOL
BKL_IOControl(
DWORD dwContext,
DWORD Ioctl,
PUCHAR pInBuf,
DWORD InBufLen,
PUCHAR pOutBuf,
DWORD OutBufLen,
PDWORD pdwBytesTransferred
)
{
DWORD dwErr = ERROR_INVALID_PARAMETER;
BOOL bRc = FALSE;
#ifdef DEBUG
TCHAR szBuf[128];
LPTSTR pszFname;
// format the routine name
_stprintf(szBuf, TEXT("BKL_IOControl(%08x)"), dwContext);
pszFname = szBuf;
#endif
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("%s: IOCTL:0x%x, InBuf:0x%x, InBufLen:%d, OutBuf:0x%x, OutBufLen:0x%x)\r\n"),
pszFname, Ioctl, pInBuf, InBufLen, pOutBuf, OutBufLen));
switch (Ioctl)
{
case IOCTL_POWER_CAPABILITIES:
// tell the power manager about ourselves.
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("%s: BKL_IOCTL_POWER_CAPABILITIES\r\n"), pszFname));
if ((pOutBuf != NULL) &&
(OutBufLen >= sizeof(POWER_CAPABILITIES)) &&
(pdwBytesTransferred != NULL))
{
PPOWER_CAPABILITIES ppc = (PPOWER_CAPABILITIES) pOutBuf;
memset(ppc, 0, sizeof(POWER_CAPABILITIES));
ppc->DeviceDx = 0x11; // support D0, D4
ppc->WakeFromDx = 0x00; // No wake capability
ppc->InrushDx = 0x00; // No in rush requirement
ppc->Power[D0] = 600; // 0.6W
ppc->Power[D1] = PwrDeviceUnspecified;
ppc->Power[D2] = PwrDeviceUnspecified;
ppc->Power[D3] = PwrDeviceUnspecified;
ppc->Power[D4] = 0;
ppc->Latency[D0] = 0;
ppc->Latency[D1] = PwrDeviceUnspecified;
ppc->Latency[D2] = PwrDeviceUnspecified;
ppc->Latency[D3] = PwrDeviceUnspecified;
ppc->Latency[D4] = 0;
ppc->Flags = 0;
*pdwBytesTransferred = sizeof(POWER_CAPABILITIES);
dwErr = ERROR_SUCCESS;
}
break;
case IOCTL_POWER_QUERY:
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("%s: BKL_IOCTL_POWER_QUERY\r\n"), pszFname));
if( pOutBuf != NULL &&
OutBufLen == sizeof(CEDEVICE_POWER_STATE) &&
pdwBytesTransferred != NULL)
{
CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE)pOutBuf;
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("NewDx = %d\r\n"), NewDx));
if(VALID_DX(NewDx))
{
// this is a valid Dx state so return a good status
*pdwBytesTransferred = sizeof(CEDEVICE_POWER_STATE);
dwErr = ERROR_SUCCESS;
}
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("%s: IOCTL_POWER_QUERY %u %s\r\n"), pszFname,
NewDx, dwErr == ERROR_SUCCESS ? TEXT("succeeded") : TEXT("failed")));
}
break;
case IOCTL_POWER_SET:
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("%s: BKL_IOCTL_POWER_SET\r\n"), pszFname));
if( pOutBuf != NULL &&
OutBufLen == sizeof(CEDEVICE_POWER_STATE) &&
pdwBytesTransferred != NULL)
{
CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE)pOutBuf;
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("NewDx = %d\r\n"), NewDx));
if(NewDx != CurDx)
{
if(NewDx == D0)
{
// TURN ON BACKLIGHT
if(fACOnline)
{
BSPBacklightSetIntensity(bklSettings.dwACBacklightLevel);
}
else
{
BSPBacklightSetIntensity(bklSettings.dwBattBacklightLevel);
}
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("BackLight ON\r\n")));
}
else
{
// if asked for a state we don't support, go to the next lower one
// which is D4
NewDx = D4;
BSPBacklightSetIntensity(0);
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("BackLight Off\r\n")));
}
EnterCriticalSection(&cs) ;
CurDx = NewDx;
LeaveCriticalSection(&cs);
*(PCEDEVICE_POWER_STATE)pOutBuf = CurDx;
}
*pdwBytesTransferred = sizeof(CEDEVICE_POWER_STATE);
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("CurDx = %d\r\n"), CurDx));
dwErr = ERROR_SUCCESS;
}
break;
case IOCTL_POWER_GET:
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("%s: BKL_IOCTL_POWER_GET\r\n"), pszFname));
if( pOutBuf != NULL &&
OutBufLen == sizeof(CEDEVICE_POWER_STATE) &&
pdwBytesTransferred != NULL)
{
// just return our CurrentDx value
*(PCEDEVICE_POWER_STATE)pOutBuf = CurDx;
*pdwBytesTransferred = sizeof(CEDEVICE_POWER_STATE);
dwErr = ERROR_SUCCESS;
}
break;
default:
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("%s: Unsupported IOCTL code %u\r\n"), pszFname, Ioctl));
dwErr = ERROR_NOT_SUPPORTED;
break;
}
// pass back appropriate response codes
SetLastError(dwErr);
if(dwErr != ERROR_SUCCESS)
bRc = FALSE;
else
bRc = TRUE;
return bRc;
}
//------------------------------------------------------------------------------
//
// FUNCTION: BKL_DllEntry
//
// DESCRIPTION:
// PARAMETERS:
//
// RETURNS:
//
//------------------------------------------------------------------------------
BOOL WINAPI BKL_DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGMSG(BKL_DEBUG_MSG, (TEXT("BKL_DllEntry: DLL_PROCESS_ATTACH\r\n")));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -