📄 led_service.cpp
字号:
/// \file LED_Service.cpp///------------------------------------------------------------------------------////// Copyright (c)(2002-2005) TechFaith Corporation. All rights reserved.//////------------------------------------------------------------------------------////// Associate Phone's some state with the LED/////------------------------------------------------------------------------------// Revision History//// Date Author Activity ID Activity Headline// 2006-08-28 huyanli CEDB200001042 merge new code from peak// 2006-08-28 shiweigang CEDB200013207 Modify LED status for Pean_V1.02// 2006-10-09 linxiuping CEDB200016326 Modify LED 功能与微软设置不统一bug// 2006-10-12 zhangxingcai CEDB200010149 modify the bug// 2006-10-21 zhangxingcai CEDB200022873 LED flash YELLOW when Btooth or Wifi // 2006-10-25 zhangxingcai CEDB200025785 Remove the Bluetooth led flash code// 2006-11-22 zhangxingcai CEDB200031306 fix the bug of send message to ongself//------------------------------------------------------------------------------#include <windows.h>#include <stdio.h>#include <commctrl.h>#include <snapi.h>#include <Regext.h>#include <Winioctl.h>#include "Nled.h"#include <Mmsystem.h>#define LED_SERVICE_API __declspec(dllexport)//------------------------------------------------------------------------------// Function Prototype//------------------------------------------------------------------------------// Local Variable Definition// Following three macro are also defined in batt_pdd.cpp// Copy them here only to make the file independent relatively#define SN_POWERBATTERYACLINE_ROOT HKEY_LOCAL_MACHINE#define SN_POWERBATTERYACLINE_PATH TEXT("System\\State\\Battery")#define SN_POWERBATTERYACLINE_VALUE TEXT("ACLine")#define AC_LINE_ONLINE 0x01#define BATTERY_FLAG_CHARGE 0x02#define LED_OURSTATEMACHINE TEXT("LED_OURSTATEMACHINE")#define SN_NOTIFICATIONACTIVE_ROOT HKEY_LOCAL_MACHINE#define SN_NOTIFICATIONACTIVE_PATH TEXT("System\\State\\Shell\\Notifications\\Active")#define SN_NOTIFICATIONACTIVE_VALUE TEXT("ID")#define SN_NOTIFICATIONACTIVE_CLSIDVALUE TEXT("CLSID")#define SN_CONTROLPANELNOTIFICATIONACTIVES_ROOT HKEY_CURRENT_USER#define SN_CONTROLPANELNOTIFICATIONACTIVES_OPTIONSVALUE TEXT("Options")#define SN_CONTROLPANELNOTIFICATIONACTIVES_LEDCOUNTVALUE TEXT("LedRefCount")#define SN_CONTROLPANELNOTIFICATIONACTIVES_BITMASK 4#define SN_CONTROLPANELNOTIFICATIONACTIVES_SMSPATH TEXT("ControlPanel\\Notifications\\{A877D65B-239C-47a7-9304-0D347F580408}")#define SN_CONTROLPANELNOTIFICATIONACTIVES_MISSCALLPATH TEXT("ControlPanel\\Notifications\\{A877D660-239C-47a7-9304-0D347F580408}")#define SN_CONTROLPANELNOTIFICATIONACTIVES_REMINDERSPATH TEXT("ControlPanel\\Notifications\\{15F11F90-8A5F-454c-89FC-BA9B7AAB0CAD}")#define SN_CONTROLPANELNOTIFICATIONACTIVES_BLUETOOTHPATH TEXT("ControlPanel\\Notifications\\{F55615D6-D29E-4db8-8C75-98125D1A7253}")#define SN_CONTROLPANELNOTIFICATIONACTIVES_WIFIPATH TEXT("ControlPanel\\Notifications\\{DDBD3B44-80B0-4b24-9DC4-839FEA6E559E}")#define SN_CONTROLPANELNOTIFICATIONACTIVES_DEFAULTPATH TEXT("ControlPanel\\Notifications\\Default")#define SN_CLOCK_ALARMPATH TEXT("Software\\Microsoft\\Clock\\0")#define SN_CLOCK_ALARMVALUE TEXT("AlarmNotFlags")#define SN_CLOCK_ALARMBITMASK 0x1e#define MAX_SIZE 128enum State { RED_BLINK = 0, RED_ON, GREEN_BLINK, BOTH_OFF, STATE_UNKNOWN};enum NotifType{ NotificationState = 0, ChargingState, PhoneState, LedcountState, MAX_NOTIF};static BOOL g_bHaveAlarmNotify = FALSE;static HREGNOTIFY g_hRegNotify[ MAX_NOTIF ] = {NULL};static DWORD g_dwMyState = BOTH_OFF;static UINT8 g_uStateToBeRecovered = 0;static HANDLE hThread = NULL;static BOOL g_bSendSMSFlag = FALSE;HANDLE g_hMessage = NULL;HANDLE hVIB = NULL;enum Signal { NULL_SIG = 0, NOTIFY_ON_SIG, NOTIFY_OFF_SIG, CHARGING_SIG, CHARGER_UNPLUGGED_SIG, CHARGE_DONE_SIG, NETREGISTER_ON_SIG, NETREGISTER_OFF_SIG};enum LED_Color{ LED_RED = 1, LED_GREEN};// End of Local Variable Definition#ifdef _LED_WRITELOG_void Led_WriteLog( const char *pString){ FILE *fStream = NULL; char *chFilename = "\\My Documents\\ledlog.txt"; fStream = fopen(chFilename, "a"); fputs(pString, fStream); fclose(fStream);}#elsevoid Led_WriteLog( const char *string, DWORD dword ){}#endif/******************************************************************************** Function : LEDFlick This Function only enlight and put off the LED, no judgement Param : LEDColor which LED should be manipulated, 1 for RED and 2 for GREEN, if 0, vibrate Param : OnOffBlink 0 expresses put off , 1 for enlight Return Value : None*********************************************************************************/void LEDFlick(UINT uLEDColor, INT iOnOffBlink){ NLED_SETTINGS_INFO sInBuf; memset(&sInBuf, 0, sizeof(NLED_SETTINGS_INFO)); sInBuf.LedNum = uLEDColor; sInBuf.OffOnBlink = iOnOffBlink; SetEvent(g_hMessage); if (!(DeviceIoControl( hVIB, IOCTL_NLED_SETDEVICE, &sInBuf, sizeof(NLED_SETTINGS_INFO), NULL, 0, NULL, NULL))) { RETAILMSG(TRUE, (L"LED_Service.dll DeviceIoControl fail,GetLastError = 0x%08x\n", GetLastError ())); }}/******************************************************************************** Function : FindStateToRecover Find the recovered state Param : uStateToRecover State stored value Return Value : UINT8 State to be recovered*********************************************************************************/UINT8 FindStateToRecover(UINT8 uStateToRecover){ UINT8 uCounter = 0; for (uCounter = 0; uCounter < 8; uCounter++) { if (uStateToRecover & (1 << uCounter)) { break; } } return uCounter;}/******************************************************************************** Function : Tran2State Set the LED state Param : uState State to be setted Return Value : none*********************************************************************************/void Tran2State(UINT8 uState){ switch (uState) { case RED_BLINK: LEDFlick(LED_GREEN, 0); LEDFlick(LED_RED, 2); break; case RED_ON: LEDFlick(LED_GREEN, 0); LEDFlick(LED_RED, 1); break; case GREEN_BLINK: LEDFlick(LED_RED, 0); LEDFlick(LED_GREEN, 2); break; case BOTH_OFF: LEDFlick(LED_RED, 0); LEDFlick(LED_GREEN, 0); break; default: break; } g_dwMyState = uState;}/******************************************************************************** Function : BothoffCase Find the next state if prestate is BOTH_OFF Param : uMessage Signal state Return Value : none*********************************************************************************/void BothoffCase(UINT8 uMessage){ switch (uMessage) { case NOTIFY_ON_SIG: g_uStateToBeRecovered |= 1 << BOTH_OFF; Tran2State(RED_BLINK); break; case NOTIFY_OFF_SIG: break; case CHARGING_SIG: Tran2State(RED_ON); g_uStateToBeRecovered |= 1 << BOTH_OFF; break; case CHARGER_UNPLUGGED_SIG: break; case CHARGE_DONE_SIG: break; case NETREGISTER_ON_SIG: Tran2State(GREEN_BLINK); g_uStateToBeRecovered |= 1 << BOTH_OFF; break; case NETREGISTER_OFF_SIG: break; default: break; } }/******************************************************************************** Function : RedonCase Find the next state if prestate is RED_ON Param : uMessage Signal state Return Value : none*********************************************************************************/void RedonCase(UINT8 uMessage){ UINT8 uMessageTBR = 0; switch (uMessage) { case NOTIFY_ON_SIG: g_uStateToBeRecovered |= 1 << RED_ON; Tran2State(RED_BLINK); break; case NOTIFY_OFF_SIG: break; case CHARGING_SIG: break; case CHARGER_UNPLUGGED_SIG: g_uStateToBeRecovered &= ~(1 << RED_ON); if (g_uStateToBeRecovered != 0) { uMessageTBR = FindStateToRecover(g_uStateToBeRecovered); Tran2State(uMessageTBR); g_uStateToBeRecovered &= ~(1 << uMessageTBR); } else { Tran2State(BOTH_OFF); } break; case CHARGE_DONE_SIG: g_uStateToBeRecovered &= ~(1 << RED_ON); if (GREEN_BLINK == FindStateToRecover(g_uStateToBeRecovered)) { Tran2State(GREEN_BLINK); } else { Tran2State(BOTH_OFF); } break; case NETREGISTER_ON_SIG: g_uStateToBeRecovered |= 1 << GREEN_BLINK; break; case NETREGISTER_OFF_SIG: g_uStateToBeRecovered &= ~(1 << GREEN_BLINK); break; default: break; }}/******************************************************************************** Function : RedblinkCase Find the next state if prestate is RED_BLINK Param : uMessage Signal state Return Value : none*********************************************************************************/void RedblinkCase(UINT8 uMessage){ UINT8 uMessageTBR = 0; switch (uMessage) { case NOTIFY_ON_SIG: Tran2State(RED_BLINK); break; case NOTIFY_OFF_SIG: if (g_uStateToBeRecovered != 0) { uMessageTBR = FindStateToRecover(g_uStateToBeRecovered); Tran2State(uMessageTBR); g_uStateToBeRecovered &= ~(1 << uMessageTBR); } else { Tran2State(BOTH_OFF); } break; case CHARGING_SIG: g_uStateToBeRecovered |= 1 << RED_ON; break; case CHARGER_UNPLUGGED_SIG: g_uStateToBeRecovered &= ~(1 << RED_ON); break; case CHARGE_DONE_SIG: g_uStateToBeRecovered &= ~(1 << RED_ON); if (GREEN_BLINK == FindStateToRecover(g_uStateToBeRecovered)) { g_uStateToBeRecovered |= 1 << GREEN_BLINK; } if (BOTH_OFF == FindStateToRecover(g_uStateToBeRecovered)) { g_uStateToBeRecovered |= 1 << BOTH_OFF; } break; case NETREGISTER_ON_SIG: g_uStateToBeRecovered |= 1 << GREEN_BLINK; break; case NETREGISTER_OFF_SIG: g_uStateToBeRecovered &= ~(1 << GREEN_BLINK); break; default: break; }}/******************************************************************************** Function : GreenblinkCase Find the next state if prestate is GREEN_BLINK Param : uMessage Signal state Return Value : none*********************************************************************************/void GreenblinkCase(UINT8 uMessage){ switch(uMessage) { case NOTIFY_ON_SIG: g_uStateToBeRecovered |= 1 << GREEN_BLINK; Tran2State(RED_BLINK); break; case NOTIFY_OFF_SIG: break; case CHARGING_SIG: Tran2State(RED_ON); g_uStateToBeRecovered |= 1 << GREEN_BLINK; break; case CHARGER_UNPLUGGED_SIG: break; case CHARGE_DONE_SIG: break; case NETREGISTER_ON_SIG: break; case NETREGISTER_OFF_SIG: Tran2State(BOTH_OFF); g_uStateToBeRecovered &= ~(1 << GREEN_BLINK); break; default: break; }}/******************************************************************************** Function : Dispatch Handle signal for get the next state Param : uSignal Signal state Return Value : none*********************************************************************************/void Dispatch(UINT8 uSignal){ switch (g_dwMyState) { case BOTH_OFF: BothoffCase(uSignal); break; case RED_ON: RedonCase(uSignal); break; case RED_BLINK: RedblinkCase(uSignal); break; case GREEN_BLINK: GreenblinkCase(uSignal); break; default: break; }}/******************************************************************************** Function : OtherNotification Handle notification of SMS/WIFI/bluetooth/misscall Param : uPath Notification path Return Value : BOOL If flash is off return ture else return false*********************************************************************************/BOOL OtherNotification(const unsigned short uPath[66]){ DWORD dwOptions = 0; //get flash state if (S_OK == RegistryGetDWORD( SN_CONTROLPANELNOTIFICATIONACTIVES_ROOT, uPath, SN_CONTROLPANELNOTIFICATIONACTIVES_OPTIONSVALUE, &dwOptions)) { if ((dwOptions & SN_CONTROLPANELNOTIFICATIONACTIVES_BITMASK) != SN_CONTROLPANELNOTIFICATIONACTIVES_BITMASK) { if(SN_CONTROLPANELNOTIFICATIONACTIVES_SMSPATH == uPath) { if(g_bSendSMSFlag) { Tran2State(FindStateToRecover(g_uStateToBeRecovered)); g_bSendSMSFlag = FALSE; if (FindStateToRecover(g_uStateToBeRecovered)) { g_uStateToBeRecovered &= ~(1 << (FindStateToRecover(g_uStateToBeRecovered))); } } } return TRUE; } else { return FALSE; } } return FALSE;}/******************************************************************************** Function : AlarmNotification Handle alarm notification Param : NULL Return Value : BOOL If flash is off return ture else return false*********************************************************************************/BOOL AlarmNotification(void){ HKEY hkey = NULL; DWORD dwSize = sizeof(DWORD); DWORD dwLedflash = 0; //get flash state if (ERROR_SUCCESS == RegOpenKeyEx( SN_NOTIFICATIONACTIVE_ROOT, SN_CLOCK_ALARMPATH, 0, 0, &hkey)) { if (ERROR_SUCCESS == RegQueryValueEx( hkey, SN_CLOCK_ALARMVALUE, NULL, NULL, (BYTE *)&dwLedflash, &dwSize) ) { if (dwLedflash == SN_CLOCK_ALARMBITMASK) { RegCloseKey( hkey ); return TRUE; } else { RegCloseKey( hkey ); return FALSE; } } RegCloseKey( hkey ); } return FALSE;}/******************************************************************************** Function : LedCountCase Handle LedCount Case Param : NULL Return Value : BOOL Only for break*********************************************************************************/BOOL LedCountCase(void){ DWORD dwNotificationState = 0; HKEY hkey = NULL; DWORD dwSize = sizeof(DWORD); DWORD dwLedcount = 0; TCHAR szNotificationCLSID[MAX_SIZE] = { 0 } ; TCHAR szALARMCLSID[] = TEXT("{15F11F90-8A5F-454C-89FC-BA9B7AAB0CAD}"); TCHAR szBlueToothCLSID[] = TEXT("{F55615D6-D29E-4DB8-8C75-98125D1A7253}"); // Get the Ledcount state value. if (ERROR_SUCCESS == RegOpenKeyEx( SN_CONTROLPANELNOTIFICATIONACTIVES_ROOT, SN_CONTROLPANELNOTIFICATIONACTIVES_DEFAULTPATH, 0, 0, &hkey)) { if (ERROR_SUCCESS == RegQueryValueEx( hkey, SN_CONTROLPANELNOTIFICATIONACTIVES_LEDCOUNTVALUE, NULL, NULL ,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -