Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

Sensors.cc

Go to the documentation of this file.
00001 /* -*- Mode: C++ -*-
00002  * $Id: Sensors.cc,v 1.49 2007/08/26 18:28:40 frehe Exp $
00003  *
00004  *
00005  * COPYRIGHT INFORMATION
00006  *
00007  * This file is part of RoboSoc created by Fredrik Heintz <frehe@ida.liu.se>
00008  * Copyright (C) 1999, 2000 Fredrik Heintz, Linköping University, Sweden
00009  *
00010  * You are allowed to modify and use this code as long as you retain this
00011  * notice. If you make any changes or have any comments I would appreciate
00012  * it if you send me a message. For more information, please see
00013  * http://www.ida.liu.se/~frehe/RoboCup/RoboSoc/
00014  *
00015  *
00016  * IDENTIFICATION
00017  *
00018  * Filename: Sensors.cc
00019  * Unitname: BasicSystem
00020  * $Revision: 1.49 $
00021  * Created by: Fredrik Heintz 1999-xx-xx
00022  * Last modified by $Author: frehe $ $Date: 2007/08/26 18:28:40 $
00023  *
00024  *
00025  * HISTORY
00026  *
00027  * $Log: Sensors.cc,v $
00028  * Revision 1.49  2007/08/26 18:28:40  frehe
00029  * Added full state sensor messages.
00030  *
00031  * Revision 1.48  2006/09/13 16:17:02  frehe
00032  * Send information to cerr instead of cout.
00033  *
00034  * Revision 1.47  2004/09/05 19:38:15  frehe
00035  * Improved support for focus.
00036  *
00037  * Revision 1.46  2004/09/04 10:38:12  frehe
00038  * Fixed bug where parsedSide was not reset after parsing.
00039  *
00040  * Revision 1.45  2004/08/29 14:42:16  frehe
00041  * Fixed support for getting the teamnames if only one is known.
00042  *
00043  * Revision 1.44  2004/08/27 14:57:53  frehe
00044  * Added support for (ok team_names...)
00045  *
00046  * Revision 1.43  2004/08/27 12:21:44  frehe
00047  * Fixed init message for trainers.
00048  *
00049  * Revision 1.42  2004/08/23 20:47:20  frehe
00050  * Added support for move ok.
00051  *
00052  * Revision 1.41  2004/08/23 13:23:23  frehe
00053  * Added support for (ok ear on).
00054  *
00055  * Revision 1.40  2003/10/14 18:07:52  s02davro
00056  * Added call for command to sensorinterface
00057  *
00058  * Revision 1.39  2003/10/02 15:41:43  s02davro
00059  * Fixed bug related to the offensive corner flags
00060  *
00061  * Revision 1.38  2003/09/02 17:55:01  frehe
00062  * Added the semantics of the command pointers. RoboSoc will now take control of them.
00063  *
00064  * Revision 1.37  2003/08/20 12:29:56  s02davro
00065  * ControlCommand fix, count counter
00066  *
00067  * Revision 1.36  2003/07/22 14:45:22  s02davro
00068  * Logging, arm, tackle, focus + bugfix
00069  *
00070  * Revision 1.35  2003/07/21 08:55:58  s02davro
00071  * Added support for new rccparser and server version 9.
00072  *
00073  * Revision 1.34  2002/12/07 17:29:04  s02davro
00074  * Hack in Sensor to fix trainer added CP_trainer to WorldFacts
00075  *
00076  * Revision 1.33  2002/09/26 15:23:41  s02davro
00077  * Bugfixes, close, team, coach
00078  *
00079  * Revision 1.32  2002/09/23 10:28:41  s02davro
00080  * Find bug in (close), this information needs to be handled - todo
00081  *
00082  * Revision 1.31  2002/09/21 15:38:57  s02davro
00083  * Update to new (1.0.3) RCCParser
00084  *
00085  * Revision 1.30  2002/08/31 15:06:16  s02davro
00086  * Redesign (again) now handles the coach fullstate information messages
00087  *
00088  * Revision 1.29  2002/08/13 10:23:17  s02davro
00089  * Update to handle ServerParam, PlayerParam and PlayerType messages.
00090  *
00091  * Revision 1.28  2002/08/02 21:51:49  s02davro
00092  * Complete rewrite, now uses rccparser-1.0 and clangparser from the soccerserver.
00093  *
00094  * Revision 1.26  2002/01/20 17:16:49  frehe
00095  * Fixed the problem with the coach not hearing the referee messages.
00096  *
00097  * Revision 1.25  2002/01/16 09:53:52  frehe
00098  * Fixed the coach parsing of referee messages.
00099  *
00100  * Revision 1.24  2002/01/15 17:19:41  frehe
00101  * Improved the coach parser.
00102  *
00103  * Revision 1.23  2002/01/11 15:27:18  frehe
00104  * Added support for coach freeform messages.
00105  *
00106  * Revision 1.22  2001/11/15 16:48:48  frehe
00107  * Added support for a coach.
00108  *
00109  * Revision 1.21  2001/10/14 21:21:43  frehe
00110  * Added better support for messages from self and from other players.
00111  *
00112  * Revision 1.20  2001/10/14 14:48:36  frehe
00113  * Removed old debug info.
00114  *
00115  * Revision 1.19  2001/09/22 17:18:28  frehe
00116  * Added a workaround to get teammates from rccparser.
00117  *
00118  * Revision 1.18  2001/09/17 21:53:59  frehe
00119  * Readded support for a debug coach.
00120  *
00121  * Revision 1.17  2001/09/17 21:30:09  andbo928
00122  * Implemented an ugly workaround to get ballspeeds working.
00123  *
00124  * Revision 1.16  2001/09/14 13:48:04  frehe
00125  * Fixed the speed bug.
00126  *
00127  * Revision 1.15  2001/09/03 19:39:36  frehe
00128  * Changed code to use the RS_BEGIN_TRY, RS_END_TRY and RS_CATCH macros.
00129  *
00130  * Revision 1.14  2001/09/01 23:52:23  frehe
00131  * Added some debug info.
00132  *
00133  * Revision 1.13  2001/08/30 21:41:47  frehe
00134  * Removed a call to distDirChng in RCCParser that crashed the agent.
00135  *
00136  * Revision 1.12  2001/08/29 16:37:32  frehe
00137  * Added a test on the validity of vec in getVectorUnknown(RCC_Vector2d).
00138  *
00139  * Revision 1.11  2001/08/29 12:35:26  frehe
00140  * Fixed a bug in sense_body handler.
00141  *
00142  * Revision 1.10  2001/08/22 21:06:59  frehe
00143  * Updated 2001-08-22
00144  *
00145  * Revision 1.9  2001/08/19 23:32:24  frehe
00146  * Updated 2001-08-19
00147  *
00148  * Revision 1.8  2001/08/17 07:15:16  frehe
00149  * Made changes to compile RoboSoc with RCCParser-0.10.
00150  *
00151  * Revision 1.7  2001/08/13 16:43:16  frehe
00152  * Made updates to compile with new autotools and RCCParser.
00153  *
00154  * Revision 1.6  2001/08/13 07:33:16  frehe
00155  * Updated from laptop 2001-08-13.
00156  *
00157  * Revision 1.5  2001/08/02 17:04:22  frehe
00158  * Updated 2001-08-02
00159  *
00160  * Revision 1.4  2000/10/24 15:15:17  frehe
00161  * Fixed the generation of the onNewCycle event.
00162  *
00163  * Revision 1.3  2000/09/05 21:15:53  frehe
00164  * Made minor changes.
00165  *
00166  * Revision 1.2  2000/09/04 08:46:45  frehe
00167  * Fixed a naming error in the sensors.
00168  *
00169  * Revision 1.1  2000/09/03 20:41:14  frehe
00170  * Imported the current version of RoboSoc (soon to be v2.5.0)
00171  *
00172  */
00173 
00186 #include <sstream>
00187 #include <cstdio>
00188 #include <cstring>
00189 #include <cctype>
00190 
00191 #include "Sensors.h"
00192 #include "Controller.h"
00193 #include "SensorInterface.h"
00194 
00195 #include "SetCyclesSinceIOBeforeShutdown.h"
00196 #include "SetMinTicksBeforeSendingCommand.h"
00197 #include "SetMaxTicksBeforeSendingCommand.h"
00198 #include "SetTicksBeforeCommandWarning.h"
00199 #include "SetTicksBetweenCycles.h"
00200 #include "SetTicksBetweenSenses.h"
00201 #include "SetTicksBetweenVisuals.h"
00202 
00203 #include "string_utils.h"
00204 #include "rs_error.h"
00205 #include "rs_log.h"
00206 #include "rs_try_catch.h"
00207 
00208 RS_BEGIN_NAMESPACE
00209 
00210 
00211 Sensors::Sensors(SensorInterface* sensor_interface, 
00212      rcss::Parser& coachMessageParser)
00213   : rcc::Parser(coachMessageParser),
00214    facts(WorldFacts::nonConstInstance()),
00215    theController(NULL),
00216    theSensorInterface(sensor_interface),
00217    lastSensorType(SENSOR_UNKNOWN),
00218    currentTime(0),
00219    commandQueue(),
00220    parsedSide(S_UNKNOWN),
00221    parsedPlayMode(PM_UNKNOWN),
00222    parsedViewQuality(VQ_UNKNOWN),
00223    parsedViewWidth(VW_UNKNOWN),
00224    parsedLocations(),
00225    parsedFlagOffset(UIntUnknown()),
00226    parsedUniformNumber(UIntUnknown()),
00227    parsedGoalie(false),
00228    parsedTeam(T_UNKNOWN),
00229    parsedArmState(),
00230    parsedFocusState(),
00231    parsedTackleState() {}
00232 
00233 void Sensors::init(Controller* controller) {
00234   theController = controller;
00235 }
00236 
00237 void Sensors::analyze(ServerCommand* command) {
00238   lastSensorType = SENSOR_ACTUATORS;
00239   commandQueue.push(command->getType());
00240   theSensorInterface->setLastCommand(command->clone());
00241   theSensorInterface->setLastSensorType(lastSensorType);
00242   delete command;
00243 }
00244 
00245 void Sensors::analyze(char* sensor_data) {
00246   lastSensorType = SENSOR_UNKNOWN;  
00247   std::istringstream strm(sensor_data);
00248   if (!parse(strm)) {
00249     RS_LOG( LA_WARNING, "Parse error on sensor data: '" << sensor_data << "'");
00250   }
00251   else if ( lastSensorType == SENSOR_UNKNOWN ) 
00252     RS_LOG( LA_WARNING, "Unknown sensor data: '" << sensor_data << "'");
00253   else 
00254     theSensorInterface->setLastSensorType(lastSensorType);
00255 }
00256 
00257 void Sensors::updateTime(int time) {
00258   setCurrentTime(time);
00259   if ( theController->updateTime(getCurrentTime()) ) {
00260     theSensorInterface->newCycle();
00261     RS_LOG( LA_CONTROLLER, "Time: " << toString(getCurrentTime()) 
00262       << " --- NEW CYCLE ---");
00263   }
00264 }
00265 
00266 /*
00267  * Misc parsing
00268  */
00269 
00270 void Sensors::doMsgParsed() {
00271 }
00272 
00273 void Sensors::doBuildScore( int time, int our, int opp ) {
00274   RS_LOG ( LA_SENSORS, "BuildScore: " << time << ", " << our << ", " << opp );
00275   facts->setScore(facts->getOurSide(), our);
00276   facts->setScore(facts->getTheirSide(), opp);
00277   updateTime(time);
00278   lastSensorType = SENSOR_AURAL_SCORE;
00279 
00280 }
00281 
00282 void Sensors::doBuildTeamName( const std::string& name ) {
00283   RS_LOG ( LA_SENSORS, "BuildTeamName: " << name );
00284   if ( parsedSide != S_UNKNOWN ) {
00285     RS_LOG ( LA_SENSORS, "BuildTeamName: got team name" );
00286     if ( facts->getOurSide() == parsedSide ) {
00287       facts->CP_team_name = name;
00288     } else {
00289       facts->CP_their_team_name = name;
00290     }
00291   } else {
00292     RS_LOG( LA_SENSORS, "BuildTeamName: " << facts->CP_team_name
00293       << ", " << facts->CP_their_team_name );
00294     if ( name == facts->CP_team_name ) {
00295       RS_LOG ( LA_SENSORS, "BuildTeamName: our team" );
00296       parsedTeam = T_OUR_TEAM;
00297     } else if ( name == facts->CP_their_team_name ) {
00298       RS_LOG ( LA_SENSORS, "BuildTeamName: their team" );
00299       parsedTeam = T_THEIR_TEAM;
00300     } else {
00301       // We have encountered an unknown teamname.
00302       // If we have one of the team names already then
00303       // update the other
00304       if ( facts->isOurTeamNameKnown() ) {
00305   RS_LOG ( LA_SENSORS, "BuildTeamName: assume their team is " << name );
00306   facts->CP_their_team_name = name;
00307   parsedTeam = T_THEIR_TEAM;
00308       } else if ( facts->isTheirTeamNameKnown() ) {
00309   RS_LOG ( LA_SENSORS, "BuildTeamName: assume our team is " << name );
00310   facts->CP_team_name = name;
00311   parsedTeam = T_OUR_TEAM;
00312       } else {
00313   // We don't know either team so do nothing!
00314   RS_LOG ( LA_SENSORS, "BuildTeamName: do not know team" );
00315   parsedTeam = T_UNKNOWN;
00316       }
00317     }
00318   }
00319 }
00320 
00321 void Sensors::doBuildUNum( int unum ) {
00322   RS_LOG ( LA_SENSORS, "BuildUNum: " << unum);
00323   parsedUniformNumber = unum;
00324 }
00325 
00326 void Sensors::doBuildGoalie() {
00327   RS_LOG ( LA_SENSORS, "BuildGoalie" );
00328   parsedGoalie = true;
00329 }
00330 
00331 /*
00332  * CLang parsning.
00333  */
00334 
00335 void Sensors::doParsedCLang( const std::string& msg ) {
00336   RS_LOG ( LA_SENSORS, "ParsedCLang: " << msg);
00337   lastSensorType = SENSOR_AURAL_COACH;
00338 }
00339 
00340 /*
00341  * Fullstate information parsing. Not implemented.
00342  */
00343 
00344 void Sensors::doBuildFullState( int time ) {
00345   RS_LOG ( LA_SENSORS, "BuildFullState: " << time);
00346   RS_WARNING("Fullstate messages isn't implemented");
00347   lastSensorType = SENSOR_UNKNOWN;
00348   updateTime(time);
00349   theSensorInterface->seeFullstate(parsedFullstatePlayers,
00350            parsedCoachBall);
00351   parsedFullstatePlayers.clear();
00352   parsedCoachBall = CoachBallObject();  
00353 }
00354 
00355 void Sensors::doBuildCounts(int kick, int dash, int turn, int katch,
00356           int move, int turn_neck, int change_view, int say) {
00357   RS_LOG ( LA_SENSORS, "BuildCounts: " << kick << ", " << dash << ", " 
00358        << turn << ", " << ", " << katch << ", " << move << ", " 
00359        << turn_neck << ", " << change_view << ", " << say);
00360   RS_WARNING("This BuildCounts isn't implemented");
00361   lastSensorType = SENSOR_UNKNOWN;
00362 }
00363 
00364 void Sensors::doBuildScore( int our, int opp ) {
00365   RS_LOG ( LA_SENSORS, "BuildScore: " << our << ", " << opp );
00366   facts->setScore(facts->getOurSide(), our);
00367   facts->setScore(facts->getTheirSide(), opp);
00368   lastSensorType = SENSOR_AURAL_SCORE;
00369 }
00370 
00371 void Sensors::doBuildBall( double x, double y, 
00372          double delta_x, double delta_y ) {
00373   RS_LOG ( LA_SENSORS, "BuildBall: " << x << ", " << y << ", "
00374        << delta_x << ", " << delta_y);
00375   parsedCoachBall = CoachBallObject(x, y, delta_x, delta_y);
00376 }
00377 
00378 void Sensors::doBuildPlayer( int unum, int type, double x, double y, 
00379            double dx, double dy,
00380            double body_dir, double head_dir,
00381            int stamina, double effort, double recovery ) {
00382   // Not pointing, not goalie
00383   RS_LOG ( LA_SENSORS, "BuildPlayer: " << unum << ", " << type << ", " 
00384        << x  << ", " << y  << ", " << dx  << ", " << dy  << ", " << body_dir
00385        << ", " << head_dir << ", " << stamina  << ", " << effort
00386        << ", " << recovery);
00387   parsedFullstatePlayers.push_back
00388     (FullstatePlayerObject
00389      (x, y, dx, dy, 
00390       T_UNKNOWN,
00391       unum,
00392       false,
00393       body_dir, 
00394       head_dir,
00395       AngleDegUnknown(),
00396       false,
00397       stamina,
00398       effort));
00399 }
00400 
00401 void Sensors::doBuildPlayer( int unum, int type, double x, double y, 
00402            double dx, double dy,
00403            double body_dir, double head_dir,
00404            double arm_mag, double arm_dir,
00405            int stamina, double effort, double recovery ) {
00406   // Pointing, not goalie
00407   RS_LOG ( LA_SENSORS, "BuildPlayer: " << unum << ", " << type << ", " 
00408        << x  << ", " << y  << ", " << dx  << ", " << dy  << ", " << body_dir
00409        << ", " << head_dir << ", " << arm_mag << ", " << arm_dir << ", " 
00410        << stamina  << ", " << effort << ", " << recovery);
00411   RS_WARNING("This doBuildPlayer isn't implemented!");
00412   lastSensorType = SENSOR_UNKNOWN;
00413 }
00414 
00415 void Sensors::doBuildGoalie( int unum, double x, double y, 
00416            double dx, double dy,
00417            double body_dir, double head_dir,
00418            int stamina, double effort, double recovery ) {
00419   // Not pointing, not goalie
00420   RS_LOG ( LA_SENSORS, "BuildGoalie: " << unum << ", " << ", " 
00421        << x  << ", " << y  << ", " << dx  << ", " << dy  << ", " << body_dir
00422        << ", " << head_dir << ", " << stamina  << ", " << effort
00423        << ", " << recovery);
00424   RS_WARNING("This doBuildGoalie isn't implemented!");
00425   lastSensorType = SENSOR_UNKNOWN;
00426 }
00427 
00428 void Sensors::doBuildGoalie( int unum, double x, double y, 
00429            double dx, double dy,
00430            double body_dir, double head_dir,
00431            double arm_mag, double arm_dir,
00432            int stamina, double effort, double recovery ) {
00433   // Pointing, not goalie
00434   RS_LOG ( LA_SENSORS, "BuildGoalie: " << unum << ", " << ", " 
00435        << x  << ", " << y  << ", " << dx  << ", " << dy  << ", " << body_dir
00436        << ", " << head_dir << ", " << arm_mag << ", " << arm_dir << ", "
00437        << stamina  << ", " << effort << ", " << recovery);
00438   RS_WARNING("This doBuildGoalie isn't implemented!");
00439   lastSensorType = SENSOR_UNKNOWN;
00440 }
00441 
00442 /*
00443  * PlayMode parsing.
00444  */
00445 
00446 void Sensors::doBuildCatchBallLeftPlayMode() {
00447   RS_LOG ( LA_SENSORS, "BuildCatchBallLeftPlayMode");
00448   if (facts->getOurSide() == S_LEFT)
00449     parsedPlayMode = PM_OUR_GOALIE_GOT_BALL;
00450   else if (facts->getOurSide() == S_RIGHT)
00451     parsedPlayMode = PM_THEIR_GOALIE_GOT_BALL;
00452 }
00453 
00454 void Sensors::doBuildCatchBallRightPlayMode() {
00455   RS_LOG ( LA_SENSORS, "BuildCatchBallRightPlayMode" );
00456   if (facts->getOurSide() == S_RIGHT)
00457     parsedPlayMode = PM_OUR_GOALIE_GOT_BALL;
00458   else if (facts->getOurSide() == S_LEFT)
00459     parsedPlayMode = PM_THEIR_GOALIE_GOT_BALL;
00460 }
00461 
00462 void Sensors::doBuildBeforeKickOffPlayMode() {
00463   RS_LOG ( LA_SENSORS, "BuildBeforeKickOffPlayMode" );
00464   parsedPlayMode = PM_BEFORE_KICK_OFF;
00465 }
00466 
00467 void Sensors::doBuildTimeOverPlayMode() {
00468   RS_LOG ( LA_SENSORS, "BuildTimeOverPlayMode" );
00469   parsedPlayMode = PM_TIME_OVER;
00470 }
00471 
00472 void Sensors::doBuildPlayOnPlayMode() {
00473   RS_LOG ( LA_SENSORS, "BuildPlayOnPlayMode" );
00474   parsedPlayMode = PM_PLAY_ON;
00475 }
00476 
00477 void Sensors::doBuildKickOffLeftPlayMode() {
00478   RS_LOG ( LA_SENSORS, "BuildKickOffLeftPlayMode" );
00479   if (facts->getOurSide() == S_LEFT)
00480     parsedPlayMode = PM_OUR_KICK_OFF;
00481   else if (facts->getOurSide() == S_RIGHT)
00482     parsedPlayMode = PM_THEIR_KICK_OFF;
00483 }
00484 
00485 void Sensors::doBuildKickOffRightPlayMode() {
00486   RS_LOG ( LA_SENSORS, "BuildKickOffRightPlayMode" );
00487   if (facts->getOurSide() == S_RIGHT)
00488     parsedPlayMode = PM_OUR_KICK_OFF;
00489   else if (facts->getOurSide() == S_LEFT)
00490     parsedPlayMode = PM_THEIR_KICK_OFF;
00491 }
00492  
00493 void Sensors::doBuildKickInLeftPlayMode() {
00494   RS_LOG ( LA_SENSORS, "BuildKickInLeftPlayMode" );
00495   if (facts->getOurSide() == S_LEFT)
00496     parsedPlayMode = PM_OUR_KICK_IN;
00497   else if (facts->getOurSide() == S_RIGHT)
00498     parsedPlayMode = PM_THEIR_KICK_IN;
00499 }
00500  
00501 void Sensors::doBuildKickInRightPlayMode() {
00502   RS_LOG ( LA_SENSORS, "BuildKickInRightPlayMode" );
00503   if (facts->getOurSide() == S_RIGHT)
00504     parsedPlayMode = PM_OUR_KICK_IN;
00505   else if (facts->getOurSide() == S_LEFT)
00506     parsedPlayMode = PM_THEIR_KICK_IN;
00507 }
00508 
00509 void Sensors::doBuildFreeKickLeftPlayMode() {
00510   RS_LOG ( LA_SENSORS, "BuildFreeKickLeftPlayMode" );
00511   if (facts->getOurSide() == S_LEFT)
00512     parsedPlayMode = PM_OUR_FREE_KICK;
00513   else if (facts->getOurSide() == S_RIGHT)
00514     parsedPlayMode = PM_THEIR_FREE_KICK;  
00515 }
00516 
00517 void Sensors::doBuildFreeKickRightPlayMode() {
00518   RS_LOG ( LA_SENSORS, "BuildFreeKickRightPlayMode" );
00519   if (facts->getOurSide() == S_RIGHT)
00520     parsedPlayMode = PM_OUR_FREE_KICK;
00521   else if (facts->getOurSide() == S_LEFT)
00522     parsedPlayMode = PM_THEIR_FREE_KICK;  
00523 }
00524 
00525 void Sensors::doBuildCornerKickLeftPlayMode() {
00526   RS_LOG ( LA_SENSORS, "BuildCornerKickLeftPlayMode" );
00527   if (facts->getOurSide() == S_LEFT)
00528     parsedPlayMode = PM_OUR_CORNER_KICK;
00529   else if (facts->getOurSide() == S_RIGHT)
00530     parsedPlayMode = PM_THEIR_CORNER_KICK;  
00531 }
00532 
00533 void Sensors::doBuildCornerKickRightPlayMode() {
00534   RS_LOG ( LA_SENSORS, "BuildCornerKickRightPlayMode" );
00535   if (facts->getOurSide() == S_RIGHT)
00536     parsedPlayMode = PM_OUR_CORNER_KICK;
00537   else if (facts->getOurSide() == S_LEFT)
00538     parsedPlayMode = PM_THEIR_CORNER_KICK;  
00539 }
00540 
00541 void Sensors::doBuildGoalKickLeftPlayMode() {
00542   RS_LOG ( LA_SENSORS, "BuildGoalKickLeftPlayMode" );
00543   if (facts->getOurSide() == S_LEFT)
00544     parsedPlayMode = PM_OUR_GOAL_KICK;
00545   else if (facts->getOurSide() == S_RIGHT)
00546     parsedPlayMode = PM_THEIR_GOAL_KICK;  
00547 }
00548 
00549 void Sensors::doBuildGoalKickRightPlayMode() {
00550   RS_LOG ( LA_SENSORS, "BuildGoalKickRightPlayMode" );
00551   if (facts->getOurSide() == S_RIGHT)
00552     parsedPlayMode = PM_OUR_GOAL_KICK;
00553   else if (facts->getOurSide() == S_LEFT)
00554     parsedPlayMode = PM_THEIR_GOAL_KICK;  
00555 }
00556 
00557 void Sensors::doBuildAfterGoalLeftPlayMode() {
00558   RS_LOG ( LA_SENSORS, "BuildAfterGoalLeftPlayMode" );
00559   if (facts->getOurSide() == S_LEFT) 
00560     parsedPlayMode = PM_OUR_GOAL;
00561   else if (facts->getOurSide() == S_RIGHT)
00562     parsedPlayMode = PM_THEIR_GOAL;
00563 }
00564  
00565 void Sensors::doBuildAfterGoalRightPlayMode() {
00566   RS_LOG ( LA_SENSORS, "BuildAfterGoalRightPlayMode" );
00567   if (facts->getOurSide() == S_RIGHT) 
00568     parsedPlayMode = PM_OUR_GOAL;
00569   else if (facts->getOurSide() == S_LEFT)
00570     parsedPlayMode = PM_THEIR_GOAL;
00571 }
00572 
00573 void Sensors::doBuildDropBallPlayMode() {
00574   RS_LOG ( LA_SENSORS, "BuildDropBallPlayMode" );
00575   parsedPlayMode = PM_DROP_BALL;
00576 }
00577 
00578 void Sensors::doBuildOffSideLeftPlayMode() {
00579   RS_LOG ( LA_SENSORS, "BuildOffSideLeftPlayMode" );
00580   if (facts->getOurSide() == S_LEFT)
00581     parsedPlayMode = PM_OUR_OFFSIDE_KICK;
00582   else if (facts->getOurSide() == S_RIGHT)
00583     parsedPlayMode = PM_THEIR_OFFSIDE_KICK;
00584 }
00585 
00586 void Sensors::doBuildOffsideRightPlayMode() {
00587   RS_LOG ( LA_SENSORS, "BuildOffsideRightPlayMode" );
00588   if (facts->getOurSide() == S_RIGHT)
00589     parsedPlayMode = PM_OUR_OFFSIDE_KICK;
00590   else if (facts->getOurSide() == S_LEFT)
00591     parsedPlayMode = PM_THEIR_OFFSIDE_KICK;
00592 }
00593  
00594 void Sensors::doBuildPenaltyKickLeftPlayMode() {
00595   RS_LOG ( LA_SENSORS, "BuildPenaltyKickLeftPlayMode" );
00596   if (facts->getOurSide() == S_LEFT)
00597     parsedPlayMode = PM_OUR_PENALTY_KICK;
00598   else if (facts->getOurSide() == S_RIGHT)
00599     parsedPlayMode = PM_THEIR_PENALTY_KICK;
00600 }
00601 
00602 void Sensors::doBuildPenaltyKickRightPlayMode() {
00603   RS_LOG ( LA_SENSORS, "BuildPenaltyKickRightPlayMode" );
00604   if (facts->getOurSide() == S_RIGHT)
00605     parsedPlayMode = PM_OUR_PENALTY_KICK;
00606   else if (facts->getOurSide() == S_LEFT)
00607     parsedPlayMode = PM_THEIR_PENALTY_KICK;
00608 }
00609  
00610 void Sensors::doBuildFirstHalfOverPlayMode() {
00611   RS_LOG ( LA_SENSORS, "BuildFirstHalfOverPlayMode" );
00612   parsedPlayMode = PM_HALF_TIME;
00613 }
00614 
00615 void Sensors::doBuildPausePlayMode() {
00616   RS_LOG ( LA_SENSORS, "BuildPausePlayMode" );
00617   parsedPlayMode = PM_PAUSE;
00618 }
00619 
00620 void Sensors::doBuildHumanPlayMode() {
00621   RS_LOG ( LA_SENSORS, "BuildHumanPlayMode" );
00622   parsedPlayMode = PM_HUMAN;
00623 }
00624 
00625 void Sensors::doBuildFoulLeftPlayMode() {
00626   RS_LOG ( LA_SENSORS, "BuildFoulLeftPlayMode: ");
00627   if (facts->getOurSide() == S_LEFT)
00628     parsedPlayMode = PM_OUR_FOUL;
00629   else if (facts->getOurSide() == S_RIGHT)
00630     parsedPlayMode = PM_THEIR_FOUL;  
00631 }
00632 
00633 void Sensors::doBuildFoulRightPlayMode() {
00634   RS_LOG ( LA_SENSORS, "BuildFoulRightPlayMode: ");
00635   if (facts->getOurSide() == S_LEFT)
00636     parsedPlayMode = PM_OUR_FOUL;
00637   else if (facts->getOurSide() == S_RIGHT)
00638     parsedPlayMode = PM_THEIR_FOUL;
00639 }
00640  
00641 void Sensors::doBuildFoulChargeLeftPlayMode() {
00642   RS_LOG ( LA_SENSORS, "BuildFoulChargeLeftPlayMode" );
00643   if (facts->getOurSide() == S_LEFT)
00644     parsedPlayMode = PM_OUR_FOUL_CHARGE;
00645   else if (facts->getOurSide() == S_RIGHT)
00646     parsedPlayMode = PM_THEIR_FOUL_CHARGE;
00647 }
00648 
00649 void Sensors::doBuildFoulChargeRightPlayMode() {
00650   RS_LOG ( LA_SENSORS, "BuildFoulChargeRightPlayMode" );
00651   if (facts->getOurSide() == S_RIGHT)
00652     parsedPlayMode = PM_OUR_FOUL_CHARGE;
00653   else if (facts->getOurSide() == S_LEFT)
00654     parsedPlayMode = PM_THEIR_FOUL_CHARGE;
00655 }
00656 
00657 void Sensors::doBuildFoulPushLeftPlayMode() {
00658   RS_LOG ( LA_SENSORS, "BuildFoulPushLeftPlayMode" );
00659   if (facts->getOurSide() == S_LEFT)
00660     parsedPlayMode = PM_OUR_FOUL_PUSH;
00661   else if (facts->getOurSide() == S_RIGHT)
00662     parsedPlayMode = PM_THEIR_FOUL_PUSH;
00663 }
00664 
00665 void Sensors::doBuildFoulPushRightPlayMode() {
00666   RS_LOG ( LA_SENSORS, "BuildFoulPushRightPlayMode" );
00667   if (facts->getOurSide() == S_RIGHT)
00668     parsedPlayMode = PM_OUR_FOUL_PUSH;
00669   else if (facts->getOurSide() == S_LEFT)
00670     parsedPlayMode = PM_THEIR_FOUL_PUSH;
00671 }
00672 
00673 void Sensors::doBuildFoulMultipleAttackerLeftPlayMode() {
00674   RS_LOG ( LA_SENSORS, "BuildFoulMultipleAttackerLeftPlayMode" );
00675   if (facts->getOurSide() == S_LEFT)
00676     parsedPlayMode = PM_OUR_FOUL_MULTIPLEATTACKER;
00677   else if (facts->getOurSide() == S_RIGHT)
00678     parsedPlayMode = PM_THEIR_FOUL_MULTIPLEATTACKER;
00679 }
00680 
00681 void Sensors::doBuildFoulMultipleAttackerRightPlayMode() {
00682   RS_LOG ( LA_SENSORS, "BuildFoulMultipleAttackerRightPlayMode" );
00683   if (facts->getOurSide() == S_RIGHT)
00684     parsedPlayMode = PM_OUR_FOUL_MULTIPLEATTACKER;
00685   else if (facts->getOurSide() == S_LEFT)
00686     parsedPlayMode = PM_THEIR_FOUL_MULTIPLEATTACKER;
00687 }
00688 
00689 void Sensors::doBuildFoulBallOutLeftPlayMode() {
00690   RS_LOG ( LA_SENSORS, "BuildFoulBallOutLeftPlayMode" );
00691   if (facts->getOurSide() == S_LEFT)
00692     parsedPlayMode = PM_OUR_FOUL_BALLOUT;
00693   else if (facts->getOurSide() == S_RIGHT)
00694     parsedPlayMode = PM_THEIR_FOUL_BALLOUT;
00695 }
00696 
00697 void Sensors::doBuildFoulBallOutRightPlayMode() {
00698   RS_LOG ( LA_SENSORS, "BuildFoulBallOutRightPlayMode" );
00699   if (facts->getOurSide() == S_RIGHT)
00700     parsedPlayMode = PM_OUR_FOUL_BALLOUT;
00701   else if (facts->getOurSide() == S_LEFT)
00702     parsedPlayMode = PM_THEIR_FOUL_BALLOUT;
00703 }
00704 
00705 void Sensors::doBuildBackPassLeftPlayMode() {
00706   RS_LOG ( LA_SENSORS, "BuildBackPassLeftPlayMode" );
00707   if (facts->getOurSide() == S_LEFT)
00708     parsedPlayMode = PM_OUR_FOUL_BACKPASS;
00709   else if (facts->getOurSide() == S_RIGHT)
00710     parsedPlayMode = PM_THEIR_FOUL_BACKPASS;
00711 }
00712 
00713 void Sensors::doBuildBackPassRightPlayMode() {
00714   RS_LOG ( LA_SENSORS, "BuildBackPassRightPlayMode" );
00715   if (facts->getOurSide() == S_RIGHT)
00716     parsedPlayMode = PM_OUR_FOUL_BACKPASS;
00717   else if (facts->getOurSide() == S_LEFT)
00718     parsedPlayMode = PM_THEIR_FOUL_BACKPASS;
00719 }
00720 
00721 void Sensors::doBuildFreeKickFaultLeftPlayMode() {
00722   RS_LOG ( LA_SENSORS, "BuildFreeKickFaultLeftPlayMode" );
00723   if (facts->getOurSide() == S_LEFT)
00724     parsedPlayMode = PM_OUR_FOUL_FREEKICKFAULT;
00725   else if (facts->getOurSide() == S_RIGHT)
00726     parsedPlayMode = PM_THEIR_FOUL_FREEKICKFAULT;
00727 }
00728 
00729 void Sensors::doBuildFreeKickFaultRightPlayMode() {
00730   RS_LOG ( LA_SENSORS, "BuildFreeKickFaultRightPlayMode" );
00731   if (facts->getOurSide() == S_RIGHT)
00732     parsedPlayMode = PM_OUR_FOUL_FREEKICKFAULT;
00733   else if (facts->getOurSide() == S_LEFT)
00734     parsedPlayMode = PM_THEIR_FOUL_FREEKICKFAULT;
00735 }
00736 
00737 void Sensors::doBuildCatchFaultLeftPlayMode() {
00738   RS_LOG ( LA_SENSORS, "BuildCatchFaultLeftPlayMode" );
00739   if (facts->getOurSide() == S_LEFT)
00740     parsedPlayMode = PM_OUR_FOUL_CATCHFAULT;
00741   else if (facts->getOurSide() == S_RIGHT)
00742     parsedPlayMode = PM_THEIR_FOUL_CATCHFAULT;
00743 }
00744 
00745 void Sensors::doBuildCatchFaultRightPlayMode() {
00746   RS_LOG ( LA_SENSORS, "BuildCatchFaultRigthPlayMode" );
00747   if (facts->getOurSide() == S_RIGHT)
00748     parsedPlayMode = PM_OUR_FOUL_CATCHFAULT;
00749   else if (facts->getOurSide() == S_RIGHT)
00750     parsedPlayMode = PM_THEIR_FOUL_CATCHFAULT;
00751 }
00752 
00753 void Sensors::doBuildIndirectFreeKickLeftPlayMode() {
00754   RS_LOG ( LA_SENSORS, "BuildIndirectFreeKickLeftPlayMode" );
00755   if (facts->getOurSide() == S_LEFT)
00756     parsedPlayMode = PM_OUR_INDIRECT_FREE_KICK;
00757   else if (facts->getOurSide() == S_RIGHT)
00758     parsedPlayMode = PM_THEIR_INDIRECT_FREE_KICK;
00759 }
00760 
00761 void Sensors::doBuildIndirectFreeKickRightPlayMode() {
00762   RS_LOG ( LA_SENSORS, "BuildIndirectFreeKickRigthPlayMode" );
00763   if (facts->getOurSide() == S_RIGHT)
00764     parsedPlayMode = PM_OUR_INDIRECT_FREE_KICK;
00765   else if (facts->getOurSide() == S_RIGHT)
00766     parsedPlayMode = PM_THEIR_INDIRECT_FREE_KICK;
00767 }
00768 
00769 void Sensors::doBuildPenaltySetupLeftPlayMode() {
00770   RS_LOG ( LA_SENSORS, "BuildPenaltySetupLeftPlayMode" );
00771   if (facts->getOurSide() == S_LEFT)
00772     parsedPlayMode = PM_OUR_PENALTY_SETUP;
00773   else if (facts->getOurSide() == S_RIGHT)
00774     parsedPlayMode = PM_THEIR_PENALTY_SETUP;
00775 }
00776 
00777 void Sensors::doBuildPenaltySetupRightPlayMode() {
00778   RS_LOG ( LA_SENSORS, "BuildPenaltySetupRightPlayMode" );
00779   if (facts->getOurSide() == S_RIGHT)
00780     parsedPlayMode = PM_OUR_PENALTY_SETUP;
00781   else if (facts->getOurSide() == S_LEFT)
00782     parsedPlayMode = PM_THEIR_PENALTY_SETUP;
00783 }
00784 
00785 void Sensors::doBuildPenaltyReadyLeftPlayMode() {
00786   RS_LOG ( LA_SENSORS, "BuildPenaltyReadyLeftPlayMode" );
00787   if (facts->getOurSide() == S_LEFT)
00788     parsedPlayMode = PM_OUR_PENALTY_READY;
00789   else if (facts->getOurSide() == S_RIGHT)
00790     parsedPlayMode = PM_THEIR_PENALTY_READY;
00791 }
00792 
00793 void Sensors::doBuildPenaltyReadyRightPlayMode() {
00794   RS_LOG ( LA_SENSORS, "BuildPenaltyReadyRightPlayMode" );
00795   if (facts->getOurSide() == S_RIGHT)
00796     parsedPlayMode = PM_OUR_PENALTY_READY;
00797   else if (facts->getOurSide() == S_LEFT)
00798     parsedPlayMode = PM_THEIR_PENALTY_READY;
00799 }
00800 
00801 void Sensors::doBuildPenaltyTakenLeftPlayMode() {
00802   RS_LOG ( LA_SENSORS, "BuildPenaltyTakenLeftPlayMode" );
00803   if (facts->getOurSide() == S_LEFT)
00804     parsedPlayMode = PM_OUR_PENALTY_TAKEN;
00805   else if (facts->getOurSide() == S_RIGHT)
00806     parsedPlayMode = PM_THEIR_PENALTY_TAKEN;
00807 }
00808 
00809 void Sensors::doBuildPenaltyTakenRightPlayMode() {
00810   RS_LOG ( LA_SENSORS, "BuildPenaltyTakenRightPlayMode" );
00811   if (facts->getOurSide() == S_RIGHT)
00812     parsedPlayMode = PM_OUR_PENALTY_TAKEN;
00813   else if (facts->getOurSide() == S_LEFT)
00814     parsedPlayMode = PM_THEIR_PENALTY_TAKEN;
00815 }
00816 
00817 void Sensors::doBuildPenaltyMissLeftPlayMode() {
00818   RS_LOG ( LA_SENSORS, "BuildPenaltyMissLeftPlayMode" );
00819   if (facts->getOurSide() == S_LEFT)
00820     parsedPlayMode = PM_OUR_PENALTY_MISS;
00821   else if (facts->getOurSide() == S_RIGHT)
00822     parsedPlayMode = PM_THEIR_PENALTY_MISS;
00823 }
00824 
00825 void Sensors::doBuildPenaltyMissRightPlayMode() {
00826   RS_LOG ( LA_SENSORS, "BuildPenaltyMissRightPlayMode" );
00827   if (facts->getOurSide() == S_RIGHT)
00828     parsedPlayMode = PM_OUR_PENALTY_MISS;
00829   else if (facts->getOurSide() == S_LEFT)
00830     parsedPlayMode = PM_THEIR_PENALTY_MISS;
00831 }
00832 
00833 void Sensors::doBuildPenaltyScoreLeftPlayMode() {
00834   RS_LOG ( LA_SENSORS, "BuildPenaltyScoreLeftPlayMode" );
00835   if (facts->getOurSide() == S_LEFT)
00836     parsedPlayMode = PM_OUR_PENALTY_SCORE;
00837   else if (facts->getOurSide() == S_RIGHT)
00838     parsedPlayMode = PM_THEIR_PENALTY_SCORE;
00839 }
00840 
00841 void Sensors::doBuildPenaltyScoreRightPlayMode() {
00842   RS_LOG ( LA_SENSORS, "BuildPenaltyScoreRightPlayMode" );
00843   if (facts->getOurSide() == S_RIGHT)
00844     parsedPlayMode = PM_OUR_PENALTY_SCORE;
00845   else if (facts->getOurSide() == S_LEFT)
00846     parsedPlayMode = PM_THEIR_PENALTY_SCORE;
00847 }
00848 
00849 void Sensors::doBuildPenaltyOnFieldLeftPlayMode() {
00850   RS_LOG ( LA_SENSORS, "BuildPenaltyOnFieldLeftPlayMode" );
00851   if (facts->getOurSide() == S_LEFT)
00852     parsedPlayMode = PM_OUR_PENALTY_ONFIELD;
00853   else if (facts->getOurSide() == S_RIGHT)
00854     parsedPlayMode = PM_THEIR_PENALTY_ONFIELD;
00855 }
00856 
00857 void Sensors::doBuildPenaltyOnFieldRightPlayMode() {
00858   RS_LOG ( LA_SENSORS, "BuildPenaltyOnFieldRightPlayMode" );
00859   if (facts->getOurSide() == S_RIGHT)
00860     parsedPlayMode = PM_OUR_PENALTY_ONFIELD;
00861   else if (facts->getOurSide() == S_LEFT)
00862     parsedPlayMode = PM_THEIR_PENALTY_ONFIELD;
00863 }
00864 
00865 void Sensors::doBuildPenaltyFoulLeftPlayMode() {
00866   RS_LOG ( LA_SENSORS, "BuildPenaltyFoulLeftPlayMode" );
00867   if (facts->getOurSide() == S_LEFT)
00868     parsedPlayMode = PM_OUR_PENALTY_FOUL;
00869   else if (facts->getOurSide() == S_RIGHT)
00870     parsedPlayMode = PM_THEIR_PENALTY_FOUL;
00871 }
00872 
00873 void Sensors::doBuildPenaltyFoulRightPlayMode() {
00874   RS_LOG ( LA_SENSORS, "BuildPenaltyFoulRightPlayMode" );
00875   if (facts->getOurSide() == S_RIGHT)
00876     parsedPlayMode = PM_OUR_PENALTY_FOUL;
00877   else if (facts->getOurSide() == S_LEFT)
00878     parsedPlayMode = PM_THEIR_PENALTY_FOUL;
00879 }
00880 
00881 void Sensors::doBuildPenaltyWinnerLeftPlayMode() {
00882   RS_LOG ( LA_SENSORS, "BuildPenaltyWinnerLeftPlayMode" );
00883   if (facts->getOurSide() == S_LEFT)
00884     parsedPlayMode = PM_OUR_PENALTY_WINNER;
00885   else if (facts->getOurSide() == S_RIGHT)
00886     parsedPlayMode = PM_THEIR_PENALTY_WINNER;
00887 }
00888 
00889 void Sensors::doBuildPenaltyWinnerRightPlayMode() {
00890   RS_LOG ( LA_SENSORS, "BuildPenaltyWinnerRightPlayMode" );
00891   if (facts->getOurSide() == S_RIGHT)
00892     parsedPlayMode = PM_OUR_PENALTY_WINNER;
00893   else if (facts->getOurSide() == S_LEFT)
00894     parsedPlayMode = PM_THEIR_PENALTY_WINNER;
00895 }
00896 
00897 void Sensors::doBuildPenaltyDrawPlayMode() {
00898   RS_LOG ( LA_SENSORS, "BuildPenaltyDraw" );
00899   parsedPlayMode = PM_PENALTY_DRAW;
00900 }
00901 
00902 /*
00903  * Side parsing.
00904  */
00905 
00906 void Sensors::doBuildLeftSide() {
00907   RS_LOG ( LA_SENSORS, "BuildLeftSide" );
00908   parsedSide = S_LEFT;
00909 }
00910 
00911 void Sensors::doBuildRightSide() {
00912   RS_LOG ( LA_SENSORS, "BuildRightSide" );
00913   parsedSide = S_RIGHT;
00914 }
00915 
00916 void Sensors::doBuildOppSide() {
00917   RS_LOG ( LA_SENSORS, "BuildOppSide" );
00918   if (facts->getOurSide() == S_LEFT)
00919     parsedSide = S_RIGHT;
00920   else if (facts->getOurSide() == S_RIGHT)
00921     parsedSide = S_LEFT;
00922 }
00923  
00924 void Sensors::doBuildOurSide() {
00925   RS_LOG ( LA_SENSORS, "BuildOurSide" );
00926   parsedSide = facts->getOurSide();
00927 }
00928  
00929 void Sensors::doBuildNeutralSide() {
00930   RS_LOG ( LA_SENSORS, "BuildNeutralSide" );
00931   parsedSide = S_NEUTRAL;  
00932 }
00933 
00934 void Sensors::doBuildSenseBody( int time, double stamina, double effort,
00935         double speed_mag, double speed_head,
00936         double head_angle, int kick_count,
00937         int dash_count, int turn_count,
00938         int say_count, int turn_neck_count,
00939         int catch_count, int move_count,
00940         int chg_view_count ) {
00941   RS_LOG ( LA_SENSORS, "BuildSenseBody: " << time  << ", " << stamina
00942        << ", " << effort << ", " << speed_mag  << ", " << speed_head
00943        << ", " << head_angle << ", " << kick_count << ", " << dash_count
00944        << ", " << turn_count << ", " << say_count << ", "
00945        << turn_neck_count  << ", " << catch_count  << ", " << move_count
00946        << ", " << chg_view_count);
00947   lastSensorType = SENSOR_SENSE;
00948   
00949   // @todo Move some things away to better place.
00950 
00951   // Immediate commands.
00952   static UInt change_views = 0;
00953   static UInt says         = 0;
00954   static UInt turn_necks   = 0;
00955   static UInt attentionTos = 0;
00956   static UInt pointTos     = 0;
00957 
00958   // Periodic (main) commands.
00959   static UInt catches      = 0;
00960   static UInt dashes       = 0;
00961   static UInt kicks        = 0;
00962   static UInt moves        = 0;
00963   static UInt turns        = 0;
00964   static UInt tackles      = 0;
00965 
00966   Int lastcycle_change_views = chg_view_count - change_views;
00967   Int lastcycle_says = say_count - says;
00968   Int lastcycle_turn_necks = turn_neck_count - turn_necks;
00969   Int lastcycle_attentionTos = parsedFocusState.focusCount - attentionTos;
00970   Int lastcycle_pointTos = parsedArmState.count - pointTos;
00971 
00972   Int lastcycle_catches = catch_count - catches;
00973   Int lastcycle_dashes = dash_count - dashes;
00974   Int lastcycle_kicks = kick_count - kicks;
00975   Int lastcycle_moves = move_count - moves;
00976   Int lastcycle_turns = turn_count - turns;
00977   Int lastcycle_tackles = parsedTackleState.tackleCount - tackles;
00978   
00979   change_views = chg_view_count;
00980   says = say_count;
00981   turn_necks = turn_neck_count;
00982   attentionTos = parsedFocusState.focusCount;
00983   pointTos = parsedArmState.count;
00984 
00985   catches = catch_count;
00986   dashes = dash_count;
00987   kicks = kick_count;
00988   moves = move_count;
00989   turns = turn_count;
00990   tackles = parsedTackleState.tackleCount;
00991 
00992   while (!commandQueue.empty()) {
00993     switch (commandQueue.front()) {
00994     case CMD_ChangeView:
00995       --lastcycle_change_views;
00996       break;
00997     case CMD_TurnNeck:
00998       --lastcycle_turn_necks;
00999       break;
01000     case CMD_Say:
01001       --lastcycle_says;
01002       break;
01003     case CMD_AttentionTo:
01004       --lastcycle_attentionTos;
01005       break;
01006     case CMD_PointTo:
01007       --lastcycle_pointTos;
01008       break;      
01009     case CMD_Catch:
01010       --lastcycle_catches;
01011       break;
01012     case CMD_Dash:
01013       --lastcycle_dashes;
01014       break;
01015     case CMD_Kick:
01016       --lastcycle_kicks;
01017       break;
01018     case CMD_Move:
01019       --lastcycle_moves;
01020       break;
01021     case CMD_Turn:
01022       --lastcycle_turns;
01023       break;
01024     case CMD_Tackle:
01025       --lastcycle_tackles;
01026       break;
01027     default:
01028       //CMD_Unknown, CMD_Bye, CMD_Init, CMD_SenseBody
01029       break;
01030     }
01031     commandQueue.pop();
01032   }
01033 
01034   if ( lastcycle_catches < 0 ) 
01035     RS_WARNING("The server missed the last catch command. " + toString(currentTime));
01036   if ( lastcycle_dashes < 0 ) 
01037     RS_WARNING("The server missed the last dash command. " + toString(currentTime));
01038   if ( lastcycle_kicks < 0 ) 
01039     RS_WARNING("The server missed the last kick command. " + toString(currentTime));
01040   if ( lastcycle_moves < 0 ) 
01041     RS_WARNING("The server missed the last move command. " + toString(currentTime));
01042   if ( lastcycle_turns < 0 ) 
01043     RS_WARNING("The server missed the last turn command. " + toString(currentTime));
01044   if ( lastcycle_tackles < 0 ) 
01045     RS_WARNING("The server missed the last tackle command. " + toString(currentTime));
01046 
01047   if ( lastcycle_change_views < 0 ) 
01048     RS_WARNING("The server missed the last change view command. " + toString(currentTime));
01049   if ( lastcycle_turn_necks < 0 ) 
01050     RS_WARNING("The server missed the last turn neck command. " + toString(currentTime));
01051   if ( lastcycle_says < 0 ) 
01052     RS_WARNING("The server missed the last say command. " + toString(currentTime));
01053   if ( lastcycle_attentionTos < 0 ) 
01054     RS_WARNING("The server missed the last attentionTo command. " + toString(currentTime));
01055   if ( lastcycle_pointTos < 0 ) 
01056     RS_WARNING("The server missed the last pointTo command. " + toString(currentTime));
01057 
01058   if ( lastcycle_catches < 0 || 
01059        lastcycle_dashes < 0 ||
01060        lastcycle_kicks < 0 ||
01061        lastcycle_moves < 0 ||
01062        lastcycle_turns < 0 ||
01063        lastcycle_tackles < 0 ||
01064        lastcycle_change_views < 0 ||
01065        lastcycle_turn_necks < 0 ||
01066        lastcycle_says < 0 ||
01067        lastcycle_attentionTos < 0 ||
01068        lastcycle_pointTos < 0)
01069     theController->delayedActions();
01070   
01071   if ( lastcycle_catches > 0 || 
01072        lastcycle_dashes > 0 ||
01073        lastcycle_kicks > 0 ||
01074        lastcycle_moves > 0 ||
01075        lastcycle_turns > 0 ||
01076        lastcycle_tackles > 0 ||
01077        lastcycle_change_views > 0 ||
01078        lastcycle_turn_necks > 0 ||
01079        lastcycle_says > 0 ||
01080        lastcycle_attentionTos > 0 ||
01081        lastcycle_pointTos > 0)
01082     theController->missingActions();
01083   
01084   updateTime(time);
01085   parsedAgent = ServerAgentObject 
01086     (parsedViewQuality, 
01087      parsedViewWidth,
01088      stamina,
01089      effort,
01090      FloatUE(ERROR_QUANTIZE, speed_mag, 0.01),
01091      AngleDegUE(ERROR_QUANTIZE, speed_head, facts->SP_angle_qstep),
01092      AngleDegUE(ERROR_QUANTIZE, head_angle, facts->SP_angle_qstep),
01093      catch_count, 
01094      chg_view_count, 
01095      dash_count,
01096      kick_count, 
01097      move_count, 
01098      say_count,
01099      turn_count, 
01100      turn_neck_count,
01101      parsedArmState,
01102      parsedFocusState,
01103      parsedTackleState);  
01104   theSensorInterface->sense(parsedAgent);
01105   parsedViewQuality = VQ_UNKNOWN;
01106   parsedViewWidth = VW_UNKNOWN;  
01107   parsedArmState = ServerArmState();
01108   parsedFocusState = ServerFocusState();
01109   parsedTackleState = ServerTackleState();
01110 }
01111 
01112 void Sensors::doBuildArmState(int moveable_in, int expires_in, 
01113             double target_x, double target_y,
01114             int count) {
01115   RS_LOG ( LA_SENSORS, "BuildArmState " << moveable_in << ", " 
01116        << expires_in << ", " << target_x << ", " << target_y 
01117        << ", " << count);
01118   parsedArmState = ServerArmState(moveable_in, expires_in,
01119           Point(target_x, target_y),
01120           count);
01121 }
01122 
01123 void Sensors::doBuildFocusState(int count) {
01124   RS_LOG ( LA_SENSORS, "BuildFocusState " << count);
01125   parsedFocusState = ServerFocusState(count);
01126 }
01127 
01128 void Sensors::doBuildFocusState(int unum, int count) {
01129   RS_LOG ( LA_SENSORS, "BuildFocusState " << unum << ", " << count);
01130   parsedFocusState = ServerFocusState(count, parsedSide, unum);
01131   parsedSide = S_UNKNOWN;
01132 }
01133 
01134 void Sensors::doBuildTackleState(int expires_in, int count) {
01135   RS_LOG ( LA_SENSORS, "BuildTackleState " << expires_in << ", " << count);
01136   parsedTackleState = ServerTackleState(expires_in, count);
01137 }
01138 
01139 /*
01140  * View Mode parsing.
01141  */
01142 
01143 void Sensors::doBuildViewMode() {
01144   RS_LOG ( LA_SENSORS, "BuildViewMode" );
01145 }
01146 
01147 void Sensors::doBuildViewQualityHigh() {
01148   RS_LOG ( LA_SENSORS, "BuildViewQualityHigh" );
01149   parsedViewQuality = VQ_HIGH;
01150 }
01151 
01152 void Sensors::doBuildViewQualityLow() {
01153   RS_LOG ( LA_SENSORS, "BuildViewQualityLow" );
01154   parsedViewQuality = VQ_LOW;
01155 }
01156 
01157 void Sensors::doBuildViewWidthNarrow() {
01158   RS_LOG ( LA_SENSORS, "BuildViewWidthNarrow" );
01159   parsedViewWidth = VW_NARROW;
01160 }
01161 
01162 void Sensors::doBuildViewWidthNormal() {
01163   RS_LOG ( LA_SENSORS, "BuildViewWidthNormal" );
01164   parsedViewWidth = VW_NORMAL;
01165 }
01166 
01167 void Sensors::doBuildViewWidthWide() {
01168   RS_LOG ( LA_SENSORS, "BuildViewWidthWide" );
01169   parsedViewWidth = VW_WIDE;
01170 }
01171 
01172 /*
01173  * Parameter parsing.
01174  */
01175 
01176 void Sensors::doBuildParam(const std::string &name, int value) {
01177   RS_LOG ( LA_SENSORS, "BuildParam " << name << ", " << value);
01178   facts->setOption(name, value);
01179 }
01180 
01181 void Sensors::doBuildParam(const std::string &name, double value) {
01182   RS_LOG ( LA_SENSORS, "BuildParam " << name << ", " << value);
01183   facts->setOption(name, value);
01184 }
01185 
01186 void Sensors::doBuildParam(const std::string &name, const std::string &value) {
01187   RS_LOG ( LA_SENSORS, "BuildParam " << name << ", " << value);
01188   facts->setOption(name, value);
01189 }
01190 
01191 void Sensors::doBuildServerParam() {
01192   RS_LOG ( LA_SENSORS, "BuildServerParam");
01193   facts->serverParamsInitialized();
01194   lastSensorType = SENSOR_PARAM;
01195 }
01196  
01197 void Sensors::doBuildPlayerParam() {
01198   RS_LOG ( LA_SENSORS, "BuildPlayerParam");
01199   facts->playerParamsInitialized();
01200   lastSensorType = SENSOR_PARAM;
01201 }
01202 
01203 void Sensors::doBuildPlayerType() {
01204   RS_LOG ( LA_SENSORS, "BuildPlayerType");
01205   facts->playerTypeComplete();
01206   lastSensorType = SENSOR_PARAM;
01207 }
01208 
01209 /*
01210  * Player visual parsning.
01211  */
01212 
01213 void Sensors::doBuildVisual( int time ) {
01214   RS_LOG ( LA_SENSORS, "BuildVisual: " << time);  
01215   lastSensorType = SENSOR_VISUAL;
01216   updateTime(time);
01217   theSensorInterface->see(parsedLines,
01218         parsedMarkers,
01219         parsedPlayers,
01220         parsedBall);
01221   parsedLines.clear();
01222   parsedMarkers.clear();
01223   parsedPlayers.clear();
01224   parsedBall = ServerBallObject();
01225   parsedAgent = ServerAgentObject();
01226 }
01227 
01228 void Sensors::doBuildLine( double dist, double dir ) {
01229   RS_LOG ( LA_SENSORS, "BuildLine: " << dist << ", " << dir);  
01230   parsedLines.push_back 
01231     (ServerLineObject (locationToLine(),
01232            AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep),
01233            FloatUE(ERROR_QUANTIZE, dist, facts->SP_land_qstep)));
01234   parsedLocations.clear();
01235 }
01236 
01237 void Sensors::doBuildLine( double dir ) {
01238   RS_LOG ( LA_SENSORS, "BuildLine: " << dir);
01239   parsedLines.push_back 
01240     (ServerLineObject (locationToLine(),
01241            AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep)));
01242   parsedLocations.clear();    
01243 }
01244 
01245 // TODO! Handle "close" in a sane way.
01246 
01247 void Sensors::doBuildFlag( double dist, double dir,
01248          double dist_chg, double dir_chg ) {
01249   RS_LOG ( LA_SENSORS, "BuildFlag: " << dist
01250        << ", " << dir << ", " << dist_chg  << ", " << dir_chg);
01251   parsedMarkers.push_back
01252     (ServerMarkerObject
01253      (locationToMarker(),
01254       false, 
01255       AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep),
01256       FloatUE(ERROR_QUANTIZE, dist, facts->SP_land_qstep),
01257       FloatUE(ERROR_DISTCHANGE, dist_chg, facts->SP_dist_qstep,
01258         dist, facts->CP_dist_change_qstep),
01259       AngleDegUE(ERROR_QUANTIZE, dir_chg, facts->CP_dir_change_qstep)));
01260   parsedLocations.clear();
01261   parsedFlagOffset = UIntUnknown();
01262 }
01263 
01264 void Sensors::doBuildFlag( bool close, double dist, double dir ) {
01265     RS_LOG ( LA_SENSORS, "BuildFlag: " << close << ", " << dist
01266        << ", " << dir);
01267   if (!close) {
01268     parsedMarkers.push_back
01269       (ServerMarkerObject
01270        (locationToMarker(),
01271   close,
01272   AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep),
01273   FloatUE(ERROR_QUANTIZE, dist, facts->SP_land_qstep)));
01274     parsedLocations.clear();
01275     parsedFlagOffset = UIntUnknown();
01276   }
01277 }
01278  
01279 void Sensors::doBuildFlag( bool close, double dir ) {
01280   RS_LOG ( LA_SENSORS, "BuildFlag: " << close  << ", " << dir);
01281   if (!close) {
01282     parsedMarkers.push_back
01283       (ServerMarkerObject
01284        (locationToMarker(), 
01285   close,
01286   AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep)));
01287     parsedLocations.clear();
01288     parsedFlagOffset = UIntUnknown();
01289   }
01290 }
01291 
01292 void Sensors::doBuildGoal( double dist, double dir,
01293          double dist_chg, double dir_chg ) {
01294   RS_LOG ( LA_SENSORS, "BuildGoal:" << dist
01295        << ", " << dir  << ", " << dist_chg  << ", " << dir_chg);
01296   doBuildFlag( dist, dir, dist_chg, dir_chg);
01297 }
01298 
01299 void Sensors::doBuildGoal( bool close, double dist, double dir ) {
01300   RS_LOG ( LA_SENSORS, "BuildGoal: " << close  << ", " << dist
01301        << ", " << dir);
01302   if (!close)
01303     doBuildFlag( close, dist, dir);
01304 }
01305 
01306 void Sensors::doBuildGoal( bool close, double dir ) {
01307   RS_LOG ( LA_SENSORS, "BuildGoal: " << close  << ", " << dir );
01308   if (!close)
01309     doBuildFlag( close, dir);
01310 }
01311 
01312 void Sensors::doBuildPlayerVisBall( double dist, double dir,
01313             double dist_chg, double dir_chg ) {
01314   RS_LOG ( LA_SENSORS, "BuildBall: " << dist
01315        << ", " << dir << ", " << dist_chg << ", " << dir_chg);
01316   parsedBall = 
01317     ServerBallObject
01318     (false,
01319      AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep),
01320      FloatUE(ERROR_QUANTIZE, dist, facts->SP_dist_qstep),
01321      FloatUE(ERROR_DISTCHANGE, dist_chg, facts->SP_dist_qstep,
01322        dist, facts->CP_dist_change_qstep),
01323      AngleDegUE(ERROR_QUANTIZE, dir_chg, facts->CP_dir_change_qstep));
01324 }
01325 
01326 void Sensors::doBuildBall( bool close, double dist, double dir ) {
01327   RS_LOG ( LA_SENSORS, "BuildBall: " << close  << ", " << dist
01328        << ", " << dir);
01329   parsedBall =
01330     ServerBallObject(close,
01331          AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep),
01332          FloatUE(ERROR_QUANTIZE, dist, facts->SP_dist_qstep));    
01333 }
01334 
01335 void Sensors::doBuildBall( bool close, double dir ) {
01336   RS_LOG ( LA_SENSORS, "BuildBall:"  << ", " << close << ", " << dir);
01337   parsedBall =
01338     ServerBallObject(close,
01339          AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep));
01340 }
01341 
01342 // Pointing players
01343 
01344 // 1.
01345 void Sensors::doBuildPlayer( double dist, double dir,
01346            double dist_chg, double dir_chg,
01347            double orientation, double head_orientation,
01348            double point_dir, bool tackling) {
01349   RS_LOG ( LA_SENSORS, "BuildPlayer: " << dist
01350        << ", " << dir << ", " << dist_chg << ", " << dir_chg
01351        << ", " << orientation << ", " << head_orientation
01352        << ", " << point_dir << ", " << tackling);
01353   parsedPlayers.push_back
01354     (ServerPlayerObject
01355      (false,
01356       AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep),
01357       parsedGoalie,
01358       parsedTeam,
01359       parsedUniformNumber,
01360       FloatUE(ERROR_QUANTIZE, dist, facts->SP_dist_qstep),
01361       FloatUE(ERROR_DISTCHANGE, dist_chg, facts->SP_dist_qstep,
01362         dist, facts->CP_dist_change_qstep),
01363       AngleDegUE(ERROR_QUANTIZE, dir_chg, facts->CP_dir_change_qstep),
01364       AngleDegUE(ERROR_QUANTIZE, orientation, facts->SP_angle_qstep),
01365       AngleDegUE(ERROR_QUANTIZE, head_orientation, facts->SP_angle_qstep),
01366       tackling,
01367       AngleDegUE(point_dir))); // Fix new (normal)error here.
01368   parsedTeam = T_UNKNOWN;
01369   parsedUniformNumber = UIntUnknown();
01370   parsedGoalie = false;  
01371 }
01372 
01373 // If we see a point direction, then the players isn't close.
01374 // 3.
01375 void Sensors::doBuildPlayer( double dist, double dir,
01376            double point_dir, bool tackling) {
01377   RS_LOG ( LA_SENSORS, "BuildPlayer: " << ", " << dist
01378        << ", " << dir << ", " << point_dir << ", " << tackling);
01379   parsedPlayers.push_back
01380     (ServerPlayerObject
01381      (false,
01382       AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep),
01383       parsedGoalie,
01384       parsedTeam,
01385       parsedUniformNumber,
01386       FloatUE(ERROR_QUANTIZE, dist, facts->SP_dist_qstep),
01387       FloatUE(),
01388       AngleDegUE(),
01389       AngleDegUE(),
01390       AngleDegUE(),
01391       tackling,
01392       AngleDegUE(point_dir))); // Fix new (normal) error here.
01393   parsedTeam = T_UNKNOWN;
01394   parsedUniformNumber = UIntUnknown();
01395   parsedGoalie = false;
01396 }
01397 
01398 
01399 // Not pointing players
01400 
01401 // 2.
01402 void Sensors::doBuildPlayer( double dist, double dir,
01403            double dist_chg, double dir_chg,
01404            double orientation, double head_orientation,
01405            bool tackling) {
01406   RS_LOG ( LA_SENSORS, "BuildPlayer: " << dist
01407        << ", " << dir << ", " << dist_chg << ", " << dir_chg
01408        << ", " << orientation << ", " << head_orientation
01409        << ", " << tackling);
01410   parsedPlayers.push_back
01411     (ServerPlayerObject
01412      (false,
01413       AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep),
01414       parsedGoalie,
01415       parsedTeam,
01416       parsedUniformNumber,
01417       FloatUE(ERROR_QUANTIZE, dist, facts->SP_dist_qstep),
01418       FloatUE(ERROR_DISTCHANGE, dist_chg, facts->SP_dist_qstep,
01419         dist, facts->CP_dist_change_qstep),
01420       AngleDegUE(ERROR_QUANTIZE, dir_chg, facts->CP_dir_change_qstep),
01421       AngleDegUE(ERROR_QUANTIZE, orientation, facts->SP_angle_qstep),
01422       AngleDegUE(ERROR_QUANTIZE, head_orientation, facts->SP_angle_qstep),
01423       tackling));
01424   parsedTeam = T_UNKNOWN;
01425   parsedUniformNumber = UIntUnknown();
01426   parsedGoalie = false;  
01427 }
01428 
01429 // 4.
01430 void Sensors::doBuildPlayer( bool close,
01431            double dist, double dir,
01432            bool tackling) {
01433   RS_LOG ( LA_SENSORS, "BuildPlayer: " << close << ", " << dist
01434        << ", " << dir << ", " << tackling);
01435   parsedPlayers.push_back
01436     (ServerPlayerObject
01437      (close,
01438       AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep),
01439       parsedGoalie,
01440       parsedTeam,
01441       parsedUniformNumber,
01442       FloatUE(ERROR_QUANTIZE, dist, facts->SP_dist_qstep),
01443       FloatUE(),
01444       AngleDegUE(),
01445       AngleDegUE(),
01446       AngleDegUE(),
01447       tackling));
01448   
01449   parsedTeam = T_UNKNOWN;
01450   parsedUniformNumber = UIntUnknown();
01451   parsedGoalie = false;
01452 }
01453 
01454 // 5. 
01455 void Sensors::doBuildPlayer( bool close, double dir ) {
01456   RS_LOG ( LA_SENSORS, "BuildPlayer:" << close  << ", " << dir);
01457   parsedPlayers.push_back
01458     (ServerPlayerObject
01459      (close,
01460       AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep),
01461       parsedGoalie,
01462       parsedTeam,
01463       parsedUniformNumber));
01464   parsedTeam = T_UNKNOWN;
01465   parsedUniformNumber = UIntUnknown();
01466   parsedGoalie = false;
01467 }
01468 
01469 
01470 /*
01471  * Coach visual parsning.
01472  */
01473 
01474 void Sensors::doBuildGlobalVisual(int time) {
01475   RS_LOG ( LA_SENSORS, "BuildGlobalVisual: " << time);
01476   lastSensorType = SENSOR_COACH_VISUAL;
01477   updateTime(time);
01478   theSensorInterface->seeGlobal(parsedCoachPlayers,
01479         parsedCoachBall);
01480   parsedCoachPlayers.clear();
01481   parsedCoachBall = CoachBallObject();  
01482 }
01483 
01484 void Sensors::doBuildGlobalGoal(double x, double y) {
01485   RS_LOG ( LA_SENSORS, "BuildGlobalGoal: " << x << ", " << y);
01486 }
01487 
01488 void Sensors::doBuildGlobalBall(double x, double y, double dx, double dy) {
01489   RS_LOG ( LA_SENSORS, "BuildGlobalBall: " << x << ", " << y 
01490        << ", " << dx << ", " << dy);
01491   parsedCoachBall = CoachBallObject(x, y, dx, dy);
01492 }
01493 
01494 void Sensors::doBuildGlobalPlayer(double x, double y, double dx, double dy, 
01495           double bodydir, double neckdir, bool tackle) {
01496     RS_LOG ( LA_SENSORS, "BuildGlobalPlayer: " << x << ", " << y 
01497        << ", " << dx << ", " << dy << ", " << bodydir << ", " 
01498        << neckdir << ", " << tackle);
01499   parsedCoachPlayers.push_back
01500     (CoachPlayerObject
01501      (x, y, dx, dy, 
01502       parsedTeam,
01503       parsedUniformNumber.getValue(),
01504       parsedGoalie,
01505       bodydir, 
01506       neckdir,
01507       AngleDegUnknown(),
01508       tackle));
01509   parsedTeam = T_UNKNOWN;
01510   parsedUniformNumber = UIntUnknown();
01511   parsedGoalie = false;
01512 }
01513 
01514 void Sensors::doBuildGlobalPlayer(double x, double y, double dx, double dy, 
01515           double bodydir, double neckdir, 
01516           double point_dir, bool tackle) {
01517   RS_LOG ( LA_SENSORS, "BuildGlobalPlayer: " << x << ", " << y 
01518        << ", " << dx << ", " << dy << ", " << bodydir << ", " 
01519        << neckdir << ", " << point_dir << ", " << tackle);
01520   parsedCoachPlayers.push_back
01521     (CoachPlayerObject
01522      (x, y, dx, dy, 
01523       parsedTeam,
01524       parsedUniformNumber.getValue(),
01525       parsedGoalie,
01526       bodydir, 
01527       neckdir,
01528       point_dir,
01529       tackle));
01530   parsedTeam = T_UNKNOWN;
01531   parsedUniformNumber = UIntUnknown();
01532   parsedGoalie = false;
01533 }
01534 
01535 /*
01536  * Field Location parsning.
01537  */
01538 
01539 void Sensors::doBuildFlagOffset( int offset ) {
01540   RS_LOG ( LA_SENSORS, "BuildFlagOffset" );
01541   parsedFlagOffset = offset;
01542 } 
01543 
01544 void Sensors::doBuildTopLocation() {
01545   RS_LOG ( LA_SENSORS, "BuildTopLocation" );
01546   parsedLocations.push_back(FL_TOP);
01547 }
01548   
01549 void Sensors::doBuildBottomLocation() {
01550   RS_LOG ( LA_SENSORS, "BuildBottomLocation" );
01551   parsedLocations.push_back(FL_BOTTOM);
01552 }
01553  
01554 void Sensors::doBuildLeftLocation() {
01555   RS_LOG ( LA_SENSORS, "BuildLeftLocation" );
01556   parsedLocations.push_back(FL_LEFT);
01557 }
01558  
01559 void Sensors::doBuildRightLocation() {
01560   RS_LOG ( LA_SENSORS, "BuildRightLocation" );
01561   parsedLocations.push_back(FL_RIGHT);
01562 }
01563  
01564 void Sensors::doBuildCenterLocation() {
01565   RS_LOG ( LA_SENSORS, "BuildCenterLocation" );
01566   parsedLocations.push_back(FL_CENTER);
01567 }
01568  
01569 void Sensors::doBuildPenaltyLocation() {
01570   RS_LOG ( LA_SENSORS, "BuildPenaltyLocation" );
01571   parsedLocations.push_back(FL_PENALTY);
01572 }
01573  
01574 void Sensors::doBuildGoalLocation() {
01575   RS_LOG ( LA_SENSORS, "BuildGoalLocation" );
01576   parsedLocations.push_back(FL_GOAL);
01577 }
01578 
01579 /*
01580  * Initialisation parsning.
01581  */
01582  
01583 void Sensors::doBuildInit( int unum ) {
01584   RS_LOG ( LA_SENSORS, "BuildInit: " << unum);
01585   theSensorInterface->hearReferee(parsedPlayMode);
01586   std::string agentSide;
01587   if (parsedSide == S_LEFT) {
01588     facts->setSides(S_LEFT, S_RIGHT);
01589     agentSide = "left";
01590   }
01591   else {
01592     facts->setSides(S_RIGHT, S_LEFT);
01593     agentSide = "right";
01594   }
01595   facts->setUniformNumber(unum);
01596   std::cerr << "-----------------------------------------------------------"
01597       << "-------------" << std::endl
01598       << "Connected player " << unum << " on team '"
01599       << facts->CP_team_name << "'" << std::endl
01600       << "It's playing on the " << agentSide << " side of the field."
01601       << std::endl << "----------------------------------------------"
01602       << "--------------------------" << std::endl;
01603 
01604   parsedSide = S_UNKNOWN;
01605   parsedPlayMode = PM_UNKNOWN;  
01606   lastSensorType = SENSOR_INIT;
01607 }
01608 
01609 void Sensors::doBuildInit() {
01610   RS_LOG ( LA_SENSORS, "BuildInit" );
01611   RS_WARNING("This doBuildInit isn't implemented!");
01612   lastSensorType = SENSOR_UNKNOWN;
01613 }
01614 
01615 void Sensors::doBuildCoachInit() {
01616   RS_LOG ( LA_SENSORS, "BuildCoachInit");
01617   if ( parsedSide == S_UNKNOWN ) {
01618     // We use left as the default side, it shouldn't really matter
01619     facts->setSides(S_LEFT, S_RIGHT);
01620     
01621     std::cerr << "-----------------------------------------------------------"
01622         << "-------------\n"
01623         << "Connected trainer.\n"
01624         << "----------------------------------------------"
01625         << "--------------------------" << std::endl;
01626   } else {
01627     std::string coachSide;
01628     if (parsedSide == S_LEFT) {    
01629       facts->setSides(S_LEFT, S_RIGHT);
01630       coachSide = "left";
01631     } else {
01632       facts->setSides(S_RIGHT, S_LEFT);
01633       coachSide = "right";
01634     }
01635     std::cerr << "-----------------------------------------------------------"
01636         << "-------------\n"
01637         << "Connected coach on team '" << facts->CP_team_name
01638         << "'\n It's coaching the team on the " << coachSide
01639         << " side of the field.\n"
01640         << "----------------------------------------------"
01641         << "--------------------------" << std::endl;
01642   }
01643   parsedSide = S_UNKNOWN;
01644   parsedPlayMode = PM_UNKNOWN;  
01645   lastSensorType = SENSOR_INIT;
01646 }
01647 
01648 /*
01649  * Audio parsning.
01650  */
01651 
01652 void Sensors::doBuildCoachAudio( int time, const std::string& msg ) {
01653   RS_LOG ( LA_SENSORS, "BuildCoachAudio: " << time << ", " << msg);
01654   lastSensorType = SENSOR_AURAL_COACH;
01655   updateTime(time);
01656   theSensorInterface->hearCoach(msg);    
01657   parsedSide = S_UNKNOWN;
01658 }
01659 
01660 void Sensors::doBuildRefAudio( int time ) {
01661   RS_LOG ( LA_SENSORS, "BuildRefAudio: " << time );
01662   lastSensorType = SENSOR_AURAL_REFEREE;
01663   updateTime(time);
01664   theSensorInterface->hearReferee(parsedPlayMode);  
01665   parsedPlayMode = PM_UNKNOWN;
01666 }
01667 
01668 
01669 void Sensors::doBuildGoalRefAudio( int time, int score ) {
01670   RS_LOG ( LA_SENSORS, "BuildGoalRefAudio: " << time << ", " << score);
01671   lastSensorType = SENSOR_AURAL_REFEREE;
01672   updateTime(time);
01673   facts->setScore(parsedSide, score);
01674   if (parsedSide == facts->getOurSide())
01675     theSensorInterface->hearReferee(PM_OUR_GOAL);
01676   else
01677     theSensorInterface->hearReferee(PM_THEIR_GOAL);
01678   parsedSide = S_UNKNOWN;
01679 }
01680 
01681 void Sensors::doBuildUnknownRefAudio( int time, const std::string& message ) {
01682   RS_LOG ( LA_SENSORS, "BuildUnknownRefAudio: " << time << ", " << message);
01683   //RS_WARNING ("BuildUnknownRefAudio");
01684   //This is a normal message sent by the offline coach!
01685   lastSensorType = SENSOR_AURAL_REFEREE;
01686   updateTime(time);
01687   parsedSide = S_UNKNOWN;
01688 }
01689 
01690 // The client is online coach, hearing a player.
01691 void Sensors::doBuildPlayerAudio( int time, const std::string& msg ) {
01692   RS_LOG ( LA_SENSORS, "BuildPlayerAudio: " << time << ", " << msg);
01693   lastSensorType = SENSOR_COACH_AURAL;
01694   updateTime(time);
01695   theSensorInterface->hearPlayerAsCoach(parsedTeam, parsedUniformNumber, msg);
01696   parsedSide = S_UNKNOWN;
01697 }
01698 
01699 // The client is a field player, hearing an opponent player.
01700 void Sensors::doBuildPlayerAudio( int time, double dir, 
01701           const std::string& msg ) {
01702   RS_LOG ( LA_SENSORS, "BuildPlayerAudio: " << time << ", " 
01703        << dir << ", " << msg);
01704   lastSensorType = SENSOR_AURAL_PLAYER;
01705   updateTime(time);
01706   theSensorInterface->hearOpponent
01707     (AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep), msg);
01708   parsedSide = S_UNKNOWN;
01709 }
01710 
01711 // The client is a field player, hearing a teammate.
01712 void Sensors::doBuildPlayerAudio( int time, double dir, 
01713           int unum, const std::string& msg ) {
01714   RS_LOG ( LA_SENSORS, "BuildPlayerAudio: " << time << ", " 
01715        << dir << ", " << unum << ", " << msg);
01716   lastSensorType = SENSOR_AURAL_PLAYER;
01717   updateTime(time);
01718   theSensorInterface->hearTeammate
01719     (unum, AngleDegUE(ERROR_QUANTIZE, dir, facts->SP_angle_qstep), msg);
01720   parsedSide = S_UNKNOWN;
01721 }
01722 
01723 // The client is a field player, hearing another teammate.
01724 void Sensors::doBuildPlayerAudio( int time, int unum ) {
01725   RS_LOG ( LA_SENSORS, "BuildPlayerAudio: " << time << ", " << unum);
01726   lastSensorType = SENSOR_AURAL_PLAYER;
01727   updateTime(time);
01728   theSensorInterface->hearAnotherTeammate(unum);
01729   parsedSide = S_UNKNOWN;
01730 }
01731 
01732 // The client is a field player, hearing another opponent.
01733 void Sensors::doBuildPlayerAudio( int time ) {
01734   RS_LOG ( LA_SENSORS, "BuildPlayerAudio: " << time);
01735   lastSensorType = SENSOR_AURAL_PLAYER;
01736   updateTime(time);
01737   theSensorInterface->hearAnotherOpponent();
01738   parsedSide = S_UNKNOWN;
01739 }
01740 
01741 void Sensors::doBuildSelfAudio( int time, const std::string& msg ) {
01742   RS_LOG ( LA_SENSORS, "BuildSelfAudio: " << time << ", " << msg);
01743   lastSensorType = SENSOR_AURAL_SELF;
01744   updateTime(time);
01745   theSensorInterface->hearSelf(msg);  
01746   parsedSide = S_UNKNOWN;
01747 }
01748 
01749 /*
01750  * Substitution parsning.
01751  */
01752 
01753 void Sensors::doBuildSubstitution( int unum, int type ) {
01754   RS_LOG ( LA_SENSORS, "BuildSubstitution: " << unum << ", " << type);
01755   facts->setTeammateType(unum, type);
01756   lastSensorType = SENSOR_SUBSTITUTION;
01757 }
01758 
01759 void Sensors::doBuildSubstitution( int unum ) {
01760   RS_LOG ( LA_SENSORS, "BuildSubstitution: " << unum);
01761   lastSensorType = SENSOR_SUBSTITUTION;
01762 }
01763 
01764 /*
01765  * Clang version parsning.
01766  * This need to be handled if field players and online coach dosn't
01767  * handle the same versions of the coach languge. Not high priority.
01768  */
01769 
01770 void Sensors::doBuildClangPlayerVersionMsg() {
01771   RS_LOG ( LA_SENSORS, "BuildClangPlayerVersionMsg");
01772   // Todo!
01773   lastSensorType = SENSOR_OK;
01774 }
01775 
01776 void Sensors::doBuildClangPlayerVersion(int min, int max) {
01777   RS_LOG ( LA_SENSORS, "BuildClangPlayerVersionMsg: " << min << ", " << max);
01778   // Todo!
01779   lastSensorType = SENSOR_OK;
01780 }
01781 
01782 /*
01783  * Error parsning.
01784  */
01785 
01786 void Sensors::doBuildCantReconnect() {
01787   RS_LOG ( LA_SENSORS, "BuildCantReconnect" );
01788   RS_WARNING ( "BuildCantReconnect" );
01789   lastSensorType = SENSOR_ERROR;
01790 }
01791 
01792 void Sensors::doBuildInitError() {
01793   RS_LOG ( LA_SENSORS, "BuildInitError" );
01794   RS_WARNING(  "BuildInitError" );
01795   lastSensorType = SENSOR_ERROR;
01796 }
01797 
01798 void Sensors::doBuildNoMoreTeamOrPlayerOrGoalieError() {
01799   RS_LOG ( LA_SENSORS, "BuildNoMoreTeamOrPlayerOrGoalieError" );
01800   RS_WARNING ( "BuildNoMoreTeamOrPlayerOrGoalieError" );
01801   lastSensorType = SENSOR_ERROR;
01802 }
01803 
01804 void Sensors::doBuildNoSuchTeamOrAlreadyHaveCoachError() {
01805   RS_LOG ( LA_SENSORS, "BuildNoSuchTeamOrAlreadyHaveCoachError" );
01806   RS_WARNING ( "BuildNoSuchTeamOrAlreadyHaveCoachError" );
01807   lastSensorType = SENSOR_ERROR;
01808 }
01809 
01810 void Sensors::doBuildTooManyMovesError() {
01811   RS_LOG ( LA_SENSORS, "BuildTooManyMovesError" );
01812   RS_WARNING ( "BuildTooManyMovesError" );
01813   lastSensorType = SENSOR_ERROR;
01814 }
01815 
01816 void Sensors::doBuildUnknownCommandError() {
01817   RS_LOG ( LA_SENSORS, "BuildUnknownCommandError" );
01818   RS_WARNING ( "BuildUnknownCommandError" );
01819   lastSensorType = SENSOR_ERROR;
01820 }
01821 
01822 void Sensors::doBuildIllegalCommandError() {
01823   RS_LOG ( LA_SENSORS, "BuildIllegalCommandError" );
01824   RS_WARNING ( "BuildIllegalCommandError" );
01825   lastSensorType = SENSOR_ERROR;
01826 }
01827 
01828 void Sensors::doBuildSayMessageTooLongError() {
01829   RS_LOG ( LA_SENSORS, "BuildSayMessageTooLongError" );
01830   RS_WARNING ( "BuildSayMessageTooLongError" );
01831   lastSensorType = SENSOR_ERROR;
01832 }
01833 
01834 void Sensors::doBuildIllegalModeError() {
01835   RS_LOG ( LA_SENSORS, "BuildIllegalModeError" );
01836   RS_WARNING ( "BuildIllegalModeError" );
01837   lastSensorType = SENSOR_ERROR;
01838 }
01839 
01840 void Sensors::doBuildIllegalObjectFormError() {
01841   RS_LOG ( LA_SENSORS, "BuildIllegalObjectFormError" );
01842   RS_WARNING ( "BuildIllegalObjectFormError" );
01843   lastSensorType = SENSOR_ERROR;
01844 }
01845 
01846 void Sensors::doBuildSaidTooManyFreeformMessagesError() {
01847   RS_LOG ( LA_SENSORS, "BuildSaidTooManyFreeformMessagesError" );
01848   RS_WARNING ( "BuildSaidTooManyFreeformMessagesError" );
01849   lastSensorType = SENSOR_ERROR;
01850 }
01851 
01852 void Sensors::doBuildCannotSayFreeformWhilePlayonError() {
01853   RS_LOG ( LA_SENSORS, "BuildCannotSayFreeformWhilePlayonError" );
01854   RS_WARNING ( "BuildCannotSayFreeformWhilePlayonError" );
01855   lastSensorType = SENSOR_ERROR;
01856 }
01857 
01858 void Sensors::doBuildSaidTooManyMetaMessagesError() {
01859   RS_LOG ( LA_SENSORS, "BuildSaidTooManyMetaMessagesError" );
01860   RS_WARNING ( "BuildSaidTooManyMetaMessagesError" );
01861   lastSensorType = SENSOR_ERROR;
01862 }
01863 
01864 void Sensors::doBuildSaidTooManyAdviceMessagesError() {
01865   RS_LOG ( LA_SENSORS, "BuildSaidTooManyAdviceMessagesError" );
01866   RS_WARNING ( "BuildSaidTooManyAdviceMessagesError" );
01867   lastSensorType = SENSOR_ERROR;
01868 }
01869 
01870 void Sensors::doBuildSaidTooManyInfoMessagesError() {
01871   RS_LOG ( LA_SENSORS, "BuildSaidTooManyInfoMessagesError" );
01872   RS_WARNING ( "BuildSaidTooManyInfoMessagesError" );
01873   lastSensorType = SENSOR_ERROR;
01874 }
01875 
01876 void Sensors::doBuildSaidTooManyDefineMessagesError() {
01877   RS_LOG ( LA_SENSORS, "BuildSaidTooManyDefineMessagesError" );
01878   RS_WARNING ( "BuildSaidTooManyDefineMessagesError" );
01879   lastSensorType = SENSOR_ERROR;
01880 }
01881 
01882 void Sensors::doBuildCouldNotParseSayError() {
01883   RS_LOG ( LA_SENSORS, "BuildCouldNotParseSayError" );
01884   RS_WARNING ( "BuildCouldNotParseSayError" );
01885   lastSensorType = SENSOR_ERROR;
01886 }
01887 
01888 void Sensors::doBuildSaidTooManyMessagesError() {
01889   RS_LOG ( LA_SENSORS, "BuildSaidTooManyMessagesError" );
01890   RS_WARNING ( "BuildSaidTooManyMessagesError" );
01891   lastSensorType = SENSOR_ERROR;
01892 }
01893 
01894 void Sensors::doBuildUnknownError( const std::string& error ) {
01895   RS_LOG ( LA_SENSORS, "BuildUnknownError: " << error);
01896   RS_WARNING ( "BuildUnknownError: " << error);
01897   lastSensorType = SENSOR_ERROR;
01898 }
01899 
01900 /*
01901  * Warning parsning.
01902  */
01903 
01904 void Sensors::doBuildNoTeamFoundWarning() {
01905   RS_LOG ( LA_SENSORS, "BuildNoTeamFoundWarning" );
01906   RS_WARNING ( "BuildNoTeamFoundWarning" );
01907   lastSensorType = SENSOR_WARNING;
01908 }
01909 
01910 void Sensors::doBuildNoSuchPlayerWarning() {
01911   RS_LOG ( LA_SENSORS, "BuildNoSuchPlayerWarning" );
01912   RS_WARNING ( "BuildNoSuchPlayerWarning" );
01913   lastSensorType = SENSOR_WARNING;
01914 }
01915 
01916 void Sensors::doBuildCannotSubWhilePlayOnWarning() {
01917   RS_LOG ( LA_SENSORS, "BuildCannotSubWhilePlayOnWarning" );
01918   RS_WARNING ( "BuildCannotSubWhilePlayOnWarning" );
01919   lastSensorType = SENSOR_WARNING;
01920 }
01921 
01922 void Sensors::doBuildNoSubsLeftWarning() {
01923   RS_LOG ( LA_SENSORS, "BuildNoSubsLeftWarning" );
01924   RS_WARNING ( "BuildNoSubsLeftWarning" );
01925   lastSensorType = SENSOR_WARNING;
01926 }
01927 
01928 void Sensors::doBuildMaxOfThatPlayerTypeOnFieldWarning() {
01929   RS_LOG ( LA_SENSORS, "BuildMaxOfThatPlayerTypeOnFieldWarning" );
01930   RS_WARNING ( "BuildMaxOfThatPlayerTypeOnFieldWarning" );
01931   lastSensorType = SENSOR_WARNING;
01932 }
01933 
01934 void Sensors::doBuildCannotChangeGoalieWarning() {
01935   RS_LOG ( LA_SENSORS, "BuildCannotChangeGoalieWarning" );
01936   RS_WARNING ( "BuildCannotChangeGoalieWarning" );
01937   lastSensorType = SENSOR_WARNING;
01938 }
01939 
01940 void Sensors::doBuildCompressionWarning() {
01941   RS_LOG ( LA_SENSORS, "BuildCompressionWarning" );
01942   RS_WARNING ( "BuildCompressionWarning" );
01943   lastSensorType = SENSOR_WARNING;
01944 }
01945 
01946 void Sensors::doBuildUnknownWarning(const std::string& warning) {
01947   RS_LOG ( LA_SENSORS, "BuildUnknownWarning: " << warning);
01948   RS_WARNING ( "BuildUnknownWarning: " << warning);
01949   lastSensorType = SENSOR_WARNING;
01950 }
01951 
01952 /*
01953  * OK parsning.
01954  */
01955 
01956 void Sensors::doBuildClangVerOK( int min, int max ) {
01957   RS_LOG ( LA_SENSORS, "BuildClangVerOK: " << min << ", " << max );
01958   lastSensorType = SENSOR_OK;
01959 }
01960 
01961 void Sensors::doBuildEyeOK(bool on) {
01962   RS_LOG (LA_SENSORS, "BuildEyeOK: " << on);
01963   lastSensorType = SENSOR_OK;
01964 }
01965 
01966 void Sensors::doBuildEarOK(bool on) {
01967   RS_LOG (LA_SENSORS, "BuildEarOK: " << on);
01968   lastSensorType = SENSOR_OK;
01969 }
01970 
01971 void Sensors::doBuildMoveOK() {
01972   RS_LOG (LA_SENSORS, "BuildMoveOK");
01973   lastSensorType = SENSOR_OK;
01974 }
01975 
01976 void Sensors::doBuildSayOK() {
01977   RS_LOG (LA_SENSORS, "BuildSayOK");
01978   lastSensorType = SENSOR_OK;
01979 }
01980 
01981 void Sensors::doBuildTeamNamesOK() {
01982   RS_LOG (LA_SENSORS, "BuildTeamNamesOK");
01983   parsedSide = S_UNKNOWN;
01984   lastSensorType = SENSOR_OK;
01985 }
01986 
01987 void Sensors::doBuildChangePlayerTypeOK(int unum, int type) {
01988   RS_LOG ( LA_SENSORS, "BuildChangePlayerTypeOK: " << unum << ", " << type);
01989   lastSensorType = SENSOR_OK;
01990 }
01991 
01992 void Sensors::doBuildCompressionOK(int level) {
01993   RS_LOG ( LA_SENSORS, "BuildCompressionOK: " << level);
01994   lastSensorType = SENSOR_OK;
01995 }
01996 
01997 void Sensors::doBuildUnknownOK(const std::string& msg) {
01998   RS_LOG ( LA_SENSORS, "BuildUnknownOK: " << msg);
01999   lastSensorType = SENSOR_OK;
02000 }
02001 
02002 /* 
02003  * Private help functions.
02004  */
02005 
02006 SideLineName Sensors::locationToLine() const {
02007   if (!parsedLocations.empty())
02008     switch (parsedLocations[0]) {
02009     case FL_TOP: {
02010       return SL_TOP;
02011     }
02012     case FL_LEFT: {
02013       return SL_LEFT;
02014     }
02015     case FL_RIGHT: {
02016       return SL_RIGHT;
02017     }
02018     case FL_BOTTOM: {
02019       return SL_BOTTOM;
02020     }
02021     default: {
02022       return SL_UNKNOWN;
02023     }
02024     }
02025   return SL_UNKNOWN;
02026 }
02027   
02028 MarkerName Sensors::locationToMarker() const {
02029   switch (parsedLocations.size()) {
02030   case 0: {
02031     return UNKNOWN_MARKER;
02032   }
02033   case 1: {
02034     if (parsedFlagOffset.isKnown()) {
02035       if (parsedFlagOffset.getValue() == 0) {
02036   switch (parsedLocations[0]) {
02037   case FL_LEFT:
02038     return FLAG_L0;
02039   case FL_RIGHT:
02040     return FLAG_R0;
02041   case FL_TOP:
02042     return FLAG_T0;
02043   case FL_BOTTOM:
02044     return FLAG_B0;
02045   default:
02046     return UNKNOWN_MARKER;
02047   }
02048       }
02049       else { 
02050   return UNKNOWN_MARKER;
02051       }
02052     }
02053     else {
02054       switch (parsedLocations[0]) {
02055       case FL_CENTER:
02056   return FLAG_C;      
02057       case FL_RIGHT:
02058   return GOAL_R;
02059       case FL_LEFT:
02060   return GOAL_L;
02061       default:
02062   return UNKNOWN_MARKER;
02063       } 
02064     }
02065   }
02066   case 2: {
02067     switch (parsedLocations[0]) {
02068     case FL_CENTER: {
02069       switch (parsedLocations[1]) {
02070       case FL_TOP:
02071   return FLAG_CT;
02072       case FL_BOTTOM: 
02073   return FLAG_CB;
02074       default:
02075   return UNKNOWN_MARKER;
02076       }
02077     }
02078     case FL_LEFT: {
02079       switch (parsedLocations[1]) {      
02080       case FL_TOP: {
02081   if (parsedFlagOffset.isKnown()) {
02082     switch (parsedFlagOffset.getValue()) {
02083     case 10:
02084       return FLAG_LT10;
02085     case 20: 
02086       return FLAG_LT20;
02087     case 30:
02088       return FLAG_LT30;
02089     default:
02090       return UNKNOWN_MARKER;
02091     }
02092   }
02093   return FLAG_LT;
02094       }
02095       case FL_BOTTOM: {
02096   if (parsedFlagOffset.isKnown()) {
02097     switch (parsedFlagOffset.getValue()) {
02098     case 10: 
02099       return FLAG_LB10;
02100     case 20:
02101       return FLAG_LB20;
02102     case 30:
02103       return FLAG_LB30;
02104     default:
02105       return UNKNOWN_MARKER;
02106     }
02107   }
02108   return FLAG_LB;
02109       }      
02110       default:
02111   return UNKNOWN_MARKER;
02112       }
02113     }
02114     case FL_RIGHT: {
02115       switch (parsedLocations[1]) {      
02116       case FL_TOP: {
02117   if (parsedFlagOffset.isKnown()) {
02118     switch (parsedFlagOffset.getValue()) {
02119     case 10:
02120       return FLAG_RT10;
02121     case 20:
02122       return FLAG_RT20;
02123     case 30:
02124       return FLAG_RT30;
02125     default:
02126       return UNKNOWN_MARKER;
02127     }
02128   }
02129   return FLAG_RT;
02130       }
02131       case FL_BOTTOM: {
02132   if (parsedFlagOffset.isKnown()) {
02133     switch (parsedFlagOffset.getValue()) {
02134     case 10:
02135       return FLAG_RB10;
02136     case 20:
02137       return FLAG_RB20;
02138     case 30:
02139       return FLAG_RB30;
02140     default:
02141       return UNKNOWN_MARKER;
02142     }
02143   }
02144   return FLAG_RB;
02145       }
02146       default: 
02147   return UNKNOWN_MARKER;
02148       }
02149     }
02150     case FL_TOP: {
02151       if (parsedFlagOffset.isKnown()) {
02152   switch (parsedLocations[1]) {
02153   case FL_LEFT: {
02154     switch (parsedFlagOffset.getValue()) {
02155     case 10: 
02156       return FLAG_TL10;
02157     case 20:
02158       return FLAG_TL20;
02159     case 30:
02160       return FLAG_TL30;
02161     case 40:
02162       return FLAG_TL40;
02163     case 50:
02164       return FLAG_TL50;
02165     default:
02166       return UNKNOWN_MARKER;
02167     }
02168   }
02169   case FL_RIGHT: {
02170     switch (parsedFlagOffset.getValue()) {
02171     case 10:
02172       return FLAG_TR10;
02173     case 20:
02174       return FLAG_TR20;
02175     case 30:
02176       return FLAG_TR30;
02177     case 40:
02178       return FLAG_TR40;
02179     case 50:
02180       return FLAG_TR50;
02181     default:
02182       return UNKNOWN_MARKER;
02183     }
02184   }
02185   default:
02186     return UNKNOWN_MARKER;
02187   }
02188       }
02189       return UNKNOWN_MARKER;
02190     }
02191     case FL_BOTTOM: {
02192       if (parsedFlagOffset.isKnown()) {
02193   switch (parsedLocations[1]) {
02194   case FL_LEFT: {
02195     switch (parsedFlagOffset.getValue()) {
02196     case 10:
02197       return FLAG_BL10;
02198     case 20:
02199       return FLAG_BL20;
02200     case 30:
02201       return FLAG_BL30;
02202     case 40:
02203       return FLAG_BL40;
02204     case 50:
02205       return FLAG_BL50;
02206     default:
02207       return UNKNOWN_MARKER;
02208     }
02209   }
02210   case FL_RIGHT: {
02211     switch (parsedFlagOffset.getValue()) {
02212     case 10:
02213       return FLAG_BR10;
02214     case 20:
02215       return FLAG_BR20;
02216     case 30:
02217       return FLAG_BR30;
02218     case 40:
02219       return FLAG_BR40;
02220     case 50:
02221       return FLAG_BR50;
02222     default:
02223       return UNKNOWN_MARKER;
02224     }
02225   }       
02226   default:
02227     return UNKNOWN_MARKER;
02228   }
02229       }
02230       return UNKNOWN_MARKER;
02231     }
02232     default:
02233       return UNKNOWN_MARKER;
02234     }
02235   }
02236   case 3: {
02237     switch (parsedLocations[0]) {
02238     case FL_PENALTY: {
02239       switch (parsedLocations[1]) {
02240       case FL_LEFT: {
02241   switch (parsedLocations[2]) {
02242   case FL_TOP:
02243     return FLAG_PLT;
02244   case FL_CENTER:
02245     return FLAG_PLC;
02246   case FL_BOTTOM:
02247     return FLAG_PLB;
02248   default:
02249     return UNKNOWN_MARKER;
02250   }
02251       }
02252       case FL_RIGHT: {
02253   switch (parsedLocations[2]) {
02254   case FL_TOP:
02255     return FLAG_PRT;
02256   case FL_CENTER:
02257     return FLAG_PRC;
02258   case FL_BOTTOM:
02259     return FLAG_PRB;
02260   default:
02261     return UNKNOWN_MARKER;
02262   }
02263       }
02264       default:
02265   return UNKNOWN_MARKER;
02266       }
02267     }
02268     case FL_GOAL: {
02269       switch (parsedLocations[1]) {
02270       case FL_LEFT: {
02271   switch (parsedLocations[2]) {
02272   case FL_TOP:
02273     return FLAG_GLT;
02274   case FL_BOTTOM:
02275     return FLAG_GLB;
02276   default:
02277     return UNKNOWN_MARKER;
02278   }
02279       }
02280       case FL_RIGHT: {
02281   switch (parsedLocations[2]) {
02282   case FL_TOP:
02283     return FLAG_GRT;
02284   case FL_BOTTOM:
02285     return FLAG_GRB;
02286   default:
02287     return UNKNOWN_MARKER;
02288   }
02289       }
02290       default:
02291   return UNKNOWN_MARKER;
02292       }
02293     }
02294     default:
02295       return UNKNOWN_MARKER;
02296     }    
02297   default:
02298     return UNKNOWN_MARKER;
02299   }
02300   }
02301 }
02302 
02303 void Sensors::executeControlCommand(ControlCommand* cmd) throw() {
02304   if (SetCyclesSinceIOBeforeShutdown* ccmd = 
02305       dynamic_cast<SetCyclesSinceIOBeforeShutdown *>(cmd) ) {
02306     facts->CP_cycles_since_io_before_shutdown = ccmd->getCycles();
02307   } else if (SetMinTicksBeforeSendingCommand* ccmd = 
02308        dynamic_cast<SetMinTicksBeforeSendingCommand *>(cmd) ) {
02309     facts->CP_min_ticks_before_sending_command = ccmd->getTicks();
02310   } else if (SetMaxTicksBeforeSendingCommand* ccmd = 
02311        dynamic_cast<SetMaxTicksBeforeSendingCommand *>(cmd) ) {
02312     facts->CP_max_ticks_before_sending_command = ccmd->getTicks();
02313   } else if (SetTicksBeforeCommandWarning* ccmd = 
02314        dynamic_cast<SetTicksBeforeCommandWarning *>(cmd) ) {
02315     facts->CP_ticks_before_command_warning = ccmd->getTicks();
02316   }
02317   delete cmd;
02318 }
02319 
02320 RS_END_NAMESPACE
02321 
02322 
02323 /* CONDITIONAL INCLUSION OF INLINE DEFINITIONS
02324  *
02325  * If the compiler or debugger does not understand the keyword inline then
02326  * include the inline definitions here, otherwise include them in the
02327  * declaration file.
02328  *
02329  * This is controlled by a flag called RS_USE_INLINE, which is usually
02330  * defined. It can be set by the user by giving the compiler an argument
02331  * usually -DRS_USE_INLINE (to define it) or -URS_USE_INLINE (to undefine it).
02332  */
02333 
02334 #ifndef RS_USE_INLINE
02335 #  include "Sensors.icc"
02336 #endif
02337 
02338 

Generated on Mon Aug 29 07:58:00 2011 for RoboSoc by doxygen1.3-rc3