Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Platform/Aperios1.3.2/DDPHandler.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file  Platform/Aperios1.3.2/DDPHandler.cpp
00003 *
00004 * Handles the Dog Discovery Protocol (DDP) so that the robot
00005 * is able to find out the ip's of his teammates.
00006 *
00007 * @author <A href=mailto:robocup@m-wachter.de>Michael Wachter</A>
00008 * 
00009 */
00010 
00011 #include "DDPHandler.h"
00012 
00013 #include <stdio.h>
00014 #include <iostream.h>
00015 
00016 #include <tools/debugging/debugging.h>
00017 #include "NetConfig.h"
00018 
00019 DDPHandler::DDPHandler() :
00020 UDPEndpoint(2048,2048)
00021 {
00022   for(int i=0; i< Player::numOfPlayerNumbers - 1; i++)
00023     {
00024         list[i].ip   = IP_ADDR_ANY;
00025         list[i].port = 0;
00026         list[i].timeLastSeen = 0;
00027     }
00028     timeLastPackage = 0;
00029 }
00030 
00031 void DDPHandler::initDDPHandler()
00032 {
00033     bind(DDPPORT); 
00034 }
00035 
00036 void DDPHandler::onReceive(void* data, int size)
00037 {
00038     ASSERT(size == sizeof(DDPPackage));
00039     DDPPackage* package = static_cast<DDPPackage*>(data);
00040  
00041     INFO(sendDDPInfo,idText,text,"Incoming DDP package from " << ipOfLastPackage << 
00042           " " << package->teamIdentifier << " " << package->teamColor <<
00043           " " << package->playerNumber );
00044 
00045     // Is the package from the same team and color ?
00046     if ( (strcmp(package->teamIdentifier,getPlayer().getTeamName()) == 0)  &&
00047          (package->teamColor == getPlayer().getTeamColor()) &&
00048          !ipOfLastPackage.InLoop())
00049     {
00050        // cout << "Incoming DDP package is from own team \n" << flush;
00051        int fieldNumberToUpdate = -1;
00052        int ownPlayerNumber = (int)getPlayer().getPlayerNumber();
00053      if (package->playerNumber < ownPlayerNumber)
00054      {
00055        fieldNumberToUpdate = package->playerNumber;
00056      }
00057      else
00058      {
00059        fieldNumberToUpdate = package->playerNumber-1;
00060      }
00061 
00062      // cout << "package:" << package->playerNumber << " own:" << 
00063      // ownPlayerNumber << " update: " << fieldNumberToUpdate << " \n";
00064 
00065        // Update the list
00066        list[fieldNumberToUpdate].ip   = ipOfLastPackage;
00067        list[fieldNumberToUpdate].port = 0xA1BC; // not really used at the moment
00068        list[fieldNumberToUpdate].timeLastSeen = SystemCall::getCurrentSystemTime();
00069 
00070        INFO(sendDDPInfo,idText,text,"Known Dogs: " 
00071          << list[0].ip << "(" << SystemCall::getTimeSince(list[0].timeLastSeen) << "), " 
00072          << list[1].ip << "(" << SystemCall::getTimeSince(list[1].timeLastSeen) << "), " 
00073          << list[2].ip << "(" << SystemCall::getTimeSince(list[2].timeLastSeen) << ")" 
00074 /*#ifdef FIVEDOGS
00075      << "," << list[3].ip << "(" << SystemCall::getTimeSince(list[3].timeLastSeen) << ")"
00076 #endif   */
00077      );
00078        
00079     /*    cout << "Known Dogs: " 
00080          << list[0].ip << "(" << SystemCall::getTimeSince(list[0].timeLastSeen) << "), " 
00081          << list[1].ip << "(" << SystemCall::getTimeSince(list[1].timeLastSeen) << "), " 
00082          << list[2].ip << "(" << SystemCall::getTimeSince(list[2].timeLastSeen) << "), " 
00083      << list[3].ip << "(" << SystemCall::getTimeSince(list[3].timeLastSeen) << ")"; */
00084     }
00085 }
00086 
00087 void DDPHandler::sendDDPPackage()
00088 {
00089   if (SystemCall::getTimeSince(timeLastPackage) > 5000)
00090   {
00091     // Prepare package to send
00092     strcpy(thePackage.teamIdentifier, getPlayer().getTeamName());
00093     thePackage.teamColor = getPlayer().getTeamColor();
00094     thePackage.playerNumber = getPlayer().getPlayerNumber();
00095 
00096   // Broadcast package
00097     send(&thePackage,sizeof(thePackage),IP_ADDR_BROADCAST,DDPPORT);
00098     timeLastPackage = SystemCall::getCurrentSystemTime();
00099   }
00100 }
00101 
00102 
00103 
00104 /*
00105  * Change log :
00106  * 
00107  * $Log: DDPHandler.cpp,v $
00108  * Revision 1.4  2004/09/12 20:10:47  wachter
00109  * Documentation-fixes
00110  *
00111  * Revision 1.3  2004/09/08 12:41:43  wachter
00112  * - Fixed some warnings
00113  * - Fixed some documentation in network-code
00114  *
00115  * Revision 1.2  2004/06/16 09:24:07  roefer
00116  * ASSERT = -> == corrected, does it still work?
00117  *
00118  * Revision 1.1.1.1  2004/05/22 17:23:25  cvsadm
00119  * created new repository GT2004_WM
00120  *
00121  * Revision 1.6  2004/05/14 15:03:47  wachter
00122  * - really using network-configuration now
00123  *
00124  * Revision 1.5  2004/05/14 14:12:08  wachter
00125  * - Added communication support for 5 robots
00126  * - rewrote parts of team-communication to be faster and more stable
00127  *
00128  * Revision 1.4  2004/01/26 13:44:07  wachter
00129  * shared-memory-buffers now have variable sizes
00130  *
00131  * Revision 1.3  2004/01/21 17:33:08  wachter
00132  * UDP Team-communication now working with packets<1400 bytes.
00133  * Not activated at the moment.
00134  *
00135  * Revision 1.2  2004/01/09 15:44:30  wachter
00136  * Worked on with the Dog-Discovery-Protocol
00137  *
00138  * Revision 1.1  2003/12/21 19:27:02  wachter
00139  * Added classes for Sender/Receiver over TCP and UDP.
00140  * ( PLEASE DO NOT USE THIS NOW ! )
00141  *
00142  * 
00143  */
00144 

Generated on Thu Sep 23 19:57:34 2004 for GT2004 by doxygen 1.3.6