You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

311 lines
6.9 KiB
C++

2 years ago
#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;
}