// ************************* // main function // ************************* int main(int argc, char **argv) { struct MessageFromCoach { char Head; char MatchMode; /** 比赛模式,如果*/ char MatchType; }coach2robot; int lifetime; int value = 0; if(signal(SIGINT, signal_catch) == SIG_ERR) { printf("Error registering signal handler"); return -1; } if(DB_init() != 0) return -1; while(end == 0) { printf("\n\n\n"); lifetime = DB_get(Agent0,MESSAGEFROMCOACHINFO, &coach2robot); printf("%d",coach2robot.MatchMode); sleep(0.5); } DB_free(); return 0; }
//************************* // Main // int main(int argc, char *argv[]) { int sckt; pthread_t recvThread; char sendBuffer[BUFFER_SIZE]; int indexBuffer; int sharedRecs; RTDBconf_var rec[MAX_RECS]; unsigned int frameCounter = 0; int i, j; int life; struct sched_param proc_sched; pthread_attr_t thread_attr; struct itimerval it; struct _frameHeader frameHeader; struct timeval tempTimeStamp; nosend = 0; if ((argc < 2) || (argc > 3)) { printUsage(); return (-1); } if (argc == 3) { if(strcmp(argv[2], "nosend") == 0) { printf("\n*** Running in listing only mode ***\n\n"); nosend = 1; } else { printUsage(); return (-1); } } /* initializations */ delay = 0; timer = 0; end = 0; RUNNING_AGENTS = 1; /* Assign a real-time priority to process */ proc_sched.sched_priority=60; if ((sched_setscheduler(getpid(), SCHED_FIFO, &proc_sched)) < 0) { PERRNO("setscheduler"); return -1; } if(signal(SIGALRM, signal_catch) == SIG_ERR) { PERRNO("signal"); return -1; } if(signal(SIGINT, signal_catch) == SIG_ERR) { PERRNO("signal"); return -1; } if((sckt = openSocket(argv[1])) == -1) { PERR("openMulticastSocket"); printf("\nUsage: comm <interface_name>\n\n"); return -1; } if(DB_init() == -1) { PERR("DB_init"); closeSocket(sckt); return -1; } if((sharedRecs = DB_comm_ini(rec)) < 1) { PERR("DB_comm_ini"); DB_free(); closeSocket(sckt); return -1; } #ifdef FILEDEBUG if ((filedebug = fopen("log.txt", "w")) == NULL) { PERRNO("fopen"); DB_free(); closeSocket(sckt); return -1; } #endif /* initializations */ for (i=0; i<MAX_AGENTS; i++) { lostPackets[i]=0; agent[i].lastFrameCounter = 0; agent[i].state = NOT_RUNNING; agent[i].removeCounter = 0; } myNumber = Whoami(); agent[myNumber].state = RUNNING; /* receive thread */ pthread_attr_init (&thread_attr); pthread_attr_setinheritsched (&thread_attr, PTHREAD_INHERIT_SCHED); if ((pthread_create(&recvThread, &thread_attr, receiveDataThread, (void *)&sckt)) != 0) { PERRNO("pthread_create"); DB_free(); closeSocket(sckt); return -1; } /* Set itimer to reactivate the program */ it.it_value.tv_usec=(__suseconds_t)(TTUP_US); it.it_value.tv_sec=0; it.it_interval.tv_usec=(__suseconds_t)(TTUP_US); it.it_interval.tv_sec=0; setitimer (ITIMER_REAL, &it, NULL); printf("communication: STARTED in "); #ifdef UNSYNC printf("unsync mode...\n"); #else printf("sync mode...\n"); #endif MTRand randomGenerator; while (!end) { //pause(); double waitTime = randomGenerator.randNorm(0,1) * TTUP_US * 0.05 + TTUP_US; usleep(waitTime); // not timer event if (timer == 0) continue; #ifndef UNSYNC // dynamic agent 0 if ((delay > (int)MIN_UPDATE_DELAY_US) && (agent[myNumber].dynamicID == 0) && timer == 1) { it.it_value.tv_usec = (__suseconds_t)(delay - (int)MIN_UPDATE_DELAY_US/2); it.it_value.tv_sec = 0; setitimer (ITIMER_REAL, &it, NULL); delay = 0; continue; } #endif timer = 0; indexBuffer = 0; bzero(sendBuffer, BUFFER_SIZE); update_stateTable(); // update dynamicID j = 0; for (i = 0; i < MAX_AGENTS; i++) { if ((agent[i].state == RUNNING) || (agent[i].state == REMOVE)) { agent[i].dynamicID = j; j++; } agent[myNumber].stateTable[i] = agent[i].state; } RUNNING_AGENTS = j; MAX_DELTA = (int)(TTUP_US/RUNNING_AGENTS * 2/3); // frame header frameHeader.number = myNumber; frameHeader.counter = frameCounter; frameCounter ++; for (i = 0; i < MAX_AGENTS; i++) frameHeader.stateTable[i] = agent[myNumber].stateTable[i]; frameHeader.noRecs = sharedRecs; memcpy(sendBuffer + indexBuffer, &frameHeader, sizeof(frameHeader)); indexBuffer += sizeof(frameHeader); for(i = 0; i < sharedRecs; i++) { // id memcpy(sendBuffer + indexBuffer, &rec[i].id, sizeof(rec[i].id)); indexBuffer += sizeof(rec[i].id); // size memcpy(sendBuffer + indexBuffer, &rec[i].size, sizeof(rec[i].size)); indexBuffer += sizeof(rec[i].size); // life and data life = DB_get(myNumber, rec[i].id, sendBuffer + indexBuffer + sizeof(life)); memcpy(sendBuffer + indexBuffer, &life, sizeof(life)); indexBuffer = indexBuffer + sizeof(life) + rec[i].size; } if (indexBuffer > BUFFER_SIZE) { PERR("Pretended frame is bigger that the available buffer."); PERR("Please increase the buffer size or reduce the number of disseminated records"); break; } if (nosend == 0) { if (sendData(sckt, sendBuffer, indexBuffer) != indexBuffer) PERRNO("Error sending data"); } gettimeofday (&tempTimeStamp, NULL); lastSendTimeStamp.tv_sec = tempTimeStamp.tv_sec; lastSendTimeStamp.tv_usec = tempTimeStamp.tv_usec; // reset values for next round for (i=0; i<MAX_AGENTS; i++) { agent[i].delta = 0; agent[i].received = NO; } } FDEBUG (filedebug, "\nLost Packets:\n"); for (i=0; i<MAX_AGENTS; i++) FDEBUG (filedebug, "%d\t", lostPackets[i]); FDEBUG (filedebug, "\n"); printf("communication: STOPED.\nCleaning process...\n"); #ifdef FILEDEBUG fclose (filedebug); #endif closeSocket(sckt); pthread_join(recvThread, NULL); DB_free(); printf("communication: FINISHED.\n"); return 0; }