|
|
|
|
#include "vision.h"
|
|
|
|
|
#include "manage.h"
|
|
|
|
|
#include "log.h"
|
|
|
|
|
#include "ops.h"
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
static const char* _endstr = ";";
|
|
|
|
|
static const int _endlen = (int)strlen(_endstr);
|
|
|
|
|
|
|
|
|
|
CVision::CVision()
|
|
|
|
|
{
|
|
|
|
|
_len = 0;
|
|
|
|
|
_ires = 0;
|
|
|
|
|
_port = VPORT;
|
|
|
|
|
_skt = INVALID_SKT;
|
|
|
|
|
_size = MAX_BUF_LEN;
|
|
|
|
|
_msg = new char[_size];
|
|
|
|
|
memset(_msg, 0, _size);
|
|
|
|
|
_status = SOCKET_DISCONNECTED;
|
|
|
|
|
_hReply = sys_CreateEvent(TRUE, FALSE, NULL);
|
|
|
|
|
_hSection = sys_InitializeCriticalSection();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CVision::~CVision(void)
|
|
|
|
|
{
|
|
|
|
|
Deinit();
|
|
|
|
|
delete _msg;
|
|
|
|
|
sys_CloseHandle(_hReply);
|
|
|
|
|
sys_DeleteCriticalSection(_hSection);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CVision::Init(const char* pszip, ushort port)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ
|
|
|
|
|
sys_EnterCriticalSection(_hSection);
|
|
|
|
|
if (INVALID_SKT == _skt)
|
|
|
|
|
{
|
|
|
|
|
_port = port;
|
|
|
|
|
Disconnect();
|
|
|
|
|
REPORT("%d <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>", _port);
|
|
|
|
|
_skt = skt_client(pszip, port);
|
|
|
|
|
}
|
|
|
|
|
sys_LeaveCriticalSection(_hSection);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CVision::Deinit()
|
|
|
|
|
{//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
sys_EnterCriticalSection(_hSection);
|
|
|
|
|
if (INVALID_SKT != _skt)
|
|
|
|
|
{
|
|
|
|
|
Disconnect();
|
|
|
|
|
skt_close(_skt);
|
|
|
|
|
_skt = INVALID_SKT;
|
|
|
|
|
REPORT("%d <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>", _port);
|
|
|
|
|
}
|
|
|
|
|
ClearMsg();
|
|
|
|
|
sys_LeaveCriticalSection(_hSection);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CVision::Connect()
|
|
|
|
|
{//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
sys_EnterCriticalSection(_hSection);
|
|
|
|
|
if (INVALID_SKT != _skt &&
|
|
|
|
|
SOCKET_CONNECTED != _status &&
|
|
|
|
|
SOCKET_CONNECTED == skt_status(_skt))
|
|
|
|
|
{
|
|
|
|
|
_status = SOCKET_CONNECTED;
|
|
|
|
|
_socket = skt_get_socket(_skt);
|
|
|
|
|
REPORT("%d <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", _port);
|
|
|
|
|
}
|
|
|
|
|
sys_LeaveCriticalSection(_hSection);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CVision::Disconnect()
|
|
|
|
|
{//<2F>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
ZERO_CHK(SOCKET_CONNECTED == _status);
|
|
|
|
|
|
|
|
|
|
_len = 0;
|
|
|
|
|
_index = 0;
|
|
|
|
|
_socket = 0;
|
|
|
|
|
sys_SetEvent(_hReply);
|
|
|
|
|
_ires = ERR_NO_CONNECT;
|
|
|
|
|
_status = SOCKET_DISCONNECTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CVision::Process()
|
|
|
|
|
{//<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>,<2C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30>ʶ<EFBFBD>ɹ<EFBFBD> <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
TOpsCfg cfg;
|
|
|
|
|
|
|
|
|
|
ops_get_cfg(&cfg);
|
|
|
|
|
|
|
|
|
|
RETURN_CHK_NOPRT(!cfg.offVision, 0);
|
|
|
|
|
|
|
|
|
|
sys_EnterCriticalSection(_hSection);
|
|
|
|
|
_ires = ERR_NO_CONNECT;
|
|
|
|
|
if (IsConn())
|
|
|
|
|
{
|
|
|
|
|
_index = 0;
|
|
|
|
|
ClearMsg();
|
|
|
|
|
sys_ResetEvent(_hReply);
|
|
|
|
|
SendMsg("M");
|
|
|
|
|
}
|
|
|
|
|
sys_LeaveCriticalSection(_hSection);
|
|
|
|
|
sys_WaitForSingleObject(_hReply, 5000);
|
|
|
|
|
return _ires;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CVision::WaitResult(char* s, int timeout)
|
|
|
|
|
{//<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> һ<><D2BB><EFBFBD><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9><EFBFBD>_res<65><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
TOpsCfg cfg;
|
|
|
|
|
char* pmsg = NULL;
|
|
|
|
|
int ret = ERR_NO_CONNECT;
|
|
|
|
|
uint ct = sys_GetTickCount();
|
|
|
|
|
|
|
|
|
|
RETURN_CHK_NOPRT(s, ERR_INPUT_PARAM);
|
|
|
|
|
|
|
|
|
|
ops_get_cfg(&cfg);
|
|
|
|
|
if (cfg.offVision)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
sprintf(s, "0");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (ret && IsConn())
|
|
|
|
|
{
|
|
|
|
|
if (sys_GetTickCount() > ct + timeout)
|
|
|
|
|
{//<2F><>ʱ
|
|
|
|
|
return ERR_TIMEOUT;
|
|
|
|
|
}
|
|
|
|
|
sys_WaitForSingleObject(_hReply, 50);
|
|
|
|
|
sys_EnterCriticalSection(_hSection);
|
|
|
|
|
if (IsConn() && !_lstmsg.empty())
|
|
|
|
|
{
|
|
|
|
|
ret = 0;
|
|
|
|
|
pmsg = _lstmsg.front();
|
|
|
|
|
_lstmsg.pop_front();
|
|
|
|
|
strcpy(s, pmsg);
|
|
|
|
|
delete pmsg;
|
|
|
|
|
}
|
|
|
|
|
if (_lstmsg.empty()) sys_ResetEvent(_hReply);
|
|
|
|
|
sys_LeaveCriticalSection(_hSection);
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CVision::RecvMsg(char* s, int nsize)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ -- <20><><EFBFBD>߳<EFBFBD>ִ<EFBFBD><D6B4>
|
|
|
|
|
sys_EnterCriticalSection(_hSection);
|
|
|
|
|
RecvMsgB(s, nsize);
|
|
|
|
|
sys_LeaveCriticalSection(_hSection);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CVision::Send(const char* s)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
|
|
RETURN_CHK_NOPRT(s && *s, ERR_INPUT_PARAM);
|
|
|
|
|
RETURN_CHK_NOPRT(IsConn(), ERR_NO_CONNECT);
|
|
|
|
|
|
|
|
|
|
sys_EnterCriticalSection(_hSection);
|
|
|
|
|
ret = SendMsg(s);
|
|
|
|
|
sys_LeaveCriticalSection(_hSection);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CVision::SendMsg(const char *pszFormat, ...)
|
|
|
|
|
{
|
|
|
|
|
int len = 0;
|
|
|
|
|
int ret = 0;
|
|
|
|
|
va_list args;
|
|
|
|
|
char buff[MAX_BUF_LEN] = {0};
|
|
|
|
|
|
|
|
|
|
va_start(args, pszFormat);
|
|
|
|
|
len = vsnprintf(buff, MAX_BUF_LEN-1, pszFormat, args);
|
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
|
|
RETURN_CHK_NOPRT(len > 0, ERR_INPUT_PARAM);
|
|
|
|
|
|
|
|
|
|
len += sprintf(buff + len, "%s", _endstr); //<2F><><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
ret = skt_send(_skt, buff, len);
|
|
|
|
|
if (ERR_NO_CONNECT == ret)
|
|
|
|
|
{//<2F>Ѿ<EFBFBD><D1BE>Ͽ<EFBFBD>
|
|
|
|
|
Disconnect();
|
|
|
|
|
REPORT("%d <20>ѶϿ<D1B6><CFBF><EFBFBD><EFBFBD><EFBFBD>", _port);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
if (ins->visionLog()) LOG_INF1("%d send: %s", _port, buff);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CVision::FindEnd(char* pszmsg)
|
|
|
|
|
{
|
|
|
|
|
char* ptmp = NULL;
|
|
|
|
|
ptmp = strstr(pszmsg, _endstr);
|
|
|
|
|
if (!ptmp) return -1;
|
|
|
|
|
*ptmp = 0;
|
|
|
|
|
return (int)(ptmp - pszmsg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CVision::ClearMsg()
|
|
|
|
|
{
|
|
|
|
|
while (!_lstmsg.empty())
|
|
|
|
|
{
|
|
|
|
|
FREE_ANY(_lstmsg.front());
|
|
|
|
|
_lstmsg.pop_front();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CVision::RecvMsgB(char* s, int nsize)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
int len = 0;
|
|
|
|
|
char* pdest = NULL;
|
|
|
|
|
|
|
|
|
|
ZERO_CHK(SOCKET_CONNECTED == _status);
|
|
|
|
|
|
|
|
|
|
//len = skt_recv(_skt, _msg + _len, _size - 1 - _len, 0);
|
|
|
|
|
len = sys_Recv(_socket, _msg + _len, _size - 1 - _len);
|
|
|
|
|
if (ERR_NO_CONNECT == len)
|
|
|
|
|
{//<2F>Ѿ<EFBFBD><D1BE>Ͽ<EFBFBD>
|
|
|
|
|
Disconnect();
|
|
|
|
|
REPORT("%d <20>ѶϿ<D1B6><CFBF><EFBFBD><EFBFBD><EFBFBD>", _port);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ZERO_CHK(len > 0); //error
|
|
|
|
|
|
|
|
|
|
if (ins->visionLog()) LOG_INF1("%d recv: %s", _port, _msg + _len);
|
|
|
|
|
|
|
|
|
|
_len += len; //<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|
|
|
|
if (_size - 1 == _len)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +<2B><>
|
|
|
|
|
_size += MAX_BUF_LEN;
|
|
|
|
|
pdest = new char[_size];
|
|
|
|
|
memset(pdest, 0, _size);
|
|
|
|
|
memcpy(pdest, _msg, _len);
|
|
|
|
|
delete _msg;
|
|
|
|
|
_msg = pdest;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pdest = _msg;
|
|
|
|
|
while(_len > 0)
|
|
|
|
|
{
|
|
|
|
|
len = FindEnd(pdest); //<2F><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (len < 0) break; //δ<>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
if (!s) ParseMsg(pdest);
|
|
|
|
|
else
|
|
|
|
|
{//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ
|
|
|
|
|
if (nsize < len + 2)
|
|
|
|
|
{//buffer <20><><EFBFBD><EFBFBD>
|
|
|
|
|
REPORT("%d <20><><EFBFBD><EFBFBD><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>", _port);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{//copy
|
|
|
|
|
nsize -= len + 1;
|
|
|
|
|
s = comm_strcpy(s, pdest);
|
|
|
|
|
s = comm_strcpy(s, ";");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
len += _endlen; //<2F><><EFBFBD>Ͻ<EFBFBD><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
_len -= len;
|
|
|
|
|
pdest += len;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_len > 0 && pdest != _msg)
|
|
|
|
|
{//<2F><><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>ʶǰ<CAB6><C7B0><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>Ҫǰ<D2AA><C7B0>
|
|
|
|
|
mem_forward(pdest, _len + 1, (uint)(pdest - _msg));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CVision::ParseMsg(char* pszmsg)
|
|
|
|
|
{
|
|
|
|
|
int nlen = 0;
|
|
|
|
|
char* ptmp = NULL;
|
|
|
|
|
|
|
|
|
|
RETURN_CHK_NOPRT(pszmsg, ERR_INPUT_PARAM);
|
|
|
|
|
|
|
|
|
|
if (ins->visionLog()) LOG_INF1("%d parse msg: %s", _port, pszmsg);
|
|
|
|
|
|
|
|
|
|
ptmp = sys_strtok(NULL, ",", &pszmsg);
|
|
|
|
|
|
|
|
|
|
RETURN_CHK_NOPRT(ptmp && *ptmp, ERR_INPUT_PARAM);
|
|
|
|
|
|
|
|
|
|
if (strcmp(ptmp, "M"))
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
REPORT("%d <20><><EFBFBD>յ<EFBFBD><D5B5>쳣ָ<ECB3A3><D6B8>: %s", _port, ptmp);
|
|
|
|
|
return ERR_INPUT_PARAM;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RETURN_CHK_NOPRT(pszmsg && *pszmsg, 0);
|
|
|
|
|
|
|
|
|
|
if (0 == _index)
|
|
|
|
|
{//<2F>״η<D7B4><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD>
|
|
|
|
|
RETURN_CHK_NOPRT(EMSTR_INT == get_str_type(pszmsg), ERR_INPUT_PARAM);
|
|
|
|
|
_ires = atoi(pszmsg); //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
sys_SetEvent(_hReply);
|
|
|
|
|
_index++;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>η<EFBFBD><CEB7>ء<EFBFBD><D8A1><EFBFBD><EFBFBD>η<EFBFBD><CEB7><EFBFBD>
|
|
|
|
|
ptmp = new char[strlen(pszmsg) + 1];
|
|
|
|
|
comm_strcpy(ptmp, pszmsg);
|
|
|
|
|
_lstmsg.push_back(ptmp);
|
|
|
|
|
sys_SetEvent(_hReply);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|