📄 sbattif.c
字号:
}
if(gInterrupt == 0) return 0;
InterruptDone(SYSINTR_EDBG); // Acknowledge the GPIO8 interrupt
}
}
return 0;
}
int WINAPI PowerOffThreadProc(LPVOID pvParam)
{
HANDLE hEvents[4];
int flag = 0;
DWORD ret;
DWORD count;
RETAILMSG(1, (_T("Enter PowerOffThreadProc\r\n")));
hEvents[0] = CreateEvent(NULL, FALSE, FALSE, L"PowerOffEvent");
hEvents[1] = CreateEvent(NULL, FALSE, FALSE, L"PowerOffOKEvent");
hEvents[2] = CreateEvent(NULL, FALSE, FALSE, L"PowerOffCancelEvent");
hEvents[3] = CreateEvent(NULL, FALSE, FALSE, L"PowerOffUsbEvent");
while (1)
{
Sleep(1);
//接受START/POWER OFF菜单发出的消息
ret = WaitForSingleObject(hEvents[0],INFINITE);
if(ret == WAIT_OBJECT_0)//收到poweroff按下的消息
{
RETAILMSG(1, (_T("PowerOffEvent\r\n")));
if(!PM_ChargerDetected())
{
if(MessageBox(NULL,POWER_WARN,POWER_OFF_TITLE,MB_YESNO|MB_ICONWARNING) == IDYES)
{
count = 10;
while(count--)//避免图片被覆盖
{
ShowPicture();
Sleep(100);
}
SetEvent(hEvents[1]);//允许poweroff
count = 0x100000;
while(count--)//避免图片被覆盖
{
ShowPicture();
Sleep(100);
}
}
else
{
SetEvent(hEvents[2]);//取消
}
}
else
{
MessageBox( NULL, POWER_OFF_USB,POWER_OFF_TITLE, MB_OK|MB_ICONWARNING);
SetEvent(hEvents[3]);//USB
}
}
}
return 0;
}
void ShowPicture(void)
{
unsigned short* pFB = NULL;
FILE* fp = NULL;
//隐藏鼠标
SetCursorPos(479,271);
//framebuffer
pFB = (unsigned short *)(hw_map_io(PHYS_CLCD_BUFF_BASE, SCREEN_BYTES, 0));
if(pFB)
{
fp = fopen("\\Windows\\powerdown.bmp","rb");
if(fp)
{
fseek(fp,54,0);
fread(pFB,SCREEN_BYTES,1,fp);
fclose(fp);
}
else
{
RETAILMSG(1, (_T("can't find powerdown.bmp\r\n")));
}
}
}
int WINAPI ClockThreadProc(LPVOID pvParam)
{
SYSTEMTIME sysTime;
DWORD clock = *((DWORD*)pvParam);
DWORD clock1;
while(gClockFlag)
{
if(clock > 0)
{
GetSystemTime(&sysTime);
clock1 = sysTime.wSecond * 1000 + sysTime.wMilliseconds;
if(clock1 - clock > 2000)//ms
{
//关闭了3个中断源
InterruptMask(SYSINTR_EDBG,TRUE);
InterruptMask(SYSINTR_TOUCH,TRUE);
InterruptMask(SYSINTR_KBD,TRUE);
gInterrupt = 0;
RETAILMSG(SHOW_DEBUG, (_T("PowerKeyThreadProc:power off\r\n")));
// InterruptDisable(SYSINTR_EDBG);
ShowPicture();
Sleep(2000);
if(SetSystemPowerState(NULL,POWER_STATE_SUSPEND,POWER_FORCE ) != ERROR_SUCCESS )
{
RETAILMSG(SHOW_DEBUG, (_T("SetSystemPowerState Error!\r\n")));
}
}
}
}
return 0;
}
void SetToRegistry(DWORD *dwState1, DWORD *dwState2, LPCTSTR lpszRegKey,
LPCTSTR lpszRegValue1, LPCTSTR lpszRegValue2)
{
HKEY hKey;
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, lpszRegKey, 0, 0, &hKey))
{
RegSetValueEx(hKey, lpszRegValue1, 0, REG_DWORD, (LPBYTE)dwState1, sizeof(DWORD));
RegSetValueEx(hKey, lpszRegValue2, 0, REG_DWORD, (LPBYTE)dwState2, sizeof(DWORD));
RegCloseKey(hKey);
}
}
#define LOW_BACKLIGHT 4
#define HIGH_BACKLIGHT 14
int WINAPI MonBkLightThreadProc(LPVOID pvParam)
{
DWORD dwStatus;
HANDLE hEvents[3];
LPTSTR pszFname = _T("PMMON!MonThreadProc");
HKEY hKey1,hKey2;
LONG ret;
DWORD dwType;
DWORD dwValue;
DWORD dwSize;
DWORD lastValue;
UCHAR flag,BKL_flag;
HANDLE event1,event2;
RETAILMSG(SHOW_DEBUG, (TEXT("Enter MonBkLightThreadProc\r\n")));
// SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_IDLE);
lastValue = LOW_BACKLIGHT;
//背光最大
{
HKEY hKey;
DWORD dwState1,dwState2;
dwState1 = 9;
dwState2 = 4;
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, L"ControlPanel\\BackLight", 0, 0, &hKey))
{
RegSetValueEx(hKey, L"BattBacklightLevel", 0, REG_DWORD, (LPBYTE)(&dwState1), sizeof(DWORD));
RegSetValueEx(hKey, L"ACBacklightLevel", 0, REG_DWORD, (LPBYTE)(&dwState2), sizeof(DWORD));
RegCloseKey(hKey);
}
PM_BackLight(dwState1);
lastValue = dwState1;
}
flag = 0;
BKL_flag = 0;
hEvents[0] = CreateEvent(NULL, FALSE, FALSE, L"BklLevelChangeEvent");
hEvents[1] = CreateEvent(NULL, FALSE, FALSE, L"BackLightOff");
hEvents[2] = CreateEvent(NULL, FALSE, FALSE, L"PowerLow");
while (1)
{
Sleep(1);
RETAILMSG(SHOW_DEBUG, (TEXT("MonThreadProc:BklLevelChangeEvent\r\n")));
dwStatus = WaitForMultipleObjects(3, &hEvents[0], FALSE, INFINITE);
if(dwStatus == WAIT_OBJECT_0)
{
//读注册表确定背光等级
ret = RegOpenKeyEx((HKEY)HKEY_CURRENT_USER ,L"ControlPanel",0,0,&hKey1);
if(ret == ERROR_SUCCESS)
{
ret = RegOpenKeyEx(hKey1 ,L"Backlight",0,0,&hKey2);
if(ret == ERROR_SUCCESS)
{
dwSize = sizeof(dwValue);
ret = RegQueryValueEx(hKey2, L"BacklightLevel", NULL, &dwType, (LPBYTE) &dwValue, &dwSize);
if(ret == ERROR_SUCCESS && dwType == REG_DWORD)
{
RETAILMSG(SHOW_DEBUG, (TEXT("MonBkLightThreadProc:BacklightLevel:%d\r\n"),dwValue));
switch(dwValue)
{
case 0://关背光
event1 = CreateEvent(NULL, FALSE, FALSE, L"BklCloseEvent");
SetEvent(event1);
event2 = CreateEvent(NULL, FALSE, FALSE, L"NoBklCloseEvent");
if(event1 && event2)
{
if(WaitForSingleObject(event2, 1000) != WAIT_OBJECT_0)
{
PM_BackLight(0);
flag = 1;
}
}
break;
case 4:// 开背光
if(flag)
{
PM_BackLight(lastValue);
flag = 0;
continue;
}
break;
default:
break;
}
//背光等级
if(dwValue >= LOW_BACKLIGHT && dwValue <= HIGH_BACKLIGHT)
{
PM_BackLight(dwValue);
lastValue = dwValue;
}
}
}
RegCloseKey(hKey1);
RegCloseKey(hKey2);
}
}
if(dwStatus == WAIT_OBJECT_0+1)
{
if(BKL_flag == 0)
{
PM_BackLight(0);
BKL_flag = 1;
}
else
{
PM_BackLight(lastValue);
BKL_flag = 0;
}
}
if(dwStatus == WAIT_OBJECT_0+2)
{
MessageBox(NULL,LOW_POWER_WARN,LOW_POWER_TITLE,MB_OK | MB_ICONWARNING);
}
}
return 0;
}
int WINAPI LowQAccThreadProc(LPVOID pvParam)
{
unsigned short* pFB = NULL;
FILE* fp = NULL;
Sleep(60000);
while(!PM_ChargerDetected())
{
Sleep(1);
RETAILMSG(SHOW_DEBUG, (_T("LowQAccThreadProc:power off\r\n")));
ShowPicture();
Sleep(2000);
if(SetSystemPowerState(NULL,POWER_STATE_SUSPEND,POWER_FORCE ) != ERROR_SUCCESS )
{
RETAILMSG(SHOW_DEBUG, (_T("SetSystemPowerState Error!\r\n")));
}
}
CloseHandle(ghLowQAccThread);
return 0;
}
void LoadQAcc(void)
{
UCHAR buff[10] = {0};
UCHAR flag = true;
UCHAR i;
UCHAR sum;
DWORD temp;
//ReadQaccFromNorFlash(buff);
FLA_Read(0,buff,8);
// head1 head2 data length
if(buff[0] != 0x55 || buff[1] != 0xaa || buff[2] != 4)
{
RETAILMSG(SHOW_DEBUG, (L"buff[0] = %x buff[1] = %x buff[2] = %x\r\n",buff[0],buff[1],buff[2]));
flag = false;
}
else
{
sum = 0;
for(i = 0;i < buff[2]+3; i++)
{
sum += buff[i];
}
if(sum != buff[buff[2]+3])
{
RETAILMSG(SHOW_DEBUG, (L"sum = %x buff[buff[2]+3] = %x\r\n",sum,buff[buff[2]+3]));
flag = false;
}
}
// temp = (DWORD)buff[3]+(((DWORD)buff[4])<<8)+(((DWORD)buff[5])<<16)+(((DWORD)buff[6])<<24);
temp = *((DWORD*)(buff+3));
if(!flag)
{
g_currentQ = TOO_LOWQ;
}
else
{
g_currentQ = temp;
}
RETAILMSG(SHOW_DEBUG,(L"flag:%d LoadQAcc g_currentQ:%d\r\n",flag,g_currentQ));
}
void SaveQAcc(void)
{
UCHAR buff[10] = {0};
UCHAR i;
RETAILMSG(SHOW_DEBUG,(L"SaveQAcc g_currentQ:%d\r\n",g_currentQ));
buff[0] = 0x55;
buff[1] = 0xaa;
buff[2] = 0x04;
#if 0
buff[3] = (UCHAR)g_currentQ;
buff[4] = (UCHAR)(g_currentQ>>8);
buff[5] = (UCHAR)(g_currentQ>>16);
buff[6] = (UCHAR)(g_currentQ>>24);
#endif
*((DWORD*)(buff+3)) = g_currentQ;
for(i = 0;i < buff[2] + 3;i++)
{
buff[buff[2] + 3] += buff[i];
}
RETAILMSG(SHOW_DEBUG,(L"SaveQAcc buff:%x,%x,%x,%x,%x,%x,%x,%x\r\n",buff[0],buff[1],buff[2],buff[3],buff[4],buff[5],buff[6],buff[7]));
//WriteQaccFromNorFlash(buff);
FLA_Write(0,buff,8);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -