From: <da...@us...> - 2007-06-26 18:29:19
|
Revision: 14393 http://bzflag.svn.sourceforge.net/bzflag/?rev=14393&view=rev Author: daxxar Date: 2007-06-26 11:29:14 -0700 (Tue, 26 Jun 2007) Log Message: ----------- initial import of "new protocol bzrc". basic protocol works (setAhead, setTurnLeft, setFire (does not wait for execute), getDistanceRemaining, getTurnRemaining, setSpeed, setTurnRate - and most important, execute) has the basic 'ticks'-setup working. anything that requires the bot to not be in a tick will "block" (not reply) until the current tick has elapsed. still has various segfaults - but i think this is a remnant from bzrc (not something I've introduced) Modified Paths: -------------- trunk/bzflag/src/bzrobots/RCLink.cxx trunk/bzflag/src/bzrobots/RCLink.h trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx trunk/bzflag/src/bzrobots/RCRobotPlayer.h trunk/bzflag/src/bzrobots/botplaying.cxx Modified: trunk/bzflag/src/bzrobots/RCLink.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.cxx 2007-06-26 07:39:45 UTC (rev 14392) +++ trunk/bzflag/src/bzrobots/RCLink.cxx 2007-06-26 18:29:14 UTC (rev 14393) @@ -387,6 +387,10 @@ } return req; } +RCRequest* RCLink::peekrequest() +{ + return requests; +} RCRequest::RCRequest() : fail(false), @@ -411,63 +415,61 @@ next(NULL) { char *endptr; - int index; // TODO: give a better error message if argc is wrong. if (strcasecmp(argv[0], "agent") == 0 && argc == 2) { request_type = HelloRequest; - } else if (strcasecmp(argv[0], "speed") == 0 && argc == 3) { - request_type = Speed; + } else if (strcasecmp(argv[0], "execute") == 0 && argc == 2) { + request_type = execute; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "setSpeed") == 0 && argc == 3) { + request_type = setSpeed; + set_robotindex(argv[1]); - index = strtol(argv[1], &endptr, 0); - if (endptr == argv[1]) { - index = -1; - fail = true; - failstr = "Invalid parameter for tank."; - } - set_robotindex(index); - - speed_level = strtof(argv[2], &endptr); + speed = strtof(argv[2], &endptr); if (endptr == argv[2]) { fail = true; failstr = "Invalid parameter for desired speed."; } - if (speed_level > 1.0) { - speed_level = 1.0; - } else if (speed_level < -1.0) { - speed_level = -1.0; - } - } else if (strcasecmp(argv[0], "angvel") == 0 && argc == 3) { - request_type = AngularVel; - index = strtol(argv[1], &endptr, 0); - if (endptr == argv[1]) { - index = -1; + speed = clamp(speed, 0.0f, 1.0f); + } else if (strcasecmp(argv[0], "setTurnRate") == 0 && argc == 3) { + request_type = setTurnRate; + set_robotindex(argv[1]); + + turnRate = strtof(argv[2], &endptr); + if (endptr == argv[2]) { fail = true; - failstr = "Invalid parameter for tank."; + failstr = "Invalid parameter for angular velocity."; } - set_robotindex(index); - angularvel_level = strtof(argv[2], &endptr); + turnRate = clamp(turnRate, 0.0f, 1.0f); + } else if (strcasecmp(argv[0], "setAhead") == 0 && argc == 3) { + request_type = setAhead; + set_robotindex(argv[1]); + + distance = strtof(argv[2], &endptr); if (endptr == argv[2]) { fail = true; - failstr = "Invalid parameter for angular velocity."; + failstr = "Invalid parameter for distance."; } - if (angularvel_level > 1.0) { - angularvel_level = 1.0; - } else if (angularvel_level < -1.0) { - angularvel_level = -1.0; - } - } else if (strcasecmp(argv[0], "shoot") == 0 && argc == 2) { - request_type = Shoot; + } else if (strcasecmp(argv[0], "setTurnLeft") == 0 && argc == 3) { + request_type = setTurnLeft; + set_robotindex(argv[1]); - index = strtol(argv[1], &endptr, 0); - if (endptr == argv[1]) { - index = -1; + turn = strtof(argv[2], &endptr); + if (endptr == argv[2]) { fail = true; - failstr = "Invalid parameter for tank."; + failstr = "Invalid parameter for turn."; } - set_robotindex(index); - + } else if (strcasecmp(argv[0], "setFire") == 0 && argc == 2) { + request_type = setFire; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "getDistanceRemaining") == 0 && argc == 2) { + request_type = getDistanceRemaining; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "getTurnRemaining") == 0 && argc == 2) { + request_type = getTurnRemaining; + set_robotindex(argv[1]); } else if (strcasecmp(argv[0], "teams") == 0 && argc == 1) { request_type = TeamListRequest; } else if (strcasecmp(argv[0], "bases") == 0 && argc == 1) { @@ -494,15 +496,30 @@ float elapsed = TimeKeeper::getCurrent() - TimeKeeper::getStartTime(); switch (request_type) { - case Speed: - link->respondf("ack %f speed %d %f\n", elapsed, get_robotindex(), speed_level); + case execute: + link->respondf("ack %f execute %d\n", elapsed, get_robotindex()); break; - case AngularVel: - link->respondf("ack %f angvel %d %f\n", elapsed, get_robotindex(), angularvel_level); + case setAhead: + link->respondf("ack %f setAhead %d %f\n", elapsed, get_robotindex(), distance); break; - case Shoot: - link->respondf("ack %f shoot %d\n", elapsed, get_robotindex()); + case setTurnLeft: + link->respondf("ack %f setTurnLeft %d %f\n", elapsed, get_robotindex(), turn); break; + case setSpeed: + link->respondf("ack %f setSpeed %d %f\n", elapsed, get_robotindex(), speed); + break; + case setTurnRate: + link->respondf("ack %f setTurnRate %d %f\n", elapsed, get_robotindex(), turnRate); + break; + case setFire: + link->respondf("ack %f setFire %d\n", elapsed, get_robotindex()); + break; + case getDistanceRemaining: + link->respondf("ack %f getDistanceRemaining %d\n", elapsed, get_robotindex()); + break; + case getTurnRemaining: + link->respondf("ack %f getTurnRemaining %d\n", elapsed, get_robotindex()); + break; case TeamListRequest: link->respondf("ack %f teams\n", elapsed); break; @@ -528,7 +545,7 @@ link->respondf("ack %f constants\n", elapsed); break; default: - link->respondf("ack %f\n"); + link->respondf("ack %f\n", elapsed); } } @@ -548,15 +565,33 @@ return robotindex; } -void RCRequest::set_robotindex(int index) +void RCRequest::set_robotindex(char *arg) { - if (index >= numRobots) { + char *endptr; + robotindex = strtol(arg, &endptr, 0); + if (endptr == arg) { robotindex = -1; - } else { - robotindex = index; + fail = true; + failstr = "Invalid parameter for tank."; } + else if (robotindex >= numRobots) { + robotindex = -1; + } } +// Mad cred to _neon_/#scene.no and runehol/#scene.no for these two sentences: +// * If val is nan, the result is undefined +// * If high < low, the result is undefined +template <class T> +T RCRequest::clamp(T val, T min, T max) +{ + if (val > max) + return max; + if (val < min) + return min; + return val; +} + agent_req_t RCRequest::get_request_type() { return request_type; Modified: trunk/bzflag/src/bzrobots/RCLink.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.h 2007-06-26 07:39:45 UTC (rev 14392) +++ trunk/bzflag/src/bzrobots/RCLink.h 2007-06-26 18:29:14 UTC (rev 14393) @@ -34,9 +34,14 @@ typedef enum { InvalidRequest, HelloRequest, - Speed, - AngularVel, - Shoot, + setSpeed, + setTurnRate, + setAhead, + setTurnLeft, + setFire, + getDistanceRemaining, + getTurnRemaining, + execute, TeamListRequest, BasesListRequest, ObstacleListRequest, @@ -44,7 +49,8 @@ ShotListRequest, MyTankListRequest, OtherTankListRequest, - ConstListRequest + ConstListRequest, + RequestCount } agent_req_t; class RCLink; @@ -61,12 +67,15 @@ void sendack(RCLink *link); void sendfail(RCLink *link); - float speed_level, angularvel_level; + float distance, turn; + float speed, turnRate; bool fail; char *failstr; private: - void set_robotindex(int index); + void set_robotindex(char *arg); + template <class T> + T clamp(T val, T min, T max); agent_req_t request_type; int robotindex; @@ -97,6 +106,7 @@ bool respond(char *message); bool respondf(const char *format, ...); RCRequest *poprequest(); + RCRequest *peekrequest(); private: enum State status; Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-06-26 07:39:45 UTC (rev 14392) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-06-26 18:29:14 UTC (rev 14393) @@ -30,9 +30,12 @@ const char* _email = "anonymous") : RobotPlayer(_id, _name, _server, _email), agent(_agent), - speed(0.0), - angularvel(0.0), - shoot(false) + lastTickAt(0.0), tickDuration(2.0), + speed(1.0), nextSpeed(1.0), + turnRate(1.0), nextTurnRate(1.0), + shoot(false), + distanceRemaining(0.0), nextDistance(0.0), + turnRemaining(0.0), nextTurn(0.0) { } @@ -45,8 +48,52 @@ void RCRobotPlayer::doUpdateMotion(float dt) { if (isAlive()) { - setDesiredSpeed(speed); - setDesiredAngVel(angularvel); + double timeNow = TimeKeeper::getCurrent().getSeconds(); + /* Is the tick still running? */ + if (lastTickAt + tickDuration >= timeNow) + { + if (distanceRemaining > 0.0f) + { + if (distanceForward) + { + setDesiredSpeed(speed); + distanceRemaining -= *getVelocity() * dt; + } + else + { + setDesiredSpeed(-speed); + distanceRemaining += *getVelocity() * dt; + } + } + else + { + setDesiredSpeed(0); + } + + if (turnRemaining > 0.0f) + { + if (turnLeft) + { + setDesiredAngVel(turnRate); + turnRemaining -= getAngularVelocity() * dt; + } + else + { + setDesiredAngVel(-turnRate); + turnRemaining += getAngularVelocity() * dt; + } + } + else + { + setDesiredAngVel(0); + } + } + else + { + setDesiredAngVel(0); + setDesiredSpeed(0); + } + } LocalPlayer::doUpdateMotion(dt); } @@ -61,21 +108,31 @@ LocalPlayer::restart(pos, _azimuth); } -void RCRobotPlayer::processrequest(RCRequest* req, +bool RCRobotPlayer::isInTick() +{ + double timeNow = TimeKeeper::getCurrent().getSeconds(); + /* last tick done? */ + if (lastTickAt + tickDuration >= timeNow) + return true; + return false; +} + +bool RCRobotPlayer::processrequest(RCRequest* req, RCLink* link) { + receivedUpdates[req->get_request_type()] = true; switch (req->get_request_type()) { - case Speed: - speed = req->speed_level; + case setSpeed: + nextSpeed = req->speed; link->respond("ok\n"); break; - case AngularVel: - angularvel = req->angularvel_level; + case setTurnRate: + nextTurnRate = req->turnRate; link->respond("ok\n"); break; - case Shoot: + case setFire: shoot = true; if (fireShot()) { link->respond("ok\n"); @@ -84,9 +141,71 @@ } break; + case setAhead: + nextDistance = req->distance; + link->respond("ok\n"); + break; + + case setTurnLeft: + nextTurn = req->turn; + link->respond("ok\n"); + break; + + case getDistanceRemaining: + if (isInTick()) + return false; + link->respondf("getDistanceRemaining %f\n", distanceRemaining); + break; + + case getTurnRemaining: + if (isInTick()) + return false; + link->respondf("getTurnRemaining %f\n", turnRemaining); + break; + + case execute: + if (isInTick()) + return false; + + lastTickAt = TimeKeeper::getCurrent().getSeconds(); + + if (receivedUpdates[setTurnLeft]) + { + turnRemaining = nextTurn; + if (turnRemaining < 0.0f) + { + turnRemaining = -turnRemaining; + turnLeft = false; + } + else + turnLeft = true; + } + + if (receivedUpdates[setAhead]) + { + distanceRemaining = nextDistance; + if (distanceRemaining < 0.0f) + { + distanceRemaining = -distanceRemaining; + distanceForward = false; + } + else + distanceForward = true; + } + + if (receivedUpdates[setTurnRate]) + turnRate = nextTurnRate; + if (receivedUpdates[setSpeed]) + speed = nextSpeed; + + for (int i = 0; i < RequestCount; ++i) + receivedUpdates[i] = false; + break; + default: break; } + return true; } Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.h 2007-06-26 07:39:45 UTC (rev 14392) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.h 2007-06-26 18:29:14 UTC (rev 14393) @@ -34,21 +34,30 @@ class RCRobotPlayer : public RobotPlayer { public: - RCRobotPlayer(const PlayerId&, - const char* name, ServerLink*, - RCLink*, - const char* _email); + RCRobotPlayer(const PlayerId&, + const char* name, ServerLink*, + RCLink*, + const char* _email); - void restart(const float* pos, float azimuth); - void explodeTank(); - void processrequest(RCRequest*, RCLink*); + void restart(const float* pos, float azimuth); + void explodeTank(); + bool processrequest(RCRequest*, RCLink*); private: - void doUpdate(float dt); - void doUpdateMotion(float dt); - RCLink* agent; - float speed, angularvel; - bool shoot; + void doUpdate(float dt); + void doUpdateMotion(float dt); + bool isInTick(); + RCLink* agent; + + double lastTickAt; + double tickDuration; + float speed, nextSpeed; + float turnRate, nextTurnRate; + bool shoot; + double distanceRemaining, nextDistance; + bool distanceForward, turnLeft; + double turnRemaining, nextTurn; + bool receivedUpdates[RequestCount]; }; #endif // BZF_TCP_RC_ROBOT_PLAYER_H Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-06-26 07:39:45 UTC (rev 14392) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-06-26 18:29:14 UTC (rev 14393) @@ -2623,23 +2623,31 @@ RCRobotPlayer* bot; int tankindex; - while ((req=rcLink->poprequest()) != NULL) { - req->sendack(rcLink); + while ((req = rcLink->peekrequest()) != NULL) { if (req->fail) { + rcLink->poprequest(); // Discard it. req->sendfail(rcLink); break; } switch (req->get_request_type()) { - case Speed: - case AngularVel: - case Shoot: + case execute: + case setSpeed: + case setTurnRate: + case setFire: + case setAhead: + case setTurnLeft: + case getDistanceRemaining: + case getTurnRemaining: tankindex = req->get_robotindex(); if (tankindex == -1) { rcLink->respondf("fail Invalid tank index.\n"); } else { bot = (RCRobotPlayer*)robots[tankindex]; - bot->processrequest(req, rcLink); + // We bail out if processing isn't ready or isn't valid. + // This happens e.g. if the last tick isn't done. + if (!bot->processrequest(req, rcLink)) + return; } break; case TeamListRequest: @@ -2669,6 +2677,9 @@ default: break; } + + rcLink->poprequest(); // Discard it, we're done with this one. + req->sendack(rcLink); } } @@ -3258,7 +3269,7 @@ } } -void updatePostions ( const float dt ) +void updatePositions ( const float dt ) { updateShots(dt); @@ -3276,7 +3287,7 @@ void doUpdates ( const float dt ) { - updatePostions(dt); + updatePositions(dt); checkEnvironment(dt); // update AutoHunt This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-06-27 00:12:17
|
Revision: 14397 http://bzflag.svn.sourceforge.net/bzflag/?rev=14397&view=rev Author: daxxar Date: 2007-06-26 17:12:17 -0700 (Tue, 26 Jun 2007) Log Message: ----------- svn:ignore for bzrobots updated. added getTickRemaining, getTickDuration, setTickDuration. Modified Paths: -------------- trunk/bzflag/src/bzrobots/RCLink.cxx trunk/bzflag/src/bzrobots/RCLink.h trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx trunk/bzflag/src/bzrobots/botplaying.cxx Property Changed: ---------------- trunk/bzflag/src/bzrobots/ Property changes on: trunk/bzflag/src/bzrobots ___________________________________________________________________ Name: svn:ignore - bzrobots Makefile.in Makefile .deps + bzrobots Makefile.in Makefile .deps .libs Modified: trunk/bzflag/src/bzrobots/RCLink.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.cxx 2007-06-26 23:25:53 UTC (rev 14396) +++ trunk/bzflag/src/bzrobots/RCLink.cxx 2007-06-27 00:12:17 UTC (rev 14397) @@ -459,7 +459,7 @@ turn = strtof(argv[2], &endptr); if (endptr == argv[2]) { fail = true; - failstr = "Invalid parameter for turn."; + failstr = "Invalid parameter for turn angle."; } } else if (strcasecmp(argv[0], "setFire") == 0 && argc == 2) { request_type = setFire; @@ -470,6 +470,21 @@ } else if (strcasecmp(argv[0], "getTurnRemaining") == 0 && argc == 2) { request_type = getTurnRemaining; set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "getTickDuration") == 0 && argc == 2) { + request_type = getTickDuration; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "setTickDuration") == 0 && argc == 3) { + request_type = setTickDuration; + set_robotindex(argv[1]); + + duration = strtof(argv[2], &endptr); + if (endptr == argv[2]) { + fail = true; + failstr = "Invalid parameter for setTickDuration."; + } + } else if (strcasecmp(argv[0], "getTickRemaining") == 0 && argc == 2) { + request_type = getTickRemaining; + set_robotindex(argv[1]); } else if (strcasecmp(argv[0], "teams") == 0 && argc == 1) { request_type = TeamListRequest; } else if (strcasecmp(argv[0], "bases") == 0 && argc == 1) { @@ -520,6 +535,15 @@ case getTurnRemaining: link->respondf("ack %f getTurnRemaining %d\n", elapsed, get_robotindex()); break; + case getTickRemaining: + link->respondf("ack %f getTickRemaining %d\n", elapsed, get_robotindex()); + break; + case getTickDuration: + link->respondf("ack %f getTickDuration %d\n", elapsed, get_robotindex()); + break; + case setTickDuration: + link->respondf("ack %f setTickDuration %d %f\n", elapsed, get_robotindex(), duration); + break; case TeamListRequest: link->respondf("ack %f teams\n", elapsed); break; Modified: trunk/bzflag/src/bzrobots/RCLink.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.h 2007-06-26 23:25:53 UTC (rev 14396) +++ trunk/bzflag/src/bzrobots/RCLink.h 2007-06-27 00:12:17 UTC (rev 14397) @@ -41,6 +41,9 @@ setFire, getDistanceRemaining, getTurnRemaining, + getTickRemaining, + getTickDuration, + setTickDuration, execute, TeamListRequest, BasesListRequest, @@ -69,6 +72,7 @@ float distance, turn; float speed, turnRate; + float duration; bool fail; char *failstr; Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-06-26 23:25:53 UTC (rev 14396) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-06-27 00:12:17 UTC (rev 14397) @@ -163,6 +163,21 @@ link->respondf("getTurnRemaining %f\n", turnRemaining); break; + case getTickDuration: + link->respondf("getTickDuration %f\n", tickDuration); + break; + + case setTickDuration: + tickDuration = req->duration; + break; + + case getTickRemaining: + if (isInTick()) + link->respondf("getTickRemaining %f\n", (lastTickAt + tickDuration) - TimeKeeper::getCurrent().getSeconds()); + else + link->respond("getTickRemaining 0.0\n"); + break; + case execute: if (isInTick()) return false; Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-06-26 23:25:53 UTC (rev 14396) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-06-27 00:12:17 UTC (rev 14397) @@ -2639,6 +2639,9 @@ case setTurnLeft: case getDistanceRemaining: case getTurnRemaining: + case getTickDuration: + case setTickDuration: + case getTickRemaining: tankindex = req->get_robotindex(); if (tankindex == -1) { rcLink->respondf("fail Invalid tank index.\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-06-27 15:06:04
|
Revision: 14414 http://bzflag.svn.sourceforge.net/bzflag/?rev=14414&view=rev Author: daxxar Date: 2007-06-27 08:06:05 -0700 (Wed, 27 Jun 2007) Log Message: ----------- setFire now waits till execute to fire. (acts like RoboCode too!) getGunHeat implemented (returns seconds till gun is ready) (not implementing getGunCoolingRate, as this is equivilant to getTickDuration. API will do this aliasing) Modified Paths: -------------- trunk/bzflag/src/bzrobots/RCLink.cxx trunk/bzflag/src/bzrobots/RCLink.h trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx trunk/bzflag/src/bzrobots/botplaying.cxx Modified: trunk/bzflag/src/bzrobots/RCLink.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.cxx 2007-06-27 14:43:30 UTC (rev 14413) +++ trunk/bzflag/src/bzrobots/RCLink.cxx 2007-06-27 15:06:05 UTC (rev 14414) @@ -464,6 +464,9 @@ } else if (strcasecmp(argv[0], "setFire") == 0 && argc == 2) { request_type = setFire; set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "getGunHeat") == 0 && argc == 2) { + request_type = getGunHeat; + set_robotindex(argv[1]); } else if (strcasecmp(argv[0], "getDistanceRemaining") == 0 && argc == 2) { request_type = getDistanceRemaining; set_robotindex(argv[1]); @@ -529,6 +532,9 @@ case setFire: link->respondf("ack %f setFire %d\n", elapsed, get_robotindex()); break; + case getGunHeat: + link->respondf("ack %f getGunHeat %d\n", elapsed, get_robotindex()); + break; case getDistanceRemaining: link->respondf("ack %f getDistanceRemaining %d\n", elapsed, get_robotindex()); break; Modified: trunk/bzflag/src/bzrobots/RCLink.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.h 2007-06-27 14:43:30 UTC (rev 14413) +++ trunk/bzflag/src/bzrobots/RCLink.h 2007-06-27 15:06:05 UTC (rev 14414) @@ -39,6 +39,7 @@ setAhead, setTurnLeft, setFire, + getGunHeat, getDistanceRemaining, getTurnRemaining, getTickRemaining, Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-06-27 14:43:30 UTC (rev 14413) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-06-27 15:06:05 UTC (rev 14414) @@ -134,13 +134,15 @@ case setFire: shoot = true; - if (fireShot()) { - link->respond("ok\n"); - } else { - link->respond("fail\n"); - } + link->respond("ok\n"); break; + case getGunHeat: + if (isInTick()) + return false; + link->respondf("getGunHeat %f\n", getReloadTime()); + break; + case setAhead: nextDistance = req->distance; link->respond("ok\n"); @@ -215,6 +217,13 @@ for (int i = 0; i < RequestCount; ++i) receivedUpdates[i] = false; + + if (shoot) + { + shoot = false; + fireShot(); + } + break; default: Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-06-27 14:43:30 UTC (rev 14413) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-06-27 15:06:05 UTC (rev 14414) @@ -2635,6 +2635,7 @@ case setSpeed: case setTurnRate: case setFire: + case getGunHeat: case setAhead: case setTurnLeft: case getDistanceRemaining: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-06-27 15:57:22
|
Revision: 14420 http://bzflag.svn.sourceforge.net/bzflag/?rev=14420&view=rev Author: daxxar Date: 2007-06-27 08:57:22 -0700 (Wed, 27 Jun 2007) Log Message: ----------- First step of work on a RCLinkFrontend. Separated some of the Backend-centric features from RCLink into RCLinkBackend. Next step is to implement more generic functionality into RCLink, create RCLinkFrontend, and either rework how RCRequest works, or make RCRequestBackend & RCRequestFront (or RCRequest and RCReply). Modified Paths: -------------- trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCLink.cxx trunk/bzflag/src/bzrobots/RCLink.h trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx trunk/bzflag/src/bzrobots/RCRobotPlayer.h trunk/bzflag/src/bzrobots/botplaying.cxx Added Paths: ----------- trunk/bzflag/src/bzrobots/RCLinkBackend.cxx trunk/bzflag/src/bzrobots/RCLinkBackend.h trunk/bzflag/src/bzrobots/RCRequest.cxx trunk/bzflag/src/bzrobots/RCRequest.h Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-06-27 15:08:56 UTC (rev 14419) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-06-27 15:57:22 UTC (rev 14420) @@ -27,6 +27,10 @@ botplaying.cxx \ RCLink.cxx \ RCLink.h \ + RCRequest.cxx \ + RCRequest.h \ + RCLinkBackend.cxx \ + RCLinkBackend.h \ RCRobotPlayer.cxx \ RCRobotPlayer.h \ ../bzflag/ActionBinding.cxx \ Modified: trunk/bzflag/src/bzrobots/RCLink.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.cxx 2007-06-27 15:08:56 UTC (rev 14419) +++ trunk/bzflag/src/bzrobots/RCLink.cxx 2007-06-27 15:57:22 UTC (rev 14420) @@ -24,14 +24,11 @@ #include "Roster.h" #include "RCRobotPlayer.h" -RCLink::RCLink(int _port) : - status(Disconnected), - listenfd(-1), - connfd(-1), - requests(NULL) +RCLink::RCLink() : + status(Disconnected), + listenfd(-1), + connfd(-1) { - port = _port; - startListening(); } RCLink::~RCLink() @@ -73,7 +70,8 @@ void RCLink::tryAccept() { - if (status != Listening) return; + if (status != Listening) + return; // O_NONBLOCK is set so we'll probably return immediately. connfd = accept(listenfd, NULL, 0); @@ -92,7 +90,7 @@ // Now we wait for them to introduce themselves. } -bool RCLink::respond(char* message) +bool RCLink::send(char* message) { if (output_overflow) { return false; @@ -117,7 +115,7 @@ * Use printf to send a message on the RCLink. We send all or nothing * (if we run out of buffer space). */ -bool RCLink::respondf(const char *format, ...) +bool RCLink::sendf(const char *format, ...) { va_list ap; int messagelen; @@ -194,454 +192,6 @@ return prev_send_amount - send_amount; } - -/* - * Fill up the receive buffer with any available incoming data. Return the - * number of bytes of data read or -1 if the connection has died. - */ -int RCLink::update_read() -{ - int prev_recv_amount = recv_amount; - - if (status != Connected && status != Connecting) { - return -1; - } - - // read in as much data as possible - while (true) { - if (recv_amount == RC_LINK_RECVBUFLEN) { - break; - } - - int nread = read(connfd, recvbuf+recv_amount, RC_LINK_RECVBUFLEN-recv_amount); - if (nread == 0) { - fprintf(stderr, "RCLink: Agent Closed Connection\n"); - status = Listening; - return -1; - } else if (nread == -1 && errno != EAGAIN) { - perror("RCLink: Read failed."); - status = SocketError; - return -1; - } else if (nread == -1) { - // got no data (remember, read is set to be nonblocking) - break; - } else { - recv_amount += nread; - } - } - - return recv_amount - prev_recv_amount; -} - - -/* - * Create as many RCRequest objects as possible (via parsecommand). - * Return the number created. - */ -int RCLink::update_parse(int maxlines) -{ - int ncommands = 0; - char *bufptr = recvbuf; - char *newline; - - if (recv_amount == 0) { - return 0; - } - - while (true) { - // Sometimes a remote agent will add unnecessary null characters after a - // newline. Drop them: - while (recv_amount >= 1 && *bufptr == '\0') { - bufptr++; - recv_amount--; - } - if (recv_amount == 0) { - break; - } - - newline = (char *)memchr(bufptr, '\n', recv_amount); - if (newline == NULL) { - if (input_toolong) { - // We're throwing out everything up to the next newline. - recv_amount = 0; - break; - } else { - // We need to read more before we can do anything. - break; - } - } else { - // We have a full input line. - recv_amount -= newline - bufptr + 1; - - if (input_toolong) { - input_toolong = false; - } else { - if (*bufptr == '\n' || (*bufptr == '\r' && *(bufptr+1) == '\n')) { - // empty line: ignore - } else { - *newline = '\0'; - if (parsecommand(bufptr)) { - ncommands++; - } - } - } - - bufptr = newline + 1; - - if (maxlines == 1) { - break; - } - } - } - - if (bufptr != recvbuf && recv_amount > 0) { - memmove(recvbuf, bufptr, recv_amount); - } - - if (recv_amount == RC_LINK_RECVBUFLEN) { - input_toolong = true; - fprintf(stderr, "RCLink: Input line too long. Discarding.\n"); - recv_amount = 0; - } - - return ncommands; -} - -/* - * Check for activity. If possible, fill up the recvbuf with incoming data - * and build up RCRequest objects as appropriate. - */ -void RCLink::update() -{ - if (status != Connected && status != Connecting) { - return; - } - - update_write(); - int amount = update_read(); - - if (amount == -1) { - status = Listening; - return; - } - - if (status == Connected) { - update_parse(); - } else if (status == Connecting) { - int ncommands = update_parse(1); - if (ncommands) { - RCRequest *req = poprequest(); - if (req && req->get_request_type() == HelloRequest) { - status = Connected; - } else { - fprintf(stderr, "RCLink: Expected a Hello.\n"); - write(connfd, RC_LINK_NOHELLO_MSG, strlen(RC_LINK_NOHELLO_MSG)); - close(connfd); - status = Listening; - } - } - } -} - -/* - * Parse a command, create an RCRequest object, and add it to requests. - * Return true if an RCRequest was successfully created. If it failed, - * return false. - */ -bool RCLink::parsecommand(char *cmdline) -{ - RCRequest *req; - int argc; - char *argv[RC_LINK_MAXARGS]; - char *s, *tkn; - - s = cmdline; - for (argc=0; argc<RC_LINK_MAXARGS; argc++) { - tkn = strtok(s, " \r\t"); - s = NULL; - argv[argc] = tkn; - if (tkn == NULL || *tkn == '\0') break; - } - - req = new RCRequest(argc, argv); - if (req->get_request_type() == InvalidRequest) { - fprintf(stderr, "RCLink: Invalid request: '%s'\n", argv[0]); - respondf("error Invalid request %s\n", argv[0]); - delete req; - return false; - } else { - if (requests == NULL) { - requests = req; - } else { - requests->append(req); - } - return true; - } -} - -RCRequest* RCLink::poprequest() -{ - RCRequest *req = requests; - if (req != NULL) { - requests = req->getnext(); - } - return req; -} -RCRequest* RCLink::peekrequest() -{ - return requests; -} - -RCRequest::RCRequest() : - fail(false), - failstr(NULL), - request_type(InvalidRequest), - next(NULL) -{ - request_type = InvalidRequest; -} - -RCRequest::RCRequest(agent_req_t reqtype) : - fail(false), - failstr(NULL), - request_type(reqtype), - next(NULL) -{ -} - -RCRequest::RCRequest(int argc, char **argv) : - fail(false), - failstr(NULL), - next(NULL) -{ - char *endptr; - // TODO: give a better error message if argc is wrong. - if (strcasecmp(argv[0], "agent") == 0 && argc == 2) { - request_type = HelloRequest; - } else if (strcasecmp(argv[0], "execute") == 0 && argc == 2) { - request_type = execute; - set_robotindex(argv[1]); - } else if (strcasecmp(argv[0], "setSpeed") == 0 && argc == 3) { - request_type = setSpeed; - set_robotindex(argv[1]); - - speed = strtof(argv[2], &endptr); - if (endptr == argv[2]) { - fail = true; - failstr = "Invalid parameter for desired speed."; - } - - speed = clamp(speed, 0.0f, 1.0f); - } else if (strcasecmp(argv[0], "setTurnRate") == 0 && argc == 3) { - request_type = setTurnRate; - set_robotindex(argv[1]); - - turnRate = strtof(argv[2], &endptr); - if (endptr == argv[2]) { - fail = true; - failstr = "Invalid parameter for angular velocity."; - } - - turnRate = clamp(turnRate, 0.0f, 1.0f); - } else if (strcasecmp(argv[0], "setAhead") == 0 && argc == 3) { - request_type = setAhead; - set_robotindex(argv[1]); - - distance = strtof(argv[2], &endptr); - if (endptr == argv[2]) { - fail = true; - failstr = "Invalid parameter for distance."; - } - } else if (strcasecmp(argv[0], "setTurnLeft") == 0 && argc == 3) { - request_type = setTurnLeft; - set_robotindex(argv[1]); - - turn = strtof(argv[2], &endptr); - if (endptr == argv[2]) { - fail = true; - failstr = "Invalid parameter for turn angle."; - } - } else if (strcasecmp(argv[0], "setFire") == 0 && argc == 2) { - request_type = setFire; - set_robotindex(argv[1]); - } else if (strcasecmp(argv[0], "getGunHeat") == 0 && argc == 2) { - request_type = getGunHeat; - set_robotindex(argv[1]); - } else if (strcasecmp(argv[0], "getDistanceRemaining") == 0 && argc == 2) { - request_type = getDistanceRemaining; - set_robotindex(argv[1]); - } else if (strcasecmp(argv[0], "getTurnRemaining") == 0 && argc == 2) { - request_type = getTurnRemaining; - set_robotindex(argv[1]); - } else if (strcasecmp(argv[0], "getTickDuration") == 0 && argc == 2) { - request_type = getTickDuration; - set_robotindex(argv[1]); - } else if (strcasecmp(argv[0], "setTickDuration") == 0 && argc == 3) { - request_type = setTickDuration; - set_robotindex(argv[1]); - - duration = strtof(argv[2], &endptr); - if (endptr == argv[2]) { - fail = true; - failstr = "Invalid parameter for setTickDuration."; - } - } else if (strcasecmp(argv[0], "getTickRemaining") == 0 && argc == 2) { - request_type = getTickRemaining; - set_robotindex(argv[1]); - } else if (strcasecmp(argv[0], "teams") == 0 && argc == 1) { - request_type = TeamListRequest; - } else if (strcasecmp(argv[0], "bases") == 0 && argc == 1) { - request_type = BasesListRequest; - } else if (strcasecmp(argv[0], "obstacles") == 0 && argc == 1) { - request_type = ObstacleListRequest; - } else if (strcasecmp(argv[0], "flags") == 0 && argc == 1) { - request_type = FlagListRequest; - } else if (strcasecmp(argv[0], "shots") == 0 && argc == 1) { - request_type = ShotListRequest; - } else if (strcasecmp(argv[0], "mytanks") == 0 && argc == 1) { - request_type = MyTankListRequest; - } else if (strcasecmp(argv[0], "othertanks") == 0 && argc == 1) { - request_type = OtherTankListRequest; - } else if (strcasecmp(argv[0], "constants") == 0 && argc == 1) { - request_type = ConstListRequest; - } else { - request_type = InvalidRequest; - } -} - -void RCRequest::sendack(RCLink *link) -{ - float elapsed = TimeKeeper::getCurrent() - TimeKeeper::getStartTime(); - - switch (request_type) { - case execute: - link->respondf("ack %f execute %d\n", elapsed, get_robotindex()); - break; - case setAhead: - link->respondf("ack %f setAhead %d %f\n", elapsed, get_robotindex(), distance); - break; - case setTurnLeft: - link->respondf("ack %f setTurnLeft %d %f\n", elapsed, get_robotindex(), turn); - break; - case setSpeed: - link->respondf("ack %f setSpeed %d %f\n", elapsed, get_robotindex(), speed); - break; - case setTurnRate: - link->respondf("ack %f setTurnRate %d %f\n", elapsed, get_robotindex(), turnRate); - break; - case setFire: - link->respondf("ack %f setFire %d\n", elapsed, get_robotindex()); - break; - case getGunHeat: - link->respondf("ack %f getGunHeat %d\n", elapsed, get_robotindex()); - break; - case getDistanceRemaining: - link->respondf("ack %f getDistanceRemaining %d\n", elapsed, get_robotindex()); - break; - case getTurnRemaining: - link->respondf("ack %f getTurnRemaining %d\n", elapsed, get_robotindex()); - break; - case getTickRemaining: - link->respondf("ack %f getTickRemaining %d\n", elapsed, get_robotindex()); - break; - case getTickDuration: - link->respondf("ack %f getTickDuration %d\n", elapsed, get_robotindex()); - break; - case setTickDuration: - link->respondf("ack %f setTickDuration %d %f\n", elapsed, get_robotindex(), duration); - break; - case TeamListRequest: - link->respondf("ack %f teams\n", elapsed); - break; - case BasesListRequest: - link->respondf("ack %f bases\n", elapsed); - break; - case ObstacleListRequest: - link->respondf("ack %f obstacles\n", elapsed); - break; - case FlagListRequest: - link->respondf("ack %f flags\n", elapsed); - break; - case ShotListRequest: - link->respondf("ack %f shots\n", elapsed); - break; - case MyTankListRequest: - link->respondf("ack %f mytanks\n", elapsed); - break; - case OtherTankListRequest: - link->respondf("ack %f othertanks\n", elapsed); - break; - case ConstListRequest: - link->respondf("ack %f constants\n", elapsed); - break; - default: - link->respondf("ack %f\n", elapsed); - } -} - -void RCRequest::sendfail(RCLink *link) -{ - if (fail) { - if (failstr) { - link->respondf("fail %s\n", failstr); - } else { - link->respond("fail\n"); - } - } -} - -int RCRequest::get_robotindex() -{ - return robotindex; -} - -void RCRequest::set_robotindex(char *arg) -{ - char *endptr; - robotindex = strtol(arg, &endptr, 0); - if (endptr == arg) { - robotindex = -1; - fail = true; - failstr = "Invalid parameter for tank."; - } - else if (robotindex >= numRobots) { - robotindex = -1; - } -} - -// Mad cred to _neon_/#scene.no and runehol/#scene.no for these two sentences: -// * If val is nan, the result is undefined -// * If high < low, the result is undefined -template <class T> -T RCRequest::clamp(T val, T min, T max) -{ - if (val > max) - return max; - if (val < min) - return min; - return val; -} - -agent_req_t RCRequest::get_request_type() -{ - return request_type; -} - -RCRequest *RCRequest::getnext() -{ - return next; -} - -void RCRequest::append(RCRequest *newreq) -{ - if (next == NULL) { - next = newreq; - } else { - next->append(newreq); - } -} - - // Local Variables: *** // mode:C++ *** // tab-width: 8 *** Modified: trunk/bzflag/src/bzrobots/RCLink.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.h 2007-06-27 15:08:56 UTC (rev 14419) +++ trunk/bzflag/src/bzrobots/RCLink.h 2007-06-27 15:57:22 UTC (rev 14420) @@ -11,8 +11,8 @@ */ /* - * Remote Control Link: Encapsulates communication between local player and - * remote agent. + * Remote Control Link: Encapsulates communication between backend and frontend. + * (This is the generic base-functionality) */ #ifndef BZF_RC_LINK_H @@ -31,62 +31,7 @@ " reading data!\n" #define RC_LINK_NOHELLO_MSG "error agent expected\n" #define RC_LINK_HELLO_STR "bzrobots 1\n" -typedef enum { - InvalidRequest, - HelloRequest, - setSpeed, - setTurnRate, - setAhead, - setTurnLeft, - setFire, - getGunHeat, - getDistanceRemaining, - getTurnRemaining, - getTickRemaining, - getTickDuration, - setTickDuration, - execute, - TeamListRequest, - BasesListRequest, - ObstacleListRequest, - FlagListRequest, - ShotListRequest, - MyTankListRequest, - OtherTankListRequest, - ConstListRequest, - RequestCount -} agent_req_t; -class RCLink; - -class RCRequest { - public: - RCRequest(); - RCRequest(agent_req_t reqtype); - RCRequest(int argc, char **argv); - RCRequest *getnext(); - void append(RCRequest *newreq); - int get_robotindex(); - agent_req_t get_request_type(); - void sendack(RCLink *link); - void sendfail(RCLink *link); - - float distance, turn; - float speed, turnRate; - float duration; - bool fail; - char *failstr; - - private: - void set_robotindex(char *arg); - template <class T> - T clamp(T val, T min, T max); - - agent_req_t request_type; - int robotindex; - RCRequest *next; -}; - class RCLink { public: enum State { @@ -97,30 +42,25 @@ Connected }; - RCLink(int port); ~RCLink(); void startListening(); void tryAccept(); - void update(); - int update_read(); - int update_parse(int maxlines=0); int update_write(); - bool parsecommand(char *cmd); void detach_agents(); - bool respond(char *message); - bool respondf(const char *format, ...); - RCRequest *poprequest(); - RCRequest *peekrequest(); + bool send(char *message); + bool sendf(const char *format, ...); - private: + protected: + /* We don't allow instanciating this directly - you have to instanciate RCLinkBackend or RClinkFrontend. */ + RCLink(); + enum State status; int listenfd, connfd; int port; char recvbuf[RC_LINK_RECVBUFLEN]; char sendbuf[RC_LINK_SENDBUFLEN]; int recv_amount, send_amount; - RCRequest *requests; bool input_toolong, output_overflow; }; Added: trunk/bzflag/src/bzrobots/RCLinkBackend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-06-27 15:57:22 UTC (rev 14420) @@ -0,0 +1,224 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <sys/socket.h> +#include <arpa/inet.h> +#include <fcntl.h> +#include <errno.h> +#include <stdarg.h> + +#include "RCLinkBackend.h" + +RCLinkBackend::RCLinkBackend(int _port) :RCLink(), + requests(NULL) +{ + port = _port; + startListening(); +} + +/* + * Fill up the receive buffer with any available incoming data. Return the + * number of bytes of data read or -1 if the connection has died. + */ +int RCLinkBackend::update_read() +{ + int prev_recv_amount = recv_amount; + + if (status != Connected && status != Connecting) { + return -1; + } + + // read in as much data as possible + while (true) { + if (recv_amount == RC_LINK_RECVBUFLEN) { + break; + } + + int nread = read(connfd, recvbuf+recv_amount, RC_LINK_RECVBUFLEN-recv_amount); + if (nread == 0) { + fprintf(stderr, "RCLink: Agent Closed Connection\n"); + status = Listening; + return -1; + } else if (nread == -1 && errno != EAGAIN) { + perror("RCLink: Read failed."); + status = SocketError; + return -1; + } else if (nread == -1) { + // got no data (remember, read is set to be nonblocking) + break; + } else { + recv_amount += nread; + } + } + + return recv_amount - prev_recv_amount; +} + + +/* + * Create as many RCRequest objects as possible (via parsecommand). + * Return the number created. + */ +int RCLinkBackend::update_parse(int maxlines) +{ + int ncommands = 0; + char *bufptr = recvbuf; + char *newline; + + if (recv_amount == 0) { + return 0; + } + + while (true) { + // Sometimes a remote agent will add unnecessary null characters after a + // newline. Drop them: + while (recv_amount >= 1 && *bufptr == '\0') { + bufptr++; + recv_amount--; + } + if (recv_amount == 0) { + break; + } + + newline = (char *)memchr(bufptr, '\n', recv_amount); + if (newline == NULL) { + if (input_toolong) { + // We're throwing out everything up to the next newline. + recv_amount = 0; + break; + } else { + // We need to read more before we can do anything. + break; + } + } else { + // We have a full input line. + recv_amount -= newline - bufptr + 1; + + if (input_toolong) { + input_toolong = false; + } else { + if (*bufptr == '\n' || (*bufptr == '\r' && *(bufptr+1) == '\n')) { + // empty line: ignore + } else { + *newline = '\0'; + if (parsecommand(bufptr)) { + ncommands++; + } + } + } + + bufptr = newline + 1; + + if (maxlines == 1) { + break; + } + } + } + + if (bufptr != recvbuf && recv_amount > 0) { + memmove(recvbuf, bufptr, recv_amount); + } + + if (recv_amount == RC_LINK_RECVBUFLEN) { + input_toolong = true; + fprintf(stderr, "RCLink: Input line too long. Discarding.\n"); + recv_amount = 0; + } + + return ncommands; +} + +/* + * Check for activity. If possible, fill up the recvbuf with incoming data + * and build up RCRequest objects as appropriate. + */ +void RCLinkBackend::update() +{ + if (status != Connected && status != Connecting) { + return; + } + + update_write(); + int amount = update_read(); + + if (amount == -1) { + status = Listening; + return; + } + + if (status == Connected) { + update_parse(); + } else if (status == Connecting) { + int ncommands = update_parse(1); + if (ncommands) { + RCRequest *req = poprequest(); + if (req && req->get_request_type() == HelloRequest) { + status = Connected; + } else { + fprintf(stderr, "RCLink: Expected a Hello.\n"); + write(connfd, RC_LINK_NOHELLO_MSG, strlen(RC_LINK_NOHELLO_MSG)); + close(connfd); + status = Listening; + } + } + } +} + +/* + * Parse a command, create an RCRequest object, and add it to requests. + * Return true if an RCRequest was successfully created. If it failed, + * return false. + */ +bool RCLinkBackend::parsecommand(char *cmdline) +{ + RCRequest *req; + int argc; + char *argv[RC_LINK_MAXARGS]; + char *s, *tkn; + + s = cmdline; + for (argc=0; argc<RC_LINK_MAXARGS; argc++) { + tkn = strtok(s, " \r\t"); + s = NULL; + argv[argc] = tkn; + if (tkn == NULL || *tkn == '\0') break; + } + + req = new RCRequest(argc, argv); + if (req->get_request_type() == InvalidRequest) { + fprintf(stderr, "RCLink: Invalid request: '%s'\n", argv[0]); + sendf("error Invalid request %s\n", argv[0]); + delete req; + return false; + } else { + if (requests == NULL) { + requests = req; + } else { + requests->append(req); + } + return true; + } +} + +RCRequest* RCLinkBackend::poprequest() +{ + RCRequest *req = requests; + if (req != NULL) { + requests = req->getnext(); + } + return req; +} +RCRequest* RCLinkBackend::peekrequest() +{ + return requests; +} + Added: trunk/bzflag/src/bzrobots/RCLinkBackend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.h (rev 0) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.h 2007-06-27 15:57:22 UTC (rev 14420) @@ -0,0 +1,47 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Remote Control Link, Backend: Encapsulates communication between backend and + * frontend, from the backends point of view. + */ + +#ifndef BZF_RC_LINK_BACKEND_H +#define BZF_RC_LINK_BACKEND_H + +#include "RCLink.h" +#include "RCRequest.h" + +class RCLinkBackend : public RCLink +{ + private: + RCRequest *requests; + + public: + RCLinkBackend(int port); + int update_read(); + int update_parse(int maxlines = 0); + void update(); + bool parsecommand(char *cmdline); + RCRequest* poprequest(); + RCRequest* peekrequest(); +}; + +#endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Added: trunk/bzflag/src/bzrobots/RCRequest.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-06-27 15:57:22 UTC (rev 14420) @@ -0,0 +1,251 @@ +#include "RCRequest.h" +#include "Roster.h" + +RCRequest::RCRequest() : + fail(false), + failstr(NULL), + request_type(InvalidRequest), + next(NULL) +{ + request_type = InvalidRequest; +} + +RCRequest::RCRequest(agent_req_t reqtype) : + fail(false), + failstr(NULL), + request_type(reqtype), + next(NULL) +{ +} + +RCRequest::RCRequest(int argc, char **argv) : + fail(false), + failstr(NULL), + next(NULL) +{ + char *endptr; + // TODO: give a better error message if argc is wrong. + if (strcasecmp(argv[0], "agent") == 0 && argc == 2) { + request_type = HelloRequest; + } else if (strcasecmp(argv[0], "execute") == 0 && argc == 2) { + request_type = execute; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "setSpeed") == 0 && argc == 3) { + request_type = setSpeed; + set_robotindex(argv[1]); + + speed = strtof(argv[2], &endptr); + if (endptr == argv[2]) { + fail = true; + failstr = "Invalid parameter for desired speed."; + } + + speed = clamp(speed, 0.0f, 1.0f); + } else if (strcasecmp(argv[0], "setTurnRate") == 0 && argc == 3) { + request_type = setTurnRate; + set_robotindex(argv[1]); + + turnRate = strtof(argv[2], &endptr); + if (endptr == argv[2]) { + fail = true; + failstr = "Invalid parameter for angular velocity."; + } + + turnRate = clamp(turnRate, 0.0f, 1.0f); + } else if (strcasecmp(argv[0], "setAhead") == 0 && argc == 3) { + request_type = setAhead; + set_robotindex(argv[1]); + + distance = strtof(argv[2], &endptr); + if (endptr == argv[2]) { + fail = true; + failstr = "Invalid parameter for distance."; + } + } else if (strcasecmp(argv[0], "setTurnLeft") == 0 && argc == 3) { + request_type = setTurnLeft; + set_robotindex(argv[1]); + + turn = strtof(argv[2], &endptr); + if (endptr == argv[2]) { + fail = true; + failstr = "Invalid parameter for turn angle."; + } + } else if (strcasecmp(argv[0], "setFire") == 0 && argc == 2) { + request_type = setFire; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "getGunHeat") == 0 && argc == 2) { + request_type = getGunHeat; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "getDistanceRemaining") == 0 && argc == 2) { + request_type = getDistanceRemaining; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "getTurnRemaining") == 0 && argc == 2) { + request_type = getTurnRemaining; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "getTickDuration") == 0 && argc == 2) { + request_type = getTickDuration; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "setTickDuration") == 0 && argc == 3) { + request_type = setTickDuration; + set_robotindex(argv[1]); + + duration = strtof(argv[2], &endptr); + if (endptr == argv[2]) { + fail = true; + failstr = "Invalid parameter for setTickDuration."; + } + } else if (strcasecmp(argv[0], "getTickRemaining") == 0 && argc == 2) { + request_type = getTickRemaining; + set_robotindex(argv[1]); + } else if (strcasecmp(argv[0], "teams") == 0 && argc == 1) { + request_type = TeamListRequest; + } else if (strcasecmp(argv[0], "bases") == 0 && argc == 1) { + request_type = BasesListRequest; + } else if (strcasecmp(argv[0], "obstacles") == 0 && argc == 1) { + request_type = ObstacleListRequest; + } else if (strcasecmp(argv[0], "flags") == 0 && argc == 1) { + request_type = FlagListRequest; + } else if (strcasecmp(argv[0], "shots") == 0 && argc == 1) { + request_type = ShotListRequest; + } else if (strcasecmp(argv[0], "mytanks") == 0 && argc == 1) { + request_type = MyTankListRequest; + } else if (strcasecmp(argv[0], "othertanks") == 0 && argc == 1) { + request_type = OtherTankListRequest; + } else if (strcasecmp(argv[0], "constants") == 0 && argc == 1) { + request_type = ConstListRequest; + } else { + request_type = InvalidRequest; + } +} + +void RCRequest::sendack(RCLink *link) +{ + float elapsed = TimeKeeper::getCurrent() - TimeKeeper::getStartTime(); + + switch (request_type) { + case execute: + link->sendf("ack %f execute %d\n", elapsed, get_robotindex()); + break; + case setAhead: + link->sendf("ack %f setAhead %d %f\n", elapsed, get_robotindex(), distance); + break; + case setTurnLeft: + link->sendf("ack %f setTurnLeft %d %f\n", elapsed, get_robotindex(), turn); + break; + case setSpeed: + link->sendf("ack %f setSpeed %d %f\n", elapsed, get_robotindex(), speed); + break; + case setTurnRate: + link->sendf("ack %f setTurnRate %d %f\n", elapsed, get_robotindex(), turnRate); + break; + case setFire: + link->sendf("ack %f setFire %d\n", elapsed, get_robotindex()); + break; + case getGunHeat: + link->sendf("ack %f getGunHeat %d\n", elapsed, get_robotindex()); + break; + case getDistanceRemaining: + link->sendf("ack %f getDistanceRemaining %d\n", elapsed, get_robotindex()); + break; + case getTurnRemaining: + link->sendf("ack %f getTurnRemaining %d\n", elapsed, get_robotindex()); + break; + case getTickRemaining: + link->sendf("ack %f getTickRemaining %d\n", elapsed, get_robotindex()); + break; + case getTickDuration: + link->sendf("ack %f getTickDuration %d\n", elapsed, get_robotindex()); + break; + case setTickDuration: + link->sendf("ack %f setTickDuration %d %f\n", elapsed, get_robotindex(), duration); + break; + case TeamListRequest: + link->sendf("ack %f teams\n", elapsed); + break; + case BasesListRequest: + link->sendf("ack %f bases\n", elapsed); + break; + case ObstacleListRequest: + link->sendf("ack %f obstacles\n", elapsed); + break; + case FlagListRequest: + link->sendf("ack %f flags\n", elapsed); + break; + case ShotListRequest: + link->sendf("ack %f shots\n", elapsed); + break; + case MyTankListRequest: + link->sendf("ack %f mytanks\n", elapsed); + break; + case OtherTankListRequest: + link->sendf("ack %f othertanks\n", elapsed); + break; + case ConstListRequest: + link->sendf("ack %f constants\n", elapsed); + break; + default: + link->sendf("ack %f\n", elapsed); + } +} + +void RCRequest::sendfail(RCLink *link) +{ + if (fail) { + if (failstr) { + link->sendf("fail %s\n", failstr); + } else { + link->send("fail\n"); + } + } +} + +int RCRequest::get_robotindex() +{ + return robotindex; +} + +void RCRequest::set_robotindex(char *arg) +{ + char *endptr; + robotindex = strtol(arg, &endptr, 0); + if (endptr == arg) { + robotindex = -1; + fail = true; + failstr = "Invalid parameter for tank."; + } + else if (robotindex >= numRobots) { + robotindex = -1; + } +} + +// Mad cred to _neon_/#scene.no and runehol/#scene.no for these two sentences: +// * If val is nan, the result is undefined +// * If high < low, the result is undefined +template <class T> +T RCRequest::clamp(T val, T min, T max) +{ + if (val > max) + return max; + if (val < min) + return min; + return val; +} + +agent_req_t RCRequest::get_request_type() +{ + return request_type; +} + +RCRequest *RCRequest::getnext() +{ + return next; +} + +void RCRequest::append(RCRequest *newreq) +{ + if (next == NULL) { + next = newreq; + } else { + next->append(newreq); + } +} Added: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h (rev 0) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-06-27 15:57:22 UTC (rev 14420) @@ -0,0 +1,88 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Remote Control Request: Encapsulates requests between backend and frontend + */ + +#ifndef BZF_RC_REQUEST_H +#define BZF_RC_REQUEST_H + +#include "common.h" + +typedef enum { + InvalidRequest, + HelloRequest, + setSpeed, + setTurnRate, + setAhead, + setTurnLeft, + setFire, + getGunHeat, + getDistanceRemaining, + getTurnRemaining, + getTickRemaining, + getTickDuration, + setTickDuration, + execute, + TeamListRequest, + BasesListRequest, + ObstacleListRequest, + FlagListRequest, + ShotListRequest, + MyTankListRequest, + OtherTankListRequest, + ConstListRequest, + RequestCount +} agent_req_t; + +class RCLink; + +class RCRequest { + public: + RCRequest(); + RCRequest(agent_req_t reqtype); + RCRequest(int argc, char **argv); + RCRequest *getnext(); + void append(RCRequest *newreq); + int get_robotindex(); + agent_req_t get_request_type(); + void sendack(RCLink *link); + void sendfail(RCLink *link); + + float distance, turn; + float speed, turnRate; + float duration; + bool fail; + char *failstr; + + private: + void set_robotindex(char *arg); + template <class T> + T clamp(T val, T min, T max); + + agent_req_t request_type; + int robotindex; + RCRequest *next; +}; + +#include "RCLink.h" + +#endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-06-27 15:08:56 UTC (rev 14419) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-06-27 15:57:22 UTC (rev 14420) @@ -26,7 +26,7 @@ #include "TargetingUtils.h" RCRobotPlayer::RCRobotPlayer(const PlayerId& _id, const char* _name, - ServerLink* _server, RCLink* _agent, + ServerLink* _server, RCLinkBackend* _agent, const char* _email = "anonymous") : RobotPlayer(_id, _name, _server, _email), agent(_agent), @@ -108,7 +108,7 @@ LocalPlayer::restart(pos, _azimuth); } -bool RCRobotPlayer::isInTick() +bool RCRobotPlayer::isSteadyState() { double timeNow = TimeKeeper::getCurrent().getSeconds(); /* last tick done? */ @@ -118,55 +118,55 @@ } bool RCRobotPlayer::processrequest(RCRequest* req, - RCLink* link) + RCLinkBackend* link) { receivedUpdates[req->get_request_type()] = true; switch (req->get_request_type()) { case setSpeed: nextSpeed = req->speed; - link->respond("ok\n"); + link->send("ok\n"); break; case setTurnRate: nextTurnRate = req->turnRate; - link->respond("ok\n"); + link->send("ok\n"); break; case setFire: shoot = true; - link->respond("ok\n"); + link->send("ok\n"); break; case getGunHeat: - if (isInTick()) + if (isSteadyState()) return false; - link->respondf("getGunHeat %f\n", getReloadTime()); + link->sendf("getGunHeat %f\n", getReloadTime()); break; case setAhead: nextDistance = req->distance; - link->respond("ok\n"); + link->send("ok\n"); break; case setTurnLeft: nextTurn = req->turn; - link->respond("ok\n"); + link->send("ok\n"); break; case getDistanceRemaining: - if (isInTick()) + if (isSteadyState()) return false; - link->respondf("getDistanceRemaining %f\n", distanceRemaining); + link->sendf("getDistanceRemaining %f\n", distanceRemaining); break; case getTurnRemaining: - if (isInTick()) + if (isSteadyState()) return false; - link->respondf("getTurnRemaining %f\n", turnRemaining); + link->sendf("getTurnRemaining %f\n", turnRemaining); break; case getTickDuration: - link->respondf("getTickDuration %f\n", tickDuration); + link->sendf("getTickDuration %f\n", tickDuration); break; case setTickDuration: @@ -174,14 +174,14 @@ break; case getTickRemaining: - if (isInTick()) - link->respondf("getTickRemaining %f\n", (lastTickAt + tickDuration) - TimeKeeper::getCurrent().getSeconds()); + if (isSteadyState()) + link->sendf("getTickRemaining %f\n", (lastTickAt + tickDuration) - TimeKeeper::getCurrent().getSeconds()); else - link->respond("getTickRemaining 0.0\n"); + link->send("getTickRemaining 0.0\n"); break; case execute: - if (isInTick()) + if (isSteadyState()) return false; lastTickAt = TimeKeeper::getCurrent().getSeconds(); Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.h 2007-06-27 15:08:56 UTC (rev 14419) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.h 2007-06-27 15:57:22 UTC (rev 14420) @@ -29,25 +29,25 @@ #include "Region.h" #include "RegionPriorityQueue.h" #include "ServerLink.h" -#include "RCLink.h" +#include "RCLinkBackend.h" class RCRobotPlayer : public RobotPlayer { public: RCRobotPlayer(const PlayerId&, const char* name, ServerLink*, - RCLink*, + RCLinkBackend*, const char* _email); void restart(const float* pos, float azimuth); void explodeTank(); - bool processrequest(RCRequest*, RCLink*); + bool processrequest(RCRequest*, RCLinkBackend*); private: void doUpdate(float dt); void doUpdateMotion(float dt); - bool isInTick(); - RCLink* agent; + bool isSteadyState(); + RCLinkBackend* agent; double lastTickAt; double tickDuration; Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-06-27 15:08:56 UTC (rev 14419) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-06-27 15:57:22 UTC (rev 14420) @@ -57,7 +57,7 @@ #include "WordFilter.h" // local implementation headers -#include "RCLink.h" +#include "RCLinkBackend.h" #include "AutoPilot.h" #include "bzflag.h" #include "commands.h" @@ -84,7 +84,7 @@ ServerLink* serverLink = NULL; static World *world = NULL; LocalPlayer* observerTank = NULL; -RCLink* rcLink = NULL; +RCLinkBackend* rcLink = NULL; static Team* teams = NULL; int numFlags = 0; static bool joinRequested = false; @@ -2308,14 +2308,14 @@ float corners[4][2]; getObsCorners(base, false, corners); - rcLink->respondf("base %s", teamname); + rcLink->sendf("base %s", teamname); for (int i=0; i < 4; i++) { float* point = corners[i]; - rcLink->respondf(" %f %f", point[0], point[1]); + rcLink->sendf(" %f %f", point[0], point[1]); } - rcLink->respond("\n"); + rcLink->send("\n"); } static void sendBasesList() @@ -2324,7 +2324,7 @@ const ObstacleList& bases = OBSTACLEMGR.getBases(); const int numBases = bases.size(); - rcLink->respond("begin\n"); + rcLink->send("begin\n"); for (int i = 0; i < numBases; i++) { BaseBuilding* base = (BaseBuilding*) bases[i]; @@ -2332,7 +2332,7 @@ sendBase(base, Team::getShortName(color)); } - rcLink->respond("end\n"); + rcLink->send("end\n"); } static void sendObstacle(Obstacle *obs) @@ -2342,15 +2342,15 @@ getObsCorners(obs, true, corners); - rcLink->respond("obstacle"); + rcLink->send("obstacle"); for (int i=0; i < 4; i++) { float* point = corners[i]; - rcLink->respondf(" %f %f", gauss(point[0], posnoise), \ + rcLink->sendf(" %f %f", gauss(point[0], posnoise), \ gauss(point[1], posnoise)); } - rcLink->respond("\n"); + rcLink->send("\n"); } static void sendObsList() @@ -2365,7 +2365,7 @@ const ObstacleList& meshes = OBSTACLEMGR.getMeshes(); const int numMeshes = meshes.size(); - rcLink->respond("begin\n"); + rcLink->send("begin\n"); for (i = 0; i < numBoxes; i++) { sendObstacle(boxes[i]); @@ -2380,7 +2380,7 @@ sendObstacle(meshes[i]); } - rcLink->respond("end\n"); + rcLink->send("end\n"); } static void sendTeamList() @@ -2390,33 +2390,33 @@ const Team& blueteam = world->getTeam(BlueTeam); const Team& purpleteam = world->getTeam(PurpleTeam); - rcLink->respond("begin\n"); + rcLink->send("begin\n"); // Note that we only look at the first base if (redteam.size > 0) { - rcLink->respondf("team %s %d\n", Team::getShortName(RedTeam), + rcLink->sendf("team %s %d\n", Team::getShortName(RedTeam), redteam.size); } if (greenteam.size > 0) { - rcLink->respondf("team %s %d\n", Team::getShortName(GreenTeam), + rcLink->sendf("team %s %d\n", Team::getShortName(GreenTeam), greenteam.size); } if (blueteam.size > 0) { - rcLink->respondf("team %s %d\n", Team::getShortName(BlueTeam), + rcLink->sendf("team %s %d\n", Team::getShortName(BlueTeam), blueteam.size); } if (purpleteam.size > 0) { - rcLink->respondf("team %s %d\n", Team::getShortName(PurpleTeam), + rcLink->sendf("team %s %d\n", Team::getShortName(PurpleTeam), purpleteam.size); } - rcLink->respond("end\n"); + rcLink->send("end\n"); } static void sendFlagList() { - rcLink->respond("begin\n"); + rcLink->send("begin\n"); for (int i=0; i<numFlags; i++) { Flag& flag = world->getFlag(i); @@ -2433,18 +2433,18 @@ } if (flag.status != FlagNoExist) { - rcLink->respondf("flag %s %s %f %f\n", + rcLink->sendf("flag %s %s %f %f\n", flagteam, possessteam, flag.position[0], flag.position[1]); } } - rcLink->respond("end\n"); + rcLink->send("end\n"); } static void sendShotList() { - rcLink->respond("begin\n"); + rcLink->send("begin\n"); for (int i=0; i<curMaxPlayers; i++) { Player* tank = player[i]; @@ -2458,13 +2458,13 @@ const float* position = shot->getPosition(); const float* velocity = shot->getVelocity(); - rcLink->respondf("shot %f %f %f %f\n", position[0], position[1], + rcLink->sendf("shot %f %f %f %f\n", position[0], position[1], velocity[0], velocity[1]); } } - rcLink->respond("end\n"); + rcLink->send("end\n"); } static void sendMyTankList() @@ -2474,7 +2474,7 @@ float angnoise = atof(BZDB.get("bzrcAngNoise").c_str()); float velnoise = atof(BZDB.get("bzrcVelNoise").c_str()); - rcLink->respond("begin\n"); + rcLink->send("begin\n"); const int numShots = World::getWorld()->getMaxShots(); @@ -2531,14 +2531,14 @@ noisy_angle += 2 * M_PI; } - rcLink->respondf("mytank %d %s %s %d %f %s %f %f %f %f %f %f\n", + rcLink->sendf("mytank %d %s %s %d %f %s %f %f %f %f %f %f\n", i, callsign, statstr, shots_avail, reloadtime, flagname, gauss(pos[0], posnoise), gauss(pos[1], posnoise), noisy_angle, gauss(vel[0], velnoise), gauss(vel[1], velnoise), gauss(angvel, angnoise)); } - rcLink->respond("end\n"); + rcLink->send("end\n"); } static void sendOtherTankList() @@ -2547,7 +2547,7 @@ float posnoise = atof(BZDB.get("bzrcPosNoise").c_str()); float angnoise = atof(BZDB.get("bzrcAngNoise").c_str()); - rcLink->respond("begin\n"); + rcLink->send("begin\n"); for (int i=0; i<curMaxPlayers; i++) { tank = player[i]; @@ -2597,24 +2597,24 @@ const float *pos = tank->getPosition(); const float angle = tank->getAngle(); - rcLink->respondf("othertank %s %s %s %s %f %f %f\n", + rcLink->sendf("othertank %s %s %s %s %f %f %f\n", callsign, colorname, statstr, flagname, gauss(pos[0], posnoise), gauss(pos[1], posnoise), gauss(angle, angnoise)); } - rcLink->respond("end\n"); + rcLink->send("end\n"); } static void sendConstList() { - rcLink->respond("begin\n"); + rcLink->send("begin\n"); - rcLink->respondf("constant team %s\n", Team::getShortName(startupInfo.team)); - rcLink->respondf("constant worldsize %f\n", BZDBCache::worldSize); - rcLink->respond("constant hoverbot 0\n"); + rcLink->sendf("constant team %s\n", Team::getShortName(startupInfo.team)); + rcLink->sendf("constant worldsize %f\n", BZDBCache::worldSize); + rcLink->send("constant hoverbot 0\n"); - rcLink->respond("end\n"); + rcLink->send("end\n"); } static void doBotRequests() @@ -2645,7 +2645,7 @@ case getTickRemaining: tankindex = req->get_robotindex(); if (tankindex == -1) { - rcLink->respondf("fail Invalid tank index.\n"); + rcLink->sendf("fail Invalid tank index.\n"); } else { bot = (RCRobotPlayer*)robots[tankindex]; // We bail out if processing isn't ready or isn't valid. @@ -3476,10 +3476,10 @@ printError(aString); } - // startup an RCLink if requested + // startup an RCLinkBackend if requested if (BZDB.isSet("rcPort")) { int port = atoi(BZDB.get("rcPort").c_str()); - rcLink = new RCLink(port); + rcLink = new RCLinkBackend(port); } // enter game if we have all the info we need, otherwise This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-02 02:13:34
|
Revision: 14448 http://bzflag.svn.sourceforge.net/bzflag/?rev=14448&view=rev Author: daxxar Date: 2007-07-01 19:13:33 -0700 (Sun, 01 Jul 2007) Log Message: ----------- Major parts of the reworking of RCLink/RCRequest is done. A lot of code has been moved to subclasses of RCRequest. RCRequest has a static method for instantiating RCRequest-subclasses based on a string (i.e. Request command). I will probably get a major flogging for my use of macros, but oh well. ;-) NOTE: New protocol is case sensitive. This could change, but I don't see a need - the protocol is mainly aimed at machine-interpretation. Major parts that were previously working aren't. This won't take long to fix, most notably ExecuteReq::process() (To make the tank do stuff) and the old protocols commands (GetObstaclesReq::process(), GetOtherTanksReq::process(), etc). Modified Paths: -------------- trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCLink.cxx trunk/bzflag/src/bzrobots/RCLink.h trunk/bzflag/src/bzrobots/RCLinkBackend.cxx trunk/bzflag/src/bzrobots/RCLinkBackend.h trunk/bzflag/src/bzrobots/RCRequest.cxx trunk/bzflag/src/bzrobots/RCRequest.h trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx trunk/bzflag/src/bzrobots/RCRobotPlayer.h trunk/bzflag/src/bzrobots/botplaying.cxx Added Paths: ----------- trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRequests.h Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-01 22:49:27 UTC (rev 14447) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-02 02:13:33 UTC (rev 14448) @@ -29,6 +29,8 @@ RCLink.h \ RCRequest.cxx \ RCRequest.h \ + RCRequests.cxx \ + RCRequests.h \ RCLinkBackend.cxx \ RCLinkBackend.h \ RCRobotPlayer.cxx \ Modified: trunk/bzflag/src/bzrobots/RCLink.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-01 22:49:27 UTC (rev 14447) +++ trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-02 02:13:33 UTC (rev 14448) @@ -75,14 +75,14 @@ // O_NONBLOCK is set so we'll probably return immediately. connfd = accept(listenfd, NULL, 0); - if (connfd == -1) return; + if (connfd == -1) + return; //BzfNetwork::setNonBlocking(connfd); int flags = fcntl(connfd, F_GETFL); fcntl(connfd, F_SETFL, flags | O_NONBLOCK); status = Connecting; - write(connfd, RC_LINK_HELLO_STR, strlen(RC_LINK_HELLO_STR)); send_amount = 0; recv_amount = 0; input_toolong = false; @@ -107,7 +107,7 @@ memcpy(sendbuf + send_amount, message, messagelen); send_amount += messagelen; - update_write(); + updateWrite(); return true; } @@ -137,21 +137,20 @@ send_amount += messagelen; - update_write(); + updateWrite(); return true; } /* * Send as much data as possible from our outgoing buffer. */ -int RCLink::update_write() +int RCLink::updateWrite(bool sendIdentify) { char *bufptr = sendbuf; int prev_send_amount = send_amount; - if (status != Connected && status != Connecting) { + if (status != Connected && (sendIdentify || status != Connecting)) return -1; - } if (output_overflow) { int errorlen = strlen(RC_LINK_OVERFLOW_MSG); Modified: trunk/bzflag/src/bzrobots/RCLink.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.h 2007-07-01 22:49:27 UTC (rev 14447) +++ trunk/bzflag/src/bzrobots/RCLink.h 2007-07-02 02:13:33 UTC (rev 14448) @@ -28,40 +28,38 @@ #define RC_LINK_SENDBUFLEN 100000 #define RC_LINK_MAXARGS 50 #define RC_LINK_OVERFLOW_MSG "\nerror Connection Stalled. RC stopped" \ - " reading data!\n" -#define RC_LINK_NOHELLO_MSG "error agent expected\n" -#define RC_LINK_HELLO_STR "bzrobots 1\n" + " reading data!\n" class RCLink { public: - enum State { - Disconnected, - SocketError, - Listening, - Connecting, - Connected - }; + typedef enum { + Disconnected, + SocketError, + Listening, + Connecting, + Connected + } State; - ~RCLink(); - void startListening(); - void tryAccept(); - int update_write(); - void detach_agents(); + virtual ~RCLink(); + void startListening(); + virtual void tryAccept(); + int updateWrite(bool sendIdentify = false); + void detach_agents(); - bool send(char *message); - bool sendf(const char *format, ...); + bool send(char *message); + bool sendf(const char *format, ...); protected: - /* We don't allow instanciating this directly - you have to instanciate RCLinkBackend or RClinkFrontend. */ - RCLink(); + /* We don't allow instanciating this directly - you have to instanciate RCLinkBackend or RClinkFrontend. */ + RCLink(); - enum State status; - int listenfd, connfd; - int port; - char recvbuf[RC_LINK_RECVBUFLEN]; - char sendbuf[RC_LINK_SENDBUFLEN]; - int recv_amount, send_amount; - bool input_toolong, output_overflow; + State status; + int listenfd, connfd; + int port; + char recvbuf[RC_LINK_RECVBUFLEN]; + char sendbuf[RC_LINK_SENDBUFLEN]; + int recv_amount, send_amount; + bool input_toolong, output_overflow; }; Modified: trunk/bzflag/src/bzrobots/RCLinkBackend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-01 22:49:27 UTC (rev 14447) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-02 02:13:33 UTC (rev 14448) @@ -18,8 +18,10 @@ #include "RCLinkBackend.h" +#include "version.h" + RCLinkBackend::RCLinkBackend(int _port) :RCLink(), - requests(NULL) + requests(NULL) { port = _port; startListening(); @@ -92,34 +94,34 @@ newline = (char *)memchr(bufptr, '\n', recv_amount); if (newline == NULL) { if (input_toolong) { - // We're throwing out everything up to the next newline. - recv_amount = 0; - break; + // We're throwing out everything up to the next newline. + recv_amount = 0; + break; } else { - // We need to read more before we can do anything. - break; + // We need to read more before we can do anything. + break; } } else { // We have a full input line. recv_amount -= newline - bufptr + 1; if (input_toolong) { - input_toolong = false; + input_toolong = false; } else { - if (*bufptr == '\n' || (*bufptr == '\r' && *(bufptr+1) == '\n')) { - // empty line: ignore - } else { - *newline = '\0'; - if (parsecommand(bufptr)) { - ncommands++; - } - } + if (*bufptr == '\n' || (*bufptr == '\r' && *(bufptr+1) == '\n')) { + // empty line: ignore + } else { + *newline = '\0'; + if (parsecommand(bufptr)) { + ncommands++; + } + } } bufptr = newline + 1; if (maxlines == 1) { - break; + break; } } } @@ -147,7 +149,7 @@ return; } - update_write(); + updateWrite(); int amount = update_read(); if (amount == -1) { @@ -161,13 +163,14 @@ int ncommands = update_parse(1); if (ncommands) { RCRequest *req = poprequest(); - if (req && req->getRequestType() == HelloRequest) { - status = Connected; + if (req && req->getType() == "IdentifyFrontend") { + status = Connected; + req->sendAck(); } else { - fprintf(stderr, "RCLink: Expected a Hello.\n"); - write(connfd, RC_LINK_NOHELLO_MSG, strlen(RC_LINK_NOHELLO_MSG)); - close(connfd); - status = Listening; + fprintf(stderr, "RCLink: Expected an 'IdentifyFrontend'.\n"); + write(connfd, RC_LINK_NOIDENTIFY_MSG, strlen(RC_LINK_NOIDENTIFY_MSG)); + close(connfd); + status = Listening; } } } @@ -193,19 +196,32 @@ if (tkn == NULL || *tkn == '\0') break; } - req = new RCRequest(argc, argv); - if (req->getRequestType() == InvalidRequest) { + req = RCRequest::getRequestInstance(argv[0], this); + if (req == NULL) { fprintf(stderr, "RCLink: Invalid request: '%s'\n", argv[0]); sendf("error Invalid request %s\n", argv[0]); - delete req; return false; } else { - if (requests == NULL) { - requests = req; - } else { - requests->append(req); + switch (req->parse(argv + 1, argc - 1)) + { + case RCRequest::ParseOk: + if (requests == NULL) + requests = req; + else + requests->append(req); + return true; + case RCRequest::InvalidArgumentCount: + fprintf(stderr, "RCLink: Invalid number of arguments (%d) for request: '%s'\n", argc - 1, argv[0]); + sendf("error Invalid number of arguments (%d) for request: '%s'\n", argc - 1, argv[0]); + return false; + case RCRequest::InvalidArguments: + fprintf(stderr, "RCLink: Invalid arguments for request: '%s'\n", argv[0]); + sendf("error Invalid arguments for request: '%s'\n", argv[0]); + return false; + default: + fprintf(stderr, "RCLink: Parse neither succeeded or failed with a known failcode. WTF?\n"); + return false; } - return true; } } @@ -222,3 +238,23 @@ return requests; } +void RCLinkBackend::tryAccept() +{ + if (status != Listening) + return; + RCLink::tryAccept(); + if (status == Connecting) + { + write(connfd, RC_LINK_IDENTIFY_STR, strlen(RC_LINK_IDENTIFY_STR)); + write(connfd, getRobotsProtocolVersion(), strlen(getRobotsProtocolVersion())); + write(connfd, "\n", 1); + } +} + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Modified: trunk/bzflag/src/bzrobots/RCLinkBackend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.h 2007-07-01 22:49:27 UTC (rev 14447) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.h 2007-07-02 02:13:33 UTC (rev 14448) @@ -21,6 +21,9 @@ #include "RCLink.h" #include "RCRequest.h" +#define RC_LINK_NOIDENTIFY_MSG "error IdentifyFrontend expected\n" +#define RC_LINK_IDENTIFY_STR "IdentifyBackend " + class RCLinkBackend : public RCLink { private: @@ -34,6 +37,7 @@ bool parsecommand(char *cmdline); RCRequest* poprequest(); RCRequest* peekrequest(); + void tryAccept(); }; #endif Modified: trunk/bzflag/src/bzrobots/RCRequest.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-01 22:49:27 UTC (rev 14447) +++ trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-02 02:13:33 UTC (rev 14448) @@ -1,208 +1,77 @@ #include "RCRequest.h" #include "Roster.h" -std::map<std::string, RCRequest *(*)()> RCRequest::requestLookup; +#include "RCLink.h" +#include "RCRequests.h" + +#define ADD_LOOKUP(COMMAND) requestLookup[#COMMAND] = &instantiate<COMMAND ## Req> +std::map<std::string, RCRequest *(*)(RCLink *)> RCRequest::requestLookup; /* These two are static functions that manipulate and access the lookup- * table for request commands -> request instances. :-) */ void RCRequest::initializeLookup(void) { - requestLookup["agent"] = &instantiate<RCRequest>; + ADD_LOOKUP(IdentifyFrontend); + ADD_LOOKUP(Execute); + ADD_LOOKUP(SetSpeed); + ADD_LOOKUP(SetTurnRate); + ADD_LOOKUP(SetAhead); + ADD_LOOKUP(SetTurnLeft); + ADD_LOOKUP(SetFire); + ADD_LOOKUP(GetGunHeat); + ADD_LOOKUP(GetDistanceRemaining); + ADD_LOOKUP(GetTurnRemaining); + ADD_LOOKUP(GetTickDuration); + ADD_LOOKUP(SetTickDuration); + ADD_LOOKUP(GetTickRemaining); + ADD_LOOKUP(GetTeams); + ADD_LOOKUP(GetBases); + ADD_LOOKUP(GetObstacles); + ADD_LOOKUP(GetFlags); + ADD_LOOKUP(GetShots); + ADD_LOOKUP(GetMyTanks); + ADD_LOOKUP(GetOtherTanks); + ADD_LOOKUP(GetConstants); +// requestLookup["identifyFrontend"] = &instantiate<IdentifyFrontendReq>; +// requestLookup["execute"] = &instantiate<ExecuteReq>; } -RCRequest *RCRequest::getRequestInstance(std::string request) + +RCRequest *RCRequest::getRequestInstance(std::string request, RCLink *_link) { if (requestLookup.find(request) != requestLookup.end()) - return requestLookup[request](); + return requestLookup[request](_link); return NULL; } -RCRequest::RCRequest() : - fail(false), - failstr(NULL), - requestType(InvalidRequest), - next(NULL) +RCRequest::~RCRequest() { } +RCRequest::RCRequest(RCLink *_link) :fail(false), + failstr(NULL), + next(NULL), + link(_link) { - requestType = InvalidRequest; } -RCRequest::RCRequest(AgentReqType reqtype) : - fail(false), - failstr(NULL), - requestType(reqtype), - next(NULL) +bool RCRequest::parseFloat(char *string, float &dest) { + char *endptr; + dest = strtof(string, &endptr); + if (endptr == string) + return false; + return true; } -RCRequest::RCRequest(int argc, char **argv) : - fail(false), - failstr(NULL), - next(NULL) +void RCRequest::sendAck(bool newline) { - char *endptr; - // TODO: give a better error message if argc is wrong. - if (strcasecmp(argv[0], "agent") == 0 && argc == 2) { - requestType = HelloRequest; - } else if (strcasecmp(argv[0], "execute") == 0 && argc == 2) { - requestType = execute; - setRobotIndex(argv[1]); - } else if (strcasecmp(argv[0], "setSpeed") == 0 && argc == 3) { - requestType = setSpeed; - setRobotIndex(argv[1]); - - speed = strtof(argv[2], &endptr); - if (endptr == argv[2]) { - fail = true; - failstr = "Invalid parameter for desired speed."; - } - - speed = clamp(speed, 0.0f, 1.0f); - } else if (strcasecmp(argv[0], "setTurnRate") == 0 && argc == 3) { - requestType = setTurnRate; - setRobotIndex(argv[1]); - - turnRate = strtof(argv[2], &endptr); - if (endptr == argv[2]) { - fail = true; - failstr = "Invalid parameter for angular velocity."; - } - - turnRate = clamp(turnRate, 0.0f, 1.0f); - } else if (strcasecmp(argv[0], "setAhead") == 0 && argc == 3) { - requestType = setAhead; - setRobotIndex(argv[1]); - - distance = strtof(argv[2], &endptr); - if (endptr == argv[2]) { - fail = true; - failstr = "Invalid parameter for distance."; - } - } else if (strcasecmp(argv[0], "setTurnLeft") == 0 && argc == 3) { - requestType = setTurnLeft; - setRobotIndex(argv[1]); - - turn = strtof(argv[2], &endptr); - if (endptr == argv[2]) { - fail = true; - failstr = "Invalid parameter for turn angle."; - } - } else if (strcasecmp(argv[0], "setFire") == 0 && argc == 2) { - requestType = setFire; - setRobotIndex(argv[1]); - } else if (strcasecmp(argv[0], "getGunHeat") == 0 && argc == 2) { - requestType = getGunHeat; - setRobotIndex(argv[1]); - } else if (strcasecmp(argv[0], "getDistanceRemaining") == 0 && argc == 2) { - requestType = getDistanceRemaining; - setRobotIndex(argv[1]); - } else if (strcasecmp(argv[0], "getTurnRemaining") == 0 && argc == 2) { - requestType = getTurnRemaining; - setRobotIndex(argv[1]); - } else if (strcasecmp(argv[0], "getTickDuration") == 0 && argc == 2) { - requestType = getTickDuration; - setRobotIndex(argv[1]); - } else if (strcasecmp(argv[0], "setTickDuration") == 0 && argc == 3) { - requestType = setTickDuration; - setRobotIndex(argv[1]); - - duration = strtof(argv[2], &endptr); - if (endptr == argv[2]) { - fail = true; - failstr = "Invalid parameter for setTickDuration."; - } - } else if (strcasecmp(argv[0], "getTickRemaining") == 0 && argc == 2) { - requestType = getTickRemaining; - setRobotIndex(argv[1]); - } else if (strcasecmp(argv[0], "teams") == 0 && argc == 1) { - requestType = TeamListRequest; - } else if (strcasecmp(argv[0], "bases") == 0 && argc == 1) { - requestType = BasesListRequest; - } else if (strcasecmp(argv[0], "obstacles") == 0 && argc == 1) { - requestType = ObstacleListRequest; - } else if (strcasecmp(argv[0], "flags") == 0 && argc == 1) { - requestType = FlagListRequest; - } else if (strcasecmp(argv[0], "shots") == 0 && argc == 1) { - requestType = ShotListRequest; - } else if (strcasecmp(argv[0], "mytanks") == 0 && argc == 1) { - requestType = MyTankListRequest; - } else if (strcasecmp(argv[0], "othertanks") == 0 && argc == 1) { - requestType = OtherTankListRequest; - } else if (strcasecmp(argv[0], "constants") == 0 && argc == 1) { - requestType = ConstListRequest; - } else { - requestType = InvalidRequest; - } -} - -void RCRequest::sendAck(RCLink *link) -{ float elapsed = TimeKeeper::getCurrent() - TimeKeeper::getStartTime(); - - switch (requestType) { - case execute: - link->sendf("ack %f execute %d\n", elapsed, getRobotIndex()); - break; - case setAhead: - link->sendf("ack %f setAhead %d %f\n", elapsed, getRobotIndex(), distance); - break; - case setTurnLeft: - link->sendf("ack %f setTurnLeft %d %f\n", elapsed, getRobotIndex(), turn); - break; - case setSpeed: - link->sendf("ack %f setSpeed %d %f\n", elapsed, getRobotIndex(), speed); - break; - case setTurnRate: - link->sendf("ack %f setTurnRate %d %f\n", elapsed, getRobotIndex(), turnRate); - break; - case setFire: - link->sendf("ack %f setFire %d\n", elapsed, getRobotIndex()); - break; - case getGunHeat: - link->sendf("ack %f getGunHeat %d\n", elapsed, getRobotIndex()); - break; - case getDistanceRemaining: - link->sendf("ack %f getDistanceRemaining %d\n", elapsed, getRobotIndex()); - break; - case getTurnRemaining: - link->sendf("ack %f getTurnRemaining %d\n", elapsed, getRobotIndex()); - break; - case getTickRemaining: - link->sendf("ack %f getTickRemaining %d\n", elapsed, getRobotIndex()); - break; - case getTickDuration: - link->sendf("ack %f getTickDuration %d\n", elapsed, getRobotIndex()); - break; - case setTickDuration: - link->sendf("ack %f setTickDuration %d %f\n", elapsed, getRobotIndex(), duration); - break; - case TeamListRequest: - link->sendf("ack %f teams\n", elapsed); - break; - case BasesListRequest: - link->sendf("ack %f bases\n", elapsed); - break; - case ObstacleListRequest: - link->sendf("ack %f obstacles\n", elapsed); - break; - case FlagListRequest: - link->sendf("ack %f flags\n", elapsed); - break; - case ShotListRequest: - link->sendf("ack %f shots\n", elapsed); - break; - case MyTankListRequest: - link->sendf("ack %f mytanks\n", elapsed); - break; - case OtherTankListRequest: - link->sendf("ack %f othertanks\n", elapsed); - break; - case ConstListRequest: - link->sendf("ack %f constants\n", elapsed); - break; + link->sendf("ack %f %s%s", elapsed, getType().c_str(), (newline ? "\n" : "")); + /*switch (requestType) { + SNIP default: link->sendf("ack %f\n", elapsed); - } + }*/ } +bool RCRequest::process(RCRobotPlayer *rrp) { return true; } -void RCRequest::sendFail(RCLink *link) +void RCRequest::sendFail() { if (fail) { if (failstr) { @@ -218,7 +87,7 @@ return robotIndex; } -void RCRequest::setRobotIndex(char *arg) +int RCRequest::setRobotIndex(char *arg) { char *endptr; robotIndex = strtol(arg, &endptr, 0); @@ -230,6 +99,7 @@ else if (robotIndex >= numRobots) { robotIndex = -1; } + return robotIndex; } // Mad cred to _neon_/#scene.no and runehol/#scene.no for these two sentences: @@ -245,11 +115,6 @@ return val; } -AgentReqType RCRequest::getRequestType() -{ - return requestType; -} - RCRequest *RCRequest::getNext() { return next; Modified: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-01 22:49:27 UTC (rev 14447) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-02 02:13:33 UTC (rev 14448) @@ -20,77 +20,59 @@ #include "common.h" #include <map> -typedef enum { - InvalidRequest, - HelloRequest, - setSpeed, - setTurnRate, - setAhead, - setTurnLeft, - setFire, - getGunHeat, - getDistanceRemaining, - getTurnRemaining, - getTickRemaining, - getTickDuration, - setTickDuration, - execute, - TeamListRequest, - BasesListRequest, - ObstacleListRequest, - FlagListRequest, - ShotListRequest, - MyTankListRequest, - OtherTankListRequest, - ConstListRequest, - RequestCount -} AgentReqType; - class RCLink; +class RCRobotPlayer; class RCRequest { public: + typedef enum { + ParseError, + ParseOk, + InvalidArgumentCount, + InvalidArguments + } parseStatus; + /* These are static functions to allow for instantiation * of classes based on a string (the request command name) */ static void initializeLookup(); - static RCRequest *getRequestInstance(std::string request); + static RCRequest *getRequestInstance(std::string request, RCLink *_link); - RCRequest(); - RCRequest(AgentReqType reqtype); - RCRequest(int argc, char **argv); + RCRequest(RCLink *_link); + virtual ~RCRequest(); + /* This is for the linked-list aspect of RCRequest. */ RCRequest *getNext(); void append(RCRequest *newreq); int getRobotIndex(); - AgentReqType getRequestType(); - void sendAck(RCLink *link); - void sendFail(RCLink *link); + void sendFail(); - float distance, turn; - float speed, turnRate; - float duration; + virtual void sendAck(bool newline = false); + virtual bool process(RCRobotPlayer *rrp); + virtual parseStatus parse(char **arguments, int count) = 0; + virtual std::string getType() = 0; + bool fail; char *failstr; private: /* These are static data and functions to allow for instantiation * of classes based on a string (the request command name) */ - static std::map<std::string, RCRequest* (*)()> requestLookup; + static std::map<std::string, RCRequest* (*)(RCLink *)> requestLookup; template <typename T> - static RCRequest* instantiate() { return new T; } + static RCRequest* instantiate(RCLink *_link) { return new T(_link); } + RCRequest *next; + int robotIndex; - void setRobotIndex(char *arg); + protected: + RCLink *link; + /* Utility functions for subclasses. */ + int setRobotIndex(char *arg); template <class T> T clamp(T val, T min, T max); - - AgentReqType requestType; - int robotIndex; - RCRequest *next; + bool parseFloat(char *string, float &dest); }; -#include "RCLink.h" - #endif // Local Variables: *** Added: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-02 02:13:33 UTC (rev 14448) @@ -0,0 +1,270 @@ +#include "RCRequests.h" +#include "RCRobotPlayer.h" + +#include "version.h" + +#define ZERO_ARGUMENT_REQUEST(COMMANDNAME) void COMMANDNAME ## Req::sendAck(bool) \ +{ \ + RCRequest::sendAck(true); \ +} \ +RCRequest::parseStatus COMMANDNAME ## Req::parse(char ** /*arguments*/, int count) \ +{ \ + if (count != 0) \ + return InvalidArgumentCount; \ + return ParseOk; \ +} + +#define BOTSPECIFIC_QUERY(COMMANDNAME) void COMMANDNAME ## Req::sendAck(bool) \ +{ \ + RCRequest::sendAck(); \ + link->sendf(" %d\n", getRobotIndex()); \ +} \ +RCRequest::parseStatus COMMANDNAME ## Req::parse(char **arguments, int count) \ +{ \ + if (count != 1) \ + return InvalidArgumentCount; \ + if (setRobotIndex(arguments[0]) == -1) \ + return InvalidArguments; \ + return ParseOk; \ +} + +void IdentifyFrontendReq::sendAck(bool) +{ + RCRequest::sendAck(); + link->sendf(" %s\n", version); +} +RCRequest::parseStatus IdentifyFrontendReq::parse(char **arguments, int count) +{ + if (count != 1) + return InvalidArgumentCount; + /* Version-checking, to be sure we're speaking the same language! */ + if (strcasecmp(arguments[0], getRobotsProtocolVersion()) != 0) + return InvalidArguments; + version = strdup(arguments[0]); + return ParseOk; +} +bool IdentifyFrontendReq::process(RCRobotPlayer *) +{ + return true; +} + +BOTSPECIFIC_QUERY(Execute); +bool ExecuteReq::process(RCRobotPlayer *) +{ + // TODO: Implement this. :p + return true; +} + +void SetSpeedReq::sendAck(bool) +{ + RCRequest::sendAck(); + link->sendf(" %d %f\n", getRobotIndex(), speed); +} +RCRequest::parseStatus SetSpeedReq::parse(char **arguments, int count) +{ + if (count != 2) + return InvalidArgumentCount; + if (setRobotIndex(arguments[0]) == -1) + return InvalidArguments; + if (!parseFloat(arguments[1], speed)) + return InvalidArguments; + return ParseOk; +} +bool SetSpeedReq::process(RCRobotPlayer *rrp) +{ + rrp->nextSpeed = speed; + return true; +} + +void SetTurnRateReq::sendAck(bool) +{ + RCRequest::sendAck(); + link->sendf(" %d %f\n", getRobotIndex(), rate); +} +RCRequest::parseStatus SetTurnRateReq::parse(char **arguments, int count) +{ + if (count != 2) + return InvalidArgumentCount; + if (setRobotIndex(arguments[0]) == -1) + return InvalidArguments; + if (!parseFloat(arguments[1], rate)) + return InvalidArguments; + return ParseOk; +} +bool SetTurnRateReq::process(RCRobotPlayer *rrp) +{ + rrp->nextTurnRate = rate; + return true; +} + +void SetAheadReq::sendAck(bool) +{ + RCRequest::sendAck(); + link->sendf(" %d %f\n", getRobotIndex(), distance); +} +RCRequest::parseStatus SetAheadReq::parse(char **arguments, int count) +{ + if (count != 2) + return InvalidArgumentCount; + if (setRobotIndex(arguments[0]) == -1) + return InvalidArguments; + if (!parseFloat(arguments[1], distance)) + return InvalidArguments; + return ParseOk; +} +bool SetAheadReq::process(RCRobotPlayer *rrp) +{ + rrp->nextDistance = distance; + return true; +} + +void SetTurnLeftReq::sendAck(bool) +{ + RCRequest::sendAck(); + link->sendf(" %d %f\n", getRobotIndex(), turn); +} +RCRequest::parseStatus SetTurnLeftReq::parse(char **arguments, int count) +{ + if (count != 2) + return InvalidArgumentCount; + if (setRobotIndex(arguments[0]) == -1) + return InvalidArguments; + if (!parseFloat(arguments[1], turn)) + return InvalidArguments; + return ParseOk; +} +bool SetTurnLeftReq::process(RCRobotPlayer *rrp) +{ + rrp->nextTurn = turn; + return true; +} + +BOTSPECIFIC_QUERY(SetFire); +bool SetFireReq::process(RCRobotPlayer *rrp) +{ + rrp->shoot = true; + return true; +} + +BOTSPECIFIC_QUERY(GetGunHeat); +bool GetGunHeatReq::process(RCRobotPlayer *rrp) +{ + if (!rrp->isSteadyState()) + return false; + link->sendf("GetGunHeat %f\n", rrp->getReloadTime()); + return true; +} + +BOTSPECIFIC_QUERY(GetDistanceRemaining); +bool GetDistanceRemainingReq::process(RCRobotPlayer *rrp) +{ + if (!rrp->isSteadyState()) + return false; + link->sendf("GetDistanceRemaining %f\n", rrp->distanceRemaining); + return true; +} + +BOTSPECIFIC_QUERY(GetTurnRemaining); +bool GetTurnRemainingReq::process(RCRobotPlayer *rrp) +{ + if (!rrp->isSteadyState()) + return false; + link->sendf("GetTurnRemaining %f\n", rrp->turnRemaining); + return true; +} + +BOTSPECIFIC_QUERY(GetTickDuration); +bool GetTickDurationReq::process(RCRobotPlayer *rrp) +{ + link->sendf("GetTickDuration %f\n", rrp->tickDuration); + return true; +} + +void SetTickDurationReq::sendAck(bool) +{ + RCRequest::sendAck(); + link->sendf(" %d %f\n", getRobotIndex(), duration); +} +RCRequest::parseStatus SetTickDurationReq::parse(char **arguments, int count) +{ + if (count != 1) + return InvalidArgumentCount; + if (setRobotIndex(arguments[0]) == -1) + return InvalidArguments; + if (!parseFloat(arguments[1], duration)) + return InvalidArguments; + return ParseOk; +} +bool SetTickDurationReq::process(RCRobotPlayer *rrp) +{ + rrp->tickDuration = duration; + return true; +} + +BOTSPECIFIC_QUERY(GetTickRemaining); +bool GetTickRemainingReq::process(RCRobotPlayer *rrp) +{ + if (rrp->isSteadyState()) + link->sendf("GetTickRemaining %f\n", (rrp->lastTickAt + rrp->tickDuration) - TimeKeeper::getCurrent().getSeconds()); + else + link->send("GetTickRemaining 0.0\n"); + + return true; +} + +ZERO_ARGUMENT_REQUEST(GetTeams); +bool GetTeamsReq::process(RCRobotPlayer *rrp) +{ + // TODO: Implement this. :p + return true; +} +ZERO_ARGUMENT_REQUEST(GetBases); +bool GetBasesReq::process(RCRobotPlayer *rrp) +{ + // TODO: Implement this. :p + return true; +} +ZERO_ARGUMENT_REQUEST(GetObstacles); +bool GetObstaclesReq::process(RCRobotPlayer *rrp) +{ + // TODO: Implement this. :p + return true; +} +ZERO_ARGUMENT_REQUEST(GetFlags); +bool GetFlagsReq::process(RCRobotPlayer *rrp) +{ + // TODO: Implement this. :p + return true; +} +ZERO_ARGUMENT_REQUEST(GetShots); +bool GetShotsReq::process(RCRobotPlayer *rrp) +{ + // TODO: Implement this. :p + return true; +} +ZERO_ARGUMENT_REQUEST(GetMyTanks); +bool GetMyTanksReq::process(RCRobotPlayer *rrp) +{ + // TODO: Implement this. :p + return true; +} +ZERO_ARGUMENT_REQUEST(GetOtherTanks); +bool GetOtherTanksReq::process(RCRobotPlayer *rrp) +{ + // TODO: Implement this. :p + return true; +} +ZERO_ARGUMENT_REQUEST(GetConstants); +bool GetConstantsReq::process(RCRobotPlayer *rrp) +{ + // TODO: Implement this. :p + return true; +} + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Added: trunk/bzflag/src/bzrobots/RCRequests.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.h (rev 0) +++ trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-02 02:13:33 UTC (rev 14448) @@ -0,0 +1,97 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Remote Control Requests: Encapsulates data and logic associated with + * requests from the frontend to the backend. + */ + +#ifndef BZF_RC_REQUESTS_H +#define BZF_RC_REQUESTS_H + +#include <string> + +#include "RCRequest.h" +#include "RCLink.h" + +/* This is just a shorthand to not repeat a bunch of typing. ;-) */ +#define DECLARE_REQUEST_BEGIN(COMMANDNAME) class COMMANDNAME ## Req : public RCRequest \ +{ \ + public: \ + COMMANDNAME ## Req(RCLink *_link) :RCRequest(_link) { } \ + RCRequest::parseStatus parse(char **arguments, int count); \ + std::string getType() { return #COMMANDNAME; } \ + void sendAck(bool newline = false); \ + bool process(RCRobotPlayer *rrp); +#define DECLARE_REQUEST_END() } +#define DECLARE_REQUEST(classname) DECLARE_REQUEST_BEGIN(classname); \ +DECLARE_REQUEST_END() + +DECLARE_REQUEST_BEGIN(IdentifyFrontend); +private: + char *version; +DECLARE_REQUEST_END(); + +DECLARE_REQUEST(Execute); + +DECLARE_REQUEST_BEGIN(SetSpeed); +private: + float speed; +DECLARE_REQUEST_END(); + +DECLARE_REQUEST_BEGIN(SetTurnRate); +private: + float rate; +DECLARE_REQUEST_END(); + +DECLARE_REQUEST_BEGIN(SetAhead); +private: + float distance; +DECLARE_REQUEST_END(); + +DECLARE_REQUEST_BEGIN(SetTurnLeft); +private: + float turn; +DECLARE_REQUEST_END(); + +DECLARE_REQUEST(SetFire); +DECLARE_REQUEST(GetGunHeat); +DECLARE_REQUEST(GetDistanceRemaining); +DECLARE_REQUEST(GetTurnRemaining); +DECLARE_REQUEST(GetTickDuration); + +DECLARE_REQUEST_BEGIN(SetTickDuration); +private: + float duration; +DECLARE_REQUEST_END(); + +DECLARE_REQUEST(GetTickRemaining); +DECLARE_REQUEST(GetTeams); +DECLARE_REQUEST(GetBases); +DECLARE_REQUEST(GetObstacles); +DECLARE_REQUEST(GetFlags); +DECLARE_REQUEST(GetShots); +DECLARE_REQUEST(GetMyTanks); +DECLARE_REQUEST(GetOtherTanks); +DECLARE_REQUEST(GetConstants); + +#undef REQUEST_DEFAULT_BODY + +#endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-07-01 22:49:27 UTC (rev 14447) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-07-02 02:13:33 UTC (rev 14448) @@ -26,10 +26,9 @@ #include "TargetingUtils.h" RCRobotPlayer::RCRobotPlayer(const PlayerId& _id, const char* _name, - ServerLink* _server, RCLinkBackend* _agent, + ServerLink* _server, const char* _email = "anonymous") : RobotPlayer(_id, _name, _server, _email), - agent(_agent), lastTickAt(0.0), tickDuration(2.0), speed(1.0), nextSpeed(1.0), turnRate(1.0), nextTurnRate(1.0), @@ -112,7 +111,7 @@ { double timeNow = TimeKeeper::getCurrent().getSeconds(); /* last tick done? */ - if (lastTickAt + tickDuration >= timeNow) + if (lastTickAt + tickDuration <= timeNow) return true; return false; } @@ -120,6 +119,7 @@ bool RCRobotPlayer::processrequest(RCRequest* req, RCLinkBackend* link) { +#if 0 receivedUpdates[req->getRequestType()] = true; switch (req->getRequestType()) { case setSpeed: @@ -229,6 +229,7 @@ default: break; } +#endif return true; } Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.h 2007-07-01 22:49:27 UTC (rev 14447) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.h 2007-07-02 02:13:33 UTC (rev 14448) @@ -36,18 +36,13 @@ public: RCRobotPlayer(const PlayerId&, const char* name, ServerLink*, - RCLinkBackend*, const char* _email); void restart(const float* pos, float azimuth); void explodeTank(); bool processrequest(RCRequest*, RCLinkBackend*); - private: - void doUpdate(float dt); - void doUpdateMotion(float dt); bool isSteadyState(); - RCLinkBackend* agent; double lastTickAt; double tickDuration; @@ -57,7 +52,10 @@ double distanceRemaining, nextDistance; bool distanceForward, turnLeft; double turnRemaining, nextTurn; - bool receivedUpdates[RequestCount]; + + private: + void doUpdate(float dt); + void doUpdateMotion(float dt); }; #endif // BZF_TCP_RC_ROBOT_PLAYER_H Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-01 22:49:27 UTC (rev 14447) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-02 02:13:33 UTC (rev 14448) @@ -1,4 +1,3 @@ - /* bzflag * Copyright (c) 1993 - 2007 Tim Riker * @@ -1728,7 +1727,7 @@ snprintf(callsign, CallSignLen, "%s%2.2d", startupInfo.callsign, i); if (rcLink) { robots[i] = new RCRobotPlayer(id, callsign, serverLink, - rcLink, startupInfo.email); + startupInfo.email); fprintf(stderr, "new tank; type: %d\n", robots[i]->getPlayerType()); } else { robots[i] = new RobotPlayer(id, callsign, serverLink, @@ -2626,10 +2625,18 @@ while ((req = rcLink->peekrequest()) != NULL) { if (req->fail) { rcLink->poprequest(); // Discard it. - req->sendFail(rcLink); + req->sendFail(); break; } + tankindex = req->getRobotIndex(); + if (tankindex == -1) { + req->process(NULL); + } else { + if (!req->process((RCRobotPlayer*)robots[tankindex])) + return; + } +#if 0 switch (req->getRequestType()) { case execute: case setSpeed: @@ -2681,9 +2688,10 @@ default: break; } +#endif rcLink->poprequest(); // Discard it, we're done with this one. - req->sendAck(rcLink); + req->sendAck(); } } @@ -3478,6 +3486,9 @@ // startup an RCLinkBackend if requested if (BZDB.isSet("rcPort")) { + // here we register the various RCRequest-handlers for commands + // that RCLinkBackend receives. :-) + RCRequest::initializeLookup(); int port = atoi(BZDB.get("rcPort").c_str()); rcLink = new RCLinkBackend(port); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-02 03:43:11
|
Revision: 14449 http://bzflag.svn.sourceforge.net/bzflag/?rev=14449&view=rev Author: daxxar Date: 2007-07-01 20:43:12 -0700 (Sun, 01 Jul 2007) Log Message: ----------- I might've gone a bit overboard with the macros. This should be better. ;-) Modified Paths: -------------- trunk/bzflag/src/bzrobots/RCRequest.cxx trunk/bzflag/src/bzrobots/RCRequest.h trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRequests.h Modified: trunk/bzflag/src/bzrobots/RCRequest.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-02 02:13:33 UTC (rev 14448) +++ trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-02 03:43:12 UTC (rev 14449) @@ -31,8 +31,6 @@ ADD_LOOKUP(GetMyTanks); ADD_LOOKUP(GetOtherTanks); ADD_LOOKUP(GetConstants); -// requestLookup["identifyFrontend"] = &instantiate<IdentifyFrontendReq>; -// requestLookup["execute"] = &instantiate<ExecuteReq>; } RCRequest *RCRequest::getRequestInstance(std::string request, RCLink *_link) Modified: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-02 02:13:33 UTC (rev 14448) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-02 03:43:12 UTC (rev 14449) @@ -18,10 +18,11 @@ #define BZF_RC_REQUEST_H #include "common.h" -#include <map> +#include "Factory.h" class RCLink; class RCRobotPlayer; +class RCRequest; class RCRequest { public: @@ -32,6 +33,7 @@ InvalidArguments } parseStatus; + static Factory<RCRequest, std::string> requestHandlerFactory; /* These are static functions to allow for instantiation * of classes based on a string (the request command name) */ static void initializeLookup(); Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-02 02:13:33 UTC (rev 14448) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-02 03:43:12 UTC (rev 14449) @@ -3,30 +3,30 @@ #include "version.h" -#define ZERO_ARGUMENT_REQUEST(COMMANDNAME) void COMMANDNAME ## Req::sendAck(bool) \ -{ \ - RCRequest::sendAck(true); \ -} \ -RCRequest::parseStatus COMMANDNAME ## Req::parse(char ** /*arguments*/, int count) \ -{ \ - if (count != 0) \ - return InvalidArgumentCount; \ - return ParseOk; \ +void RCRequestZeroArgument::sendAck(bool) +{ + RCRequest::sendAck(true); } +RCRequest::parseStatus RCRequestZeroArgument::parse(char ** /*arguments*/, int count) +{ + if (count != 0) + return InvalidArgumentCount; + return ParseOk; +} -#define BOTSPECIFIC_QUERY(COMMANDNAME) void COMMANDNAME ## Req::sendAck(bool) \ -{ \ - RCRequest::sendAck(); \ - link->sendf(" %d\n", getRobotIndex()); \ -} \ -RCRequest::parseStatus COMMANDNAME ## Req::parse(char **arguments, int count) \ -{ \ - if (count != 1) \ - return InvalidArgumentCount; \ - if (setRobotIndex(arguments[0]) == -1) \ - return InvalidArguments; \ - return ParseOk; \ +void RCRequestBotSpecific::sendAck(bool) +{ + RCRequest::sendAck(); + link->sendf(" %d\n", getRobotIndex()); } +RCRequest::parseStatus RCRequestBotSpecific::parse(char **arguments, int count) +{ + if (count != 1) + return InvalidArgumentCount; + if (setRobotIndex(arguments[0]) == -1) + return InvalidArguments; + return ParseOk; +} void IdentifyFrontendReq::sendAck(bool) { @@ -48,7 +48,6 @@ return true; } -BOTSPECIFIC_QUERY(Execute); bool ExecuteReq::process(RCRobotPlayer *) { // TODO: Implement this. :p @@ -139,14 +138,12 @@ return true; } -BOTSPECIFIC_QUERY(SetFire); bool SetFireReq::process(RCRobotPlayer *rrp) { rrp->shoot = true; return true; } -BOTSPECIFIC_QUERY(GetGunHeat); bool GetGunHeatReq::process(RCRobotPlayer *rrp) { if (!rrp->isSteadyState()) @@ -155,7 +152,6 @@ return true; } -BOTSPECIFIC_QUERY(GetDistanceRemaining); bool GetDistanceRemainingReq::process(RCRobotPlayer *rrp) { if (!rrp->isSteadyState()) @@ -164,7 +160,6 @@ return true; } -BOTSPECIFIC_QUERY(GetTurnRemaining); bool GetTurnRemainingReq::process(RCRobotPlayer *rrp) { if (!rrp->isSteadyState()) @@ -173,7 +168,6 @@ return true; } -BOTSPECIFIC_QUERY(GetTickDuration); bool GetTickDurationReq::process(RCRobotPlayer *rrp) { link->sendf("GetTickDuration %f\n", rrp->tickDuration); @@ -201,7 +195,6 @@ return true; } -BOTSPECIFIC_QUERY(GetTickRemaining); bool GetTickRemainingReq::process(RCRobotPlayer *rrp) { if (rrp->isSteadyState()) @@ -212,49 +205,41 @@ return true; } -ZERO_ARGUMENT_REQUEST(GetTeams); bool GetTeamsReq::process(RCRobotPlayer *rrp) { // TODO: Implement this. :p return true; } -ZERO_ARGUMENT_REQUEST(GetBases); bool GetBasesReq::process(RCRobotPlayer *rrp) { // TODO: Implement this. :p return true; } -ZERO_ARGUMENT_REQUEST(GetObstacles); bool GetObstaclesReq::process(RCRobotPlayer *rrp) { // TODO: Implement this. :p return true; } -ZERO_ARGUMENT_REQUEST(GetFlags); bool GetFlagsReq::process(RCRobotPlayer *rrp) { // TODO: Implement this. :p return true; } -ZERO_ARGUMENT_REQUEST(GetShots); bool GetShotsReq::process(RCRobotPlayer *rrp) { // TODO: Implement this. :p return true; } -ZERO_ARGUMENT_REQUEST(GetMyTanks); bool GetMyTanksReq::process(RCRobotPlayer *rrp) { // TODO: Implement this. :p return true; } -ZERO_ARGUMENT_REQUEST(GetOtherTanks); bool GetOtherTanksReq::process(RCRobotPlayer *rrp) { // TODO: Implement this. :p return true; } -ZERO_ARGUMENT_REQUEST(GetConstants); bool GetConstantsReq::process(RCRobotPlayer *rrp) { // TODO: Implement this. :p Modified: trunk/bzflag/src/bzrobots/RCRequests.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-02 02:13:33 UTC (rev 14448) +++ trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-02 03:43:12 UTC (rev 14449) @@ -23,8 +23,107 @@ #include "RCRequest.h" #include "RCLink.h" +struct RCRequestZeroArgument : public RCRequest +{ + RCRequestZeroArgument(RCLink *_link) :RCRequest(_link) { } + RCRequest::parseStatus parse(char **arguments, int count); + void sendAck(bool newline = false); + virtual bool process(RCRobotPlayer *rrp) = 0; +}; +struct RCRequestBotSpecific : public RCRequest +{ + RCRequestBotSpecific(RCLink *_link) :RCRequest(_link) { } + RCRequest::parseStatus parse(char **arguments, int count); + void sendAck(bool newline = false); + virtual bool process(RCRobotPlayer *rrp) = 0; +}; + +struct ExecuteReq : public RCRequestBotSpecific +{ + ExecuteReq(RCLink *l) :RCRequestBotSpecific(l) {} + std::string getType() { return "Execute"; } + bool process(RCRobotPlayer *rrp); +}; +struct SetFireReq : public RCRequestBotSpecific +{ + SetFireReq(RCLink *l) :RCRequestBotSpecific(l) {} + std::string getType() { return "SetFire"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetGunHeatReq : public RCRequestBotSpecific +{ + GetGunHeatReq(RCLink *l) :RCRequestBotSpecific(l) {} + std::string getType() { return "GetGunHeat"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetDistanceRemainingReq : public RCRequestBotSpecific +{ + GetDistanceRemainingReq(RCLink *l) :RCRequestBotSpecific(l) {} + std::string getType() { return "GetDistanceRemaining"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetTurnRemainingReq : public RCRequestBotSpecific +{ + GetTurnRemainingReq(RCLink *l) :RCRequestBotSpecific(l) {} + std::string getType() { return "GetTurnRemaining"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetTickDurationReq : public RCRequestBotSpecific +{ + GetTickDurationReq(RCLink *l) :RCRequestBotSpecific(l) {} + std::string getType() { return "GetTickDuration"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetTickRemainingReq : public RCRequestBotSpecific +{ + GetTickRemainingReq(RCLink *l) :RCRequestBotSpecific(l) {} + std::string getType() { return "GetTickRemaining"; } + bool process(RCRobotPlayer *rrp); +}; + +struct GetTeamsReq : public RCRequestZeroArgument { + GetTeamsReq(RCLink *l) :RCRequestZeroArgument(l) {} + std::string getType() { return "GetTeams"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetBasesReq : public RCRequestZeroArgument { + GetBasesReq(RCLink *l) :RCRequestZeroArgument(l) {} + std::string getType() { return "GetBases"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetObstaclesReq : public RCRequestZeroArgument { + GetObstaclesReq(RCLink *l) :RCRequestZeroArgument(l) {} + std::string getType() { return "GetObstacles"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetFlagsReq : public RCRequestZeroArgument { + GetFlagsReq(RCLink *l) :RCRequestZeroArgument(l) {} + std::string getType() { return "GetFlags"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetShotsReq : public RCRequestZeroArgument { + GetShotsReq(RCLink *l) :RCRequestZeroArgument(l) {} + std::string getType() { return "GetShots"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetMyTanksReq : public RCRequestZeroArgument { + GetMyTanksReq(RCLink *l) :RCRequestZeroArgument(l) {} + std::string getType() { return "GetMyTanks"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetOtherTanksReq : public RCRequestZeroArgument { + GetOtherTanksReq(RCLink *l) :RCRequestZeroArgument(l) {} + std::string getType() { return "GetOtherTanks"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetConstantsReq : public RCRequestZeroArgument { + GetConstantsReq(RCLink *l) :RCRequestZeroArgument(l) {} + std::string getType() { return "GetConstants"; } + bool process(RCRobotPlayer *rrp); +}; + /* This is just a shorthand to not repeat a bunch of typing. ;-) */ -#define DECLARE_REQUEST_BEGIN(COMMANDNAME) class COMMANDNAME ## Req : public RCRequest \ +#define DECLARE_REQUEST(COMMANDNAME) class COMMANDNAME ## Req : public RCRequest \ { \ public: \ COMMANDNAME ## Req(RCLink *_link) :RCRequest(_link) { } \ @@ -32,60 +131,39 @@ std::string getType() { return #COMMANDNAME; } \ void sendAck(bool newline = false); \ bool process(RCRobotPlayer *rrp); -#define DECLARE_REQUEST_END() } -#define DECLARE_REQUEST(classname) DECLARE_REQUEST_BEGIN(classname); \ -DECLARE_REQUEST_END() -DECLARE_REQUEST_BEGIN(IdentifyFrontend); +DECLARE_REQUEST(IdentifyFrontend); private: char *version; -DECLARE_REQUEST_END(); +}; -DECLARE_REQUEST(Execute); - -DECLARE_REQUEST_BEGIN(SetSpeed); +DECLARE_REQUEST(SetSpeed); private: float speed; -DECLARE_REQUEST_END(); +}; -DECLARE_REQUEST_BEGIN(SetTurnRate); +DECLARE_REQUEST(SetTurnRate); private: float rate; -DECLARE_REQUEST_END(); +}; -DECLARE_REQUEST_BEGIN(SetAhead); +DECLARE_REQUEST(SetAhead); private: float distance; -DECLARE_REQUEST_END(); +}; -DECLARE_REQUEST_BEGIN(SetTurnLeft); +DECLARE_REQUEST(SetTurnLeft); private: float turn; -DECLARE_REQUEST_END(); +}; -DECLARE_REQUEST(SetFire); -DECLARE_REQUEST(GetGunHeat); -DECLARE_REQUEST(GetDistanceRemaining); -DECLARE_REQUEST(GetTurnRemaining); -DECLARE_REQUEST(GetTickDuration); - -DECLARE_REQUEST_BEGIN(SetTickDuration); +DECLARE_REQUEST(SetTickDuration); private: float duration; -DECLARE_REQUEST_END(); +}; -DECLARE_REQUEST(GetTickRemaining); -DECLARE_REQUEST(GetTeams); -DECLARE_REQUEST(GetBases); -DECLARE_REQUEST(GetObstacles); -DECLARE_REQUEST(GetFlags); -DECLARE_REQUEST(GetShots); -DECLARE_REQUEST(GetMyTanks); -DECLARE_REQUEST(GetOtherTanks); -DECLARE_REQUEST(GetConstants); +#undef DECLARE_REQUEST -#undef REQUEST_DEFAULT_BODY - #endif // Local Variables: *** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-02 14:50:21
|
Revision: 14452 http://bzflag.svn.sourceforge.net/bzflag/?rev=14452&view=rev Author: daxxar Date: 2007-07-02 07:50:22 -0700 (Mon, 02 Jul 2007) Log Message: ----------- Implemented Execute in the new RCRequest-framework. Added a nastyish hack to allow for compilation of bzrobots when you --disable-client. Removed some unused code and #ifdeffed out code. Modified Paths: -------------- trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx trunk/bzflag/src/bzrobots/RCRobotPlayer.h trunk/bzflag/src/bzrobots/botplaying.cxx Added Paths: ----------- trunk/bzflag/src/bzrobots/OpenGLUtils.cxx Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-02 11:46:39 UTC (rev 14451) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-02 14:50:22 UTC (rev 14452) @@ -22,7 +22,7 @@ ../bzflag/ClientAuthentication.h bzrobots_LDFLAGS = -static -bzrobots_SOURCES = \ +genericfiles = \ bzrobots.cxx \ botplaying.cxx \ RCLink.cxx \ @@ -223,6 +223,15 @@ ../bzflag/stars.cxx \ ../bzflag/stars.h +bzrobots_LDFLAGS = -static + +if CLIENT_INCLUDED +bzrobots_SOURCES = $(genericfiles) +else +bzrobots_SOURCES = $(genericfiles) \ + OpenGLUtils.cxx +endif + if WIN32 RESOURCE = bzflag.res else Added: trunk/bzflag/src/bzrobots/OpenGLUtils.cxx =================================================================== --- trunk/bzflag/src/bzrobots/OpenGLUtils.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/OpenGLUtils.cxx 2007-07-02 14:50:22 UTC (rev 14452) @@ -0,0 +1,74 @@ +/* bzflag +* Copyright (c) 1993 - 2007 Tim Riker +* Writen By Jeffrey Myers +* +* This package is free software; you can redistribute it and/or +* modify it under the terms of the license found in the file +* named COPYING that should have accompanied this file. +* +* THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include "OpenGLUtils.h" + +#include <math.h> + +float getFloatColor ( int ) +{ + return 0.0f; +} + +void setColor ( float [3], int, int, int ) +{ +} + +void glSetColor ( float [3], float) +{ +} + +void glTranslatefv ( float [3] ) +{ +} + +void glQuad ( float, float, eAlignment, float ) +{ +} + +void glLineRing ( float, float ) +{ +} + +// DisplayListSystem + +DisplayListSystem::~DisplayListSystem() +{ +} + +void DisplayListSystem::flushLists ( void ) +{ +} + +GLDisplayList DisplayListSystem::newList (GLDisplayListCreator *) +{ + return GLDisplayList(); +} + +void DisplayListSystem::freeList (GLDisplayList) +{ +} + +void DisplayListSystem::callList (GLDisplayList) +{ +} + +void DisplayListSystem::callListsV (std::vector<GLDisplayList> &) +{ +} + +DisplayListSystem::DisplayListSystem() +{ +} + + Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-02 11:46:39 UTC (rev 14451) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-02 14:50:22 UTC (rev 14452) @@ -48,9 +48,44 @@ return true; } -bool ExecuteReq::process(RCRobotPlayer *) +bool ExecuteReq::process(RCRobotPlayer *rrp) { - // TODO: Implement this. :p + if (!rrp->isSteadyState()) + return false; + + rrp->lastTickAt = TimeKeeper::getCurrent().getSeconds(); + + if (rrp->pendingUpdates[RCRobotPlayer::speedUpdate]) + rrp->speed = rrp->nextSpeed; + if (rrp->pendingUpdates[RCRobotPlayer::turnRateUpdate]) + rrp->turnRate = rrp->nextTurnRate; + + if (rrp->pendingUpdates[RCRobotPlayer::distanceUpdate]) + { + if (rrp->nextDistance < 0.0f) + rrp->distanceForward = false; + else + rrp->distanceForward = true; + rrp->distanceRemaining = (rrp->distanceForward ? 1 : -1) * rrp->nextDistance; + } + if (rrp->pendingUpdates[RCRobotPlayer::turnUpdate]) + { + if (rrp->nextTurn < 0.0f) + rrp->turnLeft = false; + else + rrp->turnLeft = true; + rrp->turnRemaining = (rrp->turnLeft ? 1 : -1) * rrp->nextTurn; + } + + for (int i = 0; i < RCRobotPlayer::updateCount; ++i) + rrp->pendingUpdates[i] = false; + + if (rrp->shoot) + { + rrp->shoot = false; + rrp->fireShot(); + } + return true; } @@ -72,6 +107,7 @@ bool SetSpeedReq::process(RCRobotPlayer *rrp) { rrp->nextSpeed = speed; + rrp->pendingUpdates[RCRobotPlayer::speedUpdate] = true; return true; } @@ -93,6 +129,7 @@ bool SetTurnRateReq::process(RCRobotPlayer *rrp) { rrp->nextTurnRate = rate; + rrp->pendingUpdates[RCRobotPlayer::turnRateUpdate] = true; return true; } @@ -113,6 +150,7 @@ } bool SetAheadReq::process(RCRobotPlayer *rrp) { + rrp->pendingUpdates[RCRobotPlayer::distanceUpdate] = true; rrp->nextDistance = distance; return true; } @@ -134,6 +172,7 @@ } bool SetTurnLeftReq::process(RCRobotPlayer *rrp) { + rrp->pendingUpdates[RCRobotPlayer::turnUpdate] = true; rrp->nextTurn = turn; return true; } Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-07-02 11:46:39 UTC (rev 14451) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-07-02 14:50:22 UTC (rev 14452) @@ -116,124 +116,6 @@ return false; } -bool RCRobotPlayer::processrequest(RCRequest* req, - RCLinkBackend* link) -{ -#if 0 - receivedUpdates[req->getRequestType()] = true; - switch (req->getRequestType()) { - case setSpeed: - nextSpeed = req->speed; - link->send("ok\n"); - break; - - case setTurnRate: - nextTurnRate = req->turnRate; - link->send("ok\n"); - break; - - case setFire: - shoot = true; - link->send("ok\n"); - break; - - case getGunHeat: - if (isSteadyState()) - return false; - link->sendf("getGunHeat %f\n", getReloadTime()); - break; - - case setAhead: - nextDistance = req->distance; - link->send("ok\n"); - break; - - case setTurnLeft: - nextTurn = req->turn; - link->send("ok\n"); - break; - - case getDistanceRemaining: - if (isSteadyState()) - return false; - link->sendf("getDistanceRemaining %f\n", distanceRemaining); - break; - - case getTurnRemaining: - if (isSteadyState()) - return false; - link->sendf("getTurnRemaining %f\n", turnRemaining); - break; - - case getTickDuration: - link->sendf("getTickDuration %f\n", tickDuration); - break; - - case setTickDuration: - tickDuration = req->duration; - break; - - case getTickRemaining: - if (isSteadyState()) - link->sendf("getTickRemaining %f\n", (lastTickAt + tickDuration) - TimeKeeper::getCurrent().getSeconds()); - else - link->send("getTickRemaining 0.0\n"); - break; - - case execute: - if (isSteadyState()) - return false; - - lastTickAt = TimeKeeper::getCurrent().getSeconds(); - - if (receivedUpdates[setTurnLeft]) - { - turnRemaining = nextTurn; - if (turnRemaining < 0.0f) - { - turnRemaining = -turnRemaining; - turnLeft = false; - } - else - turnLeft = true; - } - - if (receivedUpdates[setAhead]) - { - distanceRemaining = nextDistance; - if (distanceRemaining < 0.0f) - { - distanceRemaining = -distanceRemaining; - distanceForward = false; - } - else - distanceForward = true; - } - - if (receivedUpdates[setTurnRate]) - turnRate = nextTurnRate; - if (receivedUpdates[setSpeed]) - speed = nextSpeed; - - for (int i = 0; i < RequestCount; ++i) - receivedUpdates[i] = false; - - if (shoot) - { - shoot = false; - fireShot(); - } - - break; - - default: - break; - } -#endif - return true; -} - - // Local Variables: *** // mode:C++ *** // tab-width: 8 *** Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.h 2007-07-02 11:46:39 UTC (rev 14451) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.h 2007-07-02 14:50:22 UTC (rev 14452) @@ -37,10 +37,16 @@ RCRobotPlayer(const PlayerId&, const char* name, ServerLink*, const char* _email); + typedef enum { + speedUpdate, + turnRateUpdate, + distanceUpdate, + turnUpdate, + updateCount + } variableUpdates; void restart(const float* pos, float azimuth); void explodeTank(); - bool processrequest(RCRequest*, RCLinkBackend*); bool isSteadyState(); @@ -52,6 +58,7 @@ double distanceRemaining, nextDistance; bool distanceForward, turnLeft; double turnRemaining, nextTurn; + bool pendingUpdates[updateCount]; private: void doUpdate(float dt); Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-02 11:46:39 UTC (rev 14451) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-02 14:50:22 UTC (rev 14452) @@ -2619,7 +2619,6 @@ static void doBotRequests() { RCRequest* req; - RCRobotPlayer* bot; int tankindex; while ((req = rcLink->peekrequest()) != NULL) { @@ -2638,29 +2637,6 @@ } #if 0 switch (req->getRequestType()) { - case execute: - case setSpeed: - case setTurnRate: - case setFire: - case getGunHeat: - case setAhead: - case setTurnLeft: - case getDistanceRemaining: - case getTurnRemaining: - case getTickDuration: - case setTickDuration: - case getTickRemaining: - tankindex = req->getRobotIndex(); - if (tankindex == -1) { - rcLink->sendf("fail Invalid tank index.\n"); - } else { - bot = (RCRobotPlayer*)robots[tankindex]; - // We bail out if processing isn't ready or isn't valid. - // This happens e.g. if the last tick isn't done. - if (!bot->processrequest(req, rcLink)) - return; - } - break; case TeamListRequest: sendTeamList(); break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-02 16:08:21
|
Revision: 14453 http://bzflag.svn.sourceforge.net/bzflag/?rev=14453&view=rev Author: daxxar Date: 2007-07-02 09:08:22 -0700 (Mon, 02 Jul 2007) Log Message: ----------- Removed worthless 'fail'-flag and descriptive 'failstr' in RCRequest - if something goes wrong, parse() should return an erro r (and RCRequest is thrown away). In the process, sendFail() was made useless, and therefore removed. Cleaned up some functions to match DEVINFO-standards. Cleaned up RCLink::tryAccept() & RCLinkBackend::tryAccept() a little. Clamping various parameters to sane ranges. Modified Paths: -------------- trunk/bzflag/src/bzrobots/RCLink.cxx trunk/bzflag/src/bzrobots/RCLink.h trunk/bzflag/src/bzrobots/RCLinkBackend.cxx trunk/bzflag/src/bzrobots/RCLinkBackend.h trunk/bzflag/src/bzrobots/RCRequest.cxx trunk/bzflag/src/bzrobots/RCRequest.h trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/botplaying.cxx Modified: trunk/bzflag/src/bzrobots/RCLink.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-02 14:50:22 UTC (rev 14452) +++ trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-02 16:08:22 UTC (rev 14453) @@ -68,15 +68,15 @@ status = Listening; } -void RCLink::tryAccept() +bool RCLink::tryAccept() { if (status != Listening) - return; + return false; // O_NONBLOCK is set so we'll probably return immediately. connfd = accept(listenfd, NULL, 0); if (connfd == -1) - return; + return false; //BzfNetwork::setNonBlocking(connfd); int flags = fcntl(connfd, F_GETFL); @@ -88,6 +88,7 @@ input_toolong = false; // Now we wait for them to introduce themselves. + return true; } bool RCLink::send(char* message) Modified: trunk/bzflag/src/bzrobots/RCLink.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.h 2007-07-02 14:50:22 UTC (rev 14452) +++ trunk/bzflag/src/bzrobots/RCLink.h 2007-07-02 16:08:22 UTC (rev 14453) @@ -42,7 +42,7 @@ virtual ~RCLink(); void startListening(); - virtual void tryAccept(); + virtual bool tryAccept(); int updateWrite(bool sendIdentify = false); void detach_agents(); Modified: trunk/bzflag/src/bzrobots/RCLinkBackend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-02 14:50:22 UTC (rev 14452) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-02 16:08:22 UTC (rev 14453) @@ -31,7 +31,7 @@ * Fill up the receive buffer with any available incoming data. Return the * number of bytes of data read or -1 if the connection has died. */ -int RCLinkBackend::update_read() +int RCLinkBackend::updateRead() { int prev_recv_amount = recv_amount; @@ -41,9 +41,8 @@ // read in as much data as possible while (true) { - if (recv_amount == RC_LINK_RECVBUFLEN) { + if (recv_amount == RC_LINK_RECVBUFLEN) break; - } int nread = read(connfd, recvbuf+recv_amount, RC_LINK_RECVBUFLEN-recv_amount); if (nread == 0) { @@ -70,7 +69,7 @@ * Create as many RCRequest objects as possible (via parsecommand). * Return the number created. */ -int RCLinkBackend::update_parse(int maxlines) +int RCLinkBackend::updateParse(int maxlines) { int ncommands = 0; char *bufptr = recvbuf; @@ -112,7 +111,7 @@ // empty line: ignore } else { *newline = '\0'; - if (parsecommand(bufptr)) { + if (parseCommand(bufptr)) { ncommands++; } } @@ -150,7 +149,7 @@ } updateWrite(); - int amount = update_read(); + int amount = updateRead(); if (amount == -1) { status = Listening; @@ -158,11 +157,11 @@ } if (status == Connected) { - update_parse(); + updateParse(); } else if (status == Connecting) { - int ncommands = update_parse(1); + int ncommands = updateParse(1); if (ncommands) { - RCRequest *req = poprequest(); + RCRequest *req = popRequest(); if (req && req->getType() == "IdentifyFrontend") { status = Connected; req->sendAck(); @@ -181,7 +180,7 @@ * Return true if an RCRequest was successfully created. If it failed, * return false. */ -bool RCLinkBackend::parsecommand(char *cmdline) +bool RCLinkBackend::parseCommand(char *cmdline) { RCRequest *req; int argc; @@ -189,11 +188,12 @@ char *s, *tkn; s = cmdline; - for (argc=0; argc<RC_LINK_MAXARGS; argc++) { + for (argc = 0; argc < RC_LINK_MAXARGS; argc++) { tkn = strtok(s, " \r\t"); s = NULL; argv[argc] = tkn; - if (tkn == NULL || *tkn == '\0') break; + if (tkn == NULL || *tkn == '\0') + break; } req = RCRequest::getRequestInstance(argv[0], this); @@ -225,7 +225,7 @@ } } -RCRequest* RCLinkBackend::poprequest() +RCRequest* RCLinkBackend::popRequest() { RCRequest *req = requests; if (req != NULL) { @@ -233,22 +233,21 @@ } return req; } -RCRequest* RCLinkBackend::peekrequest() +RCRequest* RCLinkBackend::peekRequest() { return requests; } -void RCLinkBackend::tryAccept() +bool RCLinkBackend::tryAccept() { - if (status != Listening) - return; - RCLink::tryAccept(); - if (status == Connecting) - { - write(connfd, RC_LINK_IDENTIFY_STR, strlen(RC_LINK_IDENTIFY_STR)); - write(connfd, getRobotsProtocolVersion(), strlen(getRobotsProtocolVersion())); - write(connfd, "\n", 1); - } + if (!RCLink::tryAccept()) + return false; + + write(connfd, RC_LINK_IDENTIFY_STR, strlen(RC_LINK_IDENTIFY_STR)); + write(connfd, getRobotsProtocolVersion(), strlen(getRobotsProtocolVersion())); + write(connfd, "\n", 1); + + return true; } // Local Variables: *** Modified: trunk/bzflag/src/bzrobots/RCLinkBackend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.h 2007-07-02 14:50:22 UTC (rev 14452) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.h 2007-07-02 16:08:22 UTC (rev 14453) @@ -31,13 +31,13 @@ public: RCLinkBackend(int port); - int update_read(); - int update_parse(int maxlines = 0); + int updateRead(); + int updateParse(int maxlines = 0); void update(); - bool parsecommand(char *cmdline); - RCRequest* poprequest(); - RCRequest* peekrequest(); - void tryAccept(); + bool parseCommand(char *cmdline); + RCRequest* popRequest(); + RCRequest* peekRequest(); + bool tryAccept(); }; #endif Modified: trunk/bzflag/src/bzrobots/RCRequest.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-02 14:50:22 UTC (rev 14452) +++ trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-02 16:08:22 UTC (rev 14453) @@ -41,9 +41,7 @@ } RCRequest::~RCRequest() { } -RCRequest::RCRequest(RCLink *_link) :fail(false), - failstr(NULL), - next(NULL), +RCRequest::RCRequest(RCLink *_link) :next(NULL), link(_link) { } @@ -61,25 +59,9 @@ { float elapsed = TimeKeeper::getCurrent() - TimeKeeper::getStartTime(); link->sendf("ack %f %s%s", elapsed, getType().c_str(), (newline ? "\n" : "")); - /*switch (requestType) { - SNIP - default: - link->sendf("ack %f\n", elapsed); - }*/ } bool RCRequest::process(RCRobotPlayer *rrp) { return true; } -void RCRequest::sendFail() -{ - if (fail) { - if (failstr) { - link->sendf("fail %s\n", failstr); - } else { - link->send("fail\n"); - } - } -} - int RCRequest::getRobotIndex() { return robotIndex; @@ -89,30 +71,14 @@ { char *endptr; robotIndex = strtol(arg, &endptr, 0); - if (endptr == arg) { + if (endptr == arg) robotIndex = -1; - fail = true; - failstr = "Invalid parameter for tank."; - } - else if (robotIndex >= numRobots) { + else if (robotIndex >= numRobots) robotIndex = -1; - } + return robotIndex; } -// Mad cred to _neon_/#scene.no and runehol/#scene.no for these two sentences: -// * If val is nan, the result is undefined -// * If high < low, the result is undefined -template <class T> -T RCRequest::clamp(T val, T min, T max) -{ - if (val > max) - return max; - if (val < min) - return min; - return val; -} - RCRequest *RCRequest::getNext() { return next; Modified: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-02 14:50:22 UTC (rev 14452) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-02 16:08:22 UTC (rev 14453) @@ -18,7 +18,8 @@ #define BZF_RC_REQUEST_H #include "common.h" -#include "Factory.h" +#include <string> +#include <map> class RCLink; class RCRobotPlayer; @@ -33,7 +34,6 @@ InvalidArguments } parseStatus; - static Factory<RCRequest, std::string> requestHandlerFactory; /* These are static functions to allow for instantiation * of classes based on a string (the request command name) */ static void initializeLookup(); @@ -47,16 +47,12 @@ void append(RCRequest *newreq); int getRobotIndex(); - void sendFail(); virtual void sendAck(bool newline = false); virtual bool process(RCRobotPlayer *rrp); virtual parseStatus parse(char **arguments, int count) = 0; virtual std::string getType() = 0; - bool fail; - char *failstr; - private: /* These are static data and functions to allow for instantiation * of classes based on a string (the request command name) */ @@ -70,9 +66,19 @@ RCLink *link; /* Utility functions for subclasses. */ int setRobotIndex(char *arg); - template <class T> - T clamp(T val, T min, T max); bool parseFloat(char *string, float &dest); + template <typename T> + T clamp(T val, T min, T max) + { + // Mad cred to _neon_/#scene.no and runehol/#scene.no for these two sentences: + // * If val is nan, the result is undefined + // * If max < min, the result is undefined + if (val > max) + return max; + if (val < min) + return min; + return val; + } }; #endif Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-02 14:50:22 UTC (rev 14452) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-02 16:08:22 UTC (rev 14453) @@ -2,6 +2,7 @@ #include "RCRobotPlayer.h" #include "version.h" +#include <values.h> void RCRequestZeroArgument::sendAck(bool) { @@ -102,6 +103,8 @@ return InvalidArguments; if (!parseFloat(arguments[1], speed)) return InvalidArguments; + + speed = clamp(speed, 0.0f, 1.0f); return ParseOk; } bool SetSpeedReq::process(RCRobotPlayer *rrp) @@ -124,6 +127,7 @@ return InvalidArguments; if (!parseFloat(arguments[1], rate)) return InvalidArguments; + rate = clamp(rate, 0.0f, 1.0f); return ParseOk; } bool SetTurnRateReq::process(RCRobotPlayer *rrp) @@ -226,6 +230,8 @@ return InvalidArguments; if (!parseFloat(arguments[1], duration)) return InvalidArguments; + + duration = clamp(duration, 0.0f, MAXFLOAT); return ParseOk; } bool SetTickDurationReq::process(RCRobotPlayer *rrp) Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-02 14:50:22 UTC (rev 14452) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-02 16:08:22 UTC (rev 14453) @@ -2621,13 +2621,7 @@ RCRequest* req; int tankindex; - while ((req = rcLink->peekrequest()) != NULL) { - if (req->fail) { - rcLink->poprequest(); // Discard it. - req->sendFail(); - break; - } - + while ((req = rcLink->peekRequest()) != NULL) { tankindex = req->getRobotIndex(); if (tankindex == -1) { req->process(NULL); @@ -2666,7 +2660,7 @@ } #endif - rcLink->poprequest(); // Discard it, we're done with this one. + rcLink->popRequest(); // Discard it, we're done with this one. req->sendAck(); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <t-...@us...> - 2007-07-02 16:55:23
|
Revision: 14455 http://bzflag.svn.sourceforge.net/bzflag/?rev=14455&view=rev Author: t-s Date: 2007-07-02 09:55:25 -0700 (Mon, 02 Jul 2007) Log Message: ----------- remove double-defininition of bzrobots_LDFLAGS abd comment out an include to a nonexisting file Modified Paths: -------------- trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCRequests.cxx Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-02 16:32:28 UTC (rev 14454) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-02 16:55:25 UTC (rev 14455) @@ -21,7 +21,6 @@ ../bzflag/ClientAuthentication.cxx \ ../bzflag/ClientAuthentication.h -bzrobots_LDFLAGS = -static genericfiles = \ bzrobots.cxx \ botplaying.cxx \ Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-02 16:32:28 UTC (rev 14454) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-02 16:55:25 UTC (rev 14455) @@ -2,7 +2,7 @@ #include "RCRobotPlayer.h" #include "version.h" -#include <values.h> +//#include <values.h> void RCRequestZeroArgument::sendAck(bool) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-03 01:23:08
|
Revision: 14456 http://bzflag.svn.sourceforge.net/bzflag/?rev=14456&view=rev Author: daxxar Date: 2007-07-02 18:22:56 -0700 (Mon, 02 Jul 2007) Log Message: ----------- Don't clamp w/ MAXFLOAT, std::max() instead. Moved more generic functionality into RCLink, specific only in RCLinkBackend. We now check for isnan() in RCRequest::parseFloat() RCRequest::parseFloat() & RCRequest::clamp() are now public and static (Why weren't they? Silly me). Moved common functionality for RCRequest and RCReply to RCMessage, and they now inherit from it. Added RCLinkFrontend, and connect()-functionality to RCLink. (NOTE: This is not added to Makefile.am, because it depends on the not-yet-written RCReply) Modified Paths: -------------- trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCLink.cxx trunk/bzflag/src/bzrobots/RCLink.h trunk/bzflag/src/bzrobots/RCLinkBackend.cxx trunk/bzflag/src/bzrobots/RCLinkBackend.h trunk/bzflag/src/bzrobots/RCRequest.cxx trunk/bzflag/src/bzrobots/RCRequest.h trunk/bzflag/src/bzrobots/RCRequests.cxx Added Paths: ----------- trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx trunk/bzflag/src/bzrobots/RCLinkFrontend.h Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-02 16:55:25 UTC (rev 14455) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-03 01:22:56 UTC (rev 14456) @@ -24,6 +24,7 @@ genericfiles = \ bzrobots.cxx \ botplaying.cxx \ + RCMessage.h \ RCLink.cxx \ RCLink.h \ RCRequest.cxx \ Modified: trunk/bzflag/src/bzrobots/RCLink.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-02 16:55:25 UTC (rev 14455) +++ trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-03 01:22:56 UTC (rev 14456) @@ -49,7 +49,8 @@ sa.sin_addr.s_addr = htonl(INADDR_ANY); listenfd = socket(AF_INET, SOCK_STREAM, 0); - if (listenfd == -1) return; + if (listenfd == -1) + return; if (bind(listenfd, (sockaddr*)&sa, sizeof(sa)) == -1) { close(listenfd); @@ -91,6 +92,36 @@ return true; } + +bool RCLink::connect() +{ + connfd = socket(AF_INET, SOCK_STREAM, 0); + if (connfd < 0) + return false; + + sockaddr_in remote; + remote.sin_port = htons(port); + remote.sin_family = AF_INET; + + hostent *hostdata = gethostbyname(host); + if (hostdata == NULL) + return false; + + memcpy(&remote.sin_addr.s_addr, hostdata->h_addr_list[0], hostdata->h_length); + + if (::connect(connfd, (sockaddr *)&remote, sizeof(remote)) < 0) + return false; + + int flags = fcntl(connfd, F_GETFL); + fcntl(connfd, F_SETFL, flags | O_NONBLOCK); + + status = Connecting; + send_amount = recv_amount = 0; + input_toolong = false; + + return true; +} + bool RCLink::send(char* message) { if (output_overflow) { @@ -145,12 +176,12 @@ /* * Send as much data as possible from our outgoing buffer. */ -int RCLink::updateWrite(bool sendIdentify) +int RCLink::updateWrite() { char *bufptr = sendbuf; int prev_send_amount = send_amount; - if (status != Connected && (sendIdentify || status != Connecting)) + if (status != Connected && status != Connecting) return -1; if (output_overflow) { @@ -192,6 +223,115 @@ return prev_send_amount - send_amount; } +/* + * Fill up the receive buffer with any available incoming data. Return the + * number of bytes of data read or -1 if the connection has died. + */ +int RCLink::updateRead() +{ + int prev_recv_amount = recv_amount; + + if (status != Connected && status != Connecting) { + return -1; + } + + // read in as much data as possible + while (true) { + if (recv_amount == RC_LINK_RECVBUFLEN) + break; + + int nread = read(connfd, recvbuf+recv_amount, RC_LINK_RECVBUFLEN-recv_amount); + if (nread == 0) { + fprintf(stderr, "RCLink: Agent Closed Connection\n"); + status = getDisconnectedState(); + return -1; + } else if (nread == -1 && errno != EAGAIN) { + perror("RCLink: Read failed."); + status = SocketError; + return -1; + } else if (nread == -1) { + // got no data (remember, read is set to be nonblocking) + break; + } else { + recv_amount += nread; + } + } + + return recv_amount - prev_recv_amount; +} + +/* + * Parse as many objects as possible (via parseCommand). + * Return the number created. + */ +int RCLink::updateParse(int maxlines) +{ + int ncommands = 0; + char *bufptr = recvbuf; + char *newline; + + if (recv_amount == 0) { + return 0; + } + + while (true) { + // Sometimes a remote agent will add unnecessary null characters after a + // newline. Drop them: + while (recv_amount >= 1 && *bufptr == '\0') { + bufptr++; + recv_amount--; + } + if (recv_amount == 0) { + break; + } + + newline = (char *)memchr(bufptr, '\n', recv_amount); + if (newline == NULL) { + if (input_toolong) { + // We're throwing out everything up to the next newline. + recv_amount = 0; + break; + } else { + // We need to read more before we can do anything. + break; + } + } else { + // We have a full input line. + recv_amount -= newline - bufptr + 1; + + if (input_toolong) { + input_toolong = false; + } else { + if (*bufptr == '\n' || (*bufptr == '\r' && *(bufptr+1) == '\n')) { + // empty line: ignore + } else { + *newline = '\0'; + if (parseCommand(bufptr)) { + ncommands++; + } + } + } + + bufptr = newline + 1; + + if (maxlines == 1) { + break; + } + } + } + + if (bufptr != recvbuf && recv_amount > 0) { + memmove(recvbuf, bufptr, recv_amount); + } + + if (recv_amount == RC_LINK_RECVBUFLEN) { + input_toolong = true; + fprintf(stderr, "RCLink: Input line too long. Discarding.\n"); + recv_amount = 0; + } + + return ncommands; +} // Local Variables: *** // mode:C++ *** // tab-width: 8 *** Modified: trunk/bzflag/src/bzrobots/RCLink.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.h 2007-07-02 16:55:25 UTC (rev 14455) +++ trunk/bzflag/src/bzrobots/RCLink.h 2007-07-03 01:22:56 UTC (rev 14456) @@ -40,22 +40,28 @@ Connected } State; + RCLink(); virtual ~RCLink(); + + bool connect(); void startListening(); virtual bool tryAccept(); - int updateWrite(bool sendIdentify = false); - void detach_agents(); + virtual State getDisconnectedState() = 0; + virtual bool parseCommand(char *cmdline) = 0; + int updateParse(int maxlines = 0); + int updateWrite(); + int updateRead(); + void detachAgents(); + bool send(char *message); bool sendf(const char *format, ...); protected: - /* We don't allow instanciating this directly - you have to instanciate RCLinkBackend or RClinkFrontend. */ - RCLink(); - State status; int listenfd, connfd; int port; + const char *host; char recvbuf[RC_LINK_RECVBUFLEN]; char sendbuf[RC_LINK_SENDBUFLEN]; int recv_amount, send_amount; Modified: trunk/bzflag/src/bzrobots/RCLinkBackend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-02 16:55:25 UTC (rev 14455) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-03 01:22:56 UTC (rev 14456) @@ -27,118 +27,13 @@ startListening(); } -/* - * Fill up the receive buffer with any available incoming data. Return the - * number of bytes of data read or -1 if the connection has died. - */ -int RCLinkBackend::updateRead() +RCLink::State RCLinkBackend::getDisconnectedState() { - int prev_recv_amount = recv_amount; - - if (status != Connected && status != Connecting) { - return -1; - } - - // read in as much data as possible - while (true) { - if (recv_amount == RC_LINK_RECVBUFLEN) - break; - - int nread = read(connfd, recvbuf+recv_amount, RC_LINK_RECVBUFLEN-recv_amount); - if (nread == 0) { - fprintf(stderr, "RCLink: Agent Closed Connection\n"); - status = Listening; - return -1; - } else if (nread == -1 && errno != EAGAIN) { - perror("RCLink: Read failed."); - status = SocketError; - return -1; - } else if (nread == -1) { - // got no data (remember, read is set to be nonblocking) - break; - } else { - recv_amount += nread; - } - } - - return recv_amount - prev_recv_amount; + return RCLink::Listening; } /* - * Create as many RCRequest objects as possible (via parsecommand). - * Return the number created. - */ -int RCLinkBackend::updateParse(int maxlines) -{ - int ncommands = 0; - char *bufptr = recvbuf; - char *newline; - - if (recv_amount == 0) { - return 0; - } - - while (true) { - // Sometimes a remote agent will add unnecessary null characters after a - // newline. Drop them: - while (recv_amount >= 1 && *bufptr == '\0') { - bufptr++; - recv_amount--; - } - if (recv_amount == 0) { - break; - } - - newline = (char *)memchr(bufptr, '\n', recv_amount); - if (newline == NULL) { - if (input_toolong) { - // We're throwing out everything up to the next newline. - recv_amount = 0; - break; - } else { - // We need to read more before we can do anything. - break; - } - } else { - // We have a full input line. - recv_amount -= newline - bufptr + 1; - - if (input_toolong) { - input_toolong = false; - } else { - if (*bufptr == '\n' || (*bufptr == '\r' && *(bufptr+1) == '\n')) { - // empty line: ignore - } else { - *newline = '\0'; - if (parseCommand(bufptr)) { - ncommands++; - } - } - } - - bufptr = newline + 1; - - if (maxlines == 1) { - break; - } - } - } - - if (bufptr != recvbuf && recv_amount > 0) { - memmove(recvbuf, bufptr, recv_amount); - } - - if (recv_amount == RC_LINK_RECVBUFLEN) { - input_toolong = true; - fprintf(stderr, "RCLink: Input line too long. Discarding.\n"); - recv_amount = 0; - } - - return ncommands; -} - -/* * Check for activity. If possible, fill up the recvbuf with incoming data * and build up RCRequest objects as appropriate. */ @@ -196,7 +91,7 @@ break; } - req = RCRequest::getRequestInstance(argv[0], this); + req = RCRequest::getInstance(argv[0], this); if (req == NULL) { fprintf(stderr, "RCLink: Invalid request: '%s'\n", argv[0]); sendf("error Invalid request %s\n", argv[0]); Modified: trunk/bzflag/src/bzrobots/RCLinkBackend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.h 2007-07-02 16:55:25 UTC (rev 14455) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.h 2007-07-03 01:22:56 UTC (rev 14456) @@ -31,13 +31,12 @@ public: RCLinkBackend(int port); - int updateRead(); - int updateParse(int maxlines = 0); void update(); bool parseCommand(char *cmdline); RCRequest* popRequest(); RCRequest* peekRequest(); bool tryAccept(); + State getDisconnectedState(); }; #endif Added: trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-03 01:22:56 UTC (rev 14456) @@ -0,0 +1,142 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <sys/socket.h> +#include <arpa/inet.h> +#include <fcntl.h> +#include <errno.h> +#include <stdarg.h> + +#include "RCLinkFrontend.h" + +#include "version.h" + +RCLinkFrontend::RCLinkFrontend(std::string _host, int _port) :RCLink(), + requests(NULL) +{ + port = _port; + host = _host.c_str(); + connect(); +} + +RCLink::State RCLinkFrontend::getDisconnectedState() +{ + return RCLink::Disconnected; +} + + +/* + * Check for activity. If possible, fill up the recvbuf with incoming data + * and build up RCReply objects as appropriate. + */ +void RCLinkFrontend::update() +{ + if (status != Connected && status != Connecting) { + return; + } + + updateWrite(); + int amount = updateRead(); + + if (amount == -1) { + status = Listening; + return; + } + + if (status == Connected) { + updateParse(); + } else if (status == Connecting) { + int ncommands = updateParse(1); + if (ncommands) { + RCReply *req = popReply(); + if (req && req->getType() == "IdentifyBackend") { + status = Connected; + req->sendAck(); + } else { + fprintf(stderr, "RCLink: Expected an 'IdentifyFrontend'.\n"); + write(connfd, RC_LINK_NOIDENTIFY_MSG, strlen(RC_LINK_NOIDENTIFY_MSG)); + close(connfd); + status = Listening; + } + } + } +} + +/* + * Parse a command, create an RCReply object, and add it to requests. + * Return true if an RCReply was successfully created. If it failed, + * return false. + */ +bool RCLinkFrontend::parseCommand(char *cmdline) +{ + RCReply *req; + int argc; + char *argv[RC_LINK_MAXARGS]; + char *s, *tkn; + + s = cmdline; + for (argc = 0; argc < RC_LINK_MAXARGS; argc++) { + tkn = strtok(s, " \r\t"); + s = NULL; + argv[argc] = tkn; + if (tkn == NULL || *tkn == '\0') + break; + } + + req = RCReply::getReplyInstance(argv[0], this); + if (req == NULL) { + fprintf(stderr, "RCLink: Invalid request: '%s'\n", argv[0]); + sendf("error Invalid request %s\n", argv[0]); + return false; + } else { + switch (req->parse(argv + 1, argc - 1)) + { + case RCReply::ParseOk: + if (requests == NULL) + requests = req; + else + requests->append(req); + return true; + case RCReply::InvalidArgumentCount: + fprintf(stderr, "RCLink: Invalid number of arguments (%d) for request: '%s'\n", argc - 1, argv[0]); + sendf("error Invalid number of arguments (%d) for request: '%s'\n", argc - 1, argv[0]); + return false; + case RCReply::InvalidArguments: + fprintf(stderr, "RCLink: Invalid arguments for request: '%s'\n", argv[0]); + sendf("error Invalid arguments for request: '%s'\n", argv[0]); + return false; + default: + fprintf(stderr, "RCLink: Parse neither succeeded or failed with a known failcode. WTF?\n"); + return false; + } + } +} + +RCReply* RCLinkFrontend::popReply() +{ + RCReply *rep = replies; + if (rep != NULL) + replies = rep->getNext(); + return req; +} +RCReply* RCLinkFrontend::peekReply() +{ + return replies; +} + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Added: trunk/bzflag/src/bzrobots/RCLinkFrontend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.h (rev 0) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.h 2007-07-03 01:22:56 UTC (rev 14456) @@ -0,0 +1,47 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Remote Control Link, Frontend: Encapsulates communication between backend and + * frontend, from the frontends point of view. + */ + +#ifndef BZF_RC_LINK_FRONTEND_H +#define BZF_RC_LINK_FRONTEND_H + +#include "RCLink.h" +#include "RCRequest.h" + +class RCLinkFrontend : public RCLink +{ + private: + RCRequest *requests; + + public: + RCLinkFrontend(std::string _host, int _port); + void update(); + bool parseCommand(char *cmdline); + RCRequest* popRequest(); + RCRequest* peekRequest(); + bool tryAccept(); + State getDisconnectedState(); +}; + +#endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Modified: trunk/bzflag/src/bzrobots/RCRequest.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-02 16:55:25 UTC (rev 14455) +++ trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-03 01:22:56 UTC (rev 14456) @@ -4,8 +4,7 @@ #include "RCLink.h" #include "RCRequests.h" -#define ADD_LOOKUP(COMMAND) requestLookup[#COMMAND] = &instantiate<COMMAND ## Req> -std::map<std::string, RCRequest *(*)(RCLink *)> RCRequest::requestLookup; +#define ADD_LOOKUP(COMMAND) messageLookup[#COMMAND] = &instantiate<COMMAND ## Req> /* These two are static functions that manipulate and access the lookup- * table for request commands -> request instances. :-) */ void RCRequest::initializeLookup(void) @@ -33,27 +32,11 @@ ADD_LOOKUP(GetConstants); } -RCRequest *RCRequest::getRequestInstance(std::string request, RCLink *_link) -{ - if (requestLookup.find(request) != requestLookup.end()) - return requestLookup[request](_link); - return NULL; -} - RCRequest::~RCRequest() { } -RCRequest::RCRequest(RCLink *_link) :next(NULL), - link(_link) +RCRequest::RCRequest(RCLink *_link) :RCMessage<RCRequest>(_link) { } -bool RCRequest::parseFloat(char *string, float &dest) -{ - char *endptr; - dest = strtof(string, &endptr); - if (endptr == string) - return false; - return true; -} void RCRequest::sendAck(bool newline) { @@ -78,17 +61,3 @@ return robotIndex; } - -RCRequest *RCRequest::getNext() -{ - return next; -} - -void RCRequest::append(RCRequest *newreq) -{ - if (next == NULL) { - next = newreq; - } else { - next->append(newreq); - } -} Modified: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-02 16:55:25 UTC (rev 14455) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-03 01:22:56 UTC (rev 14456) @@ -18,6 +18,8 @@ #define BZF_RC_REQUEST_H #include "common.h" +#include "RCMessage.h" + #include <string> #include <map> @@ -25,27 +27,11 @@ class RCRobotPlayer; class RCRequest; -class RCRequest { +class RCRequest :public RCMessage<RCRequest> { public: - typedef enum { - ParseError, - ParseOk, - InvalidArgumentCount, - InvalidArguments - } parseStatus; - - /* These are static functions to allow for instantiation - * of classes based on a string (the request command name) */ - static void initializeLookup(); - static RCRequest *getRequestInstance(std::string request, RCLink *_link); - RCRequest(RCLink *_link); virtual ~RCRequest(); - /* This is for the linked-list aspect of RCRequest. */ - RCRequest *getNext(); - void append(RCRequest *newreq); - int getRobotIndex(); virtual void sendAck(bool newline = false); @@ -53,32 +39,14 @@ virtual parseStatus parse(char **arguments, int count) = 0; virtual std::string getType() = 0; + static void initializeLookup(void); + private: - /* These are static data and functions to allow for instantiation - * of classes based on a string (the request command name) */ - static std::map<std::string, RCRequest* (*)(RCLink *)> requestLookup; - template <typename T> - static RCRequest* instantiate(RCLink *_link) { return new T(_link); } - RCRequest *next; int robotIndex; protected: RCLink *link; - /* Utility functions for subclasses. */ int setRobotIndex(char *arg); - bool parseFloat(char *string, float &dest); - template <typename T> - T clamp(T val, T min, T max) - { - // Mad cred to _neon_/#scene.no and runehol/#scene.no for these two sentences: - // * If val is nan, the result is undefined - // * If max < min, the result is undefined - if (val > max) - return max; - if (val < min) - return min; - return val; - } }; #endif Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-02 16:55:25 UTC (rev 14455) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-03 01:22:56 UTC (rev 14456) @@ -2,7 +2,6 @@ #include "RCRobotPlayer.h" #include "version.h" -//#include <values.h> void RCRequestZeroArgument::sendAck(bool) { @@ -231,7 +230,7 @@ if (!parseFloat(arguments[1], duration)) return InvalidArguments; - duration = clamp(duration, 0.0f, MAXFLOAT); + duration = std::max(duration, 0.0f); return ParseOk; } bool SetTickDurationReq::process(RCRobotPlayer *rrp) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-03 14:35:29
|
Revision: 14459 http://bzflag.svn.sourceforge.net/bzflag/?rev=14459&view=rev Author: daxxar Date: 2007-07-03 07:35:29 -0700 (Tue, 03 Jul 2007) Log Message: ----------- Added RCReply.{cxx,h} - and implemented the framework of these. RCLinkFrontend fixed - it now compiles. RCLinkFrontend and RCReply doesn't do anything useful (yet). Added RCReply.{cxx,h} and RCLink.{cxx,h} to Makefile.am. Expanded RCMessage with a getParameters(), so that a command can be reconstructed from an object. Added RCLink::send(RCMessage<C>), which sends a message from an object. Modified Paths: -------------- trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCLink.cxx trunk/bzflag/src/bzrobots/RCLink.h trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx trunk/bzflag/src/bzrobots/RCLinkFrontend.h trunk/bzflag/src/bzrobots/RCMessage.h trunk/bzflag/src/bzrobots/RCRequest.h trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRequests.h Added Paths: ----------- trunk/bzflag/src/bzrobots/RCReply.cxx trunk/bzflag/src/bzrobots/RCReply.h Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-03 01:46:12 UTC (rev 14458) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-03 14:35:29 UTC (rev 14459) @@ -24,15 +24,19 @@ genericfiles = \ bzrobots.cxx \ botplaying.cxx \ - RCMessage.h \ RCLink.cxx \ RCLink.h \ + RCMessage.h \ RCRequest.cxx \ RCRequest.h \ RCRequests.cxx \ RCRequests.h \ + RCReply.cxx \ + RCReply.h \ RCLinkBackend.cxx \ RCLinkBackend.h \ + RCLinkFrontend.cxx \ + RCLinkFrontend.h \ RCRobotPlayer.cxx \ RCRobotPlayer.h \ ../bzflag/ActionBinding.cxx \ Modified: trunk/bzflag/src/bzrobots/RCLink.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-03 01:46:12 UTC (rev 14458) +++ trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-03 14:35:29 UTC (rev 14459) @@ -16,6 +16,8 @@ #include <errno.h> #include <stdarg.h> +#include <sstream> + // BZFlag network //#include "network.h" @@ -23,6 +25,7 @@ #include "RCLink.h" #include "Roster.h" #include "RCRobotPlayer.h" +#include "RCMessage.h" RCLink::RCLink() : status(Disconnected), @@ -122,6 +125,19 @@ return true; } +template<class C> +bool RCLink::send(RCMessage<C> *message) +{ + std::stringstream ss; + ss << message->getType() << " "; + message->getParameters(ss); + return send(ss.str().c_str()); +} +template<class C> +bool RCLink::send(RCMessage<C> &message) +{ + return send(&message); +} bool RCLink::send(char* message) { if (output_overflow) { Modified: trunk/bzflag/src/bzrobots/RCLink.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.h 2007-07-03 01:46:12 UTC (rev 14458) +++ trunk/bzflag/src/bzrobots/RCLink.h 2007-07-03 14:35:29 UTC (rev 14459) @@ -30,6 +30,8 @@ #define RC_LINK_OVERFLOW_MSG "\nerror Connection Stalled. RC stopped" \ " reading data!\n" +#include "RCMessage.h" + class RCLink { public: typedef enum { @@ -55,6 +57,10 @@ void detachAgents(); bool send(char *message); + template<class C> + bool send(RCMessage<C> *); + template<class C> + bool send(RCMessage<C> &); bool sendf(const char *format, ...); protected: Modified: trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-03 01:46:12 UTC (rev 14458) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-03 14:35:29 UTC (rev 14459) @@ -21,7 +21,7 @@ #include "version.h" RCLinkFrontend::RCLinkFrontend(std::string _host, int _port) :RCLink(), - requests(NULL) + replies(NULL) { port = _port; host = _host.c_str(); @@ -60,19 +60,17 @@ RCReply *req = popReply(); if (req && req->getType() == "IdentifyBackend") { status = Connected; - req->sendAck(); } else { - fprintf(stderr, "RCLink: Expected an 'IdentifyFrontend'.\n"); - write(connfd, RC_LINK_NOIDENTIFY_MSG, strlen(RC_LINK_NOIDENTIFY_MSG)); + fprintf(stderr, "RCLink: Expected an 'IdentifyBackend'.\n"); close(connfd); - status = Listening; + status = Disconnected; } } } } /* - * Parse a command, create an RCReply object, and add it to requests. + * Parse a command, create an RCReply object, and add it to replies. * Return true if an RCReply was successfully created. If it failed, * return false. */ @@ -92,7 +90,7 @@ break; } - req = RCReply::getReplyInstance(argv[0], this); + req = RCReply::getInstance(argv[0], this); if (req == NULL) { fprintf(stderr, "RCLink: Invalid request: '%s'\n", argv[0]); sendf("error Invalid request %s\n", argv[0]); @@ -101,10 +99,10 @@ switch (req->parse(argv + 1, argc - 1)) { case RCReply::ParseOk: - if (requests == NULL) - requests = req; + if (replies == NULL) + replies = req; else - requests->append(req); + replies->append(req); return true; case RCReply::InvalidArgumentCount: fprintf(stderr, "RCLink: Invalid number of arguments (%d) for request: '%s'\n", argc - 1, argv[0]); @@ -126,7 +124,7 @@ RCReply *rep = replies; if (rep != NULL) replies = rep->getNext(); - return req; + return rep; } RCReply* RCLinkFrontend::peekReply() { Modified: trunk/bzflag/src/bzrobots/RCLinkFrontend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.h 2007-07-03 01:46:12 UTC (rev 14458) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.h 2007-07-03 14:35:29 UTC (rev 14459) @@ -19,20 +19,19 @@ #define BZF_RC_LINK_FRONTEND_H #include "RCLink.h" -#include "RCRequest.h" +#include "RCReply.h" class RCLinkFrontend : public RCLink { private: - RCRequest *requests; + RCReply *replies; public: RCLinkFrontend(std::string _host, int _port); void update(); bool parseCommand(char *cmdline); - RCRequest* popRequest(); - RCRequest* peekRequest(); - bool tryAccept(); + RCReply* popReply(); + RCReply* peekReply(); State getDisconnectedState(); }; Modified: trunk/bzflag/src/bzrobots/RCMessage.h =================================================================== --- trunk/bzflag/src/bzrobots/RCMessage.h 2007-07-03 01:46:12 UTC (rev 14458) +++ trunk/bzflag/src/bzrobots/RCMessage.h 2007-07-03 14:35:29 UTC (rev 14459) @@ -21,6 +21,7 @@ #include "common.h" #include <string> #include <map> +#include <ostream> class RCLink; class RCRobotPlayer; @@ -61,6 +62,7 @@ virtual parseStatus parse(char **arguments, int count) = 0; virtual std::string getType() = 0; + virtual void getParameters(std::ostream &stream) = 0; /* Utility functions. */ static bool parseFloat(char *string, float &dest) Added: trunk/bzflag/src/bzrobots/RCReply.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCReply.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/RCReply.cxx 2007-07-03 14:35:29 UTC (rev 14459) @@ -0,0 +1,17 @@ +#include "RCReply.h" +#include "Roster.h" + +#include "RCLink.h" +//#include "RCReplys.h" + +#define ADD_LOOKUP(COMMAND) messageLookup[#COMMAND] = &instantiate<COMMAND ## Req> +/* These two are static functions that manipulate and access the lookup- + * table for request commands -> request instances. :-) */ +void RCReply::initializeLookup(void) +{ +} + +RCReply::~RCReply() { } +RCReply::RCReply(RCLink *_link) :RCMessage<RCReply>(_link) +{ +} Added: trunk/bzflag/src/bzrobots/RCReply.h =================================================================== --- trunk/bzflag/src/bzrobots/RCReply.h (rev 0) +++ trunk/bzflag/src/bzrobots/RCReply.h 2007-07-03 14:35:29 UTC (rev 14459) @@ -0,0 +1,53 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Remote Control Request: Encapsulates requests between backend and frontend + */ + +#ifndef BZF_RC_REQUEST_H +#define BZF_RC_REQUEST_H + +#include "common.h" +#include "RCMessage.h" + +#include <string> +#include <map> + +class RCLink; +class RCRobotPlayer; +class RCReply; + +class RCReply :public RCMessage<RCReply> { + public: + RCReply(RCLink *_link); + virtual ~RCReply(); + + virtual parseStatus parse(char **arguments, int count) = 0; + virtual std::string getType() = 0; + virtual void getParameters(std::ostream &stream) = 0; + + static void initializeLookup(void); + + protected: + RCLink *link; +}; + +#endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Modified: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-03 01:46:12 UTC (rev 14458) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-03 14:35:29 UTC (rev 14459) @@ -38,6 +38,7 @@ virtual bool process(RCRobotPlayer *rrp); virtual parseStatus parse(char **arguments, int count) = 0; virtual std::string getType() = 0; + virtual void getParameters(std::ostream &stream) = 0; static void initializeLookup(void); Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-03 01:46:12 UTC (rev 14458) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-03 14:35:29 UTC (rev 14459) @@ -13,6 +13,9 @@ return InvalidArgumentCount; return ParseOk; } +void RCRequestZeroArgument::getParameters(std::ostream &) +{ +} void RCRequestBotSpecific::sendAck(bool) { @@ -27,6 +30,10 @@ return InvalidArguments; return ParseOk; } +void RCRequestBotSpecific::getParameters(std::ostream &stream) +{ + stream << getRobotIndex(); +} void IdentifyFrontendReq::sendAck(bool) { @@ -47,6 +54,10 @@ { return true; } +void IdentifyFrontendReq::getParameters(std::ostream &stream) +{ + stream << version; +} bool ExecuteReq::process(RCRobotPlayer *rrp) { @@ -112,6 +123,10 @@ rrp->pendingUpdates[RCRobotPlayer::speedUpdate] = true; return true; } +void SetSpeedReq::getParameters(std::ostream &stream) +{ + stream << getRobotIndex() << " " << speed; +} void SetTurnRateReq::sendAck(bool) { @@ -135,6 +150,10 @@ rrp->pendingUpdates[RCRobotPlayer::turnRateUpdate] = true; return true; } +void SetTurnRateReq::getParameters(std::ostream &stream) +{ + stream << getRobotIndex() << " " << rate; +} void SetAheadReq::sendAck(bool) { @@ -157,6 +176,10 @@ rrp->nextDistance = distance; return true; } +void SetAheadReq::getParameters(std::ostream &stream) +{ + stream << getRobotIndex() << " " << distance; +} void SetTurnLeftReq::sendAck(bool) { @@ -179,6 +202,10 @@ rrp->nextTurn = turn; return true; } +void SetTurnLeftReq::getParameters(std::ostream &stream) +{ + stream << getRobotIndex() << " " << turn; +} bool SetFireReq::process(RCRobotPlayer *rrp) { @@ -238,6 +265,10 @@ rrp->tickDuration = duration; return true; } +void SetTickDurationReq::getParameters(std::ostream &stream) +{ + stream << getRobotIndex() << " " << duration; +} bool GetTickRemainingReq::process(RCRobotPlayer *rrp) { Modified: trunk/bzflag/src/bzrobots/RCRequests.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-03 01:46:12 UTC (rev 14458) +++ trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-03 14:35:29 UTC (rev 14459) @@ -29,6 +29,7 @@ RCRequest::parseStatus parse(char **arguments, int count); void sendAck(bool newline = false); virtual bool process(RCRobotPlayer *rrp) = 0; + void getParameters(std::ostream &stream); }; struct RCRequestBotSpecific : public RCRequest { @@ -36,6 +37,7 @@ RCRequest::parseStatus parse(char **arguments, int count); void sendAck(bool newline = false); virtual bool process(RCRobotPlayer *rrp) = 0; + void getParameters(std::ostream &stream); }; struct ExecuteReq : public RCRequestBotSpecific @@ -130,7 +132,8 @@ RCRequest::parseStatus parse(char **arguments, int count); \ std::string getType() { return #COMMANDNAME; } \ void sendAck(bool newline = false); \ - bool process(RCRobotPlayer *rrp); + bool process(RCRobotPlayer *rrp); \ + void getParameters(std::ostream &stream); DECLARE_REQUEST(IdentifyFrontend) private: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-06 09:04:49
|
Revision: 14466 http://bzflag.svn.sourceforge.net/bzflag/?rev=14466&view=rev Author: daxxar Date: 2007-07-06 02:04:48 -0700 (Fri, 06 Jul 2007) Log Message: ----------- Moved sendAck from RCRequest to RCLinkBackend - it is now implemented using getParameters(). Moved templated send-functions to RCLink.h (duh!) Added RCReplies.{h,cxx} - implementations of Replies. :-) Modified Paths: -------------- trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCLink.cxx trunk/bzflag/src/bzrobots/RCLink.h trunk/bzflag/src/bzrobots/RCLinkBackend.cxx trunk/bzflag/src/bzrobots/RCLinkBackend.h trunk/bzflag/src/bzrobots/RCMessage.h trunk/bzflag/src/bzrobots/RCRequest.cxx trunk/bzflag/src/bzrobots/RCRequest.h trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRequests.h trunk/bzflag/src/bzrobots/botplaying.cxx Added Paths: ----------- trunk/bzflag/src/bzrobots/RCReplies.cxx trunk/bzflag/src/bzrobots/RCReplies.h Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-06 09:04:48 UTC (rev 14466) @@ -33,6 +33,8 @@ RCRequests.h \ RCReply.cxx \ RCReply.h \ + RCReplies.cxx \ + RCReplies.h \ RCLinkBackend.cxx \ RCLinkBackend.h \ RCLinkFrontend.cxx \ Modified: trunk/bzflag/src/bzrobots/RCLink.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-06 09:04:48 UTC (rev 14466) @@ -16,8 +16,6 @@ #include <errno.h> #include <stdarg.h> -#include <sstream> - // BZFlag network //#include "network.h" @@ -125,19 +123,6 @@ return true; } -template<class C> -bool RCLink::send(RCMessage<C> *message) -{ - std::stringstream ss; - ss << message->getType() << " "; - message->getParameters(ss); - return send(ss.str().c_str()); -} -template<class C> -bool RCLink::send(RCMessage<C> &message) -{ - return send(&message); -} bool RCLink::send(char* message) { if (output_overflow) { Modified: trunk/bzflag/src/bzrobots/RCLink.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.h 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/RCLink.h 2007-07-06 09:04:48 UTC (rev 14466) @@ -18,6 +18,8 @@ #ifndef BZF_RC_LINK_H #define BZF_RC_LINK_H +#include <sstream> + #include "common.h" #include "global.h" @@ -57,13 +59,29 @@ void detachAgents(); bool send(char *message); + bool sendf(const char *format, ...); + template<class C> - bool send(RCMessage<C> *); + bool send(RCMessage<C> *message) + { + return send(getMessage(message).c_str()); + } template<class C> - bool send(RCMessage<C> &); - bool sendf(const char *format, ...); + bool send(RCMessage<C> &message) + { + return send(&message); + } protected: + template<class C> + std::string getMessage(RCMessage<C> *message) + { + std::stringstream ss; + ss << message->getType() << " "; + message->getParameters(ss); + return ss.str(); + } + State status; int listenfd, connfd; int port; Modified: trunk/bzflag/src/bzrobots/RCLinkBackend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-06 09:04:48 UTC (rev 14466) @@ -59,7 +59,7 @@ RCRequest *req = popRequest(); if (req && req->getType() == "IdentifyFrontend") { status = Connected; - req->sendAck(); + sendAck(req); } else { fprintf(stderr, "RCLink: Expected an 'IdentifyFrontend'.\n"); write(connfd, RC_LINK_NOIDENTIFY_MSG, strlen(RC_LINK_NOIDENTIFY_MSG)); @@ -145,6 +145,12 @@ return true; } +void RCLinkBackend::sendAck(RCRequest *req) +{ + float elapsed = TimeKeeper::getCurrent() - TimeKeeper::getStartTime(); + sendf("ack %f %s\n", elapsed, getMessage(req).c_str()); +} + // Local Variables: *** // mode:C++ *** // tab-width: 8 *** Modified: trunk/bzflag/src/bzrobots/RCLinkBackend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.h 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.h 2007-07-06 09:04:48 UTC (rev 14466) @@ -37,6 +37,7 @@ RCRequest* peekRequest(); bool tryAccept(); State getDisconnectedState(); + void sendAck(RCRequest *req); }; #endif Modified: trunk/bzflag/src/bzrobots/RCMessage.h =================================================================== --- trunk/bzflag/src/bzrobots/RCMessage.h 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/RCMessage.h 2007-07-06 09:04:48 UTC (rev 14466) @@ -27,7 +27,8 @@ class RCRobotPlayer; template <class C> -class RCMessage { +class RCMessage +{ public: typedef enum { ParseError, @@ -60,6 +61,8 @@ next->append(newreq); } + /* These three are dependent on the specific packet-type, so they are + * left for the complete implementations. :-) */ virtual parseStatus parse(char **arguments, int count) = 0; virtual std::string getType() = 0; virtual void getParameters(std::ostream &stream) = 0; Added: trunk/bzflag/src/bzrobots/RCReplies.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-06 09:04:48 UTC (rev 14466) @@ -0,0 +1,81 @@ +#include "RCReplies.h" + +#include "version.h" + +RCReply::parseStatus GunHeatReply::parse(char **arguments, int count) +{ + if (count != 1) + return InvalidArgumentCount; + if (!parseFloat(arguments[0], heat)) + return InvalidArguments; + + return ParseOk; +} +void GunHeatReply::getParameters(std::ostream &stream) +{ + stream << heat; +} + +RCReply::parseStatus DistanceRemainingReply::parse(char **arguments, int count) +{ + if (count != 1) + return InvalidArgumentCount; + if (!parseFloat(arguments[0], distance)) + return InvalidArguments; + + return ParseOk; +} +void DistanceRemainingReply::getParameters(std::ostream &stream) +{ + stream << distance; +} + +RCReply::parseStatus TurnRemainingReply::parse(char **arguments, int count) +{ + if (count != 1) + return InvalidArgumentCount; + if (!parseFloat(arguments[0], turn)) + return InvalidArguments; + + return ParseOk; +} +void TurnRemainingReply::getParameters(std::ostream &stream) +{ + stream << turn; +} + +RCReply::parseStatus TickDurationReply::parse(char **arguments, int count) +{ + if (count != 1) + return InvalidArgumentCount; + if (!parseFloat(arguments[0], duration)) + return InvalidArguments; + + return ParseOk; +} +void TickDurationReply::getParameters(std::ostream &stream) +{ + stream << duration; +} + +RCReply::parseStatus TickRemainingReply::parse(char **arguments, int count) +{ + if (count != 1) + return InvalidArgumentCount; + if (!parseFloat(arguments[0], remaining)) + return InvalidArguments; + + return ParseOk; +} +void TickRemainingReply::getParameters(std::ostream &stream) +{ + stream << remaining; +} + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Added: trunk/bzflag/src/bzrobots/RCReplies.h =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.h (rev 0) +++ trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-06 09:04:48 UTC (rev 14466) @@ -0,0 +1,79 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Remote Control Replies: Encapsulates data and logic associated with + * replies to the requests made by the frontend + */ + +#ifndef BZF_RC_REQUESTS_H +#define BZF_RC_REQUESTS_H + +#include <string> + +#include "RCReply.h" +#include "RCLink.h" + +struct GunHeatReply : public RCReply +{ + GunHeatReply(RCLink *l) :RCReply(l) {} + std::string getType() { return "GunHeat"; } + RCReply::parseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream); + float heat; +}; + +struct DistanceRemainingReply : public RCReply +{ + DistanceRemainingReply(RCLink *l) :RCReply(l) {} + std::string getType() { return "DistanceRemaining"; } + RCReply::parseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream); + float distance; +}; + +struct TurnRemainingReply : public RCReply +{ + TurnRemainingReply(RCLink *l) :RCReply(l) {} + std::string getType() { return "TurnRemaining"; } + RCReply::parseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream); + float turn; +}; + +struct TickDurationReply : public RCReply +{ + TickDurationReply(RCLink *l) :RCReply(l) {} + std::string getType() { return "TickDuration"; } + RCReply::parseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream); + float duration; +}; + +struct TickRemainingReply : public RCReply +{ + TickRemainingReply(RCLink *l) :RCReply(l) {} + std::string getType() { return "TickRemaining"; } + RCReply::parseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream); + float remaining; +}; + +#endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Modified: trunk/bzflag/src/bzrobots/RCRequest.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-06 09:04:48 UTC (rev 14466) @@ -37,12 +37,6 @@ { } - -void RCRequest::sendAck(bool newline) -{ - float elapsed = TimeKeeper::getCurrent() - TimeKeeper::getStartTime(); - link->sendf("ack %f %s%s", elapsed, getType().c_str(), (newline ? "\n" : "")); -} bool RCRequest::process(RCRobotPlayer *rrp) { return true; } int RCRequest::getRobotIndex() Modified: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-06 09:04:48 UTC (rev 14466) @@ -27,14 +27,14 @@ class RCRobotPlayer; class RCRequest; -class RCRequest :public RCMessage<RCRequest> { +class RCRequest :public RCMessage<RCRequest> +{ public: RCRequest(RCLink *_link); virtual ~RCRequest(); int getRobotIndex(); - virtual void sendAck(bool newline = false); virtual bool process(RCRobotPlayer *rrp); virtual parseStatus parse(char **arguments, int count) = 0; virtual std::string getType() = 0; Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-06 09:04:48 UTC (rev 14466) @@ -3,10 +3,6 @@ #include "version.h" -void RCRequestZeroArgument::sendAck(bool) -{ - RCRequest::sendAck(true); -} RCRequest::parseStatus RCRequestZeroArgument::parse(char ** /*arguments*/, int count) { if (count != 0) @@ -17,11 +13,6 @@ { } -void RCRequestBotSpecific::sendAck(bool) -{ - RCRequest::sendAck(); - link->sendf(" %d\n", getRobotIndex()); -} RCRequest::parseStatus RCRequestBotSpecific::parse(char **arguments, int count) { if (count != 1) @@ -35,11 +26,6 @@ stream << getRobotIndex(); } -void IdentifyFrontendReq::sendAck(bool) -{ - RCRequest::sendAck(); - link->sendf(" %s\n", version); -} RCRequest::parseStatus IdentifyFrontendReq::parse(char **arguments, int count) { if (count != 1) @@ -100,11 +86,6 @@ return true; } -void SetSpeedReq::sendAck(bool) -{ - RCRequest::sendAck(); - link->sendf(" %d %f\n", getRobotIndex(), speed); -} RCRequest::parseStatus SetSpeedReq::parse(char **arguments, int count) { if (count != 2) @@ -128,11 +109,6 @@ stream << getRobotIndex() << " " << speed; } -void SetTurnRateReq::sendAck(bool) -{ - RCRequest::sendAck(); - link->sendf(" %d %f\n", getRobotIndex(), rate); -} RCRequest::parseStatus SetTurnRateReq::parse(char **arguments, int count) { if (count != 2) @@ -155,11 +131,6 @@ stream << getRobotIndex() << " " << rate; } -void SetAheadReq::sendAck(bool) -{ - RCRequest::sendAck(); - link->sendf(" %d %f\n", getRobotIndex(), distance); -} RCRequest::parseStatus SetAheadReq::parse(char **arguments, int count) { if (count != 2) @@ -181,11 +152,6 @@ stream << getRobotIndex() << " " << distance; } -void SetTurnLeftReq::sendAck(bool) -{ - RCRequest::sendAck(); - link->sendf(" %d %f\n", getRobotIndex(), turn); -} RCRequest::parseStatus SetTurnLeftReq::parse(char **arguments, int count) { if (count != 2) @@ -243,11 +209,6 @@ return true; } -void SetTickDurationReq::sendAck(bool) -{ - RCRequest::sendAck(); - link->sendf(" %d %f\n", getRobotIndex(), duration); -} RCRequest::parseStatus SetTickDurationReq::parse(char **arguments, int count) { if (count != 1) Modified: trunk/bzflag/src/bzrobots/RCRequests.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-06 09:04:48 UTC (rev 14466) @@ -27,7 +27,6 @@ { RCRequestZeroArgument(RCLink *_link) :RCRequest(_link) { } RCRequest::parseStatus parse(char **arguments, int count); - void sendAck(bool newline = false); virtual bool process(RCRobotPlayer *rrp) = 0; void getParameters(std::ostream &stream); }; @@ -35,7 +34,6 @@ { RCRequestBotSpecific(RCLink *_link) :RCRequest(_link) { } RCRequest::parseStatus parse(char **arguments, int count); - void sendAck(bool newline = false); virtual bool process(RCRobotPlayer *rrp) = 0; void getParameters(std::ostream &stream); }; @@ -131,7 +129,6 @@ COMMANDNAME ## Req(RCLink *_link) :RCRequest(_link) { } \ RCRequest::parseStatus parse(char **arguments, int count); \ std::string getType() { return #COMMANDNAME; } \ - void sendAck(bool newline = false); \ bool process(RCRobotPlayer *rrp); \ void getParameters(std::ostream &stream); Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-05 07:24:49 UTC (rev 14465) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-06 09:04:48 UTC (rev 14466) @@ -2661,7 +2661,7 @@ #endif rcLink->popRequest(); // Discard it, we're done with this one. - req->sendAck(); + rcLink->sendAck(req); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-06 09:33:33
|
Revision: 14467 http://bzflag.svn.sourceforge.net/bzflag/?rev=14467&view=rev Author: daxxar Date: 2007-07-06 02:33:34 -0700 (Fri, 06 Jul 2007) Log Message: ----------- RCLinkFrontend now disconnects when it can't parse a message. (No use sending 'error' to the server). Also, it never enters 'Listening' state any more. RCFrontend.{cxx,h} added - Implements a forking Frontend. Some indentation stuff in botplaying.cxx Modified Paths: -------------- trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx trunk/bzflag/src/bzrobots/RCLinkFrontend.h trunk/bzflag/src/bzrobots/botplaying.cxx Added Paths: ----------- trunk/bzflag/src/bzrobots/RCFrontend.cxx trunk/bzflag/src/bzrobots/RCFrontend.h Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-06 09:04:48 UTC (rev 14466) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-06 09:33:34 UTC (rev 14467) @@ -39,6 +39,8 @@ RCLinkBackend.h \ RCLinkFrontend.cxx \ RCLinkFrontend.h \ + RCFrontend.cxx \ + RCFrontend.h \ RCRobotPlayer.cxx \ RCRobotPlayer.h \ ../bzflag/ActionBinding.cxx \ Added: trunk/bzflag/src/bzrobots/RCFrontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCFrontend.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/RCFrontend.cxx 2007-07-06 09:33:34 UTC (rev 14467) @@ -0,0 +1,35 @@ +#include "RCFrontend.h" + +#include "TimeKeeper.h" + +#include <unistd.h> + +bool RCFrontend::run(const char *host, int port) +{ + pid_t pid = fork(); + if (pid < 0) + return false; + else if (pid > 0) + return true; + + RCFrontend rcFrontend(host, port); + + while (true) + { + rcFrontend.update(); + TimeKeeper::sleep(0.01); + } + + /* Yeah, right. */ + return true; +} + +RCFrontend::RCFrontend(const char *host, int port) +{ + link = new RCLinkFrontend(host, port); +} + +void RCFrontend::update() +{ + link->update(); +} Added: trunk/bzflag/src/bzrobots/RCFrontend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCFrontend.h (rev 0) +++ trunk/bzflag/src/bzrobots/RCFrontend.h 2007-07-06 09:33:34 UTC (rev 14467) @@ -0,0 +1,32 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Remote Control Frontend: Class to encapsulate the frontend. + */ + +#ifndef BZF_RC_FRONTEND_H +#define BZF_RC_FRONTEND_H + +#include "RCLinkFrontend.h" + +class RCFrontend +{ + RCLinkFrontend *link; + public: + static bool run(const char *host, int port); + + RCFrontend(const char *host, int port); + void update(void); +}; + +#endif Modified: trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-06 09:04:48 UTC (rev 14466) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-06 09:33:34 UTC (rev 14467) @@ -48,7 +48,7 @@ int amount = updateRead(); if (amount == -1) { - status = Listening; + status = Disconnected; return; } @@ -92,8 +92,9 @@ req = RCReply::getInstance(argv[0], this); if (req == NULL) { - fprintf(stderr, "RCLink: Invalid request: '%s'\n", argv[0]); - sendf("error Invalid request %s\n", argv[0]); + fprintf(stderr, "RCLink: Invalid reply: '%s'\n", argv[0]); + close(connfd); + status = Disconnected; return false; } else { switch (req->parse(argv + 1, argc - 1)) @@ -105,15 +106,19 @@ replies->append(req); return true; case RCReply::InvalidArgumentCount: - fprintf(stderr, "RCLink: Invalid number of arguments (%d) for request: '%s'\n", argc - 1, argv[0]); - sendf("error Invalid number of arguments (%d) for request: '%s'\n", argc - 1, argv[0]); + fprintf(stderr, "RCLink: Invalid number of arguments (%d) for reply: '%s'\n", argc - 1, argv[0]); + close(connfd); + status = Disconnected; return false; case RCReply::InvalidArguments: - fprintf(stderr, "RCLink: Invalid arguments for request: '%s'\n", argv[0]); - sendf("error Invalid arguments for request: '%s'\n", argv[0]); + fprintf(stderr, "RCLink: Invalid arguments for reply: '%s'\n", argv[0]); + close(connfd); + status = Disconnected; return false; default: fprintf(stderr, "RCLink: Parse neither succeeded or failed with a known failcode. WTF?\n"); + close(connfd); + status = Disconnected; return false; } } Modified: trunk/bzflag/src/bzrobots/RCLinkFrontend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.h 2007-07-06 09:04:48 UTC (rev 14466) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.h 2007-07-06 09:33:34 UTC (rev 14467) @@ -21,6 +21,8 @@ #include "RCLink.h" #include "RCReply.h" +class RCReply; + class RCLinkFrontend : public RCLink { private: Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-06 09:04:48 UTC (rev 14466) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-06 09:33:34 UTC (rev 14467) @@ -57,6 +57,7 @@ // local implementation headers #include "RCLinkBackend.h" +#include "RCFrontend.h" #include "AutoPilot.h" #include "bzflag.h" #include "commands.h" @@ -854,10 +855,10 @@ static void handleFlagNegotiation ( void *msg, uint16_t len ) { if (len > 0) - { - dumpMissingFlag((char *)msg, len); - return; - } + { + dumpMissingFlag((char *)msg, len); + return; + } serverLink->send(MsgWantSettings, 0, NULL); } @@ -898,14 +899,14 @@ void *buf = nboUnpackUInt(msg, bytesLeft); bool last = processWorldChunk(buf, len - 4, bytesLeft); if (!last) - { - char message[MaxPacketLen]; - // ask for next chunk - worldPtr += len - 4; - nboPackUInt(message, worldPtr); - serverLink->send(MsgGetWorld, sizeof(uint32_t), message); - return; - } + { + char message[MaxPacketLen]; + // ask for next chunk + worldPtr += len - 4; + nboPackUInt(message, worldPtr); + serverLink->send(MsgGetWorld, sizeof(uint32_t), message); + return; + } if (cacheOut) delete cacheOut; cacheOut = NULL; @@ -920,14 +921,14 @@ msg = nboUnpackInt(msg, timeLeft); hud->setTimeLeft(timeLeft); if (timeLeft == 0) - { - gameOver = true; + { + gameOver = true; #ifdef ROBOT - for (int i = 0; i < numRobots; i++) - if (robots[i]) - robots[i]->explodeTank(); + for (int i = 0; i < numRobots; i++) + if (robots[i]) + robots[i]->explodeTank(); #endif - } + } else if (timeLeft < 0) hud->setAlert(0, "Game Paused", 10.0f, true); } @@ -944,18 +945,18 @@ // make a message std::string msg2; if (team == (uint16_t)NoTeam) + { + // a player won + if (player) { - // a player won - if (player) - { - msg2 = _player->getCallSign(); - msg2 += " ("; - msg2 += Team::getName(_player->getTeam()); - msg2 += ")"; - } - else - msg2 = "[unknown player]"; + msg2 = _player->getCallSign(); + msg2 += " ("; + msg2 += Team::getName(_player->getTeam()); + msg2 += ")"; } + else + msg2 = "[unknown player]"; + } else msg2 = Team::getName(TeamColor(team)); // a team won @@ -965,10 +966,10 @@ #ifdef ROBOT for (int i = 0; i < numRobots; i++) - { - if (robots[i]) - robots[i]->explodeTank(); - } + { + if (robots[i]) + robots[i]->explodeTank(); + } #endif } @@ -984,11 +985,11 @@ if (id == observerTank->getId()) enteringServer(msg); // it's me! should be the end of updates else - { - addPlayer(id, msg, entered); - updateNumPlayers(); - checkScores = true; - } + { + addPlayer(id, msg, entered); + updateNumPlayers(); + checkScores = true; + } } static void handleRemovePlayer ( void *msg, uint16_t /*len*/, bool &checkScores ) @@ -1006,10 +1007,10 @@ uint16_t flagIndex; msg = nboUnpackUShort(msg, count); for (int i = 0; i < count; i++) - { - msg = nboUnpackUShort(msg, flagIndex); - msg = world->getFlag(int(flagIndex)).unpack(msg); - } + { + msg = nboUnpackUShort(msg, flagIndex); + msg = world->getFlag(int(flagIndex)).unpack(msg); + } } static void handleTeamUpdate ( void *msg, uint16_t /*len*/, bool &checkScores ) @@ -1019,10 +1020,10 @@ msg = nboUnpackUByte(msg,numTeams); for (int i = 0; i < numTeams; i++) - { - msg = nboUnpackUShort(msg, team); - msg = teams[int(team)].unpack(msg); - } + { + msg = nboUnpackUShort(msg, team); + msg = teams[int(team)].unpack(msg); + } updateNumPlayers(); checkScores = true; } @@ -1038,31 +1039,31 @@ int playerIndex = lookupPlayerIndex(id); if ((playerIndex >= 0) || (playerIndex == -2)) + { + static const float zero[3] = { 0.0f, 0.0f, 0.0f }; + Player* tank = getPlayerByIndex(playerIndex); + if (tank->getPlayerType() == ComputerPlayer) { - static const float zero[3] = { 0.0f, 0.0f, 0.0f }; - Player* tank = getPlayerByIndex(playerIndex); - if (tank->getPlayerType() == ComputerPlayer) - { - for (int r = 0; r < numRobots; r++) - { - if (robots[r] && robots[r]->getId() == playerIndex) - { - robots[r]->restart(pos,forward); - if (!rcLink) - { - setRobotTarget(robots[r]); - } - break; - } - } - } + for (int r = 0; r < numRobots; r++) + { + if (robots[r] && robots[r]->getId() == playerIndex) + { + robots[r]->restart(pos,forward); + if (!rcLink) + { + setRobotTarget(robots[r]); + } + break; + } + } + } - tank->setStatus(PlayerState::Alive); - tank->move(pos, forward); - tank->setVelocity(zero); - tank->setAngularVelocity(0.0f); - tank->setDeadReckoning((float)syncedClock.GetServerSeconds()); - } + tank->setStatus(PlayerState::Alive); + tank->move(pos, forward); + tank->setVelocity(zero); + tank->setAngularVelocity(0.0f); + tank->setDeadReckoning((float)syncedClock.GetServerSeconds()); + } } static void handleAutoPilot ( void *msg, uint16_t /*len*/ ) @@ -1102,7 +1103,8 @@ if (!tank) { tank = lookupPlayer(id); } - if (!tank) return; + if (!tank) + return; if (localtank) { localtank->setDesiredSpeed(0.0); @@ -1131,47 +1133,47 @@ msg = nboUnpackShort(msg, shotId); msg = FlagType::unpack(msg, flagType); if (reason == (int16_t)PhysicsDriverDeath) - { - int32_t inPhyDrv; - msg = nboUnpackInt(msg, inPhyDrv); - phydrv = int(inPhyDrv); - } + { + int32_t inPhyDrv; + msg = nboUnpackInt(msg, inPhyDrv); + phydrv = int(inPhyDrv); + } BaseLocalPlayer* victimLocal = getLocalPlayer(victim); BaseLocalPlayer* killerLocal = getLocalPlayer(killer); Player* victimPlayer = lookupPlayer(victim); Player* killerPlayer = lookupPlayer(killer); if (victimLocal) - { - // uh oh, local player is dead - if (victimLocal->isAlive()) - gotBlowedUp(victimLocal, GotKilledMsg, killer); - } + { + // uh oh, local player is dead + if (victimLocal->isAlive()) + gotBlowedUp(victimLocal, GotKilledMsg, killer); + } else if (victimPlayer) - { - victimPlayer->setExplode(TimeKeeper::getTick()); - } + { + victimPlayer->setExplode(TimeKeeper::getTick()); + } if (killerLocal) - { - // local player did it - if (shotId >= 0) - killerLocal->endShot(shotId, true); // terminate the shot - } + { + // local player did it + if (shotId >= 0) + killerLocal->endShot(shotId, true); // terminate the shot + } #ifdef ROBOT // blow up robots on victim's team if shot was genocide if (killerPlayer && victimPlayer && shotId >= 0) + { + const ShotPath* shot = killerPlayer->getShot(int(shotId)); + if (shot && shot->getFlag() == Flags::Genocide) { - const ShotPath* shot = killerPlayer->getShot(int(shotId)); - if (shot && shot->getFlag() == Flags::Genocide) - { - for (int i = 0; i < numRobots; i++) - { - if (robots[i] && victimPlayer != robots[i] && victimPlayer->getTeam() == robots[i]->getTeam() && robots[i]->getTeam() != RogueTeam) - gotBlowedUp(robots[i], GenocideEffect, killerPlayer->getId()); - } - } + for (int i = 0; i < numRobots; i++) + { + if (robots[i] && victimPlayer != robots[i] && victimPlayer->getTeam() == robots[i]->getTeam() && robots[i]->getTeam() != RogueTeam) + gotBlowedUp(robots[i], GenocideEffect, killerPlayer->getId()); + } } + } #endif checkScores = true; @@ -1237,33 +1239,33 @@ // player no longer has flag if (capturer) + { + capturer->setFlag(Flags::Null); + + // add message + if (int(capturer->getTeam()) == capturedTeam) { - capturer->setFlag(Flags::Null); - - // add message - if (int(capturer->getTeam()) == capturedTeam) - { - std::string message("took my flag into "); - message += Team::getName(TeamColor(team)); - message += " territory"; - addMessage(capturer, message); - } - else - { - std::string message("captured "); - message += Team::getName(TeamColor(capturedTeam)); - message += "'s flag"; - addMessage(capturer, message); - } + std::string message("took my flag into "); + message += Team::getName(TeamColor(team)); + message += " territory"; + addMessage(capturer, message); } + else + { + std::string message("captured "); + message += Team::getName(TeamColor(capturedTeam)); + message += "'s flag"; + addMessage(capturer, message); + } + } #ifdef ROBOT //kill all my robots if they are on the captured team for (int r = 0; r < numRobots; r++) - { - if (robots[r] && robots[r]->getTeam() == capturedTeam) - gotBlowedUp(robots[r], GotCaptured, robots[r]->getId()); - } + { + if (robots[r] && robots[r]->getTeam() == capturedTeam) + gotBlowedUp(robots[r], GotCaptured, robots[r]->getId()); + } #endif checkScores = true; @@ -1284,45 +1286,45 @@ // mode 2 == remove this person from the rabbit list if (mode == 0) // we don't need to mod the hunters if we aren't swaping + { + for (int i = 0; i < curMaxPlayers; i++) { - for (int i = 0; i < curMaxPlayers; i++) - { - if (player[i]) - player[i]->setHunted(false); - if (i != id && player[i] && player[i]->getTeam() != RogueTeam && player[i]->getTeam() != ObserverTeam) - player[i]->changeTeam(HunterTeam); - } + if (player[i]) + player[i]->setHunted(false); + if (i != id && player[i] && player[i]->getTeam() != RogueTeam && player[i]->getTeam() != ObserverTeam) + player[i]->changeTeam(HunterTeam); } + } if (rabbit != NULL) + { + if (mode != 2) { - if (mode != 2) - { - rabbit->changeTeam(RabbitTeam); + rabbit->changeTeam(RabbitTeam); - if (mode == 0) - addMessage(rabbit, "is now the rabbit", 3, true); - else - addMessage(rabbit, "is now a rabbit", 3, true); - } + if (mode == 0) + addMessage(rabbit, "is now the rabbit", 3, true); else - { - rabbit->changeTeam(HunterTeam); - addMessage(rabbit, "is no longer a rabbit", 3, true); - } + addMessage(rabbit, "is now a rabbit", 3, true); } + else + { + rabbit->changeTeam(HunterTeam); + addMessage(rabbit, "is no longer a rabbit", 3, true); + } + } #ifdef ROBOT for (int r = 0; r < numRobots; r++) + { + if (robots[r]) { - if (robots[r]) - { - if (robots[r]->getId() == id) - robots[r]->changeTeam(RabbitTeam); - else - robots[r]->changeTeam(HunterTeam); - } + if (robots[r]->getId() == id) + robots[r]->changeTeam(RabbitTeam); + else + robots[r]->changeTeam(HunterTeam); } + } #endif } @@ -3461,6 +3463,11 @@ RCRequest::initializeLookup(); int port = atoi(BZDB.get("rcPort").c_str()); rcLink = new RCLinkBackend(port); + if (!RCFrontend::run("localhost", port)) + { + fprintf(stderr, "Could not fork Frontend!\n"); + exit(1); + } } // enter game if we have all the info we need, otherwise This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-07 12:42:17
|
Revision: 14470 http://bzflag.svn.sourceforge.net/bzflag/?rev=14470&view=rev Author: daxxar Date: 2007-07-07 05:42:12 -0700 (Sat, 07 Jul 2007) Log Message: ----------- Now using Factory. GetGunHeatReq now uses GunHeatReply to send it's reply. Some grunt should hopefully go over the classes in RCReplies.h and add constructors that take parameters to initialize the struct, and change RCRequests.cxx so that it uses these constructors and link->send(SomeReply(somedata)) to reply (instead of constructing strings). Fixed a segfault. Added IdentifyBackend to RCReplies. RCReplies registered in Frontend. RCRequests registered in botplaying.cxx. RCFrontend -> Frontend. Other changes? (lots of stuff) Modified Paths: -------------- trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCLink.cxx trunk/bzflag/src/bzrobots/RCLink.h trunk/bzflag/src/bzrobots/RCLinkBackend.cxx trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx trunk/bzflag/src/bzrobots/RCLinkFrontend.h trunk/bzflag/src/bzrobots/RCMessage.h trunk/bzflag/src/bzrobots/RCReplies.cxx trunk/bzflag/src/bzrobots/RCReplies.h trunk/bzflag/src/bzrobots/RCReply.h trunk/bzflag/src/bzrobots/RCRequest.cxx trunk/bzflag/src/bzrobots/RCRequest.h trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRequests.h trunk/bzflag/src/bzrobots/botplaying.cxx Added Paths: ----------- trunk/bzflag/src/bzrobots/Frontend.cxx trunk/bzflag/src/bzrobots/Frontend.h Removed Paths: ------------- trunk/bzflag/src/bzrobots/RCFrontend.cxx trunk/bzflag/src/bzrobots/RCFrontend.h trunk/bzflag/src/bzrobots/RCReply.cxx Copied: trunk/bzflag/src/bzrobots/Frontend.cxx (from rev 14467, trunk/bzflag/src/bzrobots/RCFrontend.cxx) =================================================================== --- trunk/bzflag/src/bzrobots/Frontend.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-07 12:42:12 UTC (rev 14470) @@ -0,0 +1,39 @@ +#include "Frontend.h" + +#include "TimeKeeper.h" +#include "RCMessageFactory.h" + +#include <unistd.h> + +bool Frontend::run(const char *host, int port) +{ + return true; + pid_t pid = fork(); + if (pid < 0) + return false; + else if (pid > 0) + return true; + + Frontend frontend(host, port); + + while (true) + { + frontend.update(); + TimeKeeper::sleep(0.01); + } + + /* Yeah, right. */ + return true; +} + +Frontend::Frontend(const char *host, int port) +{ + RCMessageFactory<RCReply>::initialize(); + link = new RCLinkFrontend(host, port); + RCREPLY.setLink(link); +} + +void Frontend::update() +{ + link->update(); +} Copied: trunk/bzflag/src/bzrobots/Frontend.h (from rev 14467, trunk/bzflag/src/bzrobots/RCFrontend.h) =================================================================== --- trunk/bzflag/src/bzrobots/Frontend.h (rev 0) +++ trunk/bzflag/src/bzrobots/Frontend.h 2007-07-07 12:42:12 UTC (rev 14470) @@ -0,0 +1,33 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Remote Control Frontend: Class to encapsulate the frontend. + */ + +#ifndef BZF_FRONTEND_H +#define BZF_FRONTEND_H + +#include "RCLinkFrontend.h" + +class Frontend +{ + RCLinkFrontend *link; + /* Should only be instantiated from run() */ + Frontend(const char *host, int port); + public: + static bool run(const char *host, int port); + + void update(void); +}; + +#endif Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-07 12:42:12 UTC (rev 14470) @@ -31,18 +31,21 @@ RCRequest.h \ RCRequests.cxx \ RCRequests.h \ - RCReply.cxx \ RCReply.h \ RCReplies.cxx \ RCReplies.h \ + RCMessageFactory.h \ + RCMessageFactory.cxx \ RCLinkBackend.cxx \ RCLinkBackend.h \ RCLinkFrontend.cxx \ RCLinkFrontend.h \ - RCFrontend.cxx \ - RCFrontend.h \ RCRobotPlayer.cxx \ RCRobotPlayer.h \ + Frontend.cxx \ + Frontend.h \ + AdvancedRobot.cxx \ + AdvancedRobot.h \ ../bzflag/ActionBinding.cxx \ ../bzflag/ActionBinding.h \ ../bzflag/AudioMenu.cxx \ Deleted: trunk/bzflag/src/bzrobots/RCFrontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCFrontend.cxx 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCFrontend.cxx 2007-07-07 12:42:12 UTC (rev 14470) @@ -1,35 +0,0 @@ -#include "RCFrontend.h" - -#include "TimeKeeper.h" - -#include <unistd.h> - -bool RCFrontend::run(const char *host, int port) -{ - pid_t pid = fork(); - if (pid < 0) - return false; - else if (pid > 0) - return true; - - RCFrontend rcFrontend(host, port); - - while (true) - { - rcFrontend.update(); - TimeKeeper::sleep(0.01); - } - - /* Yeah, right. */ - return true; -} - -RCFrontend::RCFrontend(const char *host, int port) -{ - link = new RCLinkFrontend(host, port); -} - -void RCFrontend::update() -{ - link->update(); -} Deleted: trunk/bzflag/src/bzrobots/RCFrontend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCFrontend.h 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCFrontend.h 2007-07-07 12:42:12 UTC (rev 14470) @@ -1,32 +0,0 @@ -/* bzflag - * Copyright (c) 1993 - 2007 Tim Riker - * - * This package is free software; you can redistribute it and/or - * modify it under the terms of the license found in the file - * named COPYING that should have accompanied this file. - * - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * Remote Control Frontend: Class to encapsulate the frontend. - */ - -#ifndef BZF_RC_FRONTEND_H -#define BZF_RC_FRONTEND_H - -#include "RCLinkFrontend.h" - -class RCFrontend -{ - RCLinkFrontend *link; - public: - static bool run(const char *host, int port); - - RCFrontend(const char *host, int port); - void update(void); -}; - -#endif Modified: trunk/bzflag/src/bzrobots/RCLink.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCLink.cxx 2007-07-07 12:42:12 UTC (rev 14470) @@ -123,7 +123,7 @@ return true; } -bool RCLink::send(char* message) +bool RCLink::send(const char* message) { if (output_overflow) { return false; Modified: trunk/bzflag/src/bzrobots/RCLink.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLink.h 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCLink.h 2007-07-07 12:42:12 UTC (rev 14470) @@ -58,23 +58,23 @@ int updateRead(); void detachAgents(); - bool send(char *message); + bool send(const char *message); bool sendf(const char *format, ...); template<class C> - bool send(RCMessage<C> *message) + bool send(const RCMessage<C> *message) { - return send(getMessage(message).c_str()); + return sendf("%s\n", getMessage(message).c_str()); } template<class C> - bool send(RCMessage<C> &message) + bool send(const RCMessage<C> &message) { return send(&message); } protected: template<class C> - std::string getMessage(RCMessage<C> *message) + std::string getMessage(const RCMessage<C> *message) { std::stringstream ss; ss << message->getType() << " "; Modified: trunk/bzflag/src/bzrobots/RCLinkBackend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-07 12:42:12 UTC (rev 14470) @@ -17,11 +17,11 @@ #include <stdarg.h> #include "RCLinkBackend.h" +#include "RCMessageFactory.h" #include "version.h" -RCLinkBackend::RCLinkBackend(int _port) :RCLink(), - requests(NULL) +RCLinkBackend::RCLinkBackend(int _port) :requests(NULL) { port = _port; startListening(); @@ -91,7 +91,7 @@ break; } - req = RCRequest::getInstance(argv[0], this); + req = RCREQUEST.Message(argv[0]); if (req == NULL) { fprintf(stderr, "RCLink: Invalid request: '%s'\n", argv[0]); sendf("error Invalid request %s\n", argv[0]); Modified: trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-07 12:42:12 UTC (rev 14470) @@ -17,11 +17,11 @@ #include <stdarg.h> #include "RCLinkFrontend.h" +#include "RCMessageFactory.h" #include "version.h" -RCLinkFrontend::RCLinkFrontend(std::string _host, int _port) :RCLink(), - replies(NULL) +RCLinkFrontend::RCLinkFrontend(std::string _host, int _port) :replies(NULL) { port = _port; host = _host.c_str(); @@ -57,8 +57,8 @@ } else if (status == Connecting) { int ncommands = updateParse(1); if (ncommands) { - RCReply *req = popReply(); - if (req && req->getType() == "IdentifyBackend") { + RCReply *rep = popReply(); + if (rep && rep->getType() == "IdentifyBackend") { status = Connected; } else { fprintf(stderr, "RCLink: Expected an 'IdentifyBackend'.\n"); @@ -76,7 +76,7 @@ */ bool RCLinkFrontend::parseCommand(char *cmdline) { - RCReply *req; + RCReply *rep; int argc; char *argv[RC_LINK_MAXARGS]; char *s, *tkn; @@ -90,20 +90,20 @@ break; } - req = RCReply::getInstance(argv[0], this); - if (req == NULL) { + rep = RCREPLY.Message(argv[0]); + if (rep == NULL) { fprintf(stderr, "RCLink: Invalid reply: '%s'\n", argv[0]); close(connfd); status = Disconnected; return false; } else { - switch (req->parse(argv + 1, argc - 1)) + switch (rep->parse(argv + 1, argc - 1)) { case RCReply::ParseOk: if (replies == NULL) - replies = req; + replies = rep; else - replies->append(req); + replies->append(rep); return true; case RCReply::InvalidArgumentCount: fprintf(stderr, "RCLink: Invalid number of arguments (%d) for reply: '%s'\n", argc - 1, argv[0]); Modified: trunk/bzflag/src/bzrobots/RCLinkFrontend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.h 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.h 2007-07-07 12:42:12 UTC (rev 14470) @@ -21,8 +21,6 @@ #include "RCLink.h" #include "RCReply.h" -class RCReply; - class RCLinkFrontend : public RCLink { private: Modified: trunk/bzflag/src/bzrobots/RCMessage.h =================================================================== --- trunk/bzflag/src/bzrobots/RCMessage.h 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCMessage.h 2007-07-07 12:42:12 UTC (rev 14470) @@ -36,21 +36,12 @@ InvalidArgumentCount, InvalidArguments } parseStatus; - typedef std::map<std::string, C *(*)(RCLink *)> lookupTable; - /* These are static functions to allow for instantiation - * of classes based on a string (the request command name) */ - static C *getInstance(std::string message, RCLink *_link) - { - if (messageLookup.find(message) != messageLookup.end()) - return messageLookup[message](_link); - return NULL; - } - - - RCMessage(RCLink *_link) :next(NULL), link(_link) { } + RCMessage() :next(NULL), link(NULL) { } virtual ~RCMessage() {} + void setLink(RCLink *_link) { link = _link; } + /* This is for the linked-list aspect of RCMessage. */ C *getNext() { return next; } void append(C *newreq) @@ -64,8 +55,8 @@ /* These three are dependent on the specific packet-type, so they are * left for the complete implementations. :-) */ virtual parseStatus parse(char **arguments, int count) = 0; - virtual std::string getType() = 0; - virtual void getParameters(std::ostream &stream) = 0; + virtual std::string getType() const = 0; + virtual void getParameters(std::ostream &stream) const = 0; /* Utility functions. */ static bool parseFloat(char *string, float &dest) @@ -99,17 +90,9 @@ C *next; protected: - /* These are static data and functions to allow for instantiation - * of classes based on a string (the request command name) */ - static lookupTable messageLookup; - template <typename T> - static C* instantiate(RCLink *_link) { return new T(_link); } RCLink *link; }; -template <class C> -typename RCMessage<C>::lookupTable RCMessage<C>::messageLookup; - #endif // Local Variables: *** Modified: trunk/bzflag/src/bzrobots/RCReplies.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-07 12:42:12 UTC (rev 14470) @@ -2,6 +2,22 @@ #include "version.h" +RCReply::parseStatus IdentifyBackend::parse(char **arguments, int count) +{ + if (count != 1) + return InvalidArgumentCount; + /* Version-checking, to be sure we're speaking the same language! */ + if (strcasecmp(arguments[0], getRobotsProtocolVersion()) != 0) + return InvalidArguments; + version = strdup(arguments[0]); + return ParseOk; +} +void IdentifyBackend::getParameters(std::ostream &stream) const +{ + stream << version; +} + + RCReply::parseStatus GunHeatReply::parse(char **arguments, int count) { if (count != 1) @@ -11,7 +27,7 @@ return ParseOk; } -void GunHeatReply::getParameters(std::ostream &stream) +void GunHeatReply::getParameters(std::ostream &stream) const { stream << heat; } @@ -25,7 +41,7 @@ return ParseOk; } -void DistanceRemainingReply::getParameters(std::ostream &stream) +void DistanceRemainingReply::getParameters(std::ostream &stream) const { stream << distance; } @@ -39,7 +55,7 @@ return ParseOk; } -void TurnRemainingReply::getParameters(std::ostream &stream) +void TurnRemainingReply::getParameters(std::ostream &stream) const { stream << turn; } @@ -53,7 +69,7 @@ return ParseOk; } -void TickDurationReply::getParameters(std::ostream &stream) +void TickDurationReply::getParameters(std::ostream &stream) const { stream << duration; } @@ -67,7 +83,7 @@ return ParseOk; } -void TickRemainingReply::getParameters(std::ostream &stream) +void TickRemainingReply::getParameters(std::ostream &stream) const { stream << remaining; } Modified: trunk/bzflag/src/bzrobots/RCReplies.h =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-07 12:42:12 UTC (rev 14470) @@ -15,57 +15,68 @@ * replies to the requests made by the frontend */ -#ifndef BZF_RC_REQUESTS_H -#define BZF_RC_REQUESTS_H +#ifndef BZF_RC_REPLIES_H +#define BZF_RC_REPLIES_H #include <string> #include "RCReply.h" #include "RCLink.h" +struct IdentifyBackend : public RCReply +{ + std::string getType() const { return "IdentifyBackend"; } + RCReply::parseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream) const; + + private: char *version; +}; + struct GunHeatReply : public RCReply { - GunHeatReply(RCLink *l) :RCReply(l) {} - std::string getType() { return "GunHeat"; } + GunHeatReply() :heat(0.0f) {} + GunHeatReply(float _heat) :heat(_heat) {} + std::string getType() const { return "GunHeat"; } RCReply::parseStatus parse(char **arguments, int count); - void getParameters(std::ostream &stream); - float heat; + void getParameters(std::ostream &stream) const; + + private: float heat; }; struct DistanceRemainingReply : public RCReply { - DistanceRemainingReply(RCLink *l) :RCReply(l) {} - std::string getType() { return "DistanceRemaining"; } + std::string getType() const { return "DistanceRemaining"; } RCReply::parseStatus parse(char **arguments, int count); - void getParameters(std::ostream &stream); - float distance; + void getParameters(std::ostream &stream) const; + + private: float distance; }; struct TurnRemainingReply : public RCReply { - TurnRemainingReply(RCLink *l) :RCReply(l) {} - std::string getType() { return "TurnRemaining"; } + std::string getType() const { return "TurnRemaining"; } RCReply::parseStatus parse(char **arguments, int count); - void getParameters(std::ostream &stream); - float turn; + void getParameters(std::ostream &stream) const; + + private: float turn; }; struct TickDurationReply : public RCReply { - TickDurationReply(RCLink *l) :RCReply(l) {} - std::string getType() { return "TickDuration"; } + std::string getType() const { return "TickDuration"; } RCReply::parseStatus parse(char **arguments, int count); - void getParameters(std::ostream &stream); - float duration; + void getParameters(std::ostream &stream) const; + + private: float duration; }; struct TickRemainingReply : public RCReply { - TickRemainingReply(RCLink *l) :RCReply(l) {} - std::string getType() { return "TickRemaining"; } + std::string getType() const { return "TickRemaining"; } RCReply::parseStatus parse(char **arguments, int count); - void getParameters(std::ostream &stream); - float remaining; + void getParameters(std::ostream &stream) const; + + private: float remaining; }; #endif Deleted: trunk/bzflag/src/bzrobots/RCReply.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCReply.cxx 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCReply.cxx 2007-07-07 12:42:12 UTC (rev 14470) @@ -1,17 +0,0 @@ -#include "RCReply.h" -#include "Roster.h" - -#include "RCLink.h" -//#include "RCReplys.h" - -#define ADD_LOOKUP(COMMAND) messageLookup[#COMMAND] = &instantiate<COMMAND ## Req> -/* These two are static functions that manipulate and access the lookup- - * table for request commands -> request instances. :-) */ -void RCReply::initializeLookup(void) -{ -} - -RCReply::~RCReply() { } -RCReply::RCReply(RCLink *_link) :RCMessage<RCReply>(_link) -{ -} Modified: trunk/bzflag/src/bzrobots/RCReply.h =================================================================== --- trunk/bzflag/src/bzrobots/RCReply.h 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCReply.h 2007-07-07 12:42:12 UTC (rev 14470) @@ -11,11 +11,11 @@ */ /* - * Remote Control Request: Encapsulates requests between backend and frontend + * Remote Control Reply: Encapsulates the reply to a request from a frontend. */ -#ifndef BZF_RC_REQUEST_H -#define BZF_RC_REQUEST_H +#ifndef BZF_RC_REPLY_H +#define BZF_RC_REPLY_H #include "common.h" #include "RCMessage.h" @@ -23,23 +23,11 @@ #include <string> #include <map> -class RCLink; -class RCRobotPlayer; -class RCReply; - class RCReply :public RCMessage<RCReply> { public: - RCReply(RCLink *_link); - virtual ~RCReply(); - virtual parseStatus parse(char **arguments, int count) = 0; - virtual std::string getType() = 0; - virtual void getParameters(std::ostream &stream) = 0; - - static void initializeLookup(void); - - protected: - RCLink *link; + virtual std::string getType() const = 0; + virtual void getParameters(std::ostream &stream) const = 0; }; #endif Modified: trunk/bzflag/src/bzrobots/RCRequest.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-07 12:42:12 UTC (rev 14470) @@ -4,42 +4,11 @@ #include "RCLink.h" #include "RCRequests.h" -#define ADD_LOOKUP(COMMAND) messageLookup[#COMMAND] = &instantiate<COMMAND ## Req> -/* These two are static functions that manipulate and access the lookup- - * table for request commands -> request instances. :-) */ -void RCRequest::initializeLookup(void) -{ - ADD_LOOKUP(IdentifyFrontend); - ADD_LOOKUP(Execute); - ADD_LOOKUP(SetSpeed); - ADD_LOOKUP(SetTurnRate); - ADD_LOOKUP(SetAhead); - ADD_LOOKUP(SetTurnLeft); - ADD_LOOKUP(SetFire); - ADD_LOOKUP(GetGunHeat); - ADD_LOOKUP(GetDistanceRemaining); - ADD_LOOKUP(GetTurnRemaining); - ADD_LOOKUP(GetTickDuration); - ADD_LOOKUP(SetTickDuration); - ADD_LOOKUP(GetTickRemaining); - ADD_LOOKUP(GetTeams); - ADD_LOOKUP(GetBases); - ADD_LOOKUP(GetObstacles); - ADD_LOOKUP(GetFlags); - ADD_LOOKUP(GetShots); - ADD_LOOKUP(GetMyTanks); - ADD_LOOKUP(GetOtherTanks); - ADD_LOOKUP(GetConstants); -} +#include "RCMessageFactory.h" -RCRequest::~RCRequest() { } -RCRequest::RCRequest(RCLink *_link) :RCMessage<RCRequest>(_link) -{ -} +bool RCRequest::process(RCRobotPlayer *) { return true; } -bool RCRequest::process(RCRobotPlayer *rrp) { return true; } - -int RCRequest::getRobotIndex() +int RCRequest::getRobotIndex() const { return robotIndex; } Modified: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-07 12:42:12 UTC (rev 14470) @@ -23,22 +23,17 @@ #include <string> #include <map> -class RCLink; class RCRobotPlayer; -class RCRequest; class RCRequest :public RCMessage<RCRequest> { public: - RCRequest(RCLink *_link); - virtual ~RCRequest(); + int getRobotIndex() const; - int getRobotIndex(); - virtual bool process(RCRobotPlayer *rrp); virtual parseStatus parse(char **arguments, int count) = 0; - virtual std::string getType() = 0; - virtual void getParameters(std::ostream &stream) = 0; + virtual std::string getType() const = 0; + virtual void getParameters(std::ostream &stream) const = 0; static void initializeLookup(void); @@ -46,7 +41,6 @@ int robotIndex; protected: - RCLink *link; int setRobotIndex(char *arg); }; Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-07 12:42:12 UTC (rev 14470) @@ -1,15 +1,16 @@ #include "RCRequests.h" +#include "RCReplies.h" #include "RCRobotPlayer.h" #include "version.h" -RCRequest::parseStatus RCRequestZeroArgument::parse(char ** /*arguments*/, int count) +RCRequest::parseStatus RCRequestZeroArgument::parse(char **, int count) { if (count != 0) return InvalidArgumentCount; return ParseOk; } -void RCRequestZeroArgument::getParameters(std::ostream &) +void RCRequestZeroArgument::getParameters(std::ostream &) const { } @@ -21,12 +22,12 @@ return InvalidArguments; return ParseOk; } -void RCRequestBotSpecific::getParameters(std::ostream &stream) +void RCRequestBotSpecific::getParameters(std::ostream &stream) const { stream << getRobotIndex(); } -RCRequest::parseStatus IdentifyFrontendReq::parse(char **arguments, int count) +RCRequest::parseStatus IdentifyFrontend::parse(char **arguments, int count) { if (count != 1) return InvalidArgumentCount; @@ -36,12 +37,8 @@ version = strdup(arguments[0]); return ParseOk; } -bool IdentifyFrontendReq::process(RCRobotPlayer *) +void IdentifyFrontend::getParameters(std::ostream &stream) const { - return true; -} -void IdentifyFrontendReq::getParameters(std::ostream &stream) -{ stream << version; } @@ -104,7 +101,7 @@ rrp->pendingUpdates[RCRobotPlayer::speedUpdate] = true; return true; } -void SetSpeedReq::getParameters(std::ostream &stream) +void SetSpeedReq::getParameters(std::ostream &stream) const { stream << getRobotIndex() << " " << speed; } @@ -126,7 +123,7 @@ rrp->pendingUpdates[RCRobotPlayer::turnRateUpdate] = true; return true; } -void SetTurnRateReq::getParameters(std::ostream &stream) +void SetTurnRateReq::getParameters(std::ostream &stream) const { stream << getRobotIndex() << " " << rate; } @@ -147,7 +144,7 @@ rrp->nextDistance = distance; return true; } -void SetAheadReq::getParameters(std::ostream &stream) +void SetAheadReq::getParameters(std::ostream &stream) const { stream << getRobotIndex() << " " << distance; } @@ -168,7 +165,7 @@ rrp->nextTurn = turn; return true; } -void SetTurnLeftReq::getParameters(std::ostream &stream) +void SetTurnLeftReq::getParameters(std::ostream &stream) const { stream << getRobotIndex() << " " << turn; } @@ -183,7 +180,8 @@ { if (!rrp->isSteadyState()) return false; - link->sendf("GetGunHeat %f\n", rrp->getReloadTime()); + + link->send(GunHeatReply(rrp->getReloadTime())); return true; } @@ -226,7 +224,7 @@ rrp->tickDuration = duration; return true; } -void SetTickDurationReq::getParameters(std::ostream &stream) +void SetTickDurationReq::getParameters(std::ostream &stream) const { stream << getRobotIndex() << " " << duration; } @@ -241,42 +239,42 @@ return true; } -bool GetTeamsReq::process(RCRobotPlayer *rrp) +bool GetTeamsReq::process(RCRobotPlayer *) { // TODO: Implement this. :p return true; } -bool GetBasesReq::process(RCRobotPlayer *rrp) +bool GetBasesReq::process(RCRobotPlayer *) { // TODO: Implement this. :p return true; } -bool GetObstaclesReq::process(RCRobotPlayer *rrp) +bool GetObstaclesReq::process(RCRobotPlayer *) { // TODO: Implement this. :p return true; } -bool GetFlagsReq::process(RCRobotPlayer *rrp) +bool GetFlagsReq::process(RCRobotPlayer *) { // TODO: Implement this. :p return true; } -bool GetShotsReq::process(RCRobotPlayer *rrp) +bool GetShotsReq::process(RCRobotPlayer *) { // TODO: Implement this. :p return true; } -bool GetMyTanksReq::process(RCRobotPlayer *rrp) +bool GetMyTanksReq::process(RCRobotPlayer *) { // TODO: Implement this. :p return true; } -bool GetOtherTanksReq::process(RCRobotPlayer *rrp) +bool GetOtherTanksReq::process(RCRobotPlayer *) { // TODO: Implement this. :p return true; } -bool GetConstantsReq::process(RCRobotPlayer *rrp) +bool GetConstantsReq::process(RCRobotPlayer *) { // TODO: Implement this. :p return true; Modified: trunk/bzflag/src/bzrobots/RCRequests.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-07 12:42:12 UTC (rev 14470) @@ -25,118 +25,103 @@ struct RCRequestZeroArgument : public RCRequest { - RCRequestZeroArgument(RCLink *_link) :RCRequest(_link) { } RCRequest::parseStatus parse(char **arguments, int count); virtual bool process(RCRobotPlayer *rrp) = 0; - void getParameters(std::ostream &stream); + void getParameters(std::ostream &stream) const; }; struct RCRequestBotSpecific : public RCRequest { - RCRequestBotSpecific(RCLink *_link) :RCRequest(_link) { } RCRequest::parseStatus parse(char **arguments, int count); virtual bool process(RCRobotPlayer *rrp) = 0; - void getParameters(std::ostream &stream); + void getParameters(std::ostream &stream) const; }; struct ExecuteReq : public RCRequestBotSpecific { - ExecuteReq(RCLink *l) :RCRequestBotSpecific(l) {} - std::string getType() { return "Execute"; } + std::string getType() const { return "Execute"; } bool process(RCRobotPlayer *rrp); }; struct SetFireReq : public RCRequestBotSpecific { - SetFireReq(RCLink *l) :RCRequestBotSpecific(l) {} - std::string getType() { return "SetFire"; } + std::string getType() const { return "SetFire"; } bool process(RCRobotPlayer *rrp); }; struct GetGunHeatReq : public RCRequestBotSpecific { - GetGunHeatReq(RCLink *l) :RCRequestBotSpecific(l) {} - std::string getType() { return "GetGunHeat"; } + std::string getType() const { return "GetGunHeat"; } bool process(RCRobotPlayer *rrp); }; struct GetDistanceRemainingReq : public RCRequestBotSpecific { - GetDistanceRemainingReq(RCLink *l) :RCRequestBotSpecific(l) {} - std::string getType() { return "GetDistanceRemaining"; } + std::string getType() const { return "GetDistanceRemaining"; } bool process(RCRobotPlayer *rrp); }; struct GetTurnRemainingReq : public RCRequestBotSpecific { - GetTurnRemainingReq(RCLink *l) :RCRequestBotSpecific(l) {} - std::string getType() { return "GetTurnRemaining"; } + std::string getType() const { return "GetTurnRemaining"; } bool process(RCRobotPlayer *rrp); }; struct GetTickDurationReq : public RCRequestBotSpecific { - GetTickDurationReq(RCLink *l) :RCRequestBotSpecific(l) {} - std::string getType() { return "GetTickDuration"; } + std::string getType() const { return "GetTickDuration"; } bool process(RCRobotPlayer *rrp); }; struct GetTickRemainingReq : public RCRequestBotSpecific { - GetTickRemainingReq(RCLink *l) :RCRequestBotSpecific(l) {} - std::string getType() { return "GetTickRemaining"; } + std::string getType() const { return "GetTickRemaining"; } bool process(RCRobotPlayer *rrp); }; struct GetTeamsReq : public RCRequestZeroArgument { - GetTeamsReq(RCLink *l) :RCRequestZeroArgument(l) {} - std::string getType() { return "GetTeams"; } + std::string getType() const { return "GetTeams"; } bool process(RCRobotPlayer *rrp); }; struct GetBasesReq : public RCRequestZeroArgument { - GetBasesReq(RCLink *l) :RCRequestZeroArgument(l) {} - std::string getType() { return "GetBases"; } + std::string getType() const { return "GetBases"; } bool process(RCRobotPlayer *rrp); }; struct GetObstaclesReq : public RCRequestZeroArgument { - GetObstaclesReq(RCLink *l) :RCRequestZeroArgument(l) {} - std::string getType() { return "GetObstacles"; } + std::string getType() const { return "GetObstacles"; } bool process(RCRobotPlayer *rrp); }; struct GetFlagsReq : public RCRequestZeroArgument { - GetFlagsReq(RCLink *l) :RCRequestZeroArgument(l) {} - std::string getType() { return "GetFlags"; } + std::string getType() const { return "GetFlags"; } bool process(RCRobotPlayer *rrp); }; struct GetShotsReq : public RCRequestZeroArgument { - GetShotsReq(RCLink *l) :RCRequestZeroArgument(l) {} - std::string getType() { return "GetShots"; } + std::string getType() const { return "GetShots"; } bool process(RCRobotPlayer *rrp); }; struct GetMyTanksReq : public RCRequestZeroArgument { - GetMyTanksReq(RCLink *l) :RCRequestZeroArgument(l) {} - std::string getType() { return "GetMyTanks"; } + std::string getType() const { return "GetMyTanks"; } bool process(RCRobotPlayer *rrp); }; struct GetOtherTanksReq : public RCRequestZeroArgument { - GetOtherTanksReq(RCLink *l) :RCRequestZeroArgument(l) {} - std::string getType() { return "GetOtherTanks"; } + std::string getType() const { return "GetOtherTanks"; } bool process(RCRobotPlayer *rrp); }; struct GetConstantsReq : public RCRequestZeroArgument { - GetConstantsReq(RCLink *l) :RCRequestZeroArgument(l) {} - std::string getType() { return "GetConstants"; } + std::string getType() const { return "GetConstants"; } bool process(RCRobotPlayer *rrp); }; +struct IdentifyFrontend :public RCRequest { + std::string getType() const { return "IdentifyFrontend"; } + RCRequest::parseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream) const; + + private: char *version; +}; + /* This is just a shorthand to not repeat a bunch of typing. ;-) */ #define DECLARE_REQUEST(COMMANDNAME) class COMMANDNAME ## Req : public RCRequest \ { \ public: \ - COMMANDNAME ## Req(RCLink *_link) :RCRequest(_link) { } \ RCRequest::parseStatus parse(char **arguments, int count); \ - std::string getType() { return #COMMANDNAME; } \ + std::string getType() const { return #COMMANDNAME; } \ bool process(RCRobotPlayer *rrp); \ - void getParameters(std::ostream &stream); + void getParameters(std::ostream &stream) const; -DECLARE_REQUEST(IdentifyFrontend) -private: - char *version; -}; - DECLARE_REQUEST(SetSpeed) private: float speed; Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-06 19:55:09 UTC (rev 14469) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-07 12:42:12 UTC (rev 14470) @@ -57,7 +57,8 @@ // local implementation headers #include "RCLinkBackend.h" -#include "RCFrontend.h" +#include "RCMessageFactory.h" +#include "Frontend.h" #include "AutoPilot.h" #include "bzflag.h" #include "commands.h" @@ -2618,21 +2619,7 @@ rcLink->send("end\n"); } -static void doBotRequests() -{ - RCRequest* req; - int tankindex; - - while ((req = rcLink->peekRequest()) != NULL) { - tankindex = req->getRobotIndex(); - if (tankindex == -1) { - req->process(NULL); - } else { - if (!req->process((RCRobotPlayer*)robots[tankindex])) - return; - } #if 0 - switch (req->getRequestType()) { case TeamListRequest: sendTeamList(); break; @@ -2657,11 +2644,21 @@ case ConstListRequest: sendConstList(); break; - default: - break; - } #endif +static void doBotRequests() +{ + RCRequest* req; + int tankindex; + while ((req = rcLink->peekRequest()) != NULL) { + tankindex = req->getRobotIndex(); + if (tankindex == -1) { + req->process(NULL); + } else { + if (!req->process((RCRobotPlayer*)robots[tankindex])) + return; + } + rcLink->popRequest(); // Discard it, we're done with this one. rcLink->sendAck(req); } @@ -3460,10 +3457,12 @@ if (BZDB.isSet("rcPort")) { // here we register the various RCRequest-handlers for commands // that RCLinkBackend receives. :-) - RCRequest::initializeLookup(); + RCMessageFactory<RCRequest>::initialize(); + int port = atoi(BZDB.get("rcPort").c_str()); rcLink = new RCLinkBackend(port); - if (!RCFrontend::run("localhost", port)) + RCREQUEST.setLink(rcLink); + if (!Frontend::run("localhost", port)) { fprintf(stderr, "Could not fork Frontend!\n"); exit(1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-07 12:44:04
|
Revision: 14471 http://bzflag.svn.sourceforge.net/bzflag/?rev=14471&view=rev Author: daxxar Date: 2007-07-07 05:44:06 -0700 (Sat, 07 Jul 2007) Log Message: ----------- Whoops, forgot this important file (the messagefactory). AdvancedRobot is empty, will be filled eventually. ;-) Added Paths: ----------- trunk/bzflag/src/bzrobots/AdvancedRobot.cxx trunk/bzflag/src/bzrobots/AdvancedRobot.h trunk/bzflag/src/bzrobots/RCMessageFactory.cxx trunk/bzflag/src/bzrobots/RCMessageFactory.h Added: trunk/bzflag/src/bzrobots/AdvancedRobot.cxx =================================================================== Added: trunk/bzflag/src/bzrobots/AdvancedRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/AdvancedRobot.h (rev 0) +++ trunk/bzflag/src/bzrobots/AdvancedRobot.h 2007-07-07 12:44:06 UTC (rev 14471) @@ -0,0 +1,25 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * AdvancedRobot: A class for the simulation and implementation of an AdvancedRobot! + */ + +#ifndef BZF_ADVANCED_ROBOT_H +#define BZF_ADVANCED_ROBOT_H + +class AdvancedRobot +{ + public: +}; + +#endif Added: trunk/bzflag/src/bzrobots/RCMessageFactory.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCMessageFactory.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/RCMessageFactory.cxx 2007-07-07 12:44:06 UTC (rev 14471) @@ -0,0 +1,41 @@ +#include "RCMessageFactory.h" + +#define ADD_LOOKUP(COMMAND) RCREQUEST.Register<COMMAND ## Req>( #COMMAND ); +template<> +void RCMessageFactory<RCRequest>::initialize() +{ + RCREQUEST.Register<IdentifyFrontend>("IdentifyFrontend"); + ADD_LOOKUP(Execute); + ADD_LOOKUP(SetSpeed); + ADD_LOOKUP(SetTurnRate); + ADD_LOOKUP(SetAhead); + ADD_LOOKUP(SetTurnLeft); + ADD_LOOKUP(SetFire); + ADD_LOOKUP(GetGunHeat); + ADD_LOOKUP(GetDistanceRemaining); + ADD_LOOKUP(GetTurnRemaining); + ADD_LOOKUP(GetTickDuration); + ADD_LOOKUP(SetTickDuration); + ADD_LOOKUP(GetTickRemaining); + ADD_LOOKUP(GetTeams); + ADD_LOOKUP(GetBases); + ADD_LOOKUP(GetObstacles); + ADD_LOOKUP(GetFlags); + ADD_LOOKUP(GetShots); + ADD_LOOKUP(GetMyTanks); + ADD_LOOKUP(GetOtherTanks); + ADD_LOOKUP(GetConstants); +} +#undef ADD_LOOKUP + +#define ADD_LOOKUP(COMMAND) RCREPLY.Register<COMMAND ## Reply>( #COMMAND ); +template<> +void RCMessageFactory<RCReply>::initialize() +{ + RCREPLY.Register<IdentifyBackend>("IdentifyBackend"); + ADD_LOOKUP(GunHeat); + ADD_LOOKUP(DistanceRemaining); + ADD_LOOKUP(TurnRemaining); + ADD_LOOKUP(TickDuration); + ADD_LOOKUP(TickRemaining); +} Added: trunk/bzflag/src/bzrobots/RCMessageFactory.h =================================================================== --- trunk/bzflag/src/bzrobots/RCMessageFactory.h (rev 0) +++ trunk/bzflag/src/bzrobots/RCMessageFactory.h 2007-07-07 12:44:06 UTC (rev 14471) @@ -0,0 +1,75 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef RCMESSAGEFACTORY_H_20070707 +#define RCMESSAGEFACTORY_H_20070707 + +#include "common.h" + +/* system headers */ +#include <string> + +/* common interface headers */ +#include "Factory.h" +#include "Singleton.h" + +#include "RCRequests.h" +#include "RCReplies.h" + +/** convenience handle on the singleton instance */ +#define RCREQUEST (RCMessageFactory<RCRequest>::instance()) +#define RCREPLY (RCMessageFactory<RCReply>::instance()) + +template<class C> +class RCMessageFactory : public Singleton< RCMessageFactory<C> >, + public Factory<C, std::string> +{ + +public: + void setLink(RCLink *_link) + { + link = _link; + } + + C *Message(std::string s) + { + C *pointer = Factory<C, std::string>::Create(s); + if (pointer != NULL) + pointer->setLink(link); + + return pointer; + } + + static void initialize(); + +protected: + friend class Singleton<RCMessageFactory>; + +private: + RCLink *link; + RCMessageFactory() { } + ~RCMessageFactory() { } +}; + +// initialize the singleton +template<class T> +T* Singleton<T>::_instance = NULL; + +#endif + +// Local Variables: *** +// mode: C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-07 15:29:37
|
Revision: 14472 http://bzflag.svn.sourceforge.net/bzflag/?rev=14472&view=rev Author: daxxar Date: 2007-07-07 08:29:36 -0700 (Sat, 07 Jul 2007) Log Message: ----------- AdvancedRobot, Robot: RoboCode-specific stuff. BZAdvancedRobot, BZRobot: The cool API ;-) Nothing implemented yet, only the API sketched out. (This is technically the 4th milestone) Modified Paths: -------------- trunk/bzflag/src/bzrobots/AdvancedRobot.cxx trunk/bzflag/src/bzrobots/AdvancedRobot.h trunk/bzflag/src/bzrobots/Makefile.am Added Paths: ----------- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx trunk/bzflag/src/bzrobots/BZAdvancedRobot.h trunk/bzflag/src/bzrobots/BZRobot.cxx trunk/bzflag/src/bzrobots/BZRobot.h trunk/bzflag/src/bzrobots/Robot.cxx trunk/bzflag/src/bzrobots/Robot.h Modified: trunk/bzflag/src/bzrobots/AdvancedRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/AdvancedRobot.cxx 2007-07-07 12:44:06 UTC (rev 14471) +++ trunk/bzflag/src/bzrobots/AdvancedRobot.cxx 2007-07-07 15:29:36 UTC (rev 14472) @@ -0,0 +1 @@ +#include "AdvancedRobot.h" Modified: trunk/bzflag/src/bzrobots/AdvancedRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/AdvancedRobot.h 2007-07-07 12:44:06 UTC (rev 14471) +++ trunk/bzflag/src/bzrobots/AdvancedRobot.h 2007-07-07 15:29:36 UTC (rev 14472) @@ -11,15 +11,34 @@ */ /* - * AdvancedRobot: A class for the simulation and implementation of an AdvancedRobot! + * AdvancedRobot: A class for the simulation and implementation of mostly + * RoboCode-compliant AdvancedRobot (see BZRobot for the "normal" one) */ -#ifndef BZF_ADVANCED_ROBOT_H -#define BZF_ADVANCED_ROBOT_H +#ifndef ADVANCEDROBOT_H_20070707 +#define ADVANCEDROBOT_H_20070707 -class AdvancedRobot +#include "BZAdvancedRobot.h" + +class AdvancedRobot :public BZAdvancedRobot { + protected: + double getGunTurnRemaining(); + double getRadarTurnRemaining(); + bool isAdjustGunForRobotTurn(); + bool isAdjustRadarForRobotTurn(); + void setBack(double distance); + void setFire(double power); + // TODO: Implement 'Bullet setFireBullet(double power)'? + void setMaxTurnRate(double maxTurnRate); // This needs to divide by the max, so we get something between 0 and 1, then pass to setTurnRate + void setMaxSpeed(double maxSpeed); // This needs to divide by the max, so we get something between 0 and 1, then pass to setSpeed + void setTurnGunLeft(double degrees); + void setTurnGunRight(double degrees); + void setTurnRadarLeft(double degrees); + void setTurnRadarRight(double degrees); + void setTurnRight(double degrees); public: + }; #endif Added: trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-07 15:29:36 UTC (rev 14472) @@ -0,0 +1 @@ +#include "BZAdvancedRobot.h" Added: trunk/bzflag/src/bzrobots/BZAdvancedRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.h (rev 0) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-07 15:29:36 UTC (rev 14472) @@ -0,0 +1,53 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * BZAdvancedRobot: A class for simulation and implementation of a Frontend advanced robot. + */ + +#ifndef BZADVANCEDROBOT_H_20070707 +#define BZADVANCEDROBOT_H_20070707 + +class BZAdvancedRobot +{ + protected: + void execute(); + double getDistanceRemaining(); + double getTurnRemaining(); + double setAhead(double distance); + void setFire(); + // TODO: Implement 'Bullet setFireBullet()'? + void setTurnRate(double turnRate); + void setSpeed(double speed); + void setResume(); + void setStop(); + void setStop(bool overwrite); + void setTurnLeft(double degrees); + + // These are normally in Robot and not AdvancedRobot, but due to + // the upside-down hierarchy we have - they're here instead ;-) + double getBattleFieldHeight(); + double getBattleFieldWidth(); + double getGunHeat(); + double getHeading(); + double getHeight(); + double getWidth(); + int getOthers(); + long getTime(); + double getVelocity(); + double getX(); + double getY(); + public: + +}; + +#endif Added: trunk/bzflag/src/bzrobots/BZRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/BZRobot.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/BZRobot.cxx 2007-07-07 15:29:36 UTC (rev 14472) @@ -0,0 +1 @@ +#include "BZRobot.h" Added: trunk/bzflag/src/bzrobots/BZRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/BZRobot.h (rev 0) +++ trunk/bzflag/src/bzrobots/BZRobot.h 2007-07-07 15:29:36 UTC (rev 14472) @@ -0,0 +1,38 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * BZRobot: A class for simulation and implementation of a Frontend robot. + */ + +#ifndef BZROBOT_H_20070707 +#define BZROBOT_H_20070707 + +#include "BZAdvancedRobot.h" + +class BZRobot :public BZAdvancedRobot +{ + protected: + void ahead(double distance); + void doNothing(); + void fire(); + // TODO: Implement 'Bullet fireBullet();' ? + void resume(); + void stop(); + void stop(bool overwrite); + // TODO: void scan(); ? + void turnLeft(double degrees); + public: + +}; + +#endif Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-07 12:44:06 UTC (rev 14471) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-07 15:29:36 UTC (rev 14472) @@ -44,8 +44,14 @@ RCRobotPlayer.h \ Frontend.cxx \ Frontend.h \ + BZAdvancedRobot.cxx \ + BZAdvancedRobot.h \ AdvancedRobot.cxx \ AdvancedRobot.h \ + BZRobot.cxx \ + BZRobot.h \ + Robot.cxx \ + Robot.h \ ../bzflag/ActionBinding.cxx \ ../bzflag/ActionBinding.h \ ../bzflag/AudioMenu.cxx \ Added: trunk/bzflag/src/bzrobots/Robot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/Robot.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/Robot.cxx 2007-07-07 15:29:36 UTC (rev 14472) @@ -0,0 +1 @@ +#include "AdvancedRobot.h" Added: trunk/bzflag/src/bzrobots/Robot.h =================================================================== --- trunk/bzflag/src/bzrobots/Robot.h (rev 0) +++ trunk/bzflag/src/bzrobots/Robot.h 2007-07-07 15:29:36 UTC (rev 14472) @@ -0,0 +1,47 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * AdvancedRobot: A class for the simulation and implementation of mostly + * RoboCode-compliant AdvancedRobot (see BZRobot for the "normal" one) + */ + +#ifndef ROBOT_H_20070707 +#define ROBOT_H_20070707 + +class Robot :public BZRobot +{ + protected: + void back(double distance); + void fire(double power); + // TODO: Implement 'Bullet fireBullet(double power);' ? + + double getEnergy(); + double getGunCoolingRate(); // This should return the same as getTickDuration. :-) + double getGunHeading(); + double getRadarHeading(); + + int getNumRounds(); + int getRoundNum(); + + void setAdjustGunForRobotTurn(bool independent); + void setAdjustRadarForGunTurn(bool independent); + void setAdjustRadarForRobotTurn(bool independent); + + void turnGunRight(double degrees); + void turnGunLeft(double degrees); + void turnRadarRight(double degrees); + void turnRadarLeft(double degrees); + void turnRight(double degrees); +}; + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-07 16:24:04
|
Revision: 14476 http://bzflag.svn.sourceforge.net/bzflag/?rev=14476&view=rev Author: daxxar Date: 2007-07-07 09:24:02 -0700 (Sat, 07 Jul 2007) Log Message: ----------- added footer to files Modified Paths: -------------- trunk/bzflag/src/bzrobots/AdvancedRobot.cxx trunk/bzflag/src/bzrobots/AdvancedRobot.h trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx trunk/bzflag/src/bzrobots/BZAdvancedRobot.h trunk/bzflag/src/bzrobots/BZRobot.cxx trunk/bzflag/src/bzrobots/BZRobot.h trunk/bzflag/src/bzrobots/Frontend.cxx trunk/bzflag/src/bzrobots/Frontend.h trunk/bzflag/src/bzrobots/OpenGLUtils.cxx trunk/bzflag/src/bzrobots/RCMessageFactory.cxx trunk/bzflag/src/bzrobots/RCRequest.cxx trunk/bzflag/src/bzrobots/Robot.cxx trunk/bzflag/src/bzrobots/Robot.h Modified: trunk/bzflag/src/bzrobots/AdvancedRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/AdvancedRobot.cxx 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/AdvancedRobot.cxx 2007-07-07 16:24:02 UTC (rev 14476) @@ -1 +1,10 @@ #include "AdvancedRobot.h" + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/AdvancedRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/AdvancedRobot.h 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/AdvancedRobot.h 2007-07-07 16:24:02 UTC (rev 14476) @@ -42,3 +42,12 @@ }; #endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-07 16:24:02 UTC (rev 14476) @@ -1 +1,10 @@ #include "BZAdvancedRobot.h" + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-07 16:24:02 UTC (rev 14476) @@ -51,3 +51,12 @@ }; #endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/BZRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/BZRobot.cxx 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/BZRobot.cxx 2007-07-07 16:24:02 UTC (rev 14476) @@ -1 +1,10 @@ #include "BZRobot.h" + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/BZRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/BZRobot.h 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/BZRobot.h 2007-07-07 16:24:02 UTC (rev 14476) @@ -36,3 +36,12 @@ }; #endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/Frontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-07 16:24:02 UTC (rev 14476) @@ -37,3 +37,12 @@ { link->update(); } + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/Frontend.h =================================================================== --- trunk/bzflag/src/bzrobots/Frontend.h 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/Frontend.h 2007-07-07 16:24:02 UTC (rev 14476) @@ -31,3 +31,12 @@ }; #endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/OpenGLUtils.cxx =================================================================== --- trunk/bzflag/src/bzrobots/OpenGLUtils.cxx 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/OpenGLUtils.cxx 2007-07-07 16:24:02 UTC (rev 14476) @@ -72,3 +72,12 @@ } + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/RCMessageFactory.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCMessageFactory.cxx 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/RCMessageFactory.cxx 2007-07-07 16:24:02 UTC (rev 14476) @@ -39,3 +39,12 @@ ADD_LOOKUP(TickDuration); ADD_LOOKUP(TickRemaining); } + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/RCRequest.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-07 16:24:02 UTC (rev 14476) @@ -24,3 +24,12 @@ return robotIndex; } + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/Robot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/Robot.cxx 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/Robot.cxx 2007-07-07 16:24:02 UTC (rev 14476) @@ -1 +1,10 @@ #include "AdvancedRobot.h" + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + Modified: trunk/bzflag/src/bzrobots/Robot.h =================================================================== --- trunk/bzflag/src/bzrobots/Robot.h 2007-07-07 16:21:28 UTC (rev 14475) +++ trunk/bzflag/src/bzrobots/Robot.h 2007-07-07 16:24:02 UTC (rev 14476) @@ -45,3 +45,12 @@ }; #endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-08 13:45:19
|
Revision: 14484 http://bzflag.svn.sourceforge.net/bzflag/?rev=14484&view=rev Author: daxxar Date: 2007-07-08 06:45:21 -0700 (Sun, 08 Jul 2007) Log Message: ----------- Change how Frontend::run exits Modified Paths: -------------- trunk/bzflag/src/bzrobots/Frontend.cxx trunk/bzflag/src/bzrobots/botplaying.cxx Modified: trunk/bzflag/src/bzrobots/Frontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-08 13:42:04 UTC (rev 14483) +++ trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-08 13:45:21 UTC (rev 14484) @@ -29,10 +29,7 @@ } std::cout << "Frontend disconnected / failed! (" << frontend.getError() << ")" << std::endl; - exit(1); - - /* Yeah, right. */ - return true; + return false; } Frontend::Frontend() :sentStuff(false) Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-08 13:42:04 UTC (rev 14483) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-08 13:45:21 UTC (rev 14484) @@ -3455,10 +3455,7 @@ rcLink->startListening(port); RCREQUEST.setLink(rcLink); if (!Frontend::run("localhost", port)) - { - fprintf(stderr, "Could not fork Frontend!\n"); - exit(0); - } + return; } // enter game if we have all the info we need, otherwise This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-08 15:34:30
|
Revision: 14485 http://bzflag.svn.sourceforge.net/bzflag/?rev=14485&view=rev Author: daxxar Date: 2007-07-08 08:34:25 -0700 (Sun, 08 Jul 2007) Log Message: ----------- TestRobot - something that will be used for testing the c++ api. RCLinkFrontend#sendAndProcess - sends a message and processes replies & events. Indentation fixing. BZAdvancedRobot now has defined methods. Modified Paths: -------------- trunk/bzflag/src/bzrobots/AdvancedRobot.h trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx trunk/bzflag/src/bzrobots/BZAdvancedRobot.h trunk/bzflag/src/bzrobots/BZRobot.h trunk/bzflag/src/bzrobots/Frontend.cxx trunk/bzflag/src/bzrobots/Frontend.h trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx trunk/bzflag/src/bzrobots/RCLinkFrontend.h trunk/bzflag/src/bzrobots/RCReplies.cxx trunk/bzflag/src/bzrobots/RCReplies.h trunk/bzflag/src/bzrobots/RCReply.h trunk/bzflag/src/bzrobots/Robot.h Added Paths: ----------- trunk/bzflag/src/bzrobots/TestRobot.cxx trunk/bzflag/src/bzrobots/TestRobot.h Modified: trunk/bzflag/src/bzrobots/AdvancedRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/AdvancedRobot.h 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/AdvancedRobot.h 2007-07-08 15:34:25 UTC (rev 14485) @@ -22,23 +22,21 @@ class AdvancedRobot :public BZAdvancedRobot { - protected: - double getGunTurnRemaining(); - double getRadarTurnRemaining(); - bool isAdjustGunForRobotTurn(); - bool isAdjustRadarForRobotTurn(); - void setBack(double distance); - void setFire(double power); - // TODO: Implement 'Bullet setFireBullet(double power)'? - void setMaxTurnRate(double maxTurnRate); // This needs to divide by the max, so we get something between 0 and 1, then pass to setTurnRate - void setMaxSpeed(double maxSpeed); // This needs to divide by the max, so we get something between 0 and 1, then pass to setSpeed - void setTurnGunLeft(double degrees); - void setTurnGunRight(double degrees); - void setTurnRadarLeft(double degrees); - void setTurnRadarRight(double degrees); - void setTurnRight(double degrees); - public: - + protected: + double getGunTurnRemaining(); + double getRadarTurnRemaining(); + bool isAdjustGunForRobotTurn(); + bool isAdjustRadarForRobotTurn(); + void setBack(double distance); + void setFire(double power); + // TODO: Implement 'Bullet setFireBullet(double power)'? + void setMaxTurnRate(double maxTurnRate); // This needs to divide by the max, so we get something between 0 and 1, then pass to setTurnRate + void setMaxSpeed(double maxSpeed); // This needs to divide by the max, so we get something between 0 and 1, then pass to setSpeed + void setTurnGunLeft(double degrees); + void setTurnGunRight(double degrees); + void setTurnRadarLeft(double degrees); + void setTurnRadarRight(double degrees); + void setTurnRight(double degrees); }; #endif @@ -50,4 +48,3 @@ // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 - Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-08 15:34:25 UTC (rev 14485) @@ -1,5 +1,130 @@ #include "BZAdvancedRobot.h" +#include "RCRequests.h" + +void BZAdvancedRobot::execute() +{ + link->sendAndProcess(ExecuteReq(), this); +} + +double BZAdvancedRobot::getDistanceRemaining() +{ + /* TODO: Implement this. */ + return 0.0; +} + +double BZAdvancedRobot::getTurnRemaining() +{ + /* TODO: Implement this. */ + return 0.0; +} + +double BZAdvancedRobot::setAhead(double distance) +{ + /* TODO: Implement this. */ + return 0.0; +} + +void BZAdvancedRobot::setFire() +{ + link->sendAndProcess(SetFireReq(), this); +} + +// TODO: Implement 'Bullet setFireBullet()'? +void BZAdvancedRobot::setTurnRate(double turnRate) +{ +} + +void BZAdvancedRobot::setSpeed(double speed) +{ +} + +void BZAdvancedRobot::setResume() +{ +} + +void BZAdvancedRobot::setStop() +{ +} + +void BZAdvancedRobot::setStop(bool overwrite) +{ +} + +void BZAdvancedRobot::setTurnLeft(double degrees) +{ +} + + +// These are normally in Robot and not AdvancedRobot, but due to +// the upside-down hierarchy we have - they're here instead ;-) +double BZAdvancedRobot::getBattleFieldHeight() +{ + /* TODO: Implement this. */ + return 0.0; +} + +double BZAdvancedRobot::getBattleFieldWidth() +{ + /* TODO: Implement this. */ + return 0.0; +} + +double BZAdvancedRobot::getGunHeat() +{ + link->sendAndProcess(GetGunHeatReq(), this); + return gunHeat; +} + +double BZAdvancedRobot::getHeading() +{ + /* TODO: Implement this. */ + return 0.0; +} + +double BZAdvancedRobot::getHeight() +{ + /* TODO: Implement this. */ + return 0.0; +} + +double BZAdvancedRobot::getWidth() +{ + /* TODO: Implement this. */ + return 0.0; +} + +int BZAdvancedRobot::getOthers() +{ + /* TODO: Implement this. */ + return 0; +} + +long BZAdvancedRobot::getTime() +{ + /* TODO: Implement this. */ + return 0; +} + +double BZAdvancedRobot::getVelocity() +{ + /* TODO: Implement this. */ + return 0.0; +} + +double BZAdvancedRobot::getX() +{ + /* TODO: Implement this. */ + return 0.0; +} + +double BZAdvancedRobot::getY() +{ + /* TODO: Implement this. */ + return 0.0; +} + + // Local Variables: *** // mode:C++ *** // tab-width: 8 *** @@ -7,4 +132,3 @@ // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 - Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-08 15:34:25 UTC (rev 14485) @@ -17,37 +17,47 @@ #ifndef BZROBOTS_BZADVANCEDROBOT_H #define BZROBOTS_BZADVANCEDROBOT_H +#include "RCLinkFrontend.h" + +class RCLinkFrontend; + class BZAdvancedRobot { - protected: - void execute(); - double getDistanceRemaining(); - double getTurnRemaining(); - double setAhead(double distance); - void setFire(); - // TODO: Implement 'Bullet setFireBullet()'? - void setTurnRate(double turnRate); - void setSpeed(double speed); - void setResume(); - void setStop(); - void setStop(bool overwrite); - void setTurnLeft(double degrees); + RCLinkFrontend *link; + protected: + void execute(); + double getDistanceRemaining(); + double getTurnRemaining(); + double setAhead(double distance); + void setFire(); + // TODO: Implement 'Bullet setFireBullet()'? + void setTurnRate(double turnRate); + void setSpeed(double speed); + void setResume(); + void setStop(); + void setStop(bool overwrite); + void setTurnLeft(double degrees); - // These are normally in Robot and not AdvancedRobot, but due to - // the upside-down hierarchy we have - they're here instead ;-) - double getBattleFieldHeight(); - double getBattleFieldWidth(); - double getGunHeat(); - double getHeading(); - double getHeight(); - double getWidth(); - int getOthers(); - long getTime(); - double getVelocity(); - double getX(); - double getY(); - public: + // These are normally in Robot and not AdvancedRobot, but due to + // the upside-down hierarchy we have - they're here instead ;-) + double getBattleFieldHeight(); + double getBattleFieldWidth(); + double getGunHeat(); + double getHeading(); + double getHeight(); + double getWidth(); + int getOthers(); + long getTime(); + double getVelocity(); + double getX(); + double getY(); + public: + virtual void run() = 0; + BZAdvancedRobot(RCLinkFrontend *_link) :link(_link) {} + virtual ~BZAdvancedRobot() {} + + float gunHeat; }; #endif @@ -59,4 +69,3 @@ // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 - Modified: trunk/bzflag/src/bzrobots/BZRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/BZRobot.h 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/BZRobot.h 2007-07-08 15:34:25 UTC (rev 14485) @@ -21,18 +21,16 @@ class BZRobot :public BZAdvancedRobot { - protected: - void ahead(double distance); - void doNothing(); - void fire(); - // TODO: Implement 'Bullet fireBullet();' ? - void resume(); - void stop(); - void stop(bool overwrite); - // TODO: void scan(); ? - void turnLeft(double degrees); - public: - + protected: + void ahead(double distance); + void doNothing(); + void fire(); + // TODO: Implement 'Bullet fireBullet();' ? + void resume(); + void stop(); + void stop(bool overwrite); + // TODO: void scan(); ? + void turnLeft(double degrees); }; #endif @@ -44,4 +42,3 @@ // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 - Modified: trunk/bzflag/src/bzrobots/Frontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-08 15:34:25 UTC (rev 14485) @@ -2,6 +2,7 @@ #include "TimeKeeper.h" #include "RCMessageFactory.h" +#include "TestRobot.h" #include <unistd.h> @@ -23,11 +24,7 @@ } std::cout << "Frontend initialized, " << host << ":" << port << std::endl; - while (frontend.update()) - { - TimeKeeper::sleep(0.01); - } - + frontend.start(); std::cout << "Frontend disconnected / failed! (" << frontend.getError() << ")" << std::endl; return false; } @@ -49,7 +46,6 @@ return false; if (link->getStatus() == RCLink::Connected && !sentStuff) { - TimeKeeper::sleep(2.0); link->send(SetFireReq()); link->send(ExecuteReq()); link->send(GetGunHeatReq()); @@ -65,6 +61,11 @@ } return true; } +void Frontend::start() +{ + TestRobot bot(link); + bot.run(); +} // Local Variables: *** // mode:C++ *** Modified: trunk/bzflag/src/bzrobots/Frontend.h =================================================================== --- trunk/bzflag/src/bzrobots/Frontend.h 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/Frontend.h 2007-07-08 15:34:25 UTC (rev 14485) @@ -30,6 +30,7 @@ bool connect(const char *host, int port); bool update(void); + void start(void); const std::string &getError() const { return error; } }; Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-08 15:34:25 UTC (rev 14485) @@ -52,6 +52,8 @@ BZRobot.h \ Robot.cxx \ Robot.h \ + TestRobot.cxx \ + TestRobot.h \ ../bzflag/ActionBinding.cxx \ ../bzflag/ActionBinding.h \ ../bzflag/AudioMenu.cxx \ Modified: trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-08 15:34:25 UTC (rev 14485) @@ -25,16 +25,32 @@ return RCLink::Disconnected; } -bool RCLinkFrontend::hasReply(const std::string command) const +bool RCLinkFrontend::sendAndProcess(const RCRequest &request, BZAdvancedRobot *bot) { - if (!replies) + if (!send(request)) return false; + waitForReply(request.getType()); + RCReply *reply = replies; - do { + while (reply != NULL) + { + reply->updateBot(bot); + reply = reply->getNext(); + } + + return true; +} + +bool RCLinkFrontend::hasReply(const std::string command) const +{ + RCReply *reply = replies; + while (reply != NULL) + { if (reply->getType() == "CommandDone" && ((CommandDoneReply *)reply)->command == command) return true; reply = reply->getNext(); - } while (reply != NULL); + } + return false; } Modified: trunk/bzflag/src/bzrobots/RCLinkFrontend.h =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.h 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.h 2007-07-08 15:34:25 UTC (rev 14485) @@ -20,7 +20,11 @@ #include "RCLink.h" #include "RCReply.h" +#include "BZAdvancedRobot.h" +class RCReply; class RCRequest; +class BZAdvancedRobot; + class RCLinkFrontend : public RCLink { private: @@ -35,6 +39,7 @@ RCReply* peekReply(); State getDisconnectedState(); bool waitForReply(const std::string command); + bool sendAndProcess(const RCRequest &request, BZAdvancedRobot *bot); }; #endif Modified: trunk/bzflag/src/bzrobots/RCReplies.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-08 15:34:25 UTC (rev 14485) @@ -48,6 +48,11 @@ { stream << heat; } +bool GunHeatReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->gunHeat = heat; + return true; +} RCReply::parseStatus DistanceRemainingReply::parse(char **arguments, int count) { Modified: trunk/bzflag/src/bzrobots/RCReplies.h =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-08 15:34:25 UTC (rev 14485) @@ -51,7 +51,8 @@ std::string getType() const { return "GunHeat"; } RCReply::parseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; - + bool updateBot(BZAdvancedRobot *robot) const; + private: float heat; }; Modified: trunk/bzflag/src/bzrobots/RCReply.h =================================================================== --- trunk/bzflag/src/bzrobots/RCReply.h 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/RCReply.h 2007-07-08 15:34:25 UTC (rev 14485) @@ -19,12 +19,16 @@ #include "common.h" #include "RCMessage.h" +#include "BZAdvancedRobot.h" #include <string> #include <map> +class BZAdvancedRobot; + class RCReply :public RCMessage<RCReply> { public: + virtual bool updateBot(BZAdvancedRobot *) const { return true; } virtual parseStatus parse(char **arguments, int count) = 0; virtual std::string getType() const = 0; virtual void getParameters(std::ostream &stream) const = 0; Modified: trunk/bzflag/src/bzrobots/Robot.h =================================================================== --- trunk/bzflag/src/bzrobots/Robot.h 2007-07-08 13:45:21 UTC (rev 14484) +++ trunk/bzflag/src/bzrobots/Robot.h 2007-07-08 15:34:25 UTC (rev 14485) @@ -20,28 +20,28 @@ class Robot :public BZRobot { - protected: - void back(double distance); - void fire(double power); - // TODO: Implement 'Bullet fireBullet(double power);' ? + protected: + void back(double distance); + void fire(double power); + // TODO: Implement 'Bullet fireBullet(double power);' ? - double getEnergy(); - double getGunCoolingRate(); // This should return the same as getTickDuration. :-) - double getGunHeading(); - double getRadarHeading(); + double getEnergy(); + double getGunCoolingRate(); // This should return the same as getTickDuration. :-) + double getGunHeading(); + double getRadarHeading(); - int getNumRounds(); - int getRoundNum(); + int getNumRounds(); + int getRoundNum(); - void setAdjustGunForRobotTurn(bool independent); - void setAdjustRadarForGunTurn(bool independent); - void setAdjustRadarForRobotTurn(bool independent); + void setAdjustGunForRobotTurn(bool independent); + void setAdjustRadarForGunTurn(bool independent); + void setAdjustRadarForRobotTurn(bool independent); - void turnGunRight(double degrees); - void turnGunLeft(double degrees); - void turnRadarRight(double degrees); - void turnRadarLeft(double degrees); - void turnRight(double degrees); + void turnGunRight(double degrees); + void turnGunLeft(double degrees); + void turnRadarRight(double degrees); + void turnRadarLeft(double degrees); + void turnRight(double degrees); }; #endif @@ -53,4 +53,3 @@ // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 - Added: trunk/bzflag/src/bzrobots/TestRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/TestRobot.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/TestRobot.cxx 2007-07-08 15:34:25 UTC (rev 14485) @@ -0,0 +1,14 @@ +#include "TestRobot.h" + +#include "TimeKeeper.h" + +void TestRobot::run() +{ + while (true) + { + setFire(); + execute(); + TimeKeeper::sleep(0.5); + std::cout << "Heat: " << getGunHeat() << std::endl; + } +} Added: trunk/bzflag/src/bzrobots/TestRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/TestRobot.h (rev 0) +++ trunk/bzflag/src/bzrobots/TestRobot.h 2007-07-08 15:34:25 UTC (rev 14485) @@ -0,0 +1,36 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * TestRobot: Testing basic stuff. + */ + +#ifndef BZROBOTS_TESTROBOT_H +#define BZROBOTS_TESTROBOT_H + +#include "BZAdvancedRobot.h" + +struct TestRobot :public BZAdvancedRobot +{ + TestRobot(RCLinkFrontend *_link) :BZAdvancedRobot(_link) {} + void run(); +}; + +#endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-09 08:31:36
|
Revision: 14486 http://bzflag.svn.sourceforge.net/bzflag/?rev=14486&view=rev Author: daxxar Date: 2007-07-09 01:31:37 -0700 (Mon, 09 Jul 2007) Log Message: ----------- Frontend now waits for a connection to be established before initializing TestBot. Fixed a bug in sendAndProcess - it wasn't pop()ing replies. Now only supports one bot. Modified Paths: -------------- trunk/bzflag/src/bzrobots/Frontend.cxx trunk/bzflag/src/bzrobots/Frontend.h trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx trunk/bzflag/src/bzrobots/RCRequest.cxx trunk/bzflag/src/bzrobots/RCRequest.h trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRequests.h trunk/bzflag/src/bzrobots/TestRobot.cxx trunk/bzflag/src/bzrobots/botplaying.cxx trunk/bzflag/src/bzrobots/bzrobots.cxx Modified: trunk/bzflag/src/bzrobots/Frontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-08 15:34:25 UTC (rev 14485) +++ trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-09 08:31:37 UTC (rev 14486) @@ -40,29 +40,14 @@ return link->connect(host, port); } -bool Frontend::update() +void Frontend::start() { - if (!link->update()) - return false; - if (link->getStatus() == RCLink::Connected && !sentStuff) + while (link->getStatus() != RCLink::Connected) { - link->send(SetFireReq()); - link->send(ExecuteReq()); - link->send(GetGunHeatReq()); - std::cout << "[OK] GetGunHeat 0" << std::endl; - - link->waitForReply("GetGunHeat"); - std::cout << "[OK] Reply" << std::endl; - - RCReply *reply; - while ((reply = link->popReply())) - std::cout << "Got message: " << reply->asString() << std::endl; - sentStuff = true; + link->update(); + TimeKeeper::sleep(0.5); } - return true; -} -void Frontend::start() -{ + TestRobot bot(link); bot.run(); } Modified: trunk/bzflag/src/bzrobots/Frontend.h =================================================================== --- trunk/bzflag/src/bzrobots/Frontend.h 2007-07-08 15:34:25 UTC (rev 14485) +++ trunk/bzflag/src/bzrobots/Frontend.h 2007-07-09 08:31:37 UTC (rev 14486) @@ -29,7 +29,6 @@ static bool run(const char *host, int port); bool connect(const char *host, int port); - bool update(void); void start(void); const std::string &getError() const { return error; } }; Modified: trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-08 15:34:25 UTC (rev 14485) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-09 08:31:37 UTC (rev 14486) @@ -31,11 +31,11 @@ return false; waitForReply(request.getType()); - RCReply *reply = replies; + RCReply *reply = popReply(); while (reply != NULL) { reply->updateBot(bot); - reply = reply->getNext(); + reply = popReply(); } return true; Modified: trunk/bzflag/src/bzrobots/RCRequest.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-08 15:34:25 UTC (rev 14485) +++ trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-09 08:31:37 UTC (rev 14486) @@ -8,23 +8,6 @@ bool RCRequest::process(RCRobotPlayer *) { return true; } -int RCRequest::getRobotIndex() const -{ - return robotIndex; -} - -int RCRequest::setRobotIndex(char *arg) -{ - char *endptr; - robotIndex = strtol(arg, &endptr, 0); - if (endptr == arg) - robotIndex = -1; - else if (robotIndex >= numRobots) - robotIndex = -1; - - return robotIndex; -} - // Local Variables: *** // mode:C++ *** // tab-width: 8 *** Modified: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-08 15:34:25 UTC (rev 14485) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-09 08:31:37 UTC (rev 14486) @@ -28,18 +28,12 @@ class RCRequest :public RCMessage<RCRequest> { public: - int getRobotIndex() const; - virtual bool process(RCRobotPlayer *rrp); virtual parseStatus parse(char **arguments, int count) = 0; virtual std::string getType() const = 0; virtual void getParameters(std::ostream &stream) const = 0; static void initializeLookup(void); - - protected: - int robotIndex; - int setRobotIndex(char *arg); }; #endif Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-08 15:34:25 UTC (rev 14485) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-09 08:31:37 UTC (rev 14486) @@ -14,18 +14,6 @@ { } -RCRequest::parseStatus RCRequestBotSpecific::parse(char **arguments, int count) -{ - if (count != 1) - return InvalidArgumentCount; - if (setRobotIndex(arguments[0]) == -1) - return InvalidArguments; - return ParseOk; -} -void RCRequestBotSpecific::getParameters(std::ostream &stream) const -{ - stream << getRobotIndex(); -} RCRequest::parseStatus IdentifyFrontend::parse(char **arguments, int count) { @@ -85,12 +73,10 @@ RCRequest::parseStatus SetSpeedReq::parse(char **arguments, int count) { - if (count != 2) + if (count != 1) return InvalidArgumentCount; - if (setRobotIndex(arguments[0]) == -1) + if (!parseFloat(arguments[0], speed)) return InvalidArguments; - if (!parseFloat(arguments[1], speed)) - return InvalidArguments; speed = clamp(speed, 0.0f, 1.0f); return ParseOk; @@ -103,17 +89,15 @@ } void SetSpeedReq::getParameters(std::ostream &stream) const { - stream << getRobotIndex() << " " << speed; + stream << speed; } RCRequest::parseStatus SetTurnRateReq::parse(char **arguments, int count) { - if (count != 2) + if (count != 1) return InvalidArgumentCount; - if (setRobotIndex(arguments[0]) == -1) + if (!parseFloat(arguments[0], rate)) return InvalidArguments; - if (!parseFloat(arguments[1], rate)) - return InvalidArguments; rate = clamp(rate, 0.0f, 1.0f); return ParseOk; } @@ -125,17 +109,15 @@ } void SetTurnRateReq::getParameters(std::ostream &stream) const { - stream << getRobotIndex() << " " << rate; + stream << rate; } RCRequest::parseStatus SetAheadReq::parse(char **arguments, int count) { - if (count != 2) + if (count != 1) return InvalidArgumentCount; - if (setRobotIndex(arguments[0]) == -1) + if (!parseFloat(arguments[0], distance)) return InvalidArguments; - if (!parseFloat(arguments[1], distance)) - return InvalidArguments; return ParseOk; } bool SetAheadReq::process(RCRobotPlayer *rrp) @@ -146,17 +128,15 @@ } void SetAheadReq::getParameters(std::ostream &stream) const { - stream << getRobotIndex() << " " << distance; + stream << distance; } RCRequest::parseStatus SetTurnLeftReq::parse(char **arguments, int count) { - if (count != 2) + if (count != 1) return InvalidArgumentCount; - if (setRobotIndex(arguments[0]) == -1) + if (!parseFloat(arguments[0], turn)) return InvalidArguments; - if (!parseFloat(arguments[1], turn)) - return InvalidArguments; return ParseOk; } bool SetTurnLeftReq::process(RCRobotPlayer *rrp) @@ -167,7 +147,7 @@ } void SetTurnLeftReq::getParameters(std::ostream &stream) const { - stream << getRobotIndex() << " " << turn; + stream << turn; } bool SetFireReq::process(RCRobotPlayer *rrp) @@ -211,10 +191,8 @@ { if (count != 1) return InvalidArgumentCount; - if (setRobotIndex(arguments[0]) == -1) + if (!parseFloat(arguments[0], duration)) return InvalidArguments; - if (!parseFloat(arguments[1], duration)) - return InvalidArguments; duration = std::max(duration, 0.0f); return ParseOk; @@ -226,7 +204,7 @@ } void SetTickDurationReq::getParameters(std::ostream &stream) const { - stream << getRobotIndex() << " " << duration; + stream << duration; } bool GetTickRemainingReq::process(RCRobotPlayer *rrp) Modified: trunk/bzflag/src/bzrobots/RCRequests.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-08 15:34:25 UTC (rev 14485) +++ trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-09 08:31:37 UTC (rev 14486) @@ -29,45 +29,38 @@ virtual bool process(RCRobotPlayer *rrp) = 0; void getParameters(std::ostream &stream) const; }; -struct RCRequestBotSpecific : public RCRequest -{ - RCRequestBotSpecific() { robotIndex = 0; } - RCRequest::parseStatus parse(char **arguments, int count); - virtual bool process(RCRobotPlayer *rrp) = 0; - void getParameters(std::ostream &stream) const; -}; -struct ExecuteReq : public RCRequestBotSpecific +struct ExecuteReq : public RCRequestZeroArgument { std::string getType() const { return "Execute"; } bool process(RCRobotPlayer *rrp); }; -struct SetFireReq : public RCRequestBotSpecific +struct SetFireReq : public RCRequestZeroArgument { std::string getType() const { return "SetFire"; } bool process(RCRobotPlayer *rrp); }; -struct GetGunHeatReq : public RCRequestBotSpecific +struct GetGunHeatReq : public RCRequestZeroArgument { std::string getType() const { return "GetGunHeat"; } bool process(RCRobotPlayer *rrp); }; -struct GetDistanceRemainingReq : public RCRequestBotSpecific +struct GetDistanceRemainingReq : public RCRequestZeroArgument { std::string getType() const { return "GetDistanceRemaining"; } bool process(RCRobotPlayer *rrp); }; -struct GetTurnRemainingReq : public RCRequestBotSpecific +struct GetTurnRemainingReq : public RCRequestZeroArgument { std::string getType() const { return "GetTurnRemaining"; } bool process(RCRobotPlayer *rrp); }; -struct GetTickDurationReq : public RCRequestBotSpecific +struct GetTickDurationReq : public RCRequestZeroArgument { std::string getType() const { return "GetTickDuration"; } bool process(RCRobotPlayer *rrp); }; -struct GetTickRemainingReq : public RCRequestBotSpecific +struct GetTickRemainingReq : public RCRequestZeroArgument { std::string getType() const { return "GetTickRemaining"; } bool process(RCRobotPlayer *rrp); Modified: trunk/bzflag/src/bzrobots/TestRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/TestRobot.cxx 2007-07-08 15:34:25 UTC (rev 14485) +++ trunk/bzflag/src/bzrobots/TestRobot.cxx 2007-07-09 08:31:37 UTC (rev 14486) @@ -8,7 +8,6 @@ { setFire(); execute(); - TimeKeeper::sleep(0.5); std::cout << "Heat: " << getGunHeat() << std::endl; } } Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-08 15:34:25 UTC (rev 14485) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-09 08:31:37 UTC (rev 14486) @@ -2642,16 +2642,13 @@ static void doBotRequests() { RCRequest* req; - int tankindex; + if (numRobots < 1) + return; + while ((req = rcLink->peekRequest()) != NULL) { - tankindex = req->getRobotIndex(); - if (tankindex == -1) { - req->process(NULL); - } else { - if (!req->process((RCRobotPlayer*)robots[tankindex])) - return; - } + if (!req->process((RCRobotPlayer*)robots[0])) + return; rcLink->popRequest(); // Discard it, we're done with this one. rcLink->sendAck(req); Modified: trunk/bzflag/src/bzrobots/bzrobots.cxx =================================================================== --- trunk/bzflag/src/bzrobots/bzrobots.cxx 2007-07-08 15:34:25 UTC (rev 14485) +++ trunk/bzflag/src/bzrobots/bzrobots.cxx 2007-07-09 08:31:37 UTC (rev 14486) @@ -142,7 +142,6 @@ " [-m | -mute]" " [-p | -rcport <remote-control-port>]" " [-motd <motd-url>] [-nomotd]" - " [-solo <num-robots>]" " [-team {red|green|blue|purple|rogue|observer}]" " [-v | -version | --version]" " [callsign[:password]@]server[:port]\n\nExiting.", argv0); @@ -219,13 +218,6 @@ strcmp(argv[i], "-rcport") == 0) { checkArgc(i, argc, argv[i]); BZDB.set("rcPort", argv[i]); - } else if (strcmp(argv[i], "-solo") == 0) { - checkArgc(i, argc, argv[i]); - numRobotTanks = atoi(argv[i]); - if (numRobotTanks < 1 || numRobotTanks > MAX_ROBOTS) { - printFatalError("Invalid argument for %s.", argv[i-1]); - usage(); - } } else if (strcmp(argv[i], "-posnoise") == 0) { checkArgc(i, argc, argv[i]); BZDB.set("bzrcPosNoise", argv[i]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-09 10:54:52
|
Revision: 14488 http://bzflag.svn.sourceforge.net/bzflag/?rev=14488&view=rev Author: daxxar Date: 2007-07-09 03:54:50 -0700 (Mon, 09 Jul 2007) Log Message: ----------- Now Frontend dies on SIGINT. TestRobot now does something a bit more useful; goes forward (while firing), turns 90 degrees, repeat. If no -p / -rcPort, use a random port. Implemented setAhead, setTurnLeft, getDistanceRemaining and getTurnRemaining in BZAdvancedRobot. (also decent ctors in RCRequests & RCReplies, and updateBot-s) TestRobot doesn't 100% do what it's supposed to yet, will have to be debugged. Modified Paths: -------------- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx trunk/bzflag/src/bzrobots/BZAdvancedRobot.h trunk/bzflag/src/bzrobots/Frontend.cxx trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCReplies.cxx trunk/bzflag/src/bzrobots/RCReplies.h trunk/bzflag/src/bzrobots/RCRequest.h trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRequests.h trunk/bzflag/src/bzrobots/TestRobot.cxx trunk/bzflag/src/bzrobots/botplaying.cxx Removed Paths: ------------- trunk/bzflag/src/bzrobots/RCRequest.cxx Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-09 10:54:50 UTC (rev 14488) @@ -9,20 +9,19 @@ double BZAdvancedRobot::getDistanceRemaining() { - /* TODO: Implement this. */ - return 0.0; + link->sendAndProcess(GetDistanceRemainingReq(), this); + return distanceRemaining; } double BZAdvancedRobot::getTurnRemaining() { - /* TODO: Implement this. */ - return 0.0; + link->sendAndProcess(GetTurnRemainingReq(), this); + return turnRemaining; } -double BZAdvancedRobot::setAhead(double distance) +void BZAdvancedRobot::setAhead(double distance) { - /* TODO: Implement this. */ - return 0.0; + link->sendAndProcess(SetAheadReq(distance), this); } void BZAdvancedRobot::setFire() @@ -53,6 +52,7 @@ void BZAdvancedRobot::setTurnLeft(double degrees) { + link->sendAndProcess(SetTurnLeftReq(degrees), this); } Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-09 10:54:50 UTC (rev 14488) @@ -28,7 +28,7 @@ void execute(); double getDistanceRemaining(); double getTurnRemaining(); - double setAhead(double distance); + void setAhead(double distance); void setFire(); // TODO: Implement 'Bullet setFireBullet()'? void setTurnRate(double turnRate); @@ -57,7 +57,7 @@ BZAdvancedRobot(RCLinkFrontend *_link) :link(_link) {} virtual ~BZAdvancedRobot() {} - float gunHeat; + float gunHeat, distanceRemaining, turnRemaining; }; #endif Modified: trunk/bzflag/src/bzrobots/Frontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/Frontend.cxx 2007-07-09 10:54:50 UTC (rev 14488) @@ -4,9 +4,10 @@ #include "RCMessageFactory.h" #include "TestRobot.h" -#include <unistd.h> +#include "bzsignal.h" #include <iostream> +#include <unistd.h> bool Frontend::run(const char *host, int port) { @@ -16,6 +17,9 @@ else if (pid > 0) return true; + fclose(stdin); // Shouldn't mess around with that here ;-) + bzSignal(SIGINT, SIG_DFL); + Frontend frontend; if (!frontend.connect(host, port)) { Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-09 10:54:50 UTC (rev 14488) @@ -27,7 +27,6 @@ RCLink.cxx \ RCLink.h \ RCMessage.h \ - RCRequest.cxx \ RCRequest.h \ RCRequests.cxx \ RCRequests.h \ Modified: trunk/bzflag/src/bzrobots/RCReplies.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-09 10:54:50 UTC (rev 14488) @@ -67,6 +67,11 @@ { stream << distance; } +bool DistanceRemainingReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->distanceRemaining = distance; + return true; +} RCReply::parseStatus TurnRemainingReply::parse(char **arguments, int count) { @@ -81,7 +86,13 @@ { stream << turn; } +bool TurnRemainingReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->turnRemaining = turn; + return true; +} + RCReply::parseStatus TickDurationReply::parse(char **arguments, int count) { if (count != 1) Modified: trunk/bzflag/src/bzrobots/RCReplies.h =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-09 10:54:50 UTC (rev 14488) @@ -58,18 +58,24 @@ struct DistanceRemainingReply : public RCReply { + DistanceRemainingReply() {} + DistanceRemainingReply(float _distance) :distance(_distance) {} std::string getType() const { return "DistanceRemaining"; } RCReply::parseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; + bool updateBot(BZAdvancedRobot *robot) const; private: float distance; }; struct TurnRemainingReply : public RCReply { + TurnRemainingReply() {} + TurnRemainingReply(float _turn) :turn(_turn) {} std::string getType() const { return "TurnRemaining"; } RCReply::parseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; + bool updateBot(BZAdvancedRobot *robot) const; private: float turn; }; Deleted: trunk/bzflag/src/bzrobots/RCRequest.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/RCRequest.cxx 2007-07-09 10:54:50 UTC (rev 14488) @@ -1,18 +0,0 @@ -#include "RCRequest.h" -#include "Roster.h" - -#include "RCLink.h" -#include "RCRequests.h" - -#include "RCMessageFactory.h" - -bool RCRequest::process(RCRobotPlayer *) { return true; } - -// Local Variables: *** -// mode:C++ *** -// tab-width: 8 *** -// c-basic-offset: 2 *** -// indent-tabs-mode: t *** -// End: *** -// ex: shiftwidth=2 tabstop=8 - Modified: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-09 10:54:50 UTC (rev 14488) @@ -28,7 +28,7 @@ class RCRequest :public RCMessage<RCRequest> { public: - virtual bool process(RCRobotPlayer *rrp); + virtual bool process(RCRobotPlayer *) { return true; } virtual parseStatus parse(char **arguments, int count) = 0; virtual std::string getType() const = 0; virtual void getParameters(std::ostream &stream) const = 0; Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-09 10:54:50 UTC (rev 14488) @@ -169,7 +169,8 @@ { if (!rrp->isSteadyState()) return false; - link->sendf("GetDistanceRemaining %f\n", rrp->distanceRemaining); + + link->send(DistanceRemainingReply(rrp->distanceRemaining)); return true; } @@ -177,7 +178,8 @@ { if (!rrp->isSteadyState()) return false; - link->sendf("GetTurnRemaining %f\n", rrp->turnRemaining); + + link->send(TurnRemainingReply(rrp->turnRemaining)); return true; } Modified: trunk/bzflag/src/bzrobots/RCRequests.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-09 10:54:50 UTC (rev 14488) @@ -113,6 +113,7 @@ #define DECLARE_REQUEST(COMMANDNAME) class COMMANDNAME ## Req : public RCRequest \ { \ public: \ + COMMANDNAME ## Req() {} \ RCRequest::parseStatus parse(char **arguments, int count); \ std::string getType() const { return #COMMANDNAME; } \ bool process(RCRobotPlayer *rrp); \ @@ -129,11 +130,13 @@ }; DECLARE_REQUEST(SetAhead) + SetAheadReq(float _distance) :distance(_distance) {} private: float distance; }; DECLARE_REQUEST(SetTurnLeft) + SetTurnLeftReq(float _turn) :turn(_turn) {} private: float turn; }; Modified: trunk/bzflag/src/bzrobots/TestRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/TestRobot.cxx 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/TestRobot.cxx 2007-07-09 10:54:50 UTC (rev 14488) @@ -8,6 +8,17 @@ { setFire(); execute(); - std::cout << "Heat: " << getGunHeat() << std::endl; + TimeKeeper::sleep(getGunHeat()); + setFire(); + setAhead(100); + while (getDistanceRemaining() > 0) + { + if (getGunHeat() <= 0) + setFire(); + execute(); + } + setTurnLeft(90); + while (getTurnRemaining() > 0) + execute(); } } Modified: trunk/bzflag/src/bzrobots/botplaying.cxx =================================================================== --- trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-09 09:07:12 UTC (rev 14487) +++ trunk/bzflag/src/bzrobots/botplaying.cxx 2007-07-09 10:54:50 UTC (rev 14488) @@ -3441,20 +3441,23 @@ printError(aString); } - // startup an RCLinkBackend if requested - if (BZDB.isSet("rcPort")) { - // here we register the various RCRequest-handlers for commands - // that RCLinkBackend receives. :-) - RCMessageFactory<RCRequest>::initialize(); + int port; + if (!BZDB.isSet("rcPort")) // Generate a random port between 1024 & 65536. + port = (int)(bzfrand() * (65536 - 1024)) + 1024; + else + port = atoi(BZDB.get("rcPort").c_str()); - int port = atoi(BZDB.get("rcPort").c_str()); - rcLink = new RCLinkBackend(); - rcLink->startListening(port); - RCREQUEST.setLink(rcLink); - if (!Frontend::run("localhost", port)) - return; - } + // here we register the various RCRequest-handlers for commands + // that RCLinkBackend receives. :-) + RCMessageFactory<RCRequest>::initialize(); + rcLink = new RCLinkBackend(); + rcLink->startListening(port); + RCREQUEST.setLink(rcLink); + + if (!Frontend::run("localhost", port)) + return; + // enter game if we have all the info we need, otherwise joinRequested = true; printout("Trying..."); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-09 12:18:41
|
Revision: 14489 http://bzflag.svn.sourceforge.net/bzflag/?rev=14489&view=rev Author: daxxar Date: 2007-07-09 05:18:43 -0700 (Mon, 09 Jul 2007) Log Message: ----------- ExecuteReq and GetTurnRemainingReq now convert to and from radians. We now actually realize that getVelocity returns a vector, and do NOT rely only on the x-part of it. *cough* (TestRobot actually "works" now!) Modified Paths: -------------- trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx trunk/bzflag/src/bzrobots/TestRobot.cxx Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-09 10:54:50 UTC (rev 14488) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-09 12:18:43 UTC (rev 14489) @@ -56,7 +56,7 @@ rrp->turnLeft = false; else rrp->turnLeft = true; - rrp->turnRemaining = (rrp->turnLeft ? 1 : -1) * rrp->nextTurn; + rrp->turnRemaining = (rrp->turnLeft ? 1 : -1) * rrp->nextTurn * M_PI/180.0f; /* We have to convert to radians! */ } for (int i = 0; i < RCRobotPlayer::updateCount; ++i) @@ -179,7 +179,7 @@ if (!rrp->isSteadyState()) return false; - link->send(TurnRemainingReply(rrp->turnRemaining)); + link->send(TurnRemainingReply(rrp->turnRemaining * 180.0f/M_PI)); return true; } Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-07-09 10:54:50 UTC (rev 14488) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-07-09 12:18:43 UTC (rev 14489) @@ -54,15 +54,12 @@ if (distanceRemaining > 0.0f) { if (distanceForward) - { setDesiredSpeed(speed); - distanceRemaining -= *getVelocity() * dt; - } else - { setDesiredSpeed(-speed); - distanceRemaining += *getVelocity() * dt; - } + + const float *vel = getVelocity(); + distanceRemaining -= sqrt(vel[0]*vel[0] + vel[1]*vel[1] + vel[2]*vel[2]) * dt; } else { Modified: trunk/bzflag/src/bzrobots/TestRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/TestRobot.cxx 2007-07-09 10:54:50 UTC (rev 14488) +++ trunk/bzflag/src/bzrobots/TestRobot.cxx 2007-07-09 12:18:43 UTC (rev 14489) @@ -7,18 +7,16 @@ while (true) { setFire(); - execute(); - TimeKeeper::sleep(getGunHeat()); - setFire(); - setAhead(100); - while (getDistanceRemaining() > 0) - { + setAhead(20); + do { if (getGunHeat() <= 0) setFire(); execute(); - } + } while (getDistanceRemaining() > 0); + setTurnLeft(90); - while (getTurnRemaining() > 0) + do { execute(); + } while (getTurnRemaining() > 0); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-09 14:18:53
|
Revision: 14492 http://bzflag.svn.sourceforge.net/bzflag/?rev=14492&view=rev Author: daxxar Date: 2007-07-09 07:18:50 -0700 (Mon, 09 Jul 2007) Log Message: ----------- Implemented setTurnRate and setSpeed in BZAdvancedRobot Created MessageUtilities, which has parseFloat, clamp and parseSingleFloat (code reuse ;) Created GetBattleFieldSizeReq & BattleFieldSizeReply parseStatus -> messageParseStatus, and no longer inside the template. Fixed some brokenness in Robot.h Modified Paths: -------------- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx trunk/bzflag/src/bzrobots/BZAdvancedRobot.h trunk/bzflag/src/bzrobots/Makefile.am trunk/bzflag/src/bzrobots/RCLinkBackend.cxx trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx trunk/bzflag/src/bzrobots/RCMessage.h trunk/bzflag/src/bzrobots/RCMessageFactory.cxx trunk/bzflag/src/bzrobots/RCReplies.cxx trunk/bzflag/src/bzrobots/RCReplies.h trunk/bzflag/src/bzrobots/RCReply.h trunk/bzflag/src/bzrobots/RCRequest.h trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRequests.h trunk/bzflag/src/bzrobots/Robot.cxx trunk/bzflag/src/bzrobots/Robot.h Added Paths: ----------- trunk/bzflag/src/bzrobots/MessageUtilities.cxx trunk/bzflag/src/bzrobots/MessageUtilities.h Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-09 14:18:50 UTC (rev 14492) @@ -29,13 +29,14 @@ link->sendAndProcess(SetFireReq(), this); } -// TODO: Implement 'Bullet setFireBullet()'? void BZAdvancedRobot::setTurnRate(double turnRate) { + link->sendAndProcess(SetTurnRateReq(turnRate), this); } void BZAdvancedRobot::setSpeed(double speed) { + link->sendAndProcess(SetSpeedReq(speed), this); } void BZAdvancedRobot::setResume() @@ -56,20 +57,14 @@ } -// These are normally in Robot and not AdvancedRobot, but due to -// the upside-down hierarchy we have - they're here instead ;-) -double BZAdvancedRobot::getBattleFieldHeight() +double BZAdvancedRobot::getBattleFieldSize() { - /* TODO: Implement this. */ - return 0.0; + link->sendAndProcess(GetBattleFieldSizeReq(), this); + return battleFieldSize; } -double BZAdvancedRobot::getBattleFieldWidth() -{ - /* TODO: Implement this. */ - return 0.0; -} - +// These are normally in Robot and not AdvancedRobot, but due to +// the upside-down hierarchy we have - they're here instead ;-) double BZAdvancedRobot::getGunHeat() { link->sendAndProcess(GetGunHeatReq(), this); Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-09 14:18:50 UTC (rev 14492) @@ -37,11 +37,10 @@ void setStop(); void setStop(bool overwrite); void setTurnLeft(double degrees); + double getBattleFieldSize(); // These are normally in Robot and not AdvancedRobot, but due to // the upside-down hierarchy we have - they're here instead ;-) - double getBattleFieldHeight(); - double getBattleFieldWidth(); double getGunHeat(); double getHeading(); double getHeight(); @@ -57,7 +56,7 @@ BZAdvancedRobot(RCLinkFrontend *_link) :link(_link) {} virtual ~BZAdvancedRobot() {} - float gunHeat, distanceRemaining, turnRemaining; + float gunHeat, distanceRemaining, turnRemaining, battleFieldSize; }; #endif Modified: trunk/bzflag/src/bzrobots/Makefile.am =================================================================== --- trunk/bzflag/src/bzrobots/Makefile.am 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/Makefile.am 2007-07-09 14:18:50 UTC (rev 14492) @@ -33,6 +33,8 @@ RCReply.h \ RCReplies.cxx \ RCReplies.h \ + MessageUtilities.cxx \ + MessageUtilities.h \ RCMessageFactory.h \ RCMessageFactory.cxx \ RCLinkBackend.cxx \ Added: trunk/bzflag/src/bzrobots/MessageUtilities.cxx =================================================================== --- trunk/bzflag/src/bzrobots/MessageUtilities.cxx (rev 0) +++ trunk/bzflag/src/bzrobots/MessageUtilities.cxx 2007-07-09 14:18:50 UTC (rev 14492) @@ -0,0 +1,26 @@ +#include "MessageUtilities.h" + +bool MessageUtilities::parseFloat(char *string, float &dest) +{ + char *endptr; + dest = strtof(string, &endptr); + if (endptr == string) + return false; + + /* We don't want NaN no matter what - it's of no use in this scenario. + * (And strtof will allow the string "NAN" as NaN) */ + if (isnan(dest)) + dest = 0.0f; + + return true; +} + +messageParseStatus MessageUtilities::parseSingleFloat(char **arguments, int count, float &dest) +{ + if (count != 1) + return InvalidArgumentCount; + if (!parseFloat(arguments[0], dest)) + return InvalidArguments; + + return ParseOk; +} Added: trunk/bzflag/src/bzrobots/MessageUtilities.h =================================================================== --- trunk/bzflag/src/bzrobots/MessageUtilities.h (rev 0) +++ trunk/bzflag/src/bzrobots/MessageUtilities.h 2007-07-09 14:18:50 UTC (rev 14492) @@ -0,0 +1,49 @@ +/* bzflag + * Copyright (c) 1993 - 2007 Tim Riker + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the license found in the file + * named COPYING that should have accompanied this file. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * MessageUtilities: A namespace of useful functions for messages. + */ + +#ifndef BZROBOTS_MESSAGEUTILITIES_H +#define BZROBOTS_MESSAGEUTILITIES_H + +#include "RCReply.h" + +namespace MessageUtilities +{ + bool parseFloat(char *string, float &dest); + messageParseStatus parseSingleFloat(char **arguments, int count, float &dest); + + template <typename T> + static T clamp(T val, T min, T max) + { + // Mad cred to _neon_/#scene.no and runehol/#scene.no for these two sentences: + // * If val is nan, the result is undefined + // * If max < min, the result is undefined + if (val > max) + return max; + if (val < min) + return min; + return val; + } +}; + +#endif + +// Local Variables: *** +// mode:C++ *** +// tab-width: 8 *** +// c-basic-offset: 2 *** +// indent-tabs-mode: t *** +// End: *** +// ex: shiftwidth=2 tabstop=8 Modified: trunk/bzflag/src/bzrobots/RCLinkBackend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/RCLinkBackend.cxx 2007-07-09 14:18:50 UTC (rev 14492) @@ -94,17 +94,17 @@ } else { switch (req->parse(argv + 1, argc - 1)) { - case RCRequest::ParseOk: + case ParseOk: if (requests == NULL) requests = req; else requests->append(req); return true; - case RCRequest::InvalidArgumentCount: + case InvalidArgumentCount: fprintf(stderr, "RCLinkBackend: Invalid number of arguments (%d) for request: '%s'\n", argc - 1, argv[0]); sendf("error Invalid number of arguments (%d) for request: '%s'\n", argc - 1, argv[0]); return false; - case RCRequest::InvalidArguments: + case InvalidArguments: fprintf(stderr, "RCLinkBackend: Invalid arguments for request: '%s'\n", argv[0]); sendf("error Invalid arguments for request: '%s'\n", argv[0]); return false; Modified: trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/RCLinkFrontend.cxx 2007-07-09 14:18:50 UTC (rev 14492) @@ -140,18 +140,18 @@ } else { switch (rep->parse(argv + 1, argc - 1)) { - case RCReply::ParseOk: + case ParseOk: if (replies == NULL) replies = rep; else replies->append(rep); return true; - case RCReply::InvalidArgumentCount: + case InvalidArgumentCount: fprintf(stderr, "RCLink: Invalid number of arguments (%d) for reply: '%s'\n", argc - 1, argv[0]); close(connfd); status = Disconnected; return false; - case RCReply::InvalidArguments: + case InvalidArguments: fprintf(stderr, "RCLink: Invalid arguments for reply: '%s'\n", argv[0]); close(connfd); status = Disconnected; Modified: trunk/bzflag/src/bzrobots/RCMessage.h =================================================================== --- trunk/bzflag/src/bzrobots/RCMessage.h 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/RCMessage.h 2007-07-09 14:18:50 UTC (rev 14492) @@ -27,16 +27,17 @@ class RCLink; class RCRobotPlayer; +typedef enum { + ParseError, + ParseOk, + InvalidArgumentCount, + InvalidArguments +} messageParseStatus; + template <class C> class RCMessage { public: - typedef enum { - ParseError, - ParseOk, - InvalidArgumentCount, - InvalidArguments - } parseStatus; RCMessage() :next(NULL), link(NULL) { } virtual ~RCMessage() {} @@ -55,7 +56,7 @@ /* These three are dependent on the specific packet-type, so they are * left for the complete implementations. :-) */ - virtual parseStatus parse(char **arguments, int count) = 0; + virtual messageParseStatus parse(char **arguments, int count) = 0; virtual std::string getType() const = 0; virtual void getParameters(std::ostream &stream) const = 0; @@ -66,34 +67,6 @@ return ss.str(); } - /* Utility functions. */ - static bool parseFloat(char *string, float &dest) - { - char *endptr; - dest = strtof(string, &endptr); - if (endptr == string) - return false; - - /* We don't want NaN no matter what - it's of no use in this scenario. - * (And strtof will allow the string "NAN" as NaN) */ - if (isnan(dest)) - dest = 0.0f; - - return true; - } - template <typename T> - static T clamp(T val, T min, T max) - { - // Mad cred to _neon_/#scene.no and runehol/#scene.no for these two sentences: - // * If val is nan, the result is undefined - // * If max < min, the result is undefined - if (val > max) - return max; - if (val < min) - return min; - return val; - } - private: C *next; Modified: trunk/bzflag/src/bzrobots/RCMessageFactory.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCMessageFactory.cxx 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/RCMessageFactory.cxx 2007-07-09 14:18:50 UTC (rev 14492) @@ -17,6 +17,7 @@ ADD_LOOKUP(GetTickDuration); ADD_LOOKUP(SetTickDuration); ADD_LOOKUP(GetTickRemaining); + ADD_LOOKUP(GetBattleFieldSize); ADD_LOOKUP(GetTeams); ADD_LOOKUP(GetBases); ADD_LOOKUP(GetObstacles); @@ -39,6 +40,7 @@ ADD_LOOKUP(TurnRemaining); ADD_LOOKUP(TickDuration); ADD_LOOKUP(TickRemaining); + ADD_LOOKUP(BattleFieldSize); } // Local Variables: *** Modified: trunk/bzflag/src/bzrobots/RCReplies.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-09 14:18:50 UTC (rev 14492) @@ -1,10 +1,11 @@ #include "RCReplies.h" #include "RCMessageFactory.h" +#include "MessageUtilities.h" #include "version.h" -RCReply::parseStatus IdentifyBackend::parse(char **arguments, int count) +messageParseStatus IdentifyBackend::parse(char **arguments, int count) { if (count != 1) return InvalidArgumentCount; @@ -16,10 +17,10 @@ } void IdentifyBackend::getParameters(std::ostream &stream) const { - stream << version; + stream << version; } -RCReply::parseStatus CommandDoneReply::parse(char **arguments, int count) +messageParseStatus CommandDoneReply::parse(char **arguments, int count) { if (count != 1) return InvalidArgumentCount; @@ -32,21 +33,16 @@ } void CommandDoneReply::getParameters(std::ostream &stream) const { - stream << command; + stream << command; } -RCReply::parseStatus GunHeatReply::parse(char **arguments, int count) +messageParseStatus GunHeatReply::parse(char **arguments, int count) { - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], heat)) - return InvalidArguments; - - return ParseOk; + return MessageUtilities::parseSingleFloat(arguments, count, heat); } void GunHeatReply::getParameters(std::ostream &stream) const { - stream << heat; + stream << heat; } bool GunHeatReply::updateBot(BZAdvancedRobot *robot) const { @@ -54,18 +50,13 @@ return true; } -RCReply::parseStatus DistanceRemainingReply::parse(char **arguments, int count) +messageParseStatus DistanceRemainingReply::parse(char **arguments, int count) { - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], distance)) - return InvalidArguments; - - return ParseOk; + return MessageUtilities::parseSingleFloat(arguments, count, distance); } void DistanceRemainingReply::getParameters(std::ostream &stream) const { - stream << distance; + stream << distance; } bool DistanceRemainingReply::updateBot(BZAdvancedRobot *robot) const { @@ -73,18 +64,13 @@ return true; } -RCReply::parseStatus TurnRemainingReply::parse(char **arguments, int count) +messageParseStatus TurnRemainingReply::parse(char **arguments, int count) { - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], turn)) - return InvalidArguments; - - return ParseOk; + return MessageUtilities::parseSingleFloat(arguments, count, turn); } void TurnRemainingReply::getParameters(std::ostream &stream) const { - stream << turn; + stream << turn; } bool TurnRemainingReply::updateBot(BZAdvancedRobot *robot) const { @@ -93,34 +79,40 @@ } -RCReply::parseStatus TickDurationReply::parse(char **arguments, int count) +messageParseStatus TickDurationReply::parse(char **arguments, int count) { - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], duration)) - return InvalidArguments; - - return ParseOk; + return MessageUtilities::parseSingleFloat(arguments, count, duration); } void TickDurationReply::getParameters(std::ostream &stream) const { - stream << duration; + stream << duration; } -RCReply::parseStatus TickRemainingReply::parse(char **arguments, int count) +messageParseStatus TickRemainingReply::parse(char **arguments, int count) { - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], remaining)) - return InvalidArguments; - - return ParseOk; + return MessageUtilities::parseSingleFloat(arguments, count, remaining); } void TickRemainingReply::getParameters(std::ostream &stream) const { - stream << remaining; + stream << remaining; } +messageParseStatus BattleFieldSizeReply::parse(char **arguments, int count) +{ + return MessageUtilities::parseSingleFloat(arguments, count, size); +} +void BattleFieldSizeReply::getParameters(std::ostream &stream) const +{ + stream << size; +} +bool BattleFieldSizeReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->battleFieldSize = size; + return true; +} + +//BZDB.set(StateDatabase::BZDB_WORLDSIZE, + // Local Variables: *** // mode:C++ *** // tab-width: 8 *** Modified: trunk/bzflag/src/bzrobots/RCReplies.h =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-09 14:18:50 UTC (rev 14492) @@ -28,7 +28,7 @@ IdentifyBackend() :version("") {} IdentifyBackend(std::string _version) :version(_version) {} std::string getType() const { return "IdentifyBackend"; } - RCReply::parseStatus parse(char **arguments, int count); + messageParseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; private: std::string version; @@ -39,7 +39,7 @@ CommandDoneReply(std::string _command) :command(_command) {} CommandDoneReply() :command("") {} std::string getType() const { return "CommandDone"; } - RCReply::parseStatus parse(char **arguments, int count); + messageParseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; std::string command; }; @@ -49,7 +49,7 @@ GunHeatReply() :heat(0.0f) {} GunHeatReply(float _heat) :heat(_heat) {} std::string getType() const { return "GunHeat"; } - RCReply::parseStatus parse(char **arguments, int count); + messageParseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; bool updateBot(BZAdvancedRobot *robot) const; @@ -61,7 +61,7 @@ DistanceRemainingReply() {} DistanceRemainingReply(float _distance) :distance(_distance) {} std::string getType() const { return "DistanceRemaining"; } - RCReply::parseStatus parse(char **arguments, int count); + messageParseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; bool updateBot(BZAdvancedRobot *robot) const; @@ -73,7 +73,7 @@ TurnRemainingReply() {} TurnRemainingReply(float _turn) :turn(_turn) {} std::string getType() const { return "TurnRemaining"; } - RCReply::parseStatus parse(char **arguments, int count); + messageParseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; bool updateBot(BZAdvancedRobot *robot) const; @@ -83,7 +83,7 @@ struct TickDurationReply : public RCReply { std::string getType() const { return "TickDuration"; } - RCReply::parseStatus parse(char **arguments, int count); + messageParseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; private: float duration; @@ -92,12 +92,24 @@ struct TickRemainingReply : public RCReply { std::string getType() const { return "TickRemaining"; } - RCReply::parseStatus parse(char **arguments, int count); + messageParseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; private: float remaining; }; +struct BattleFieldSizeReply : public RCReply +{ + BattleFieldSizeReply() {} + BattleFieldSizeReply(float _size) :size(_size) {} + std::string getType() const { return "BattleFieldSize"; } + messageParseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream) const; + bool updateBot(BZAdvancedRobot *robot) const; + + private: float size; +}; + #endif // Local Variables: *** Modified: trunk/bzflag/src/bzrobots/RCReply.h =================================================================== --- trunk/bzflag/src/bzrobots/RCReply.h 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/RCReply.h 2007-07-09 14:18:50 UTC (rev 14492) @@ -29,7 +29,7 @@ class RCReply :public RCMessage<RCReply> { public: virtual bool updateBot(BZAdvancedRobot *) const { return true; } - virtual parseStatus parse(char **arguments, int count) = 0; + virtual messageParseStatus parse(char **arguments, int count) = 0; virtual std::string getType() const = 0; virtual void getParameters(std::ostream &stream) const = 0; }; Modified: trunk/bzflag/src/bzrobots/RCRequest.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/RCRequest.h 2007-07-09 14:18:50 UTC (rev 14492) @@ -29,7 +29,7 @@ { public: virtual bool process(RCRobotPlayer *) { return true; } - virtual parseStatus parse(char **arguments, int count) = 0; + virtual messageParseStatus parse(char **arguments, int count) = 0; virtual std::string getType() const = 0; virtual void getParameters(std::ostream &stream) const = 0; Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-09 14:18:50 UTC (rev 14492) @@ -1,10 +1,13 @@ #include "RCRequests.h" + #include "RCReplies.h" #include "RCRobotPlayer.h" +#include "MessageUtilities.h" +#include "BZDBCache.h" #include "version.h" -RCRequest::parseStatus RCRequestZeroArgument::parse(char **, int count) +messageParseStatus RCRequestZeroArgument::parse(char **, int count) { if (count != 0) return InvalidArgumentCount; @@ -15,7 +18,7 @@ } -RCRequest::parseStatus IdentifyFrontend::parse(char **arguments, int count) +messageParseStatus IdentifyFrontend::parse(char **arguments, int count) { if (count != 1) return InvalidArgumentCount; @@ -71,15 +74,12 @@ return true; } -RCRequest::parseStatus SetSpeedReq::parse(char **arguments, int count) +messageParseStatus SetSpeedReq::parse(char **arguments, int count) { - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], speed)) - return InvalidArguments; - - speed = clamp(speed, 0.0f, 1.0f); - return ParseOk; + messageParseStatus status = MessageUtilities::parseSingleFloat(arguments, count, speed); + if (status == ParseOk) + speed = MessageUtilities::clamp(speed, 0.0f, 1.0f); + return status; } bool SetSpeedReq::process(RCRobotPlayer *rrp) { @@ -92,14 +92,12 @@ stream << speed; } -RCRequest::parseStatus SetTurnRateReq::parse(char **arguments, int count) +messageParseStatus SetTurnRateReq::parse(char **arguments, int count) { - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], rate)) - return InvalidArguments; - rate = clamp(rate, 0.0f, 1.0f); - return ParseOk; + messageParseStatus status = MessageUtilities::parseSingleFloat(arguments, count, rate); + if (status == ParseOk) + rate = MessageUtilities::clamp(rate, 0.0f, 1.0f); + return status; } bool SetTurnRateReq::process(RCRobotPlayer *rrp) { @@ -112,13 +110,9 @@ stream << rate; } -RCRequest::parseStatus SetAheadReq::parse(char **arguments, int count) +messageParseStatus SetAheadReq::parse(char **arguments, int count) { - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], distance)) - return InvalidArguments; - return ParseOk; + return MessageUtilities::parseSingleFloat(arguments, count, distance); } bool SetAheadReq::process(RCRobotPlayer *rrp) { @@ -131,13 +125,9 @@ stream << distance; } -RCRequest::parseStatus SetTurnLeftReq::parse(char **arguments, int count) +messageParseStatus SetTurnLeftReq::parse(char **arguments, int count) { - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], turn)) - return InvalidArguments; - return ParseOk; + return MessageUtilities::parseSingleFloat(arguments, count, turn); } bool SetTurnLeftReq::process(RCRobotPlayer *rrp) { @@ -189,15 +179,12 @@ return true; } -RCRequest::parseStatus SetTickDurationReq::parse(char **arguments, int count) +messageParseStatus SetTickDurationReq::parse(char **arguments, int count) { - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], duration)) - return InvalidArguments; - - duration = std::max(duration, 0.0f); - return ParseOk; + messageParseStatus status = MessageUtilities::parseSingleFloat(arguments, count, duration); + if (status == ParseOk) + duration = std::max(duration, 0.0f); + return status; } bool SetTickDurationReq::process(RCRobotPlayer *rrp) { @@ -219,6 +206,12 @@ return true; } +bool GetBattleFieldSizeReq::process(RCRobotPlayer *) +{ + link->send(BattleFieldSizeReply(BZDBCache::worldSize)); + return true; +} + bool GetTeamsReq::process(RCRobotPlayer *) { // TODO: Implement this. :p Modified: trunk/bzflag/src/bzrobots/RCRequests.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-09 14:18:50 UTC (rev 14492) @@ -25,7 +25,7 @@ struct RCRequestZeroArgument : public RCRequest { - RCRequest::parseStatus parse(char **arguments, int count); + messageParseStatus parse(char **arguments, int count); virtual bool process(RCRobotPlayer *rrp) = 0; void getParameters(std::ostream &stream) const; }; @@ -65,7 +65,11 @@ std::string getType() const { return "GetTickRemaining"; } bool process(RCRobotPlayer *rrp); }; - +struct GetBattleFieldSizeReq : public RCRequestZeroArgument +{ + std::string getType() const { return "GetBattleFieldSize"; } + bool process(RCRobotPlayer *rrp); +}; struct GetTeamsReq : public RCRequestZeroArgument { std::string getType() const { return "GetTeams"; } bool process(RCRobotPlayer *rrp); @@ -103,7 +107,7 @@ IdentifyFrontend() :version("") {} IdentifyFrontend(std::string _version) :version(_version) {} std::string getType() const { return "IdentifyFrontend"; } - RCRequest::parseStatus parse(char **arguments, int count); + messageParseStatus parse(char **arguments, int count); void getParameters(std::ostream &stream) const; private: std::string version; @@ -114,17 +118,19 @@ { \ public: \ COMMANDNAME ## Req() {} \ - RCRequest::parseStatus parse(char **arguments, int count); \ + messageParseStatus parse(char **arguments, int count); \ std::string getType() const { return #COMMANDNAME; } \ bool process(RCRobotPlayer *rrp); \ void getParameters(std::ostream &stream) const; DECLARE_REQUEST(SetSpeed) + SetSpeedReq(float _speed) :speed(_speed) {} private: float speed; }; DECLARE_REQUEST(SetTurnRate) + SetTurnRateReq(float _rate) :rate(_rate) {} private: float rate; }; Modified: trunk/bzflag/src/bzrobots/Robot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/Robot.cxx 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/Robot.cxx 2007-07-09 14:18:50 UTC (rev 14492) @@ -1,4 +1,4 @@ -#include "AdvancedRobot.h" +#include "Robot.h" // Local Variables: *** // mode:C++ *** Modified: trunk/bzflag/src/bzrobots/Robot.h =================================================================== --- trunk/bzflag/src/bzrobots/Robot.h 2007-07-09 13:14:49 UTC (rev 14491) +++ trunk/bzflag/src/bzrobots/Robot.h 2007-07-09 14:18:50 UTC (rev 14492) @@ -11,13 +11,15 @@ */ /* - * AdvancedRobot: A class for the simulation and implementation of mostly - * RoboCode-compliant AdvancedRobot (see BZRobot for the "normal" one) + * Robot: A class for simulation and implementation of a simpler + * RoboCode-supporting robot. */ #ifndef BZROBOTS_ROBOT_H #define BZROBOTS_ROBOT_H +#include "BZRobot.h" + class Robot :public BZRobot { protected: @@ -37,6 +39,9 @@ void setAdjustRadarForGunTurn(bool independent); void setAdjustRadarForRobotTurn(bool independent); + double getBattleFieldHeight(); + double getBattleFieldWidth(); + void turnGunRight(double degrees); void turnGunLeft(double degrees); void turnRadarRight(double degrees); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-09 15:46:26
|
Revision: 14493 http://bzflag.svn.sourceforge.net/bzflag/?rev=14493&view=rev Author: daxxar Date: 2007-07-09 08:46:18 -0700 (Mon, 09 Jul 2007) Log Message: ----------- Implemented GetX, GetY, GetZ, GetHeight, GetWidth, GetLength, GetHeading. Modified Paths: -------------- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx trunk/bzflag/src/bzrobots/BZAdvancedRobot.h trunk/bzflag/src/bzrobots/RCReplies.cxx trunk/bzflag/src/bzrobots/RCReplies.h trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRequests.h Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-09 14:18:50 UTC (rev 14492) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-09 15:46:18 UTC (rev 14493) @@ -73,22 +73,28 @@ double BZAdvancedRobot::getHeading() { - /* TODO: Implement this. */ - return 0.0; + link->sendAndProcess(GetHeadingReq(), this); + return heading; } double BZAdvancedRobot::getHeight() { - /* TODO: Implement this. */ - return 0.0; + link->sendAndProcess(GetHeightReq(), this); + return tankHeight; } double BZAdvancedRobot::getWidth() { - /* TODO: Implement this. */ - return 0.0; + link->sendAndProcess(GetWidthReq(), this); + return tankWidth; } +double BZAdvancedRobot::getLength() +{ + link->sendAndProcess(GetLengthReq(), this); + return tankLength; +} + int BZAdvancedRobot::getOthers() { /* TODO: Implement this. */ @@ -109,17 +115,23 @@ double BZAdvancedRobot::getX() { - /* TODO: Implement this. */ - return 0.0; + link->sendAndProcess(GetXReq(), this); + return xPosition; } double BZAdvancedRobot::getY() { - /* TODO: Implement this. */ - return 0.0; + link->sendAndProcess(GetYReq(), this); + return yPosition; } +double BZAdvancedRobot::getZ() +{ + link->sendAndProcess(GetZReq(), this); + return zPosition; +} + // Local Variables: *** // mode:C++ *** // tab-width: 8 *** Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.h =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-09 14:18:50 UTC (rev 14492) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.h 2007-07-09 15:46:18 UTC (rev 14493) @@ -45,18 +45,24 @@ double getHeading(); double getHeight(); double getWidth(); + double getLength(); int getOthers(); long getTime(); double getVelocity(); double getX(); double getY(); + double getZ(); public: virtual void run() = 0; BZAdvancedRobot(RCLinkFrontend *_link) :link(_link) {} virtual ~BZAdvancedRobot() {} - float gunHeat, distanceRemaining, turnRemaining, battleFieldSize; + float gunHeat, distanceRemaining, turnRemaining; + float battleFieldSize; + float yPosition, xPosition, zPosition; + float tankWidth, tankLength, tankHeight; + float heading; }; #endif Modified: trunk/bzflag/src/bzrobots/RCReplies.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-09 14:18:50 UTC (rev 14492) +++ trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-09 15:46:18 UTC (rev 14493) @@ -111,8 +111,101 @@ return true; } -//BZDB.set(StateDatabase::BZDB_WORLDSIZE, +messageParseStatus XReply::parse(char **arguments, int count) +{ + return MessageUtilities::parseSingleFloat(arguments, count, x); +} +void XReply::getParameters(std::ostream &stream) const +{ + stream << x; +} +bool XReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->xPosition = x; + return true; +} +messageParseStatus YReply::parse(char **arguments, int count) +{ + return MessageUtilities::parseSingleFloat(arguments, count, y); +} +void YReply::getParameters(std::ostream &stream) const +{ + stream << y; +} +bool YReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->yPosition = y; + return true; +} +messageParseStatus ZReply::parse(char **arguments, int count) +{ + return MessageUtilities::parseSingleFloat(arguments, count, z); +} +void ZReply::getParameters(std::ostream &stream) const +{ + stream << z; +} +bool ZReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->zPosition = z; + return true; +} + +messageParseStatus WidthReply::parse(char **arguments, int count) +{ + return MessageUtilities::parseSingleFloat(arguments, count, width); +} +void WidthReply::getParameters(std::ostream &stream) const +{ + stream << width; +} +bool WidthReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->tankWidth = width; + return true; +} +messageParseStatus HeightReply::parse(char **arguments, int count) +{ + return MessageUtilities::parseSingleFloat(arguments, count, height); +} +void HeightReply::getParameters(std::ostream &stream) const +{ + stream << height; +} +bool HeightReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->tankHeight = height; + return true; +} +messageParseStatus LengthReply::parse(char **arguments, int count) +{ + return MessageUtilities::parseSingleFloat(arguments, count, length); +} +void LengthReply::getParameters(std::ostream &stream) const +{ + stream << length; +} +bool LengthReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->tankLength = length; + return true; +} + +messageParseStatus HeadingReply::parse(char **arguments, int count) +{ + return MessageUtilities::parseSingleFloat(arguments, count, heading); +} +void HeadingReply::getParameters(std::ostream &stream) const +{ + stream << heading; +} +bool HeadingReply::updateBot(BZAdvancedRobot *robot) const +{ + robot->heading = heading; + return true; +} + // Local Variables: *** // mode:C++ *** // tab-width: 8 *** Modified: trunk/bzflag/src/bzrobots/RCReplies.h =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-09 14:18:50 UTC (rev 14492) +++ trunk/bzflag/src/bzrobots/RCReplies.h 2007-07-09 15:46:18 UTC (rev 14493) @@ -110,6 +110,86 @@ private: float size; }; +struct XReply : public RCReply +{ + XReply() {} + XReply(float _x) :x(_x) {} + std::string getType() const { return "X"; } + messageParseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream) const; + bool updateBot(BZAdvancedRobot *robot) const; + + private: float x; +}; +struct YReply : public RCReply +{ + YReply() {} + YReply(float _y) :y(_y) {} + std::string getType() const { return "X"; } + messageParseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream) const; + bool updateBot(BZAdvancedRobot *robot) const; + + private: float y; +}; +struct ZReply : public RCReply +{ + ZReply() {} + ZReply(float _z) :z(_z) {} + std::string getType() const { return "X"; } + messageParseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream) const; + bool updateBot(BZAdvancedRobot *robot) const; + + private: float z; +}; + +struct WidthReply : public RCReply +{ + WidthReply() {} + WidthReply(float _width) :width(_width) {} + std::string getType() const { return "Width"; } + messageParseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream) const; + bool updateBot(BZAdvancedRobot *robot) const; + + private: float width; +}; +struct HeightReply : public RCReply +{ + HeightReply() {} + HeightReply(float _height) :height(_height) {} + std::string getType() const { return "Height"; } + messageParseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream) const; + bool updateBot(BZAdvancedRobot *robot) const; + + private: float height; +}; +struct LengthReply : public RCReply +{ + LengthReply() {} + LengthReply(float _length) :length(_length) {} + std::string getType() const { return "Length"; } + messageParseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream) const; + bool updateBot(BZAdvancedRobot *robot) const; + + private: float length; +}; + +struct HeadingReply : public RCReply +{ + HeadingReply() {} + HeadingReply(float _heading) :heading(_heading) {} + std::string getType() const { return "Heading"; } + messageParseStatus parse(char **arguments, int count); + void getParameters(std::ostream &stream) const; + bool updateBot(BZAdvancedRobot *robot) const; + + private: float heading; +}; + #endif // Local Variables: *** Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-09 14:18:50 UTC (rev 14492) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-09 15:46:18 UTC (rev 14493) @@ -253,6 +253,43 @@ return true; } +bool GetXReq::process(RCRobotPlayer *rrp) +{ + link->send(XReply(rrp->getPosition()[0])); + return true; +} +bool GetYReq::process(RCRobotPlayer *rrp) +{ + link->send(YReply(rrp->getPosition()[1])); + return true; +} +bool GetZReq::process(RCRobotPlayer *rrp) +{ + link->send(ZReply(rrp->getPosition()[2])); + return true; +} + +bool GetWidthReq::process(RCRobotPlayer *rrp) +{ + link->send(WidthReply(rrp->getDimensions()[0])); + return true; +} +bool GetLengthReq::process(RCRobotPlayer *rrp) +{ + link->send(LengthReply(rrp->getDimensions()[1])); + return true; +} +bool GetHeightReq::process(RCRobotPlayer *rrp) +{ + link->send(HeightReply(rrp->getDimensions()[2])); + return true; +} +bool GetHeadingReq::process(RCRobotPlayer *rrp) +{ + link->send(HeadingReply(rrp->getAngle()*180.0f/M_PI)); + return true; +} + // Local Variables: *** // mode:C++ *** // tab-width: 8 *** Modified: trunk/bzflag/src/bzrobots/RCRequests.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-09 14:18:50 UTC (rev 14492) +++ trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-09 15:46:18 UTC (rev 14493) @@ -103,6 +103,37 @@ bool process(RCRobotPlayer *rrp); }; +struct GetXReq : public RCRequestZeroArgument { + std::string getType() const { return "GetX"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetYReq : public RCRequestZeroArgument { + std::string getType() const { return "GetY"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetZReq : public RCRequestZeroArgument { + std::string getType() const { return "GetZ"; } + bool process(RCRobotPlayer *rrp); +}; + +struct GetWidthReq : public RCRequestZeroArgument { + std::string getType() const { return "GetWidth"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetHeightReq : public RCRequestZeroArgument { + std::string getType() const { return "GetHeight"; } + bool process(RCRobotPlayer *rrp); +}; +struct GetLengthReq : public RCRequestZeroArgument { + std::string getType() const { return "GetLength"; } + bool process(RCRobotPlayer *rrp); +}; + +struct GetHeadingReq : public RCRequestZeroArgument { + std::string getType() const { return "GetHeading"; } + bool process(RCRobotPlayer *rrp); +}; + struct IdentifyFrontend :public RCRequest { IdentifyFrontend() :version("") {} IdentifyFrontend(std::string _version) :version(_version) {} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <da...@us...> - 2007-07-10 15:19:55
|
Revision: 14494 http://bzflag.svn.sourceforge.net/bzflag/?rev=14494&view=rev Author: daxxar Date: 2007-07-10 08:19:52 -0700 (Tue, 10 Jul 2007) Log Message: ----------- RCRobotPlayer: Support for 'stored' values for setStop/setResume (reindented some). Added SetResumeReq, SetStopReq. MessageUtilities now has parse and parseSingle, which are template-functions. (Makes it prettier to extend) Modified Paths: -------------- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx trunk/bzflag/src/bzrobots/MessageUtilities.cxx trunk/bzflag/src/bzrobots/MessageUtilities.h trunk/bzflag/src/bzrobots/RCReplies.cxx trunk/bzflag/src/bzrobots/RCRequests.cxx trunk/bzflag/src/bzrobots/RCRequests.h trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx trunk/bzflag/src/bzrobots/RCRobotPlayer.h Modified: trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx =================================================================== --- trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-09 15:46:18 UTC (rev 14493) +++ trunk/bzflag/src/bzrobots/BZAdvancedRobot.cxx 2007-07-10 15:19:52 UTC (rev 14494) @@ -41,14 +41,17 @@ void BZAdvancedRobot::setResume() { + link->sendAndProcess(SetResumeReq(), this); } void BZAdvancedRobot::setStop() { + setStop(false); } void BZAdvancedRobot::setStop(bool overwrite) { + link->sendAndProcess(SetStopReq(overwrite), this); } void BZAdvancedRobot::setTurnLeft(double degrees) Modified: trunk/bzflag/src/bzrobots/MessageUtilities.cxx =================================================================== --- trunk/bzflag/src/bzrobots/MessageUtilities.cxx 2007-07-09 15:46:18 UTC (rev 14493) +++ trunk/bzflag/src/bzrobots/MessageUtilities.cxx 2007-07-10 15:19:52 UTC (rev 14494) @@ -1,7 +1,20 @@ #include "MessageUtilities.h" -bool MessageUtilities::parseFloat(char *string, float &dest) +template <> +bool MessageUtilities::parse(const char *string, bool &dest) { + if (strcasecmp(string, "true") == 0) + dest = true; + else if (strcasecmp(string, "false") == 0) + dest = false; + else + return false; + + return true; +} +template <> +bool MessageUtilities::parse(const char *string, float &dest) +{ char *endptr; dest = strtof(string, &endptr); if (endptr == string) @@ -14,13 +27,3 @@ return true; } - -messageParseStatus MessageUtilities::parseSingleFloat(char **arguments, int count, float &dest) -{ - if (count != 1) - return InvalidArgumentCount; - if (!parseFloat(arguments[0], dest)) - return InvalidArguments; - - return ParseOk; -} Modified: trunk/bzflag/src/bzrobots/MessageUtilities.h =================================================================== --- trunk/bzflag/src/bzrobots/MessageUtilities.h 2007-07-09 15:46:18 UTC (rev 14493) +++ trunk/bzflag/src/bzrobots/MessageUtilities.h 2007-07-10 15:19:52 UTC (rev 14494) @@ -21,9 +21,23 @@ namespace MessageUtilities { - bool parseFloat(char *string, float &dest); - messageParseStatus parseSingleFloat(char **arguments, int count, float &dest); + template<typename T> + bool parse(const char *string, T &dest); + template<> + bool parse(const char *string, bool &dest); + template<> + bool parse(const char *string, float &dest); + template<typename T> + messageParseStatus parseSingle(char **arguments, int count, T &dest) + { + if (count != 1) + return InvalidArgumentCount; + if (!parse(arguments[0], dest)) + return InvalidArguments; + return ParseOk; + } + template <typename T> static T clamp(T val, T min, T max) { Modified: trunk/bzflag/src/bzrobots/RCReplies.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-09 15:46:18 UTC (rev 14493) +++ trunk/bzflag/src/bzrobots/RCReplies.cxx 2007-07-10 15:19:52 UTC (rev 14494) @@ -38,7 +38,7 @@ messageParseStatus GunHeatReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, heat); + return MessageUtilities::parseSingle(arguments, count, heat); } void GunHeatReply::getParameters(std::ostream &stream) const { @@ -52,7 +52,7 @@ messageParseStatus DistanceRemainingReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, distance); + return MessageUtilities::parseSingle(arguments, count, distance); } void DistanceRemainingReply::getParameters(std::ostream &stream) const { @@ -66,7 +66,7 @@ messageParseStatus TurnRemainingReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, turn); + return MessageUtilities::parseSingle(arguments, count, turn); } void TurnRemainingReply::getParameters(std::ostream &stream) const { @@ -81,7 +81,7 @@ messageParseStatus TickDurationReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, duration); + return MessageUtilities::parseSingle(arguments, count, duration); } void TickDurationReply::getParameters(std::ostream &stream) const { @@ -90,7 +90,7 @@ messageParseStatus TickRemainingReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, remaining); + return MessageUtilities::parseSingle(arguments, count, remaining); } void TickRemainingReply::getParameters(std::ostream &stream) const { @@ -99,7 +99,7 @@ messageParseStatus BattleFieldSizeReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, size); + return MessageUtilities::parseSingle(arguments, count, size); } void BattleFieldSizeReply::getParameters(std::ostream &stream) const { @@ -113,7 +113,7 @@ messageParseStatus XReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, x); + return MessageUtilities::parseSingle(arguments, count, x); } void XReply::getParameters(std::ostream &stream) const { @@ -127,7 +127,7 @@ messageParseStatus YReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, y); + return MessageUtilities::parseSingle(arguments, count, y); } void YReply::getParameters(std::ostream &stream) const { @@ -140,7 +140,7 @@ } messageParseStatus ZReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, z); + return MessageUtilities::parseSingle(arguments, count, z); } void ZReply::getParameters(std::ostream &stream) const { @@ -154,7 +154,7 @@ messageParseStatus WidthReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, width); + return MessageUtilities::parseSingle(arguments, count, width); } void WidthReply::getParameters(std::ostream &stream) const { @@ -167,7 +167,7 @@ } messageParseStatus HeightReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, height); + return MessageUtilities::parseSingle(arguments, count, height); } void HeightReply::getParameters(std::ostream &stream) const { @@ -180,7 +180,7 @@ } messageParseStatus LengthReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, length); + return MessageUtilities::parseSingle(arguments, count, length); } void LengthReply::getParameters(std::ostream &stream) const { @@ -194,7 +194,7 @@ messageParseStatus HeadingReply::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, heading); + return MessageUtilities::parseSingle(arguments, count, heading); } void HeadingReply::getParameters(std::ostream &stream) const { Modified: trunk/bzflag/src/bzrobots/RCRequests.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-09 15:46:18 UTC (rev 14493) +++ trunk/bzflag/src/bzrobots/RCRequests.cxx 2007-07-10 15:19:52 UTC (rev 14494) @@ -76,7 +76,7 @@ messageParseStatus SetSpeedReq::parse(char **arguments, int count) { - messageParseStatus status = MessageUtilities::parseSingleFloat(arguments, count, speed); + messageParseStatus status = MessageUtilities::parseSingle(arguments, count, speed); if (status == ParseOk) speed = MessageUtilities::clamp(speed, 0.0f, 1.0f); return status; @@ -94,7 +94,7 @@ messageParseStatus SetTurnRateReq::parse(char **arguments, int count) { - messageParseStatus status = MessageUtilities::parseSingleFloat(arguments, count, rate); + messageParseStatus status = MessageUtilities::parseSingle(arguments, count, rate); if (status == ParseOk) rate = MessageUtilities::clamp(rate, 0.0f, 1.0f); return status; @@ -112,7 +112,7 @@ messageParseStatus SetAheadReq::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, distance); + return MessageUtilities::parseSingle(arguments, count, distance); } bool SetAheadReq::process(RCRobotPlayer *rrp) { @@ -127,7 +127,7 @@ messageParseStatus SetTurnLeftReq::parse(char **arguments, int count) { - return MessageUtilities::parseSingleFloat(arguments, count, turn); + return MessageUtilities::parseSingle(arguments, count, turn); } bool SetTurnLeftReq::process(RCRobotPlayer *rrp) { @@ -146,6 +146,22 @@ return true; } +bool SetResumeReq::process(RCRobotPlayer *rrp) +{ + if (!rrp->isSteadyState()) + return false; + + if (rrp->hasStopped) + { + rrp->hasStopped = false; + rrp->distanceRemaining = rrp->stoppedDistance; + rrp->turnRemaining = rrp->stoppedTurn; + rrp->distanceForward = rrp->stoppedForward; + rrp->turnLeft = rrp->stoppedLeft; + } + return true; +} + bool GetGunHeatReq::process(RCRobotPlayer *rrp) { if (!rrp->isSteadyState()) @@ -181,7 +197,7 @@ messageParseStatus SetTickDurationReq::parse(char **arguments, int count) { - messageParseStatus status = MessageUtilities::parseSingleFloat(arguments, count, duration); + messageParseStatus status = MessageUtilities::parseSingle(arguments, count, duration); if (status == ParseOk) duration = std::max(duration, 0.0f); return status; @@ -290,6 +306,30 @@ return true; } +messageParseStatus SetStopReq::parse(char **arguments, int count) +{ + return MessageUtilities::parseSingle(arguments, count, overwrite); +} +bool SetStopReq::process(RCRobotPlayer *rrp) +{ + if (!rrp->isSteadyState()) + return false; + + if (!rrp->hasStopped || overwrite) + { + rrp->hasStopped = true; + rrp->stoppedDistance = rrp->distanceRemaining; + rrp->stoppedTurn = rrp->turnRemaining; + rrp->stoppedForward = rrp->distanceForward; + rrp->stoppedLeft = rrp->turnLeft; + } + return true; +} +void SetStopReq::getParameters(std::ostream &stream) const +{ + stream << overwrite; +} + // Local Variables: *** // mode:C++ *** // tab-width: 8 *** Modified: trunk/bzflag/src/bzrobots/RCRequests.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-09 15:46:18 UTC (rev 14493) +++ trunk/bzflag/src/bzrobots/RCRequests.h 2007-07-10 15:19:52 UTC (rev 14494) @@ -40,6 +40,11 @@ std::string getType() const { return "SetFire"; } bool process(RCRobotPlayer *rrp); }; +struct SetResumeReq : public RCRequestZeroArgument +{ + std::string getType() const { return "SetResume"; } + bool process(RCRobotPlayer *rrp); +}; struct GetGunHeatReq : public RCRequestZeroArgument { std::string getType() const { return "GetGunHeat"; } @@ -183,6 +188,12 @@ float duration; }; +DECLARE_REQUEST(SetStop) + SetStopReq(bool _overwrite) :overwrite(_overwrite) {} +private: + bool overwrite; +}; + #undef DECLARE_REQUEST #endif Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-07-09 15:46:18 UTC (rev 14493) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.cxx 2007-07-10 15:19:52 UTC (rev 14494) @@ -34,7 +34,8 @@ turnRate(1.0), nextTurnRate(1.0), shoot(false), distanceRemaining(0.0), nextDistance(0.0), - turnRemaining(0.0), nextTurn(0.0) + turnRemaining(0.0), nextTurn(0.0), + hasStopped(false) { } @@ -63,7 +64,7 @@ } else { - setDesiredSpeed(0); + setDesiredSpeed(0); } if (turnRemaining > 0.0f) @@ -81,7 +82,7 @@ } else { - setDesiredAngVel(0); + setDesiredAngVel(0); } } else @@ -106,11 +107,11 @@ bool RCRobotPlayer::isSteadyState() { - double timeNow = TimeKeeper::getCurrent().getSeconds(); - /* last tick done? */ - if (lastTickAt + tickDuration <= timeNow) - return true; - return false; + double timeNow = TimeKeeper::getCurrent().getSeconds(); + /* last tick done? */ + if (lastTickAt + tickDuration <= timeNow) + return true; + return false; } // Local Variables: *** Modified: trunk/bzflag/src/bzrobots/RCRobotPlayer.h =================================================================== --- trunk/bzflag/src/bzrobots/RCRobotPlayer.h 2007-07-09 15:46:18 UTC (rev 14493) +++ trunk/bzflag/src/bzrobots/RCRobotPlayer.h 2007-07-10 15:19:52 UTC (rev 14494) @@ -50,16 +50,22 @@ bool isSteadyState(); + bool pendingUpdates[updateCount]; + double lastTickAt; double tickDuration; float speed, nextSpeed; float turnRate, nextTurnRate; bool shoot; + double distanceRemaining, nextDistance; bool distanceForward, turnLeft; double turnRemaining, nextTurn; - bool pendingUpdates[updateCount]; + bool hasStopped; + double stoppedDistance, stoppedTurn; + bool stoppedForward, stoppedLeft; + private: void doUpdate(float dt); void doUpdateMotion(float dt); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |