📄 backlight.c
字号:
///////////////////////////////////////////////////
#include <windows.h>
#include <types.h>
#include <s3c2450.h>
#include <bsp_cfg.h>
#include "BackLight.h"
static HANDLE gPendownEvent = NULL; // 触摸驱动发送
static HANDLE gBLCEvent = NULL; // 控制面板和电池驱动发送
static HANDLE gEnableBacklightAutoChangeEvent = NULL;
static HANDLE gDisableBacklightAutoChangeEvent = NULL;
static int bltbrightness;
static PBACKLIGHTDEVICE g_pBltDev;
static DWORD g_dwPwdr;
#define SEUIC_BACKLIGHT_PWM
#define SEUIC_AUTOSHUTDOWN
#define IS_CHARGING TRUE
#define BLT 0
/*************************************************************************************
// 从控制面板得到已有的背光设置.正确则存入pBltDev中,返回TRUE;否则返回FALSE
**************************************************************************************/
static BOOL GetRegSettings(PBACKLIGHTDEVICE pBltDev)
{
HKEY hKey;
DWORD bright, interAC, interBT;
DWORD briSize, interSize;
LONG briError, interError;
BOOL ret = FALSE;
BOOL UseBattery, UseExt;
DWORD BacklightOri;
LONG ubSize, ueSize;
LONG ubError, ueError;
briError = RegOpenKeyEx(HKEY_CURRENT_USER, BACKLIGHT_REG_PATH, 0, KEY_READ, &hKey);
if (briError == ERROR_SUCCESS)
{
briSize = sizeof (bright);
interSize = sizeof (interAC);
ubSize = sizeof (UseBattery);
ueSize = sizeof (UseExt);
pBltDev->BacklightOri = TRUE;
briError = RegQueryValueEx(hKey, BACKLIGHT_ORI, NULL, NULL, (LPBYTE)&BacklightOri, &briSize);
if (briError == ERROR_SUCCESS)
{
if(BacklightOri == 1)
pBltDev->BacklightOri = FALSE;
}
RETAILMSG(BLT, (TEXT("pBltDev->BacklightOri = %d\r\n"), pBltDev->BacklightOri));
briError = RegQueryValueEx(hKey, RV_BACKLIGHT_BRIGHTNESS, NULL, NULL, (LPBYTE)&bright, &briSize);
if (briError == ERROR_SUCCESS)
{
pBltDev->brightness = bright;
ret = TRUE;
}
interError = RegQueryValueEx(hKey, BACKLIGHT_INTERVAL_AC, NULL, NULL, (LPBYTE)&interAC, &interSize);
if (interError == ERROR_SUCCESS)
{
pBltDev->intervalAC = interAC;
ret = TRUE;
}
interError = RegQueryValueEx(hKey, BACKLIGHT_INTERVAL_BT, NULL, NULL, (LPBYTE)&interBT, &interSize);
if (interError == ERROR_SUCCESS)
{
pBltDev->intervalBT = interBT;
ret = TRUE;
}
ubError = RegQueryValueEx(hKey, RV_USEBATTERY, NULL, NULL, (LPBYTE)&UseBattery, &ubSize);
if (ubError == ERROR_SUCCESS)
{
pBltDev->UseBattery = UseBattery;
ret = TRUE;
}
else
{
pBltDev->UseBattery = TRUE;
}
ueError = RegQueryValueEx(hKey, RV_USEAC, NULL, NULL, (LPBYTE)&UseExt, &ueSize);
if (ueError == ERROR_SUCCESS)
{
pBltDev->UseExt = UseExt;
ret = TRUE;
}
else
{
pBltDev->UseExt = TRUE;
}
RegCloseKey(hKey);
}
return ret;
}
/*************************************************************************************
// ResetBacklightState
**************************************************************************************/
static void ResetBacklightState( PBACKLIGHTDEVICE pBltDev, BACKLIGHTSTATE newState )
{
long pwdr = pBltDev->brightness * MAX_PWM / MAX_SHORT ;
int duration = DEFDUTYON - DEFDUTYOFF;
RETAILMSG(BLT, (TEXT("ResetBacklightState !!!\r\n")));
g_pBltDev = (PBACKLIGHTDEVICE)LocalAlloc(LPTR, sizeof (BACKLIGHTDEVICE));
if (duration > 0)
{
if (pBltDev->BacklightOri)
{ pwdr = DEFDUTYOFF + pBltDev->brightness * duration / MAX_SHORT; }
else
{ pwdr = DEFDUTYOFF + (MAX_SHORT - pBltDev->brightness) * duration / MAX_SHORT; }
}
else if (duration < 0)
{
if (pBltDev->BacklightOri)
{ pwdr = DEFDUTYOFF - (MAX_SHORT - pBltDev->brightness) * (-duration) / MAX_SHORT; }
else
{ pwdr = DEFDUTYOFF - (pBltDev->brightness) * (-duration) / MAX_SHORT; }
}
if (pBltDev)
{
EnterCriticalSection(&(pBltDev->cs));
if (newState == LIGHT_ON)
{
RETAILMSG(BLT, (TEXT("Reset backlight state: TURN ON\r\n")));
pBltDev->v_pPWMRegs->TCNTB0 = MAX_PWM; //周期配置
pBltDev->v_pPWMRegs->TCMPB0 = DEFDUTYON; //亮
pBltDev->v_pPWMRegs->TCON |= 0x0A;
pBltDev->v_pPWMRegs->TCON &=(~0x2);
pBltDev->v_pPWMRegs->TCON |=0x1;
pBltDev->state = LIGHT_ON;
}
else if (newState == LIGHT_OFF)
{
RETAILMSG(BLT, (TEXT("Reset backlight state: TURN OFF\r\n")));
pBltDev->v_pPWMRegs->TCNTB0 = MAX_PWM;
pBltDev->v_pPWMRegs->TCMPB0 = DEFDUTYOFF;
pBltDev->v_pPWMRegs->TCON |= 0x0A;
pBltDev->v_pPWMRegs->TCON &=(~0x2);
pBltDev->v_pPWMRegs->TCON |=0x1;
pBltDev->state = LIGHT_OFF;
}
LeaveCriticalSection(&(pBltDev->cs));
}
RETAILMSG(BLT, (TEXT("ResetBacklightState over!!\r\n")));
}
/*************************************************************************************
// BacklightMonitorThreadProc线程
**************************************************************************************/
DWORD WINAPI BacklightMonitorThreadProc(LPVOID lpvParam)
{
PBACKLIGHTDEVICE pBltDev = NULL;
BOOL bEnableBacklightAutoChange;
UINT uelapse, oldelapse;//ms
HANDLE Handles[4];
DWORD ret;
pBltDev = (PBACKLIGHTDEVICE)lpvParam;
if (!pBltDev) return 0;
RETAILMSG(BLT, (TEXT("BacklightMonitorThreadProc Running \r\n")));
// 根据msdn,在其他驱动中使用“PenDownInBackLightOffEvent”创建的event将和这里的gPendownEvent
// 享有同一个event句柄,因此其他驱动可以set本event句柄,下面的gBLCEvent也一样
gPendownEvent = CreateEvent(NULL, FALSE, TRUE, TEXT("PenDownInBackLightOffEvent"));
Handles[0] = gPendownEvent;
gBLCEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("BackLightChangeEvent"));
Handles[1] = gBLCEvent;
gEnableBacklightAutoChangeEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("EnableBacklightAutoChangeEvent"));
Handles[2] = gEnableBacklightAutoChangeEvent;
gDisableBacklightAutoChangeEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("DisableBacklightAutoChangeEvent"));
Handles[3] = gDisableBacklightAutoChangeEvent;
if(IS_CHARGING)
{
if(pBltDev->UseExt)
{
uelapse = oldelapse = pBltDev->intervalAC * 1000; // 秒 -> 毫秒
}
else
{ uelapse = oldelapse = -1; }
}
else
{
if(pBltDev->UseBattery)
{
uelapse = oldelapse = pBltDev->intervalBT * 1000; // 秒 -> 毫秒
}
else
{ uelapse = oldelapse = -1; }
}
bEnableBacklightAutoChange = TRUE;
for( ; ; )
{
ret = WaitForMultipleObjects(4, (CONST HANDLE*)Handles, FALSE, uelapse);
switch (ret)
{
case (WAIT_OBJECT_0):
// 收到笔点击通知消息
RETAILMSG(BLT, (TEXT("Pen down, we have to reset backlight status\r\n")));
if (bEnableBacklightAutoChange == TRUE)
{
RETAILMSG(BLT, (TEXT("bEnableBacklightAutoChange enabled\r\n")));
if (pBltDev->state == LIGHT_OFF)
{
RETAILMSG(BLT, (TEXT("pBltDev->state == LIGHT_OFF\r\n")));
ResetBacklightState(pBltDev, LIGHT_ON);
}
// 重新开始计时
uelapse = oldelapse;
}
break;
case (WAIT_OBJECT_0 + 1):
RETAILMSG(BLT, (TEXT("there is a BackLightChangeEvent\r\n")));
// 注册表背光设置改变,重新读取
if (GetRegSettings(pBltDev))
{
if(IS_CHARGING)
{
if(pBltDev->UseExt)
{
uelapse = oldelapse = pBltDev->intervalAC * 1000; // 秒 -> 毫秒
}
else
{ uelapse = oldelapse = -1; }
}
else
{
if(pBltDev->UseBattery)
{
uelapse = oldelapse = pBltDev->intervalBT * 1000; // 秒 -> 毫秒
}
else
{ uelapse = oldelapse = -1; }
}
ResetBacklightState(pBltDev, LIGHT_ON);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -