00001 /** 00002 * @file Representations/WLan/TeamMessageCollection.cpp 00003 * 00004 * Implementation of class TeamMessageCollection. 00005 * 00006 * @author <A href=mailto:sebastian.schmidt@udo.edu>Sebastian Schmidt</A> 00007 * @author <A href=mailto:m_wachter@gmx.de>Michael Wachter</A> 00008 */ 00009 00010 #include "TeamMessageCollection.h" 00011 #include "Platform/SystemCall.h" 00012 #include "Tools/Player.h" 00013 #include "Tools/Debugging/Debugging.h" 00014 00015 TeamMessageCollection::TeamMessageCollection() 00016 { 00017 lastSendingTimeStamp = 0; 00018 for (int a=0; a< maxNumberOfTeamMessages; a++) 00019 { 00020 incomingTimeStamp[a] = teamMessageTimeStamp[a] = 0; 00021 } 00022 00023 int i; 00024 00025 // all ringbuffer elements are set to zero. 00026 for(int j=0;j< maxNumberOfTeamMessages ;j++) 00027 { 00028 for(int i=0;i<100;i++) offsets[j].add(0); 00029 offsets[j].init(); 00030 timeOffsetSum[j]=0; 00031 offsets[j].add(0); 00032 } 00033 00034 messagesSent = false; 00035 for(i=0;i< maxNumberOfTeamMessages ;i++) 00036 { 00037 teamMessages[i] = NULL; 00038 } 00039 00040 for(i=0;i< maxNumberOfTeamMessages ;i++) 00041 { 00042 teamMessagesForActualTeamMessages[i] = 0; 00043 } 00044 00045 numberOfInTeamMessages = 0; 00046 numberOfOutTeamMessages = 0; 00047 lastSendTime=0; 00048 sendNow = false; 00049 delay = 100; 00050 } 00051 00052 void TeamMessageCollection::processTimeStamps() 00053 { 00054 signed long actualOffset; 00055 for (int i=0; i < numberOfInTeamMessages; i++) 00056 { 00057 /* Offset = (1/2) * ( T2 - T1 + T3 - T4 ) = T5 - T4 00058 * 00059 * T1 = LastReceivedTimeStamp 00060 * T2 = IncomimgTimeStamp 00061 * T3 = TimeStamp 00062 * T4 = System-Time 00063 * T5 = System-Time of the other Robot 00064 * 00065 */ 00066 00067 actualOffset= ( (signed long)teamMessages[i]->incomingTimeStamp - 00068 (signed long)teamMessages[i]->lastReceivedTimeStamp + 00069 (signed long)teamMessages[i]->timeStamp - 00070 (signed long)SystemCall::getCurrentSystemTime() ) / 2 ; 00071 00072 // calculating the average of the values in the ringBuffer 00073 timeOffsetSum[i] += actualOffset; 00074 timeOffsetSum[i] -= offsets[i].getEntry(-1); 00075 00076 (const_cast<TeamMessage*>(teamMessages[i]))->timeOffset = 00077 //((TeamMessage*)teamMessages[i])->timeOffset = 00078 timeOffsetSum[i] / offsets[i].getNumberOfEntries(); 00079 offsets[i].add(actualOffset); 00080 00081 // Setting timeStamps in teamMessages 00082 outTeamMessages[i]->incomingTimeStamp = SystemCall::getCurrentSystemTime(); 00083 outTeamMessages[i]->lastReceivedTimeStamp = teamMessages[i]->timeStamp; 00084 00085 } 00086 INFO(sendTimeOffsets,idText,text,"TimeOffsets : " 00087 << teamMessages[0]->timeOffset << " " << teamMessages[0]->playerNumberOfSender <<" " 00088 << teamMessages[1]->timeOffset << " " << teamMessages[1]->playerNumberOfSender <<" " 00089 << teamMessages[2]->timeOffset << " " << teamMessages[2]->playerNumberOfSender); 00090 } 00091 00092 00093 void TeamMessageCollection::processMessages() 00094 { 00095 00096 numberOfTeamMessages = 0; 00097 for(int a=0;a< numberOfInTeamMessages;a++) { 00098 00099 // Reset sendXxx fields in the TeamMessages if they are send 00100 if (messagesSent) { 00101 ((TeamMessage*) outTeamMessages[a])->sendSeenBallPosition 00102 = outTeamMessages[a] -> sendBehaviorTeamMessage 00103 = outTeamMessages[a] -> sendRobotPose 00104 = false; 00105 messagesSent = false; 00106 } 00107 00108 // Set the teamMessagesForActualTeamMessages so that operator[] only returns actual 00109 // teamMessages. 00110 if (teamMessages[a]->isActual()) { 00111 teamMessagesForActualTeamMessages[numberOfTeamMessages++] = a; 00112 } 00113 } 00114 00115 processTimeStamps(); 00116 } 00117 00118 void TeamMessageCollection::setOutTeamMessages(TeamMessage& tm) 00119 { 00120 outTeamMessages[numberOfOutTeamMessages] = &tm; 00121 numberOfOutTeamMessages++; 00122 00123 } 00124 00125 void TeamMessageCollection::setInTeamMessages(TeamMessage& tm) 00126 { 00127 teamMessages[numberOfInTeamMessages] = &tm; 00128 numberOfInTeamMessages++; 00129 } 00130 00131 00132 void TeamMessageCollection::send(const RobotPose& robotPose,bool sendNow) const 00133 { 00134 for (int i=0;i< numberOfOutTeamMessages;i++) 00135 { 00136 outTeamMessages[i]->robotPose = robotPose ; 00137 outTeamMessages[i]->sendRobotPose = true; 00138 } 00139 this->sendNow |= sendNow; 00140 } 00141 00142 void TeamMessageCollection::send(const SeenBallPosition& seenBallPosition, bool sendNow) const 00143 { 00144 for (int i=0;i< numberOfOutTeamMessages;i++) 00145 { 00146 outTeamMessages[i]->seenBallPosition = seenBallPosition; 00147 outTeamMessages[i]->sendSeenBallPosition = true; 00148 } 00149 this->sendNow |= sendNow; 00150 } 00151 00152 void TeamMessageCollection::send(const BehaviorTeamMessage& behaviorTeamMessage,bool sendNow) const 00153 { 00154 for (int i=0;i< numberOfOutTeamMessages;i++) 00155 { 00156 outTeamMessages[i]->behaviorTeamMessage = behaviorTeamMessage; 00157 outTeamMessages[i]->sendBehaviorTeamMessage = true; 00158 } 00159 this->sendNow |= sendNow; 00160 } 00161 00162 bool TeamMessageCollection::processOutMessages() { 00163 00164 // is te delay over ? 00165 sendNow |= ((signed)(SystemCall::getCurrentSystemTime() - (signed) lastSendTime) > delay); 00166 if (sendNow) 00167 { 00168 // set timestamps for all outgoing TeamMessages 00169 for(int a=0;a< numberOfOutTeamMessages;a++) { 00170 outTeamMessages[a]->timeStamp = SystemCall::getCurrentSystemTime(); 00171 } 00172 00173 messagesSent = true; 00174 lastSendTime = SystemCall::getCurrentSystemTime(); 00175 sendNow = false; 00176 return (true); 00177 } 00178 else return (false); 00179 } 00180 00181 00182 void TeamMessageCollection::setDelay(int delay) 00183 { 00184 this->delay = delay; 00185 } 00186 00187 int TeamMessageCollection::getDelay() const 00188 { 00189 return (delay); 00190 } 00191 00192 00193 /* 00194 * Change log : 00195 * 00196 * $Log: TeamMessageCollection.cpp,v $ 00197 * Revision 1.1.1.1 2004/05/22 17:26:05 cvsadm 00198 * created new repository GT2004_WM 00199 * 00200 * Revision 1.4 2004/05/14 14:12:08 wachter 00201 * - Added communication support for 5 robots 00202 * - rewrote parts of team-communication to be faster and more stable 00203 * 00204 * Revision 1.3 2004/02/18 12:09:20 hamerla 00205 * add playernumber to Debugkey Timeoffset 00206 * 00207 * Revision 1.2 2003/12/06 17:45:33 loetzsch 00208 * replaced Player::playerRole (goalie, defender, striker1, striker2) 00209 * by Player::playerNumber (one, two, three, four) 00210 * 00211 * Revision 1.1 2003/10/07 10:09:36 cvsadm 00212 * Created GT2004 (M.J.) 00213 * 00214 * Revision 1.3 2003/09/26 15:27:27 juengel 00215 * Renamed DataTypes to representations. 00216 * 00217 * Revision 1.2 2003/07/02 19:14:23 loetzsch 00218 * bug fixes, removed unused functions 00219 * 00220 * Revision 1.1.1.1 2003/07/02 09:40:23 cvsadm 00221 * created new repository for the competitions in Padova from the 00222 * tamara CVS (Tuesday 2:00 pm) 00223 * 00224 * removed unused solutions 00225 * 00226 * Revision 1.5 2003/05/02 12:57:13 loetzsch 00227 * TeamMessage now contains a SeenBallPosition instead of a BallPercept 00228 * 00229 * Revision 1.4 2003/03/24 12:10:45 wachter 00230 * Fixed warning. 00231 * 00232 * Revision 1.3 2003/02/28 17:02:55 wachter 00233 * Reenabled trainer-syncronisation for RuhrpottHellhound-Behavior 00234 * 00235 * Revision 1.2 2003/02/25 12:55:40 wachter 00236 * made some attributes muteable 00237 * 00238 * Revision 1.1 2003/02/18 13:24:36 wachter 00239 * added new TeamMessageCollection and TeamMessage 00240 * 00241 * 00242 */ 00243 00244 00245 00246 00247