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

📄 led_service.cpp

📁 LED 驱动程序模块源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/// \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 + -