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

📄 gpiosvr.cpp

📁 wince下控制GPIO,用于高低电平控制 wince42.net xscale pxa225平台
💻 CPP
字号:
// GpioSvr.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "Winsock2.h"
#include "Pkfuncs.h"
#include "MsgNotify.h"
#include "VisableCall.h"
#include "ini.h"

extern "C" DWORD RequestSysIrq(DWORD DeviceIrq);
//void writebuginfo(WCHAR *p);
#define SYSIRQ_RING		0x49
#define SYSIRQ_SPRING	0x4a
#define INT_TIMEOUT		5000	//5秒钟一次,保证可以退出。
HANDLE	hHandleRing,hHandleSpring;
DWORD   gSysIntrRing = 0,gSysIntrSpring=0;
BOOL g_bRun=TRUE;
BOOL g_bSrpingEdge=FALSE; //要与ISR同步,初始为FALSE,表示低电平;
BOOL g_bRingEdge=FALSE; //要与ISR同步,初始为FALSE,表示低电平;
int g_nRingTickUp=0;
int gSocket=NULL;			//发送通知的UDP socket
struct sockaddr_in gTo;//接收通知的UDP socket地址
#define GPIO_PORT	8002//接收通知的UDP socket地址端口
#define GPIO_IP		"127.0.0.1"//接收通知的UDP socket IP地址
#define MSG_RING	4001
#define OVERTIMEOFRING	6 //second
UINT g_unTimerID=0;
int g_nSecTick=0;
//CWinThread *pThreadRing;
//CWinThread *pThreadSpring;
UINT ThreadRing( LPVOID pParam );
UINT ThreadSpring( LPVOID pParam );
UINT ThreadTImer( LPVOID pParam );
DWORD dwMainThreadID;
void SendMsgGpio(int ngpio,int nParam=0);
BOOL InitWinsock();
CVisableCall g_VisableCall;

void writebuginfo(const char* lpszFormat, ...);
unsigned short g_unBugPort=0;
char g_szBufIp[20]="";
#define GPIOBUG_FILENAME	"\\storage card\\log.ini"	//日志输出配置文件名称
#define GPIOBUG_SECTION	"GpioSvr"	
#define GPIOBUG_PORTITEM "Port"
#define GPIOBUG_IPITEM	"IpAddr"
int WINAPI WinMain(	HINSTANCE hInstance,
					HINSTANCE hPrevInstance,
					LPTSTR    lpCmdLine,
					int       nCmdShow)
{
	CIni ini;
		if(ini.Open(GPIOBUG_FILENAME))
		{
			g_unBugPort=ini.ReadInt(GPIOBUG_SECTION,GPIOBUG_PORTITEM);
//			printf(" port=%d",g_unBugPort);
			char *p=ini.ReadText(GPIOBUG_SECTION,GPIOBUG_IPITEM);
			if(p !=NULL)
				strncpy(g_szBufIp,p,16);
	//		printf(" IP=%s",g_szBufIp);
			ini.Close();
		}
	dwMainThreadID=GetCurrentThreadId();
 	// TODO: Place code here.
	if(!InitWinsock())
	{
		MessageBox(NULL,L"Socket Error!",L"dbsvr",MB_OK);
		return -1;
	}
//	printf("gpio 001!");
	HANDLE hMutex=CreateMutex(NULL,FALSE,L"GPIOSERVER");
	if(hMutex ==NULL)
	{
		MessageBox(NULL,L"Create  mutex Error!",L"Gpio Server",MB_OK);
		return -1;
	}
//	printf("gpio 002!");
	if(GetLastError() ==ERROR_ALREADY_EXISTS)
	{
		CloseHandle(hMutex);
		MessageBox(NULL,L"Already exist!",L"Gpio Server",MB_OK);
		return -1;
	}
//	printf("gpio 003!");
	hHandleRing = CreateEvent(NULL,FALSE,FALSE,NULL);
	if( hHandleRing == NULL )
	{	
		MessageBox(NULL,L"Creat Event failure!",L"Gpio Server",MB_OK);
		goto ErrExit;
	}
	hHandleSpring = CreateEvent(NULL,FALSE,FALSE,NULL);
	if( hHandleRing == NULL )
	{	
		MessageBox(NULL,L"Creat Event failure!",L"Gpio Server!",MB_OK);
		goto ErrExit;
	}

//	printf("gpio 004!");
	// Register system interrupt SYSINTR_ADVOEM
	gSysIntrRing=RequestSysIrq(SYSIRQ_RING);
	gSysIntrSpring=RequestSysIrq(SYSIRQ_SPRING);
	
	// ensure this interrupt has been disabled
	InterruptDisable(gSysIntrRing);
	InterruptDisable(gSysIntrSpring);
//	printf("gpio 005!");

	// This initialization register an event and enable the interrupt
	if (!InterruptInitialize( gSysIntrRing, hHandleRing, NULL, 0) )
	{
		MessageBox(NULL,L"Init Interrupt failure!",L"Gpio Server!",MB_OK);
		goto ErrExit;
	}
	if (!InterruptInitialize( gSysIntrSpring, hHandleSpring, NULL, 0) )
	{
		InterruptDisable(gSysIntrRing);
		MessageBox(NULL,L"Init Interrupt failure!",L"Gpio Server!",MB_OK);
		goto ErrExit;
	}
	//pThreadRing =
//	printf("start gpio!");
		AfxBeginThread(ThreadRing,NULL);
//	pThreadSpring =
		AfxBeginThread(ThreadSpring,NULL);


		g_VisableCall.StartService(); //启动DO操作服务
	MSG msg;
#ifdef _USEBYLHL
	MessageBox(NULL,L"Gpio Server Running!",L"Gpio Server!",MB_OK);
#else
	writebuginfo("file:%s,running\n",__FILE__);
	do{
		Sleep(1000);
		if(g_nSecTick>0)
			g_nSecTick--;
		if(g_nSecTick ==1)
		{//超时
			g_nSecTick=0;
			writebuginfo("ring end!\n");
			SetVedioNotifyMsg(20,1);
		}
	}while(1);
#endif
//	while (GetMessage(&msg, NULL, 0, 0)) 
	{
	};
ErrExit:
	g_bRun=FALSE;
	return 0;
}
UINT ThreadRing( LPVOID pParam )
{
	DWORD dwStat;
	
	int nRingHightPlusWidth;
	{
		while(g_bRun)
		{
			RETAILMSG (1, (TEXT("Wait for ring Interrupt !!\r\n")));
			dwStat = WaitForSingleObject( hHandleRing, INT_TIMEOUT);
			if( WAIT_OBJECT_0 == dwStat )   
			{
				g_bRingEdge=!g_bRingEdge;
				if(g_bRingEdge)
				{//上升
					g_nRingTickUp=GetTickCount();
				//	printf("up:%d\r\n",g_nRingTickUp);
				}else
				{
					nRingHightPlusWidth=GetTickCount()-g_nRingTickUp;
				//	printf("down tm=%d\r\n",nRingHightPlusWidth);
					if(nRingHightPlusWidth>1000 && nRingHightPlusWidth< 2000)
					{
						writebuginfo("ring plus\n");
						SendMsgGpio(SYSIRQ_RING);
					}
				}
				RETAILMSG (1, (TEXT("Ring!\r\n")));
				InterruptDone(gSysIntrRing);
			}
		}
	}
	InterruptDisable(gSysIntrRing);
	return 0;

}
UINT ThreadSpring( LPVOID pParam )
{
	DWORD dwStat;
	{
		while(g_bRun)
		{
			RETAILMSG (1, (TEXT("Wait for spring Interrupt !!\r\n")));
			dwStat = WaitForSingleObject( hHandleSpring, INT_TIMEOUT);
			if( WAIT_OBJECT_0 == dwStat )   
			{//发送通知消息
				if(g_bSrpingEdge)
				RETAILMSG (1, (TEXT("Spring Up!\r\n")));
				else
				RETAILMSG (1, (TEXT("Spring Down!\r\n")));

				SendMsgGpio(SYSIRQ_SPRING,g_bSrpingEdge);
				g_bSrpingEdge=!g_bSrpingEdge;
				InterruptDone(gSysIntrSpring);
			}
		}
	}
	InterruptDisable(gSysIntrSpring);
	return 0;
}

/*
功能:发送GPIO中断到达通知
参数:
int ngpio -表明是通知哪个gpio到达
int nParam - 通知要携带的信息
返回:无
编写人:lhl
日期:20050303
*/
void SendMsgGpio(int ngpio,int nParam)
{
	char buf[100];
	memset(buf,0,100);
	switch(ngpio)
	{
	case SYSIRQ_RING:
		{
			sprintf(buf,"GPIO:ring,STATE:%d\r\n",nParam);
		//	sendto(gSocket,buf,strlen(buf),MSG_DONTROUTE,(struct sockaddr *)&gTo, sizeof(struct sockaddr_in));
//			printf(buf);
	//		printf("ring TimerID=%d,Tick=%d!",g_unTimerID,g_nSecTick);
			if(g_nSecTick ==0)
			{//新的呼叫
			//	printf("new ring!");
				writebuginfo("new ring!\n");
				g_nSecTick=OVERTIMEOFRING+1;
				SetNotifyMsg(mtNewVedio);
			}else
			{
				writebuginfo("++++ring!\n");
				g_nSecTick=OVERTIMEOFRING+1;
		//		g_nSecTick=0;//本次呼叫的后续震铃

			}
		}
		break;
	case SYSIRQ_SPRING:
		{
			sprintf(buf,"GPIO:spring,STATE:%d\n",nParam);
		//	sendto(gSocket,buf,strlen(buf),MSG_DONTROUTE,(struct sockaddr *)&gTo, sizeof(struct sockaddr_in));
//			printf(buf);
			writebuginfo("spring=%d\n",nParam);
			SetNotifyMsg(mtNotifyHandler,nParam);
		}
		break;
	default :
		break;
	}
}

BOOL InitWinsock()
{
	int Error;
	WORD VersionRequested;
	WSADATA WsaData;
	VersionRequested=MAKEWORD(2,2);
	Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
	if(Error!=0)
	{
//		WCHAR cwTemp[30];
	//	swprintf(cwTemp,L"Socket Startup err=%d \r\n",Error); 
//		writebuginfo(cwTemp);
		writebuginfo("file:%s,line:%d\n",__FILE__,__LINE__);
		return FALSE;
	}
	else
	{
		if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
		{
	//	WCHAR cwTemp[30];
	//	swprintf(cwTemp,L"Socket Ver =%d.%d \r\n",LOBYTE(WsaData.wVersion),HIBYTE(WsaData.wHighVersion)); 
//		writebuginfo(cwTemp);
		writebuginfo("file:%s,line:%d,Ver =%d.%d \n",__FILE__,__LINE__,LOBYTE(WsaData.wVersion),HIBYTE(WsaData.wHighVersion));
		//	WSACleanup();
		//	return FALSE;
		}
		
	}
	return TRUE;
}
/*
void writebuginfo(WCHAR *p)
{
#ifdef USEBYLHL
	FILE *pFile=_wfopen(L"\\Storage Card\\gpiobug.txt",L"a+");
	if(pFile != NULL)
	{
	//	CTime t=CTime::Get
		fwprintf(pFile,p,sizeof(WCHAR),wcslen(p));
		fwprintf(pFile,L"\r\n",sizeof(WCHAR),2);
		fclose(pFile);
	}
#endif
}
*/

/*
函数功能:使用UDP发送日志信息到目标主机
参数说明:pLog:日志信息字符串
返 回 值:无
*/
int g_nLogSocket = -1;
int g_bLogSockCreated = 0;
sockaddr_in g_LogAddr;

void writebuginfo(const char* lpszFormat, ...)
{
	if(!lpszFormat )
	return ;
#ifdef _USEBYLHL
	FILE *pFile=fopen("\\storage card\\gpiobug.txt","a+");
	if(pFile != NULL)
	{
	va_list argList;
		va_start(argList, lpszFormat);
	char szInfo[2024] = { 0 } ;
	vsprintf(szInfo, lpszFormat, argList);
	va_end(argList);
		fprintf(pFile,szInfo,sizeof(char),strlen(szInfo));
	//	fprintf(pFile,L"\r\n",sizeof(WCHAR),2);
		fclose(pFile);
	}
#else
		if(g_unBugPort==0 || strlen(g_szBufIp)<1)
		return ;

	//如果socket未创建,创建Log socket
	if(0 == g_bLogSockCreated)
	{
	g_nLogSocket = socket(AF_INET, SOCK_DGRAM, 0);
	if(g_nLogSocket <= 0)
	return ;

	g_bLogSockCreated = 1;

	//初始化日志接收地址
	g_LogAddr.sin_family = AF_INET;
	g_LogAddr.sin_port = htons(g_unBugPort);
	g_LogAddr.sin_addr.s_addr = inet_addr(g_szBufIp);
	}

	va_list argList;
		va_start(argList, lpszFormat);
	char szInfo[1024] = { 0 } ;
	vsprintf(szInfo, lpszFormat, argList);
	va_end(argList);

	int nRet = sendto(g_nLogSocket, szInfo, strlen(szInfo), 0, (SOCKADDR*)&g_LogAddr, sizeof(sockaddr_in));
	if(nRet <= 0)
	return ;
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -