Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages | Examples

ArServerHandlerCommMonitor.cpp

Go to the documentation of this file.
00001 /*
00002 MobileRobots Advanced Robotics Interface for Applications (ARIA)
00003 Copyright (C) 2004, 2005 ActivMedia Robotics LLC
00004 Copyright (C) 2006, 2007 MobileRobots Inc.
00005 
00006      This program is free software; you can redistribute it and/or modify
00007      it under the terms of the GNU General Public License as published by
00008      the Free Software Foundation; either version 2 of the License, or
00009      (at your option) any later version.
00010 
00011      This program is distributed in the hope that it will be useful,
00012      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014      GNU General Public License for more details.
00015 
00016      You should have received a copy of the GNU General Public License
00017      along with this program; if not, write to the Free Software
00018      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 If you wish to redistribute ARIA under different terms, contact 
00021 MobileRobots for information about a commercial version of ARIA at 
00022 robots@mobilerobots.com or 
00023 MobileRobots Inc, 19 Columbia Drive, Amherst, NH 03031; 800-639-9481
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   // Do not allow intervals too small...
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 } // end ctor
00095 
00096 
00097 ArServerHandlerCommMonitor::~ArServerHandlerCommMonitor()
00098 {
00099   // TODO Remove CBs from server?
00100 }
00101 
00102 
00103 AREXPORT void ArServerHandlerCommMonitor::handleGetHeartbeatInterval
00104                                               (ArServerClient *client, 
00105                                                ArNetPacket *packet)
00106 {
00107   if (client == NULL) {
00108     return; // Something very bad has happened...
00109   }
00110 
00111   ArNetPacket sendPacket;
00112   sendPacket.uByte4ToBuf(myHeartbeatInterval);
00113 
00114   client->sendPacketTcp(&sendPacket);
00115 
00116 } // end method handleGetHeartbeatInterval
00117 
00118 
00119 AREXPORT void ArServerHandlerCommMonitor::handleAckCommTcp(ArServerClient *client, 
00120                                                            ArNetPacket *packet)
00121 {
00122   if (client == NULL) {
00123     return; // Something very bad has happened...
00124   }
00125 
00126   ArNetPacket sendPacket;
00127 
00128   client->sendPacketTcp(&sendPacket);
00129 
00130 } // end method handleAckCommTcp
00131 
00132 
00133 AREXPORT void ArServerHandlerCommMonitor::handleAckCommUdp(ArServerClient *client, 
00134                                                            ArNetPacket *packet)
00135 {
00136   if (client == NULL) {
00137     return; // Something very bad has happened...
00138   }
00139 
00140   ArNetPacket sendPacket;
00141 
00142   client->sendPacketUdp(&sendPacket);
00143 
00144 } // end method handleAckCommUdp
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 } // end method cycleCallback
00161 
00162 
00163 

Generated on Tue Feb 20 10:51:50 2007 for ArNetworking by  doxygen 1.4.0