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 #include "Aria.h"
00027 #include "ArExport.h"
00028 #include "ArServerHandlerCommMonitor.h"
00029
00030 AREXPORT const char *ArServerHandlerCommMonitor::HEARTBEAT_TCP_PACKET_NAME = "heartbeatTcp";
00031 AREXPORT const char *ArServerHandlerCommMonitor::HEARTBEAT_UDP_PACKET_NAME = "heartbeatUdp";
00032
00033 AREXPORT const char *ArServerHandlerCommMonitor::GET_HEARTBEAT_INTERVAL_PACKET_NAME = "getHeartbeatInterval";
00034 AREXPORT const char *ArServerHandlerCommMonitor::ACK_COMM_TCP_PACKET_NAME = "ackCommTcp";
00035 AREXPORT const char *ArServerHandlerCommMonitor::ACK_COMM_UDP_PACKET_NAME = "ackCommUdp";
00036 AREXPORT const char *ArServerHandlerCommMonitor::COMMAND_GROUP = "RobotInfo";
00037 AREXPORT const char *ArServerHandlerCommMonitor::NO_ARGS = "None";
00038
00039
00040 ArServerHandlerCommMonitor::ArServerHandlerCommMonitor
00041 (ArServerBase *server,
00042 int heartbeatInterval) :
00043 myServer(server),
00044 myHeartbeatInterval(heartbeatInterval),
00045 myLastHeartbeatTime(),
00046 myGetHeartbeatIntervalCB(this, &ArServerHandlerCommMonitor::handleGetHeartbeatInterval),
00047 myAckCommUdpCB(this, &ArServerHandlerCommMonitor::handleAckCommUdp),
00048 myAckCommTcpCB(this, &ArServerHandlerCommMonitor::handleAckCommTcp),
00049 myCycleCB(this, &ArServerHandlerCommMonitor::cycleCallback)
00050 {
00051
00052 if (myHeartbeatInterval < MIN_HEARTBEAT_INTERVAL) {
00053 myHeartbeatInterval = DEFAULT_HEARTBEAT_INTERVAL;
00054 }
00055
00056 myServer->addData(HEARTBEAT_TCP_PACKET_NAME,
00057 "Packet is broadcast (TCP) at regular intervals to confirm that server is alive.",
00058 NULL,
00059 NO_ARGS,
00060 NO_ARGS,
00061 COMMAND_GROUP, "RETURN_SINGLE");
00062
00063 myServer->addData(HEARTBEAT_UDP_PACKET_NAME,
00064 "Packet is broadcast (UDP) at regular intervals to confirm that server is alive.",
00065 NULL,
00066 NO_ARGS,
00067 NO_ARGS,
00068 COMMAND_GROUP, "RETURN_SINGLE");
00069
00070 myServer->addData(GET_HEARTBEAT_INTERVAL_PACKET_NAME,
00071 "Gets the expected heartbeat interval (msecs); this is an approximate value depending on the server cycle time.",
00072 &myGetHeartbeatIntervalCB,
00073 NO_ARGS,
00074 "uByte4: expected heartbeat interval (msecs)",
00075 COMMAND_GROUP, "RETURN_SINGLE");
00076
00077 myServer->addData(ACK_COMM_TCP_PACKET_NAME,
00078 "Acknowledges two-way communication over TCP",
00079 &myAckCommTcpCB,
00080 NO_ARGS,
00081 NO_ARGS,
00082 COMMAND_GROUP, "RETURN_SINGLE");
00083
00084 myServer->addData(ACK_COMM_UDP_PACKET_NAME,
00085 "Acknowledges two-way communication over UDP",
00086 &myAckCommUdpCB,
00087 NO_ARGS,
00088 NO_ARGS,
00089 COMMAND_GROUP, "RETURN_SINGLE");
00090
00091
00092 myServer->addCycleCallback(&myCycleCB);
00093
00094 }
00095
00096
00097 ArServerHandlerCommMonitor::~ArServerHandlerCommMonitor()
00098 {
00099
00100 }
00101
00102
00103 AREXPORT void ArServerHandlerCommMonitor::handleGetHeartbeatInterval
00104 (ArServerClient *client,
00105 ArNetPacket *packet)
00106 {
00107 if (client == NULL) {
00108 return;
00109 }
00110
00111 ArNetPacket sendPacket;
00112 sendPacket.uByte4ToBuf(myHeartbeatInterval);
00113
00114 client->sendPacketTcp(&sendPacket);
00115
00116 }
00117
00118
00119 AREXPORT void ArServerHandlerCommMonitor::handleAckCommTcp(ArServerClient *client,
00120 ArNetPacket *packet)
00121 {
00122 if (client == NULL) {
00123 return;
00124 }
00125
00126 ArNetPacket sendPacket;
00127
00128 client->sendPacketTcp(&sendPacket);
00129
00130 }
00131
00132
00133 AREXPORT void ArServerHandlerCommMonitor::handleAckCommUdp(ArServerClient *client,
00134 ArNetPacket *packet)
00135 {
00136 if (client == NULL) {
00137 return;
00138 }
00139
00140 ArNetPacket sendPacket;
00141
00142 client->sendPacketUdp(&sendPacket);
00143
00144 }
00145
00146
00147 AREXPORT void ArServerHandlerCommMonitor::cycleCallback()
00148 {
00149 if (myLastHeartbeatTime.mSecSince() < myHeartbeatInterval) {
00150 return;
00151 }
00152
00153 ArNetPacket sendPacket;
00154
00155 myServer->broadcastPacketTcp(&sendPacket, HEARTBEAT_TCP_PACKET_NAME);
00156 myServer->broadcastPacketUdp(&sendPacket, HEARTBEAT_UDP_PACKET_NAME);
00157
00158 myLastHeartbeatTime.setToNow();
00159
00160 }
00161
00162
00163