示例#1
0
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;
}
示例#2
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;
}
示例#3
0
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();
}