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

📄 visablecall.cpp

📁 wince下控制GPIO,用于高低电平控制 wince42.net xscale pxa225平台
💻 CPP
字号:
// VisableCall.cpp: implementation of the CVisableCall class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "VisableCall.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

extern void writebuginfo(const char* lpszFormat, ...);

#define IOCTRL_GET_DO   0x1003
#define IOCTRL_SET_DO	0X1005
#define DO_OPEN_DOOR		0
#define DO_HUJIAO_SEND		0
#define DO_DAA				2
#define	DO_VISABLE_CHANNEL	3
#define	DO_VOLUM_CHANNEL	4	
#define	DO_VOLUM_CHANNEL2	5	
#define DO_MSG_STATE		6		//消息提示
#define DO_NODE_STATE		7		//节点状态

#define OP_VISABLECALL_OPEN_ERR -1
#define OP_VISABLECALL_BUSY_ERR -2
#define OP_DO_DRIVE_NO_OPEN		-3
#define OP_DO_WRITE_ERR			-4

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define PORT_SYNSERVER  6699

UINT ListenCmdServer (void* hSendWnd)
{
//		writebuginfo("file:%s,line:%d\n",__FILE__,__LINE__);
	CVisableCall* m_lvcp=(CVisableCall*)hSendWnd;
	struct sockaddr_in from_sin;
	int sze,res;
	unsigned char buf[1024];
	fd_set	readset;
	while(1)
	{
		int ret;
		FD_ZERO(&readset);
		FD_SET((unsigned int)m_lvcp->socket_listen_fd,&readset);

		res = select( m_lvcp->socket_listen_fd+1,&readset,NULL,NULL,NULL);
		if(res < 1)
		{
			buf[0]=-1;
			continue;
		}
		
		res=sizeof(struct sockaddr);
		sze=recvfrom( m_lvcp->socket_listen_fd,(char*)buf,1024,0,(struct sockaddr*)&from_sin,(int *)&res);
//		writebuginfo("socket_listen_fd=%d,recv size=%d\n",m_lvcp->socket_listen_fd,sze);
		if(sze<0)
		{
		writebuginfo("Do listen udp failure!\n");
			break;
		}

		if(sze<sizeof(struct cmmd_struct))
		{	
			writebuginfo("file:%s,line:%d\n",__FILE__,__LINE__);
			ret=-1;
			sendto( m_lvcp->socket_listen_fd,(char*)&ret,sizeof(int),0,(struct sockaddr*)&from_sin,sizeof(struct sockaddr));
			continue;
		}
		//判断标志位是否正确
//			writebuginfo("file:%s,line:%d\n",__FILE__,__LINE__);
	//	struct cmmd_struct newcmmd;
	//	memcpy((char*)&newcmmd,(char*)buf,sizeof(struct cmmd_struct));
		struct cmmd_struct *pNewCmmd=(struct cmmd_struct *)buf;
		//判断标志位是否正确
//		writebuginfo("before add\n");

		if(CVCALL_CMMD_FLAG!=pNewCmmd->nFlag)
			continue;
//		writebuginfo("before add1");
		m_lvcp->AddCmmd(*pNewCmmd,from_sin);
//		writebuginfo("after add");
		m_lvcp->m_dealCmdMessage.SetEvent();

		
	}
	return 0;
}

UINT ListenDealCmd (void* hSendWnd)
{
//		writebuginfo("file:%s,line:%d\n",__FILE__,__LINE__);
	CVisableCall* m_lvcp=(CVisableCall*)hSendWnd;
	struct cmmd_struct_list cmm_list;
	HANDLE han[1];
	int ret=9;

	while(1)
	{
		han[0]=m_lvcp->m_dealCmdMessage.m_hObject;
		DWORD dw=WaitForMultipleObjects(1,han,false,INFINITE);//3秒定时器
		if(dw==WAIT_TIMEOUT)
			continue;
		while(1)
		{
			if(m_lvcp->GetCmmdFromHead(&cmm_list)==-1)
				break;
			writebuginfo("comid=%d",cmm_list.cmm.cmm_id);

			switch(cmm_list.cmm.cmm_id)
			{
			case 0:
				ret=m_lvcp->DealOpenDoor();
				break;
			case 1:
				ret=m_lvcp->StartHuJiao();
				break;
			case 2:
				ret=m_lvcp->ChangVolumMode(0);
				break;
			case 3:
				ret=m_lvcp->ChangVolumMode(1);
				break;
			case 4:
				ret=m_lvcp->EndCallProcess();
				break;
			case 5://
				ret=m_lvcp->ChangViewChannel(1);
				break;
			case 6:
				ret=m_lvcp->ChangViewChannel(0);
				break;
			case 7:
				//ret=0;
				//sendto(m_lvcp->socket_listen_fd,(char*)&ret,sizeof(int),0,(struct sockaddr*)&cmm_list.tosin,sizeof(struct sockaddr));
				//Sleep(50);
				ret=m_lvcp->OpenDAA();
				//printf("---end --------\n");
				//continue;
				break;
			case 8:
				ret=m_lvcp->CloseDAA();
				//printf("---end --------\n");
				//continue;
				break;
				//添加node 和net 状态处理 lhl,20050613
			case 9://节点状态打开
				ret=m_lvcp->DOControl(DO_NODE_STATE,TRUE);
				break;
			case 10://节点状态关闭
				ret=m_lvcp->DOControl(DO_NODE_STATE,FALSE);
				break;
	//		case 11://网络状态打开
	//			ret=m_lvcp->DOControl(DO_MSG_STATE,TRUE);
	//			break;
	//		case 12://网络状态关闭	
	//			ret=m_lvcp->DOControl(DO_MSG_STATE,FALSE);
	//			break;
			case CVCALL_CMMD_MSG://设置状态灯
				writebuginfo("MsgState:Type=%d,State=%d\n",cmm_list.cmm.nParam1,cmm_list.cmm.nParam2);
				ret=m_lvcp->SetMsgState(cmm_list.cmm.nParam1,cmm_list.cmm.nParam2);
				break;
			default:
				ret=-1;
				continue;
			}            
			//sendto(m_lvcp->socket_listen_fd,(char*)&ret,sizeof(int),0,(struct sockaddr*)&cmm_list.tosin,sizeof(struct sockaddr));
		
		}
	}

}

CVisableCall::CVisableCall()
{
	m_nCurrentState=0;//0:空闲状态
					  //1:通话准备状态
					  //2:呼叫状态
					  //3:通话状态
	m_bVolumChannel=0;//0:免提
					  //1:手柄
	m_hDIOHandle=NULL;
	this->m_cmmd_list=NULL;
	memset(m_nMsgList,sizeof(int)*CVCALL_MSG_MAX,0);
	
}

CVisableCall::~CVisableCall()
{
	RemoveAllCmmd();
	this->close();
}

int CVisableCall::DealOpenDoor()
{
	int ret;
	if((ret=DOControl(DO_OPEN_DOOR,1))!=0)
		return ret;
	//需要延时一段时间处理
	::Sleep(3000);
	if((ret=DOControl(DO_OPEN_DOOR,0))!=0)
		return ret;
	return 0;
}

int CVisableCall::StartService()
{
//		writebuginfo("file:%s,line:%d\n",__FILE__,__LINE__);
	TCHAR szDioname[108];
	wsprintf(szDioname,TEXT("DIO1:"));

	// TODO: Add extra initialization here
	m_hDIOHandle=::CreateFile(szDioname,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(m_hDIOHandle==INVALID_HANDLE_VALUE)
	{
		m_hDIOHandle=NULL;
		writebuginfo("file:%s,line:%d\n",__FILE__,__LINE__);
		return OP_VISABLECALL_OPEN_ERR;
	}
	CloseDAA();
	ChangViewChannel(0);
	struct sockaddr_in sin;
    socket_listen_fd=socket(AF_INET,SOCK_DGRAM,0);

	memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
	sin.sin_port=htons(PORT_SYNSERVER);
	sin.sin_addr.s_addr=htonl(INADDR_ANY);

//		writebuginfo("file:%s,line:%d\n",__FILE__,__LINE__);
 	bind(socket_listen_fd,(struct sockaddr*)&sin,sizeof(sin));
	if(socket_listen_fd<0)
	{
	writebuginfo("file:%s,line:%d,errcode=%d\n",__FILE__,__LINE__,GetLastError());
		return NULL;
	}
	writebuginfo("file:%s,line:%d,socketlisten=%d\n",__FILE__,__LINE__,socket_listen_fd);
	::AfxBeginThread(ListenDealCmd,this,0);
	::AfxBeginThread(ListenCmdServer,this,0);
	return 0;
}
int CVisableCall::NetState(bool isOnline)
{
	return DOControl(DO_MSG_STATE,isOnline);
}
int CVisableCall::NodeState(bool isOnline)
{
	return DOControl(DO_NODE_STATE,isOnline);
}
int CVisableCall::StartHuJiao()
{
	
	//if(this->m_nCurrentState!=0)
	//	return OP_VISABLECALL_BUSY_ERR;

	int ret;
	if((ret=DOControl(DO_HUJIAO_SEND,1))!=0)
		return ret;
	
	Sleep(3000);
	if((ret=DOControl(DO_HUJIAO_SEND,0))!=0)
		return ret;
	m_nCurrentState=2;

	return 0;
}

int CVisableCall::ChangVolumMode(BYTE bMode)
{
	int ret;
//	printf("--------------------------------------bMode----\n");
	if(bMode==0)//开
	{
		if((ret=DOControl(DO_VOLUM_CHANNEL,1))!=0)
		{
			return ret;
		}
		if((ret=DOControl(DO_VOLUM_CHANNEL2,0))!=0)
		{
			return ret;
		}
	}
	else if(bMode==1)
	{
		if((ret=DOControl(DO_VOLUM_CHANNEL,0))!=0)
		{
			return ret;
		}
		if((ret=DOControl(DO_VOLUM_CHANNEL2,1))!=0)
		{
			return ret;
		}
	}
	else if(bMode==2)
	{
		if((ret=DOControl(DO_VOLUM_CHANNEL,0))!=0)
		{
			return ret;
		}
		if((ret=DOControl(DO_VOLUM_CHANNEL2,0))!=0)
		{
			return ret;
		}
	}
	m_bVolumChannel=bMode;
	return 0;

}

int CVisableCall::OpenDAA()
{
	int ret;
	//printf("------statrt DAA---------\n");
	if((ret=DOControl(DO_DAA,0))!=0)
		return ret;
	//printf("------end DAA---------\n");
	return 0;
}

int CVisableCall::CloseDAA()
{
	int ret;
	if((ret=DOControl(DO_DAA,1))!=0)
		return ret;
	
	return 0;
}

int CVisableCall::EndCallProcess()
{
	ChangViewChannel(0);
	this->ChangVolumMode(2);
	this->CloseDAA();
	this->m_bVolumChannel=0;
	this->m_nCurrentState=0;
	return 0;
}

int CVisableCall::ChangViewChannel(BYTE bChannel)
{
	int ret;
	if((ret=DOControl(DO_VISABLE_CHANNEL,bChannel))!=0)
		return ret;
	return 0;
}

int CVisableCall::DOControl(BYTE bIO, DWORD dwValue)
{
	int ret;
	DWORD dwRet=1;
	DWORD dwtemp=1;
	if(m_hDIOHandle==NULL)
		return OP_DO_DRIVE_NO_OPEN;
	//写io
	int i=DeviceIoControl(this->m_hDIOHandle,IOCTRL_SET_DO,(LPVOID)&bIO,dwValue,(LPVOID)&ret,4,(LPDWORD)&dwtemp,NULL);
	if(i==0)
	{
		DWORD dw=GetLastError();
		return OP_DO_WRITE_ERR;
	}
	//读io
	i=DeviceIoControl(m_hDIOHandle,IOCTRL_GET_DO,(LPVOID)&bIO,1,(LPVOID)&dwRet,4,(LPDWORD)&dwtemp,NULL);
	if(i==0)
	{
		return OP_DO_WRITE_ERR;
	}
	if(dwValue!=dwRet)
		return OP_DO_WRITE_ERR;
	return 0;	

}

int CVisableCall::close()
{
	CloseHandle(m_hDIOHandle);
	return 0;
}

int CVisableCall::AddCmmd(struct cmmd_struct cmd,struct sockaddr_in tosin)
{
	struct cmmd_struct_list *pm,*q,*news;
	pm=m_cmmd_list;
	q=NULL;
	this->m_Cmmd_mutxex.Lock();
	
	while(pm!=NULL)
	{
		q=pm;
		pm=pm->next;
	}
	news=(struct cmmd_struct_list*)malloc(sizeof(struct cmmd_struct_list));
	if(news==NULL)
	{
		this->m_Cmmd_mutxex.Unlock();
		return -1;
	}

	memcpy((char*)&news->cmm,(char*)&cmd,sizeof(struct cmmd_struct));
	memcpy((char*)&news->tosin,(char*)&tosin,sizeof(struct sockaddr_in));

	news->next=NULL;
	if(q==NULL)
		m_cmmd_list=news;
	else q->next=news;
	this->m_Cmmd_mutxex.Unlock();
	return 0;
}

int CVisableCall::GetCmmdFromHead(struct cmmd_struct_list *head)
{
	struct cmmd_struct_list* pm;
	if(m_cmmd_list==NULL)
		return -1;
	if(this->m_Cmmd_mutxex==NULL)
		return -1;
	this->m_Cmmd_mutxex.Lock();
	memcpy((char*)head,(char*)this->m_cmmd_list,sizeof(struct cmmd_struct_list));

	pm=m_cmmd_list;
	m_cmmd_list=m_cmmd_list->next;
	free(pm);	
	this->m_Cmmd_mutxex.Unlock();
	return 0;
}

int CVisableCall::RemoveAllCmmd()
{
	struct cmmd_struct_list* pm;
	while(m_cmmd_list!=NULL)
	{
		pm=m_cmmd_list;
		m_cmmd_list=m_cmmd_list->next;
		free(pm);
	}
	return 0;
}
int CVisableCall::SetMsgState(int nMsgType,int nMsgState)
{
	if(nMsgType<=0 || nMsgType >CVCALL_MSG_MAX)
	{
		ASSERT(0);
		writebuginfo("MsgType no exist!\n");
		return -1;
	}
	if(nMsgState !=0)
	{
		m_nMsgList[nMsgType-1]=1;
		DOControl(DO_MSG_STATE,TRUE);
	}else
	{
		m_nMsgList[nMsgType-1]=0;
		for(int i=0;i<CVCALL_MSG_MAX;i++)
		{
			if(m_nMsgList[i] !=0)
			{
				DOControl(DO_MSG_STATE,TRUE);
				break;
			}
		}
		if(CVCALL_MSG_MAX==i)
		{//
				DOControl(DO_MSG_STATE,FALSE);
		}
	}
	return 0;
}

⌨️ 快捷键说明

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