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