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.

1054 lines
24 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "log.h"
#include "var.h"
#include "test.h"
#include "manage.h"
#include "config.h"
#include "control.h"
//½áÊø·û
static const char* _endstr = "$";
static const int _endlen = (int)strlen(_endstr);
CTest::CTest()
{
_p = NULL;
_pvar = NULL;
_result = 0;
_csvInfo = "";
_failItems = "";
_testItems = "";
_skt = INVALID_SKT;
_size = MAX_BUF_LEN;
_msg = new char[_size];
memset(_msg, 0, _size);
//_prvstatus = TestNoConn;
_status = SOCKET_DISCONNECTED;
memset(_client, 0, MAX_NAME_LEN);
memset(&_data, 0, sizeof(_data));
memset(_daypath, 0, MAX_NAME_LEN);
_hSend = sys_CreateEvent(FALSE, TRUE, NULL);
_hReply = sys_CreateEvent(TRUE, TRUE, NULL);
_hSection = sys_InitializeCriticalSection();
ClearFlag();
_data.benable = 1; //ĬÈÏÆôÓÃ
_data.yield = 1;
_data.pass = 0;
_data.lastct = TESTCT;
_pCurCmd = NULL;
}
CTest::~CTest()
{
Close();
delete _msg;
sys_CloseHandle(_hSend);
sys_CloseHandle(_hReply);
sys_DeleteCriticalSection(_hSection);
}
void CTest::ClearFlag()
{
_len = 0;
_index = 0;
_regtm = 0;
_socket = 0;
_qstart = 0;
_qstatus = 0;
_startct = 0;
_cmdres = 0;
_notest = false;
_btesting = false;
//_pass = 0;
//_data.total = 0;
//_data.yield = 1;
unlock();
setReply();
}
void CTest::loadCounter()
{
char buff[64] = { 0 };
sprintf(buff, "test_%s", _data.ate);
_data.pass = get_cfg_int(buff, "pass");
_data.total = get_cfg_int(buff, "total");
_data.yield = _data.total > 0 ? ((float)_data.pass / _data.total) : 1;
}
void CTest::saveCounter()
{
char buff[64] = { 0 };
sprintf(buff, "test_%s", _data.ate);
modify_cfg_int(buff, "pass", _data.pass);
modify_cfg_int(buff, "total", _data.total);
}
void CTest::resetCounter()
{
_data.pass = 0;
_data.total = 0;
_data.yield = 1;
saveCounter();
}
void CTest::operator =(CTest &r)
{
if (INVALID_SKT != _skt) skt_close(_skt);
_len = 0;
_skt = r._skt;
_index = r._index;
_status = r._status;
_socket = r._socket;
_qstatus = r._qstatus;
_startct = r._startct;
memset(_msg, 0, _size);
_csvTitle = r._csvTitle;
strcpy(_client, r._client);
_data.pass = r._data.pass;
_data.total = r._data.total;
_data.yield = r._data.yield;
//strcpy(_data.sn, r._data.sn);
_data.status = r._data.status;
strcpy(_data.ate, r._data.ate);
r.ClearFlag();
r._skt = INVALID_SKT; //°ÑÁ¬½Ó¸³Öµµ½Ð¶ÔÏó
r._status = SOCKET_DISCONNECTED;
r._data.status = TestNoConn;
r._csvTitle = "";
//memset(r._data.sn, 0, MAX_NAME_LEN);
memset(r._data.ate, 0, MAX_NAME_LEN); //Çå¿Õ»úÆ÷±àÂë
}
void CTest::Open(const char* pszip)
{
static bool bhintOk = false;
static bool bhintFail = false;
ClearFlag();
_status = SOCKET_DISCONNECTED;
_skt = skt_server(pszip, 6050);
if (!bhintFail && INVALID_SKT == _skt)
{//Ìáʾʧ°Ü
bhintOk = false;
bhintFail = true;
REPORT("Öξ߷þÎñ¶Ë´´½¨Ê§°Ü£¬Çë¼ì²é¶Ë¿ÚÊÇ·ñ±»Õ¼ÓÃ");
}
else if (!bhintOk && INVALID_SKT != _skt)
{//Ìáʾok
bhintOk = true;
bhintFail = false;
REPORT("Öξ߷þÎñ¶Ë´´½¨³É¹¦£¬µÈ´ýÁ¬½Ó...");
}
}
void CTest::Close()
{
ZERO_CHK(IsOpen());
skt_close(_skt);
_skt = INVALID_SKT;
UpdateStatus(TestNoConn);
_status = SOCKET_DISCONNECTED;
ClearFlag();
}
int CTest::SetVarStatus(const char* szvar)
{
ipvar* p = get_ipvars(szvar);
RETURN_CHK_NOPRT(p != _pvar, ERR_INPUT_PARAM);
_pvar = p;
if (p) p->seti(getStatus());
return 0;
}
cstr GetTestMode(cstr p)
{//¸ù¾ÝÓû§»ñÈ¡²âÊÔģʽ
if (0 == *p) return "Production";
if (!stricmp(p, "PM")) return "Audit";
if (!stricmp(p, "ADMIN")) return "Audit";
if (!stricmp(p, "ENG_MI")) return "Audit";
if (!stricmp(p, "ENGINEER")) return "Audit";
if (!stricmp(p, "ENG_VENDOR")) return "Audit";
if (!stricmp(p, "OP")) return "Production";
if (!stricmp(p, "DualTest")) return "Production";
if (!stricmp(p, "OPERATOR")) return "Production";
return p;
}
void CTest::PutProduct(CProduct* p)
{//½«²úÆ·Êý¾ÝÒÆÈëÖξß
ZERO_CHK(p != _p); //ÅжϿÕ
_p = p; //¸³Öµ
p->data.index = _index;
p->data.pos = LocationTest;
}
//ÕâÀïp¿ÉÄÜΪNULL
//StartTest#SN#Machine#User#Config#Lot#Mode#SiteID#ProjectID#RetryMode#Mes#Mtcp$
int CTest::StartTest(CProduct* p, const char* machine, const char* pszcfg, const char* pszcfg2,
const char* site, const char* project, int bmes, int bmtcp, int bdualmode,const char* sublotname,int bupnoise)
{//֪ͨÖξ߿ªÊ¼²âÊÔ£¬ÐèÒª×é°üͨÐÅ
RETURN_CHK_NOPRT(p || _p, ERR_NO_PRODUCT);
if (!p) p = _p; //Èô´«Èë¿Õ£¬ÔòʹÓñ¾µØ
if (_notest)
{//½ö×÷Ϊ»º´æÓà -- ½öÒ»´ÎÓÐЧ
PutProduct(p);
_notest = false;
return 0;
}
ins->WriteLog("manager.txt", "%s->%s", this->getAte(), "StartTest");
RETURN_CHK_NOPRT(IsReady(), ERR_NOREADY);
RETURN_CHK_NOPRT(lock(), ERR_NOREADY);
_qstart = 0; //×Ô¶¯Åж¨³¬Ê±±êʶ
resetReply();
_pCurCmd = START;
_cmdres = ERR_TIMEOUT;
cstr pszuser = get_cur_user();
if (!pszuser) pszuser = "OP";
if (!strcmp("DualTest", pszuser)) bdualmode = 1; //˫ģʽ
char rowcol[32] = {0};
CalcRowColumn(p->data.takeIndex, rowcol);
SendMsg("%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%d#%d#%s#%d#%s#%s#%d", START, p->data.sn, machine,
pszuser, pszcfg, p->data.lot, GetTestMode(pszuser),
site, project, p->getRetryModelS(), bmes, bmtcp, pszcfg2, bdualmode, rowcol, sublotname, bupnoise);
if (!waitReply())
{//Ö¸Áîδ»Ø¸´
unlock(); //ÊÍ·Å
REPORT("%s Æô¶¯²âÊÔÖ¸Áî·µ»Ø³¬Ê±.", _data.ate);
return ERR_TIMEOUT;
}
unlock(); //ÊÍ·Å
if (!IsRunning())
{//Ö¸Áîδ»Ø¸´£¬»òÕßδÆô¶¯²âÊÔ
REPORT("%s Æô¶¯²âÊÔʧ°Ü.", _data.ate);
return ERR_NOREADY;
}
ulong ct = sys_GetTickCount() - _qstart;
if (ct > 0) REPORT("test start command reply: %dms", ct);
PutProduct(p); //¸³Öµ
p->data.count++; //²âÊÔ´ÎÊý+1
p->SetIndex(_index);
p->data.failItems[0] = 0; //Çå¿Õ
strcpy(p->Ate(), _data.ate);
_startct = sys_GetTickCount();
char buff[MAX_NAME_LEN] = { 0 };
//sprintf(buff, "Fixture%d Start Test", _index);
//ins->EventTracker(pszuser, 0, "", buff);
sprintf(buff, "Fixture%d ", _index);
ins->BreakdownLog(buff, "Test Start");
return 0;
}
int CTest::Home()
{
RETURN_CHK_NOPRT(IsReady(), ERR_NOREADY);
RETURN_CHK_NOPRT(lock(), ERR_NOREADY);
_qstart = 0;
resetReply();
_pCurCmd = HOME;
_cmdres = ERR_TIMEOUT;
SendMsg("%s", HOME);
if (!waitReply())
{//Ö¸Áîδ»Ø¸´
unlock(); //ÊÍ·Å
REPORT("%s %s Ö¸Áî·µ»Ø³¬Ê±.", _data.ate, HOME);
return ERR_TIMEOUT;
}
unlock(); //ÊÍ·Å
return _cmdres;
}
int CTest::Reset()
{
RETURN_CHK_NOPRT(IsNormal(), ERR_NOREADY);
RETURN_CHK_NOPRT(lock(), ERR_NOREADY);
_qstart = 0;
resetReply();
_pCurCmd = RESET;
_cmdres = ERR_TIMEOUT;
SendMsg("%s", RESET);
if (!waitReply())
{//Ö¸Áîδ»Ø¸´
unlock(); //ÊÍ·Å
REPORT("%s %s Ö¸Áî·µ»Ø³¬Ê±.", _data.ate, RESET);
return ERR_TIMEOUT;
}
unlock(); //ÊÍ·Å
return _cmdres;
}
int CTest::Pause(int bpause/* = 1*/)
{//֪ͨÖξßÔÝÍ£
RETURN_CHK_NOPRT(IsNormal(), ERR_NOREADY);
RETURN_CHK_NOPRT(lock(), ERR_NOREADY);
_qstart = 0;
resetReply();
_pCurCmd = PAUSE;
_cmdres = ERR_TIMEOUT;
SendMsg("%s#%d", PAUSE, bpause);
if (!waitReply())
{//Ö¸Áîδ»Ø¸´
unlock(); //ÊÍ·Å
REPORT("%s %s Ö¸Áî·µ»Ø³¬Ê±.", _data.ate, PAUSE);
return ERR_TIMEOUT;
}
unlock(); //ÊÍ·Å
return _cmdres;
}
int CTest::EnableGrip(int benable/* = 1*/)
{//¿ØÖƼÐצ´ò¿ª»ò¹Ø±Õ 1¼Ð½ô 0ËÉ¿ª
RETURN_CHK_NOPRT(IsReady(), ERR_NOREADY);
RETURN_CHK_NOPRT(lock(), ERR_NOREADY);
_qstart = 0;
resetReply();
_pCurCmd = GRIP;
_cmdres = ERR_TIMEOUT;
SendMsg("%s#%d", GRIP, benable);
if (!waitReply())
{//Ö¸Áîδ»Ø¸´
unlock(); //ÊÍ·Å
REPORT("%s ¿ØÖƼÐצָÁî·µ»Ø³¬Ê±.", _data.ate);
return ERR_TIMEOUT;
}
unlock(); //ÊÍ·Å
return _cmdres;
}
int CTest::SendGR(const char* s)
{//·¢ËÍGRÏûÏ¢¸øÖξß
int ret = 0;
RETURN_CHK_NOPRT(s && *s, ERR_INPUT_PARAM);
RETURN_CHK_NOPRT(IsNormal(), ERR_NOREADY);
RETURN_CHK_NOPRT(lock(), ERR_NOREADY);
_qstart = 0;
_cmdres = ERR_TIMEOUT;
ret = SendMsg("%s#%s", GR, s);
unlock(); //ÊÍ·Å
return ret;
}
int CTest::GetResultCsvInfo(char* pbuffer/* = 0*/, int nsize/* = 0*/)
{
int nlen = (int)_csvInfo.length();
RETURN_CHK_NOPRT(pbuffer, nlen);
if (nsize < nlen) nlen = nsize;
comm_strncpy(pbuffer, _csvInfo.c_str(), nlen);
return nlen;
}
int CTest::GetResultFailInfo(char* pbuffer/* = 0*/, int nsize/* = 0*/)
{
int nlen = (int)_failItems.length();
RETURN_CHK_NOPRT(pbuffer, nlen);
if (nsize < nlen) nlen = nsize;
comm_strncpy(pbuffer, _failItems.c_str(), nlen);
return nlen;
}
int CTest::GetResultTestInfo(char* pbuffer/* = 0*/, int nsize/* = 0*/)
{
int nlen = (int)_testItems.length();
RETURN_CHK_NOPRT(pbuffer, nlen);
if (nsize < nlen) nlen = nsize;
comm_strncpy(pbuffer, _testItems.c_str(), nlen);
return nlen;
}
static const char* _pszst[] = {"¶Ï¿ªÁ¬½Ó", "²âÊÔÖÐ", "¾ÍÐ÷", "±¨¾¯", "»ØÔ­ÖÐ" };
void CTest::UpdateStatus(TestStatus status)
{//¸üÐÂÖξß״̬
ZERO_CHK(status != _data.status);
REPORT("%s:%s", _data.ate, _pszst[status]);
_data.status = status; //×îºó¸üÐÂ״̬
if (_pvar) _pvar->seti(status);
}
void CTest::Connect()
{//µÈ´ýÁ¬½Ó
ushort port = 0;
char ip[MAX_IP_LEN] = {0};
ZERO_CHK(IsOpen());
ZERO_CHK(SOCKET_CONNECTED != _status);
ZERO_CHK(SOCKET_CONNECTED == skt_status(_skt));
ClearFlag();
_status = SOCKET_CONNECTED;
_regtm = sys_GetTickCount();
skt_get_addr(_skt, ip, &port);
_socket = skt_get_socket(_skt);
sprintf(_client, "%s:%d", ip, port);
REPORT("%s ÒÑÁ¬½Ó,µÈ´ý×¢²á.", _client);
}
void CTest::Process()
{//ÆäËü´¦Àí -- ÓÉÏß³ÌÖ´ÐÐ
//sys_EnterCriticalSection(_hSection);
ChkRegist();
QueryStatus();
ChkReplyTimeout();
//sys_LeaveCriticalSection(_hSection);
}
void CTest::ChkRegist()
{//¼ì²â×¢²á³¬Ê±
ZERO_CHK(IsConn() && !IsRegOk());
if (sys_GetTickCount() - _regtm > 2000)
{//³¬Ê±ÁË,³¬¹ý2sδע²á
Close();
REPORT("%s ³¬¹ý2sδע²á£¬¶Ï¿ªÁ¬½Ó.", _client);
}
}
void CTest::QueryStatus()
{//²éѯÖξß״̬
uint ct = 0;
ZERO_CHK(IsNormal());
ct = sys_GetTickCount();
ZERO_CHK(ct - _qstatus > 500); //¼ÆËã¼ä¸ô
ZERO_CHK(trylock()); //³¢ÊÔËø¶¨
SendMsg(STATUS);
_pCurCmd = STATUS;
_qstatus = _qstart = ct;
}
void CTest::ChkReplyTimeout()
{//¼ì²â»Ø¸´³¬Ê±
ulong ct = 0;
ZERO_CHK(IsNormal() && _qstart);
ct = sys_GetTickCount();
if (ct > _qstart + 2000)
{//δ»Ø¸´£¬²¢ÇÒ³¬¹ý2s
//Close();
_qstart = 0;
UpdateStatus(TestWarn);
REPORT("%s ³¬¹ý2sδ»Ø¸´ %s", _data.ate, _pCurCmd ? _pCurCmd : "");
_pCurCmd = NULL;
unlock(); //½âËø
}
}
int CTest::SendMsg(const char *pszFormat, ...)
{
int len = 0;
int ret = 0;
va_list args;
char buff[1024] = {0};
va_start(args, pszFormat);
len = vsnprintf(buff, 1023, pszFormat, args);
va_end(args);
RETURN_CHK_NOPRT(len > 0, ERR_INPUT_PARAM);
len += sprintf(buff + len, "%s", _endstr); //Ôö¼Ó½áÊø·û
if (!strstr(buff, "Status") && !strstr(buff, "Register") && !strstr(buff, "ErrorCode") && !strstr(buff, "Vlog"))
{
ins->WriteLog("manager.txt", "%s->send to test before %s",getAte(), buff);
}
ret = skt_send(_skt, buff, len);
if (!strstr(buff, "Status") && !strstr(buff, "Register") && !strstr(buff, "ErrorCode") && !strstr(buff, "Vlog"))
{
ins->WriteLog("manager.txt", "%s->send to test after ret=%d", getAte(), ret);
}
if (ret <= 0)
{
ret = skt_send(_skt, buff, len);
if (!strstr(buff, "Status") && !strstr(buff, "Register") && !strstr(buff, "ErrorCode") && !strstr(buff, "Vlog"))
{
ins->WriteLog("manager.txt", "µÚ¶þ´Î·¢ËÍÊý¾Ý %s->send to test after ret=%d", getAte(), ret);
}
}
if (ERR_NO_CONNECT == ret)
{//ÒѾ­¶Ï¿ª
Close();
ins->WriteLog("manager.txt", "%s ÒѶϿªÁ¬½Ó", _data.ate);
REPORT("%s ÒѶϿªÁ¬½Ó", _data.ate);
return ret;
}
if (ins->testLog())
{
LOG_INF1("send->%s: %s", _data.ate, buff);
if (ins->getCommunicationmsgcallback() != NULL)
{
ins->getCommunicationmsgcallback()(1, getIndex(), buff, 0);
}
}
return 0;
}
int CTest::FindEnd(char* pszmsg)
{
char* ptmp = NULL;
ptmp = strstr(pszmsg, _endstr);
if (!ptmp) return -1;
*ptmp = 0;
return (int)(ptmp - pszmsg);
}
void CTest::RecvMsg()
{//½ÓÊÕÏûÏ¢
int len = 0;
char* pdest = NULL;
//ZERO_CHK(IsConn());
//len = skt_recv(_skt, _msg + _len, _size - 1 - _len, 0);
len = sys_Recv(_socket, _msg + _len, _size - 1 - _len);
if (ERR_NO_CONNECT == len)
{//ÒѾ­¶Ï¿ª
Close();
REPORT("%s ÒѶϿªÁ¬½Ó", _client);
return;
}
ZERO_CHK(len > 0); //error
pdest = _msg + _len;
_len += len; //ÏûÏ¢³¤¶È
pdest[len] = 0;
if (ins->testLog())
{
LOG_INF1("%s[%s] recv: %s", _client, _data.ate, pdest);
if (ins->getCommunicationmsgcallback() != NULL)
{
ins->getCommunicationmsgcallback()(1, getIndex(), pdest, 1);
}
}
if (_size - 1 == _len)
{//»º³åÇø²»¹»ÁË +´ó
_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); //²éÕÒ½áÊø·û
if (len < 0)
{//δÕÒµ½½áÊø·û
if (pdest != _msg)
{//²»µÈ£¬±êÊ¶Ç°ÃæÒѾ­½âÎö¹ýÏûÏ¢£¬ºóÃæÊ£ÓàÏûÏ¢ÐèÒªÇ°ÒÆ
mem_forward(pdest, _len + 1, (uint)(pdest - _msg));
}
return;
}
//ÐÂÏûÏ¢
ParseMsg(pdest);
len += _endlen; //¼ÓÉϽáÊø·û³¤¶È
_len -= len;
pdest += len;
}
}
void CTest::ParseMsg(char* pszmsg)
{
char* ptmp = NULL;
ZERO_CHK(pszmsg);
//LOG_INF1("%s[%s] parse msg: %s", _client, _data.ate, pszmsg);
ptmp = sys_strtok(NULL, SPLIT, &pszmsg);
ZERO_CHK(ptmp && *ptmp);
if (!strcmp(ptmp, REG))
{//×¢²áÏûÏ¢
return ParseRegister(pszmsg);
}
if (!strcmp(ptmp, VLOG))
{//ÉÏ´«ÈÕÖ¾
return ParseWriteLog(pszmsg);
}
if (!strcmp(ptmp, GR))
{//²àÏà»úÊÓ¾õ´¦ÀíÇëÇó
return ParseGR(pszmsg);
}
if (!strcmp(ptmp, RIO))
{//¶ÁÈ¡±¾µØIO
return ParseRIO(pszmsg);
}
if (!strcmp(ptmp, WIO))
{//дÈë±¾µØIO
return ParseWIO(pszmsg);
}
//------------------//
//ÕâÀïÒÔ϶¼Êǻظ´ÏûÏ¢£¬±ØÐë¼ì²é·¢³öµÄÖ¸ÁîºÍ½ÓÊÕµ½µÄÊÇ·ñÒ»Ö£¬·ñÔò¶ªÆú¸ÃÏûÏ¢
//-
if (!_pCurCmd || strcmp(ptmp, _pCurCmd))
{//±ØÐëÊǵ±Ç°Ö¸Áî»Ø¸´²ÅÐÐ
REPORT("%s ´íÎ󻨏´Ö¸Áî:%s", _data.ate, ptmp);
return;
}
_pCurCmd = NULL; //ÖØÖÃ
if (!strcmp(ptmp, STATUS))
{//Öξß״̬»Ø¸´
return ParseStatusReply(pszmsg);
}
if (!strcmp(ptmp, START))
{//Æô¶¯²âÊԻظ´
return ParseStartReply(pszmsg);
}
if (!strcmp(ptmp, RES))
{//ѯÎʽá¹û»Ø¸´
return ParseResultReply(pszmsg);
}
if (!strcmp(ptmp, ERR))
{//´íÎó´úÂë»Ø¸´
return ParseErrorReply(pszmsg);
}
if (!strcmp(ptmp, HOME))
{//»ØÔ­Ö¸Áî»Ø¸´
return ParseIntReply(pszmsg);
}
if (!strcmp(ptmp, RESET))
{//ÖØÖÃÖ¸Áî»Ø¸´
return ParseIntReply(pszmsg);
}
if (!strcmp(ptmp, GRIP))
{//¿ØÖƼÐצ»Ø¸´
return ParseIntReply(pszmsg);
}
if (!strcmp(ptmp, PAUSE))
{//ÔÝÍ£»Ø¸´
return ParseIntReply(pszmsg);
}
REPORT("%s Òì³£Ö¸Áî: %s", _client, ptmp);
}
void CTest::ParseRegister(char* pszcmd)
{//½âÎö×¢²áÏûÏ¢
int index = 0;
char* ptmp = NULL;
char ate[MAX_NAME_LEN] = {0};
if (0 == _regtm)
{
SendMsg("%s#0", REG);
REPORT("%s ÖØ¸´×¢²á»ò²»ÔÚÏÞÖÆÊ±¼äÄÚ×¢²á.", _client);
return;
}
ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if ((0 == ptmp || 0 == *ptmp || strlen(ptmp) >= MAX_NAME_LEN))
{//¸ñʽ²»¶Ô
SendMsg("%s#0", REG);
LOG_WARN("%s ×¢²á¸ñʽ´íÎó.", _client);
return;
}
strcpy(ate, ptmp); //ate
ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if (EMSTR_INT != get_str_type(ptmp))
{//¸ñʽ²»¶Ô
SendMsg("%s#0", REG);
LOG_WARN("%s ×¢²á¸ñʽ´íÎó.", _client);
return;
}
index = atoi(ptmp);
if (index <= 0 || index > TESTCNT)
{//ÐòºÅ²»¶Ô
SendMsg("%s#0", REG);
LOG_WARN("%s ×¢²á»ų́ÐòºÅ´íÎó:%d", _client, index);
return;
}
if (!ins->ChkAteValid(index, ate))
{//±àÂëÖØ¸´ÁË
SendMsg("%s#0", REG);
LOG_WARN("%s Öξ߱àÂëÖØ¸´:%s", _client, ate);
return;
}
//ÅжÏÊÇ·ñ´øÓбêÌâ
_csvTitle = pszcmd ? pszcmd : "";
_csvTitle += "\n"; //Ôö¼Ó»»Ðзû
_regtm = 0; //ÖØÖñêʶ
_index = index; //ÐòºÅ
strcpy(_data.ate, ate); //ate
loadCounter(); //¼ÓÔØ¼ÆÊý
SendMsg("%s#1", REG);
UpdateStatus(TestWarn);
}
void CTest::ParseStatusReply(char* pszcmd)
{//Öξß״̬»Ø¸´
int status = 0;
if (EMSTR_INT != get_str_type(pszcmd))
{//¸ñʽ²»¶Ô
LOG_WARN("%s ״̬·µ»Ø´íÎó :%s.", _data.ate, pszcmd);
return;
}
status = atoi(pszcmd);
if (status != 0 && status != 1 && status != 2)
{//±ØÐëÊÇ1ºÍ0
LOG_WARN("%s ״̬·µ»Ø´íÎó :%s.", _data.ate, pszcmd);
}
if (0 == status)
{//²âÊÔÖÐ
SendMsg(ERR);
_pCurCmd = ERR;
_qstart = sys_GetTickCount();
}
else if (2 == status)
{
unlock();
UpdateStatus(TestHoming);
}
else if (_p && /*IsRunning()*/_btesting)
{//ÓвúÆ·ÇÒ²âÊÔÖÐ->¾ÍÐ÷
SendMsg(RES);
_pCurCmd = RES;
_qstart = sys_GetTickCount();
_data.lastct = (int)(_qstart - _startct);
}
else
{//״̬¾ÍÐ÷
unlock();
_qstart = 0; //ÖØÖÃ
UpdateStatus(TestIdle);
}
}
void CTest::ParseErrorReply(char* pszcmd)
{//´íÎó´úÂë»Ø¸´
int err = 0;
char* ptmp = NULL;
ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if (EMSTR_INT != get_str_type(ptmp))
{//¸ñʽ²»¶Ô
LOG_WARN("%s ²éѯ´íÎ󷵻ظñʽ´íÎó :%s.", _data.ate, pszcmd);
return;
}
_pCurCmd = NULL;
err = atoi(ptmp);
if (0 == err)
{//ÎÞ´íÎó
//if (TestWarn == getStatus()) UpdateStatus(TestIdle);
}
else if (TestWarn != getStatus())
{//ÓдíÎó
UpdateStatus(TestWarn);
REPORT("%s ±¨¾¯ %d:%s", _data.ate, err, pszcmd ? pszcmd : "");
ins->PostWarn("%s ±¨¾¯ %d:%s", _data.ate, err, pszcmd ? pszcmd : "");
}
unlock();
}
void CTest::ParseWriteLog(char* pszcmd)
{
char* ptmp = NULL;
ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if (0 == ptmp || 0 == pszcmd)
{//¸ñʽ²»¶Ô
SendMsg("%s#0", VLOG);
LOG_WARN("%s ÉÏ´«ÈÕÖ¾¸ñʽ´íÎó.", _data.ate);
return;
}
if (0 == *ptmp || 0 == *pszcmd || strlen(ptmp) > 256 || strlen(pszcmd) > 256)
{//³¤¶ÈÊÜÏÞ
SendMsg("%s#0", VLOG);
LOG_WARN("%s ÉÏ´«ÈÕÖ¾ÄÚÈݳ¤¶È³¬ÏÞ.", _data.ate);
return;
}
ins->BreakdownLog(ptmp, pszcmd);
SendMsg("%s#1", VLOG);
}
void CTest::ParseGR(char* pszcmd)
{
int ret = ins->SendTestGR(_index, pszcmd);
if (ret)
{//fail.
SendMsg("%s#%d", GR, ret);
LOG_WARN("%s ·¢Ë͸øÊÓ¾õʧ°Ü.", _data.ate);
}
}
void DelEnter(char * source)
{
char * temp = source;
if (source == NULL)
{
return;
}
while (*source)
{
if (*source != '\r' && *source != '\n')
{
*temp = *source;
temp++;
}
source++;
}
*temp = '\0';
}
void CTest::ParseResult(char* pszcmd)
{
DelEnter(pszcmd);
char* ptmp = NULL;
_csvInfo = "";
_failItems = "";
_testItems = "";
ZERO_CHK(pszcmd);
ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if (ptmp) _csvInfo = ptmp; //csvinfo
ptmp = NULL;
_csvInfo += ",";
if (pszcmd) ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if (ptmp)
{//failitems
_failItems = ptmp;
_csvInfo += ptmp;
}
ptmp = NULL;
_csvInfo += ",";
if (pszcmd) ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if (ptmp)
{//testitems
_testItems = ptmp;
_csvInfo += ptmp;
}
_csvInfo += "\n";
ptmp = NULL;
if (pszcmd) ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if (_p)
{//bin
if (ptmp) comm_strncpy(_p->data.level, ptmp, MAX_NAME_LEN); //bin
comm_strncpy(_p->data.failItems, _failItems.c_str(), MAX_BUF_LEN);
}
}
void CTest::ParseResultReply(char* pszcmd)
{//ѯÎʽá¹û»Ø¸´
int ret = 0;
char* ptmp = NULL;
char buff[MAX_NAME_LEN] = { 0 };
ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if (EMSTR_INT != get_str_type(ptmp))
{//¸ñʽ²»¶Ô
LOG_WARN("%s ²éѯ½á¹û·µ»Ø¸ñʽ´íÎó :%s.", _data.ate, ptmp ? ptmp : "");
return;
}
unlock(); //½âËø
_btesting = false;
UpdateStatus(TestIdle);
ret = atoi(ptmp);
ZERO_CHK(ret == 1);
ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if (EMSTR_INT != get_str_type(ptmp))
{//¸ñʽ²»¶Ô
LOG_WARN("%s ²éѯ½á¹û·µ»Ø´íÎ󣬲âÊÔ½á¹û:%s", _data.ate, ptmp ? ptmp : "");
return;
}
_result = atoi(ptmp);
if (_p)
{//ÓвúÆ· -- ¼ÆËãÁ¼ÂÊ
_p->data.status = _result;
_data.total++;
if (_result) _data.pass++;
_data.yield = (float)_data.pass / _data.total;
saveCounter();
}
ParseResult(pszcmd); //½âÎöºóÃæµÄ½á¹û
//CalcYield();
ins->SummaryLog(_csvTitle.c_str(), _csvInfo.c_str());
ins->UnitTracker(_p->data.sn, _data.ate, _p->data.lot, _p->data.status, _p->getRetryModelE());
//cstr pszuser = get_cur_user();
//sprintf(buff, "Fixture%d Test OK", _index);
//ins->EventTracker(pszuser ? pszuser : "OP", 0, "", buff);
sprintf(buff, "Fixture %d", _index);
ins->BreakdownLog(buff, " Test End");
}
void CTest::ParseStartReply(char* pszcmd)
{//Æô¶¯²âÊԻظ´
int ret = 0;
if (EMSTR_INT != get_str_type(pszcmd))
{//¸ñʽ²»¶Ô
LOG_WARN("%s Æô¶¯²âÊÔ·µ»Ø´íÎó :%s.", _data.ate, pszcmd);
}
else
{//¸ñʽ¶Ô
ret = atoi(pszcmd);
if (ret != 0 && ret != 1)
{//±ØÐëÊÇ1ºÍ0
LOG_WARN("%s Æô¶¯²âÊÔ·µ»Ø´íÎó :%s.", _data.ate, pszcmd);
}
}
if (1 == ret)
{//OK
_cmdres = 0;
_btesting = true; //²âÊÔÖÐ
UpdateStatus(TestRunning);
}
setReply();
}
void CTest::ParseIntReply(char* pszcmd)
{//½âÎö·µ»Ø½á¹û£¨ÕûÊý£©
int ret = 0;
if (EMSTR_INT != get_str_type(pszcmd))
{//¸ñʽ²»¶Ô
LOG_WARN("%s Ö¸Áî·µ»Ø´íÎó :%s.", _data.ate, pszcmd);
}
else
{//¸ñʽ¶Ô
ret = atoi(pszcmd);
if (ret != 0 && ret != 1)
{//±ØÐëÊÇ1ºÍ0
LOG_WARN("%s Ö¸Áî·µ»Ø´íÎó :%s.", _data.ate, pszcmd);
}
if (1 == ret)
{//OK
_cmdres = 0;
}
}
setReply();
}
void CTest::ParseRIO(char* pszcmd)
{//ReadIO#name
ZERO_CHK(pszcmd);
if (EMSTR_STRING != get_str_type(pszcmd))
{//¸ñʽ²»¶Ô
LOG_WARN("%s IOÃû³Æ¸ñʽ´íÎó :%s.", _data.ate, pszcmd);
SendMsg("%s#0", RIO);
return;
}
SendMsg("%s#%d", RIO, read_by_name(pszcmd));
}
void CTest::ParseWIO(char* pszcmd)
{//WriteIO#name#val
int ret = 0;
cstr ptmp = 0;
ZERO_CHK(pszcmd);
ptmp = sys_strtok(NULL, SPLIT, &pszcmd);
if (EMSTR_STRING != get_str_type(ptmp))
{//¸ñʽ²»¶Ô
LOG_WARN("%s IOÃû³Æ¸ñʽ´íÎó :%s.", _data.ate, pszcmd);
SendMsg("%s#-1", WIO);
return;
}
if (EMSTR_INT != get_str_type(pszcmd))
{//¸ñʽ²»¶Ô
LOG_WARN("%s IOдÈëÖµ¸ñʽ´íÎó :%s.", _data.ate, pszcmd);
SendMsg("%s#-1", WIO);
return;
}
ret = atoi(pszcmd);
SendMsg("%s#%d", WIO, write_by_name(ptmp, ret));
LOG_INF1("%s[%s] write IO: %s = %d", _client, _data.ate, ptmp, ret);
}
/*
¸ù¾Ý²úÆ·ÔÚÁÏÅÌÖеÄË÷ÒýÖµ¼ÆËã³ö²úÆ·ÔÚÁÏÅÌÖеÄÐÐÁÐ
*/
void CTest::CalcRowColumn(int takeindex, char* rowcol)
{
int _row, _col;
_row = _col = 0;
if (takeindex % 16 == 0)
{
_row = takeindex / 16;
_col = 16;
}
else
{
_row = (takeindex / 16) + 1;
_col = takeindex % 16;
}
sprintf(rowcol,"R%dC%d", _row, _col);
}