int main(int argc, char *argv[]) { initConfig(); if (!parseCmdLine(argc, argv)) goto exit; if (estgbconf.isSingleton) { switch (checkSingleton()) { case 0: break; // No another instance found, continue to work case 1: goto exit; // Found another instance of bot, exiting case 2: printf("Error open PID file for singleton check\n"); goto exit; // Something goes wrong, exiting } } if (!globalInit()) goto exit; if (estgbconf.isDaemonize) daemon(0, 0); if (estgbconf.needUnescape) { estgbconf.text = zc_unescape(estgbconf.text); estgbconf.comment = zc_unescape(estgbconf.comment); } if (estgbconf.isScan >= 0) { scan(); goto exit; } if (estgbconf.isWildcard) sendMultiple(); else sendSingle(); exit: freeConfig(); return 0; }
void scan(void) { int infinite = (estgbconf.isScan == 0); if (estgbconf.isScan < 0) return; if (!estgbconf.isWildcard) { while (estgbconf.isScan-- || infinite) { sendSingle(); sleep(estgbconf.timeRescan); } return; } while (estgbconf.isScan-- || infinite) { sendMultiple(); sleep(estgbconf.timeRescan); } return; }
void boardRegThread::signalBoardReg(int currentRegNum) { int num,nread; fd_set rfds; struct timeval tv; /***** send single board register command frame to board i *******/ memset (&nodeType, 0x0, sizeof(nodeType)); memset (&loopRegNum, 0x0, sizeof(loopRegNum)); memset (&louxianReg,0,sizeof(louxianReg)); memset (&zhikongzongxianReg,0,sizeof(zhikongzongxianReg)); //memset (&zhikongReg,0,sizeof(zhikongReg)); //memset (&zongxianReg,0,sizeof(zongxianReg)); memset (&sendFrame, 0x0, sizeof(struct can_frame)); memset (&recvFrame, 0x0, sizeof(struct can_frame)); isTimeOut3s = false; isTimeOut200s = false; sendSingle(currentRegNum);//send single frame to board emit currentRegBoardSgl(currentRegNum);//info for boardregDialog ,to tell people which board is registing... timer3s->start(); qDebug()<<"3s-timer start, 1st do-while loop"; do { if(isTimeOut3s) { /*no ack of current board in 3s, do something here ,then continue to next board*/ qDebug() << "by timeOut3s: no receive in 3 seconds,board "<< i <<" is offline"<<endl; break; } FD_ZERO(&rfds);//清空串口接收端口集 FD_SET(can_fd, &rfds);//设置串口接收端口集 //tv.tv_sec = 3; tv.tv_sec = 3; tv.tv_usec = 0; num = select (can_fd + 1, &rfds, NULL, NULL, &tv); if (num == 0)//no receive in 3 seconds { qDebug() << "by select:no receive in 3 seconds,board "<< i <<" is offline"<<endl; isTimeOut3s = true;//no receive in 3s break; } else { nread = read(can_fd, &recvFrame, sizeof(struct can_frame)); if(recvFrame.ti == TI_Ack && recvFrame.src_addr == sendFrame.dest_addr && recvFrame.priority == Priority4 ) { timer3s->stop();//3s count down STOP ! timer200s->start();//200s counting down qDebug() << "200s counting down..."; qDebug() <<"In boardRegThread:In boardRegThread: receive ack from board "<<recvFrame.src_addr; isTimeOut3s = false; } else { qDebug() << "receive wrong ack....go to next do-while-1 loop..."; continue;//go to next do-while loop } } }while((recvFrame.ti != TI_Ack) || (recvFrame.src_addr != sendFrame.dest_addr) || (recvFrame.priority != Priority4) ); if(timer3s->isActive()) timer3s->stop(); if(isTimeOut3s)//no ack in 3s,go to next board { return; //continue; } qDebug()<<"2nd do-while loop"; do { if(isTimeOut200s) { /**** board fault, no register over frame received in 200s ******/ qDebug() <<"In boardRegThread:In boardRegThread:no registerOver frame received in 200 seconds,board fault"<<endl; break; } /*** deal with the info reported of board i ***/ FD_ZERO(&rfds);//清空串口接收端口集 FD_SET(can_fd, &rfds);//设置串口接收端口集 tv.tv_sec = 3; tv.tv_usec = 0; num = select (can_fd + 1, &rfds, NULL, NULL, &tv); if (num == 0) { qDebug() << "no receive in 3 seconds"<<endl; continue;//in 200s,every 3s if no info report,go to next do-while loop } nread = read(can_fd, &recvFrame, sizeof(struct can_frame)); if(nread != sizeof(struct can_frame)) { qDebug()<<"in boardregthread::run():read recvFrame error."; continue; } if( (recvFrame.ti == TI_RegisterInfReport) && (recvFrame.src_addr == sendFrame.dest_addr) && (recvFrame.priority == Priority5) ) { dealInfo(recvFrame.src_addr); //qDebug() <<"In boardRegThread:In boardRegThread:receive info from board "<<recvFrame.src_addr; } else if((recvFrame.ti == TI_RegisterOver) && (recvFrame.src_addr == sendFrame.dest_addr) && (recvFrame.priority == Priority5) ) { /* END of board i register, save info to file for test */ /* header of 8 bytes @int boardstate; //4 byte @unsigned char loopRegNum[4];//4 byte */ qDebug() <<"In boardRegThread:In boardRegThread:receive overFrame from board "<<recvFrame.src_addr; timer200s->stop(); qDebug() <<"In boardRegThread:In boardRegThread:200s-timer stop"; sendAck(); if(currentRegNum < LOUXIANNUM) { for(int j = 0; j<LOOPMAXINUM; j++) { for(int k = 0; k<NODEMAXINUM; k++) if (nodeType[j][k] != 0xFF && nodeType[j][k] != 0x00) loopRegNum[j]+=1; } saveNodeToDB(currentRegNum, nodeType);//save to unitset table } else if( currentRegNum == LOUXIANNUM) { louxianRegNum = 0; for(int j = 0; j< LOUXIANMAXNUM; j++) if(louxianReg[j] == LOUXIAN) louxianRegNum += 1; saveLouxianToDB(); } else if( currentRegNum == ZHIKONGZONGXIAN) { zhikongRegNum = 0; for(int j = 0; j< 20; j++) if(zhikongzongxianReg[j] == ZHIKONGPAN) zhikongRegNum += 1; for(int j = 21; j< ZHIKONGZONGXIANNUM ; j++) if(zhikongzongxianReg[j] == ZONGXIANPAN) zongxianRegNum += 1; } boardRegFlag[currentRegNum - 1] = TRUE; boardRegSum += 1; } }while(recvFrame.ti != TI_RegisterOver );//&& recvFrame.priority == Priority5 );//while((recvFrame.pri_ti & 0x1F) != TI_RegisterOver); if(recvFrame.ti != TI_RegisterOver) { boardRegFlag[currentRegNum - 1] = FALSE; } if(timer200s->isActive()) timer200s->stop(); if(timer3s->isActive()) timer3s->stop(); }