⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 backlight.cpp

📁 freescale i.mx31 BSP CE5.0全部源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//  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 + -