#include "Aria.h" /* This class contains the methods called by the connection callback functors. */ class ConnHandler { public: // Constructor ConnHandler(ArRobot *robot); // Destructor, its just empty ~ConnHandler(void) {} // called if the connection was sucessfully made void connected(void); // called if the connection failed. stop the robot processing thread. void connectionFailed(void); // called when the connection is closed void disconnected(void); // called if the connection is lost due to an error void connectionLost(void); protected: // keep a robot pointer ArRobot *myRobot; // the functor callbacks ArFunctorC<ConnHandler> myConnectedCB; ArFunctorC<ConnHandler> myConnFailCB; ArFunctorC<ConnHandler> myDisconnectedCB; ArFunctorC<ConnHandler> myConnLostCB; }; /* ConnHandler constructor. Initialize functor objects, then * add them as connection handler callbacks with the robot object. */ ConnHandler::ConnHandler(ArRobot *robot) : myConnectedCB(this, &ConnHandler::connected), myConnFailCB(this, &ConnHandler::connectionFailed), myDisconnectedCB(this, &ConnHandler::disconnected), myConnLostCB(this, &ConnHandler::connectionLost) { // keep a robot pointer for use by the handler callback methods myRobot = robot; // add the callbacks to the robot myRobot->addConnectCB(&myConnectedCB, ArListPos::FIRST); myRobot->addFailedConnectCB(&myConnFailCB, ArListPos::FIRST); myRobot->addDisconnectNormallyCB(&myDisconnectedCB, ArListPos::FIRST); myRobot->addDisconnectOnErrorCB(&myDisconnectedCB, ArListPos::FIRST); } // just exit if the connection failed void ConnHandler::connectionFailed(void) { ArLog::log(ArLog::Normal, "ConnHandler: Connection failed. Exiting the program."); exit(1); } void ConnHandler::connected(void) { ArLog::log(ArLog::Normal, "ConnHandler: Connected. Turning off sonar,"); // turn off sonar, turn off amigobot sounds myRobot->comInt(ArCommands::SONAR, 0); myRobot->comInt(ArCommands::SOUNDTOG, 0); } // disconnected void ConnHandler::disconnected(void) { ArLog::log(ArLog::Normal, "ConnHandler: Connection closed. Exiting the program."); exit(0); } // lost connection due to errror, exit void ConnHandler::connectionLost(void) { ArLog::log(ArLog::Normal, "ConnHandler: Lost connection due to an error! Exiting the program!"); exit(1); } int main(int argc, char **argv) { Aria::init(); ArRobot robot; ArArgumentParser argParser(&argc, argv); ArSimpleConnector con(&argParser); if(!Aria::parseArgs() || !argParser.checkHelpAndWarnUnparsed()) { Aria::logOptions(); return 1; } // Create a connection handler object, defined above, then try to connect to the // robot. ConnHandler ch(&robot); con.connectRobot(&robot); robot.runAsync(true); // Sleep for 10 seconds, then request that ArRobot stop its thread. ArLog::log(ArLog::Normal, "Sleeping for 10 seconds..."); ArUtil::sleep(10000); ArLog::log(ArLog::Normal, "...requesting that the robot thread exit, then shutting down ARIA and exiting."); robot.stopRunning(); Aria::shutdown(); return 0; }