📄 gpiosvr.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 + -