00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef ARCENTRALFORWARDER_H
00027 #define ARCENTRALFORWARDER_H
00028
00029 #include "Aria.h"
00030 #include "ArServerBase.h"
00031 #include "ArClientBase.h"
00032
00036 class ArCentralForwarder
00037 {
00038 public:
00039 AREXPORT ArCentralForwarder(
00040 ArServerBase *mainServer, ArSocket *socket,
00041 const char *robotName, int startingPort, std::set<int> *usedPorts);
00042 AREXPORT ~ArCentralForwarder();
00043 ArServerBase *getServer(void) { return myServer; }
00044 ArClientBase *getClient(void) { return myClient; }
00045 int getPort(void) { return myPort; }
00046 const char *getRobotName(void) { return myRobotName.c_str(); }
00047 AREXPORT void netCentralHeartbeat(ArNetPacket *packet);
00048 AREXPORT bool callOnce(double heartbeatTimeout);
00049 AREXPORT bool isConnected(void) { return myState == STATE_CONNECTED; }
00050 protected:
00051 void serverClientRemoved(ArServerClient *client);
00052 void receiveData(ArNetPacket *packet);
00053 void requestChanged(long interval, unsigned int command);
00054 void requestOnce(ArServerClient *client, ArNetPacket *packet);
00055
00056 AREXPORT bool startingCallOnce(double heartbeatTimeout);
00057 AREXPORT bool connectingCallOnce(double heartbeatTimeout);
00058 AREXPORT bool connectedCallOnce(double heartbeatTimeout);
00059
00060 ArServerBase *myMainServer;
00061 ArSocket *mySocket;
00062 std::string myRobotName;
00063 int myStartingPort;
00064 std::set<int> *myUsedPorts;
00065
00066 enum State
00067 {
00068 STATE_STARTING,
00069 STATE_CONNECTING,
00070 STATE_CONNECTED
00071 };
00072
00073 ArServerBase *myServer;
00074 ArClientBase *myClient;
00075 State myState;
00076 int myPort;
00077 ArServerBase *server;
00078 ArClientBase *client;
00079
00080 enum ReturnType
00081 {
00082 RETURN_NONE,
00083 RETURN_SINGLE,
00084 RETURN_VIDEO,
00085 RETURN_UNTIL_EMPTY,
00086 RETURN_COMPLEX
00087 };
00088
00089 std::map<unsigned int, ReturnType> myReturnTypes;
00090 std::map<unsigned int, std::list<ArServerClient *> *> myRequestOnces;
00091 std::map<unsigned int, ArTime *> myLastRequest;
00092 std::map<unsigned int, ArTime *> myLastBroadcast;
00093
00094 ArTime myLastHeartbeat;
00095
00096 ArFunctor1C<ArCentralForwarder, ArNetPacket *> myReceiveDataFunctor;
00097 ArFunctor2C<ArCentralForwarder,
00098 long, unsigned int> myRequestChangedFunctor;
00099 ArFunctor2C<ArCentralForwarder,
00100 ArServerClient *, ArNetPacket *> myRequestOnceFunctor;
00101 ArFunctor1C<ArCentralForwarder,
00102 ArServerClient *> myServerClientRemovedCB;
00103 ArFunctor1C<ArCentralForwarder,
00104 ArNetPacket *> myNetCentralHeartbeatCB;
00105
00106 };
00107
00108
00109 #endif // ARSERVERSWITCHFORWARDER