00001 /* 00002 * $Id: RCParser_8java-source.html,v 1.2 2002/07/07 20:59:52 stork Exp $ 00003 * 00004 * $Log: RCParser_8java-source.html,v $ 00004 * Revision 1.2 2002/07/07 20:59:52 stork 00004 * update dokumenation 00004 * 00005 * Revision 1.15 2002/07/05 18:34:08 stork 00006 * update dokumentation 00007 * 00008 * Revision 1.14 2002/07/03 19:06:01 stork 00009 * enable output of the server messages to the log file 00010 * 00011 * Revision 1.13 2002/07/03 17:23:15 stork 00012 * add some debug messages 00013 * 00014 * Revision 1.12 2002/06/27 20:26:39 stork 00015 * add + update dokumentation 00016 * 00017 * Revision 1.11 2002/06/22 20:15:41 stork 00018 * add some more dokumentation 00019 * 00020 * Revision 1.10 2002/06/10 20:52:19 stork 00021 * correct handling of enemies and friend 00022 * 00023 * Revision 1.9 2002/06/08 14:40:33 stork 00024 * add logging support 00025 * 00026 * Revision 1.8 2002/06/07 21:36:17 stork 00027 * syncronize and improve the event parsing with the world 00028 * 00029 * Revision 1.7 2002/06/07 18:12:51 stork 00030 * bug fix in flag handling 00031 * 00032 * Revision 1.5 2002/06/04 16:39:02 stork 00033 * correct bug in sorting list 00034 * 00035 * Revision 1.4 2002/05/29 21:06:18 stork 00036 * add missing Hear type value 00037 * 00038 * Revision 1.3 2002/05/25 22:05:12 stork 00039 * tests and minor bugfixes 00040 * 00041 * Revision 1.2 2002/05/21 20:57:14 stork 00042 * first communicator version 00043 * 00044 * Revision 1.1.1.1 2002/05/21 20:32:05 stork 00045 * empty project 00046 * 00047 */ 00048 import java.util.*; 00049 00055 public class RCParser 00056 implements RCEventType, RCSender,RCType, RCView, RCPlayMode { 00057 00058 // String data base 00059 private final String ServerParam = "(server_param "; 00060 private final String PlayerType = "(player_type "; 00061 private final String PlayerParam = "(player_param "; 00062 private final String Hear = "(hear "; 00063 private final String See = "(see "; 00064 private final String SenceBody = "(sense_body "; 00065 00066 private String TeamName; 00068 int OldTimeStamp; 00069 00073 public RCParser(String TeamName){ 00074 this.TeamName = TeamName; 00075 this.OldTimeStamp = 0; 00076 } 00077 00084 public void pushMessage ( String Command, RCWorld World ){ 00085 String Message = Command.trim(); 00086 00087 /* identify messsage type */ 00088 if( Message.startsWith(ServerParam) == true ){ 00089 World.Log.Log("Player-"+World.PlayerNumber+" : parse ServerParam-Message"); 00090 this.parseServerParam(Message, World); 00091 }else if( Message.startsWith(PlayerType) == true ){ 00092 World.Log.Log("Player-"+World.PlayerNumber+" : parse PlayerType-Message"); 00093 this.parsePlayerType(Message, World); 00094 }else if( Message.startsWith(PlayerParam) == true ){ 00095 World.Log.Log("Player-"+World.PlayerNumber+" : parse PlayerParam-Message"); 00096 this.parsePlayerParam(Message, World); 00097 }else if( Message.startsWith(Hear) == true ){ 00098 World.Log.Log("Player-"+World.PlayerNumber+" : parse Hear-Message"); 00099 this.parseHear(Message, World); 00100 }else if( Message.startsWith(See) == true ){ 00101 World.Log.Log("Player-"+World.PlayerNumber+" : parse See-mMessage"); 00102 this.parseSee(Message, World); 00103 }else if( Message.startsWith(SenceBody) == true ){ 00104 World.Log.Log("Player-"+World.PlayerNumber+" : parse SenceBody-Message"); 00105 this.parseSenseBody(Message, World); 00106 } 00107 } 00108 00109 00117 public void parseServerParam(String Message, RCWorld World){ 00118 RCServerParamEvent event = new RCServerParamEvent(); 00119 String data = Message.substring( ServerParam.length(), Message.length()-1); 00120 StringTokenizer tk = new StringTokenizer(data); 00121 00122 /* parse the message */ 00123 event.Type = SERVER_PARAM; 00124 event.gwidth = Double.parseDouble(tk.nextToken()); 00125 event.inertia_moment = Double.parseDouble(tk.nextToken()); 00126 event.psize = Double.parseDouble(tk.nextToken()); 00127 event.pdecay = Double.parseDouble(tk.nextToken()); 00128 event.prand = Double.parseDouble(tk.nextToken()); 00129 event.pweight = Double.parseDouble(tk.nextToken()); 00130 event.pspeed_max = Double.parseDouble(tk.nextToken()); 00131 event.paccel_max = Double.parseDouble(tk.nextToken()); 00132 event.stamia_max = Double.parseDouble(tk.nextToken()); 00133 event.stamia_inc = Double.parseDouble(tk.nextToken()); 00134 event.recover_init = Double.parseDouble(tk.nextToken()); 00135 event.recover_dthr = Double.parseDouble(tk.nextToken()); 00136 event.recover_min = Double.parseDouble(tk.nextToken()); 00137 event.recover_dec = Double.parseDouble(tk.nextToken()); 00138 event.effort_init = Double.parseDouble(tk.nextToken()); 00139 event.effort_dthr = Double.parseDouble(tk.nextToken()); 00140 event.effor_min = Double.parseDouble(tk.nextToken()); 00141 event.effort_dec = Double.parseDouble(tk.nextToken()); 00142 event.effort_ithr = Double.parseDouble(tk.nextToken()); 00143 event.effort_inc = Double.parseDouble(tk.nextToken()); 00144 event.kick_rand = Double.parseDouble(tk.nextToken()); 00145 event.team_actuator_noise = Double.parseDouble(tk.nextToken()); 00146 event.prand_factor_l = Double.parseDouble(tk.nextToken()); 00147 event.prand_factor_r = Double.parseDouble(tk.nextToken()); 00148 event.kick_rand_factor_l = Double.parseDouble(tk.nextToken()); 00149 event.kick_rand_factor_r = Double.parseDouble(tk.nextToken()); 00150 event.bsize = Double.parseDouble(tk.nextToken()); 00151 event.bdecay = Double.parseDouble(tk.nextToken()); 00152 event.brand = Double.parseDouble(tk.nextToken()); 00153 event.bweight = Double.parseDouble(tk.nextToken()); 00154 event.bspeed_max = Double.parseDouble(tk.nextToken()); 00155 event.baccel_max = Double.parseDouble(tk.nextToken()); 00156 event.dprate = Double.parseDouble(tk.nextToken()); 00157 event.kprate = Double.parseDouble(tk.nextToken()); 00158 event.kmargin = Double.parseDouble(tk.nextToken()); 00159 event.ctlradius = Double.parseDouble(tk.nextToken()); 00160 event.ctlradius_width = Double.parseDouble(tk.nextToken()); 00161 event.maxp = Double.parseDouble(tk.nextToken()); 00162 event.minp = Double.parseDouble(tk.nextToken()); 00163 event.maxm = Double.parseDouble(tk.nextToken()); 00164 event.minm = Double.parseDouble(tk.nextToken()); 00165 event.maxnm = Double.parseDouble(tk.nextToken()); 00166 event.minnm = Double.parseDouble(tk.nextToken()); 00167 event.maxn = Double.parseDouble(tk.nextToken()); 00168 event.minn = Double.parseDouble(tk.nextToken()); 00169 event.visangle = Double.parseDouble(tk.nextToken()); 00170 event.visdist = Double.parseDouble(tk.nextToken()); 00171 event.windir = Double.parseDouble(tk.nextToken()); 00172 event.winforce = Double.parseDouble(tk.nextToken()); 00173 event.winang = Double.parseDouble(tk.nextToken()); 00174 event.winrand = Double.parseDouble(tk.nextToken()); 00175 event.kickable_area = Double.parseDouble(tk.nextToken()); 00176 event.catch_area_l = Double.parseDouble(tk.nextToken()); 00177 event.catch_area_w = Double.parseDouble(tk.nextToken()); 00178 event.catch_prob = Double.parseDouble(tk.nextToken()); 00179 event.goalie_max_moves = Double.parseDouble(tk.nextToken()); 00180 event.ckmargin = Double.parseDouble(tk.nextToken()); 00181 event.offside_area = Double.parseDouble(tk.nextToken()); 00182 event.win_no = Double.parseDouble(tk.nextToken()); 00183 event.win_random = Double.parseDouble(tk.nextToken()); 00184 event.say_cnt_max = Double.parseDouble(tk.nextToken()); 00185 event.SayCoachMsgSize = Double.parseDouble(tk.nextToken()); 00186 event.clang_win_size = Double.parseDouble(tk.nextToken()); 00187 event.clang_define_win = Double.parseDouble(tk.nextToken()); 00188 event.clang_meta_win = Double.parseDouble(tk.nextToken()); 00189 event.clang_advice_win = Double.parseDouble(tk.nextToken()); 00190 event.clang_info_win = Double.parseDouble(tk.nextToken()); 00191 event.clang_mess_delay = Double.parseDouble(tk.nextToken()); 00192 event.clang_mess_per_cycle = Double.parseDouble(tk.nextToken()); 00193 event.half_time = Double.parseDouble(tk.nextToken()); 00194 event.sim_st = Double.parseDouble(tk.nextToken()); 00195 event.send_st = Double.parseDouble(tk.nextToken()); 00196 event.recv_st = Double.parseDouble(tk.nextToken()); 00197 event.sb_step = Double.parseDouble(tk.nextToken()); 00198 event.lcm_st = Double.parseDouble(tk.nextToken()); 00199 event.SayMsgSize = Double.parseDouble(tk.nextToken()); 00200 event.hear_max = Double.parseDouble(tk.nextToken()); 00201 event.hear_inc = Double.parseDouble(tk.nextToken()); 00202 event.hear_decay = Double.parseDouble(tk.nextToken()); 00203 event.cban_cycle = Double.parseDouble(tk.nextToken()); 00204 event.slow_down_factor = Double.parseDouble(tk.nextToken()); 00205 event.useoffside = Double.parseDouble(tk.nextToken()); 00206 event.kickoffoffside = Double.parseDouble(tk.nextToken()); 00207 event.offside_kick_margin = Double.parseDouble(tk.nextToken()); 00208 event.audio_dist = Double.parseDouble(tk.nextToken()); 00209 event.dist_qstep = Double.parseDouble(tk.nextToken()); 00210 event.land_qstep = Double.parseDouble(tk.nextToken()); 00211 event.dir_qstep = Double.parseDouble(tk.nextToken()); 00212 event.dist_qstep_l = Double.parseDouble(tk.nextToken()); 00213 event.dist_qstep_r = Double.parseDouble(tk.nextToken()); 00214 event.land_qstep_l = Double.parseDouble(tk.nextToken()); 00215 event.land_qstep_r = Double.parseDouble(tk.nextToken()); 00216 event.dir_qstep_l = Double.parseDouble(tk.nextToken()); 00217 event.dir_qstep_r = Double.parseDouble(tk.nextToken()); 00218 event.CoachMode = Double.parseDouble(tk.nextToken()); 00219 event.CwRMode = Double.parseDouble(tk.nextToken()); 00220 event.old_hear = Double.parseDouble(tk.nextToken()); 00221 event.sv_st = Double.parseDouble(tk.nextToken()); 00222 event.start_goal_l = Double.parseDouble(tk.nextToken()); 00223 event.start_goal_r = Double.parseDouble(tk.nextToken()); 00224 event.fullstate_l = Double.parseDouble(tk.nextToken()); 00225 event.fullstate_r = Double.parseDouble(tk.nextToken()); 00226 event.drop_time = Double.parseDouble(tk.nextToken()); 00227 00228 // deliver event 00229 LinkedList l = new LinkedList(); 00230 l.add(event); 00231 World.receiveEvent(l); 00232 } 00233 00241 public void parsePlayerParam(String Message, RCWorld World){ 00242 RCPlayerParamEvent event = new RCPlayerParamEvent(); 00243 StringTokenizer tk = new StringTokenizer( Message.substring(PlayerParam.length(), Message.length()-1)); 00244 00245 /* parse event */ 00246 event.Type = PLAYER_PARAM; 00247 event.player_types = Double.parseDouble(tk.nextToken()); 00248 event.subst_max = Double.parseDouble(tk.nextToken()); 00249 event.pt_max = Double.parseDouble(tk.nextToken()); 00250 event.player_speed_max_delta_min = Double.parseDouble(tk.nextToken()); 00251 event.player_speed_max_delta_max = Double.parseDouble(tk.nextToken()); 00252 event.stamoa_inc_max_delta_factor = Double.parseDouble(tk.nextToken()); 00253 event.player_decay_delta_min = Double.parseDouble(tk.nextToken()); 00254 event.player_decay_delta_max = Double.parseDouble(tk.nextToken()); 00255 event.inertia_moment_delta_factor = Double.parseDouble(tk.nextToken()); 00256 event.dash_power_rarte_delta_min = Double.parseDouble(tk.nextToken()); 00257 event.dash_power_rate_delta_max = Double.parseDouble(tk.nextToken()); 00258 event.player_size_delta_factor = Double.parseDouble(tk.nextToken()); 00259 event.kickable_margin_delta_min = Double.parseDouble(tk.nextToken()); 00260 event.kickable_margin_delta_max = Double.parseDouble(tk.nextToken()); 00261 event.kick_rand_delta_factor = Double.parseDouble(tk.nextToken()); 00262 event.extra_stamina_delta_min = Double.parseDouble(tk.nextToken()); 00263 event.extra_stamina_delta_max = Double.parseDouble(tk.nextToken()); 00264 event.effort_max_delta_factor = Double.parseDouble(tk.nextToken()); 00265 event.effort_min_delta_factor = Double.parseDouble(tk.nextToken()); 00266 00267 // deliver event 00268 LinkedList l = new LinkedList(); 00269 l.add(event); 00270 World.receiveEvent(l); 00271 } 00272 00280 public void parsePlayerType(String Message, RCWorld World){ 00281 RCPlayerTypeEvent event = new RCPlayerTypeEvent(); 00282 StringTokenizer tk = new StringTokenizer( Message.substring(PlayerType.length(), Message.length()-1)); 00283 00284 /* parse meassage */ 00285 event.Type = PLAYER_TYPE; 00286 event.id = Integer.parseInt(tk.nextToken()); 00287 event.player_speed_max = Double.parseDouble(tk.nextToken()); 00288 event.stamina_inc_max = Double.parseDouble(tk.nextToken()); 00289 event.player_decay = Double.parseDouble(tk.nextToken()); 00290 event.inertia_moment = Double.parseDouble(tk.nextToken()); 00291 event.dash_power_rate = Double.parseDouble(tk.nextToken()); 00292 event.player_size = Double.parseDouble(tk.nextToken()); 00293 event.kicakable_margin = Double.parseDouble(tk.nextToken()); 00294 event.kick_rand = Double.parseDouble(tk.nextToken()); 00295 event.extra_stamina = Double.parseDouble(tk.nextToken()); 00296 event.effort_max = Double.parseDouble(tk.nextToken()); 00297 event.effort_min = Double.parseDouble(tk.nextToken()); 00298 00299 // deliver event 00300 LinkedList l = new LinkedList(); 00301 l.add(event); 00302 World.receiveEvent(l); 00303 } 00304 00312 public void parseHear(String Message, RCWorld World){ 00313 RCHearEvent event = new RCHearEvent(); 00314 String data = Message.substring(Hear.length(), Message.length()-1); 00315 StringTokenizer tk = new StringTokenizer(data); 00316 00317 event.TimeStamp = Integer.parseInt(tk.nextToken()); 00318 String Sender = tk.nextToken(); 00319 00320 /* check for package lose */ 00321 if( OldTimeStamp+1 < event.TimeStamp){ 00322 World.Log.Debug("lost "+(event.TimeStamp-OldTimeStamp)+" packages("+OldTimeStamp+"/"+event.TimeStamp+")"); 00323 } 00324 OldTimeStamp = event.TimeStamp; 00325 00326 /* get sender */ 00327 if( Sender.compareTo("online_coach_left") == 0){ 00328 event.Sender = LEFT_COACH; 00329 }else if( Sender.compareTo("online_coach_right") == 0){ 00330 event.Sender = RIGHT_COACH; 00331 }else if( Sender.compareTo("referee") == 0){ 00332 event.Sender = REFEREE; 00333 }else if( Sender.compareTo("self") == 0 ){ 00334 event.Sender = SELF; 00335 }else{ 00336 event.Sender = DIRECTION; 00337 event.Direction = Double.parseDouble(Sender); 00338 } 00339 event.Message = tk.nextToken(); 00340 event.Type = HEAR; 00341 00342 // deliver event 00343 LinkedList l = new LinkedList(); 00344 l.add(event); 00345 World.receiveEvent(l); 00346 } 00347 00355 public void parseSee(String Message, RCWorld World){ 00356 LinkedList l = new LinkedList(); 00357 StringTokenizer tk = new StringTokenizer( Message.substring(See.length(), Message.length()-1)); 00358 int TimeStamp = Integer.parseInt(tk.nextToken()); // get timestamp 00359 boolean onlyOneTime = false; 00360 00361 // World.Log.Log("****************************************"); 00362 World.Log.Log("Player-"+World.PlayerNumber+" : "+Message); 00363 00364 00365 // make one event for each object 00366 int loop = tk.countTokens(); 00367 while( tk.hasMoreElements() ){ 00368 // for( int rl = 0; rl < loop ; rl++ ){ 00369 boolean AddToList = true; 00370 RCSeeEvent event = new RCSeeEvent(); 00371 String ID = tk.nextToken(")"); 00372 String PARAM = tk.nextToken(")"); 00373 ID = ID.substring(" ((".length(), ID.length()); // remove " ((" 00374 00375 // System.out.println("object = " + ID +" -> " +PARAM ); 00376 00377 // find opbject 00378 StringTokenizer tkId = new StringTokenizer(ID); 00379 String TK = tkId.nextToken(); 00380 //System.out.println("TOKEN = " + TK); 00381 switch( (TK.getBytes())[0] ){ 00382 case 'p': 00383 { 00384 //System.out.println("PLAYER"); 00385 00386 if( tkId.hasMoreTokens() ){ 00387 // find teamname 00388 event.TeamName = tkId.nextToken(); 00389 if( event.TeamName.compareTo("\""+this.TeamName+"\"") == 0 ){ 00390 event.Object = FRIEND; 00391 }else{ 00392 event.Object = ENEMY; 00393 } 00394 if( tkId.hasMoreTokens() ){ 00395 // get uniformnumber 00396 event.UniformNumber = Integer.parseInt(tkId.nextToken()); 00397 00398 if( tkId.hasMoreTokens() ){ 00399 // is he a goalie 00400 event.Goalie = Boolean.valueOf(tkId.nextToken()).booleanValue(); 00401 } 00402 }else{ 00403 AddToList = false; 00404 } 00405 }else{ 00406 // undefined player 00407 AddToList = false; 00408 event.Object = PLAYER; 00409 } 00410 break; 00411 } 00412 case 'b': 00413 { 00414 //System.out.println("BALL"); 00415 00416 event.Object = BALL; 00417 break; 00418 } 00419 case 'g': 00420 { 00421 //System.out.println("GOAL"); 00422 00423 // goal 00424 event.Object = GOAL; 00425 if( (tkId.nextToken().getBytes())[0] == 'l' ){ 00426 // left 00427 event.FirstLocation = LEFT; 00428 }else{ 00429 // right 00430 event.FirstLocation = RIGHT; 00431 } 00432 break; 00433 } 00434 case 'f': 00435 { 00436 //System.out.println("FLAG"); 00437 00438 // flag 00439 event.Object = FLAGS; 00440 String pos = tkId.nextToken(); 00441 00442 switch( (pos.getBytes())[0] ){ 00443 case 'l': 00444 { 00445 event.FirstLocation = LEFT; 00446 switch( (tkId.nextToken().getBytes())[0] ){ 00447 case '0': 00448 { 00449 event.SecondLocation = CENTER; 00450 event.Number = 0; 00451 break; 00452 } 00453 case 't': 00454 { 00455 event.SecondLocation = TOP; 00456 break; 00457 } 00458 case 'b': 00459 { 00460 event.SecondLocation = BOTTOM; 00461 break; 00462 } 00463 } 00464 if( tkId.hasMoreTokens()){ 00465 event.Number = Integer.parseInt(tkId.nextToken()); 00466 }else{ 00467 event.Number = -1; 00468 } 00469 break; 00470 } 00471 case 'c': 00472 { 00473 if( tkId.hasMoreTokens() == false ){ 00474 event.FirstLocation = CENTER; 00475 break; 00476 } 00477 event.FirstLocation = CENTER; 00478 switch( (tkId.nextToken().getBytes())[0] ){ 00479 case 't': 00480 { 00481 event.SecondLocation = TOP; 00482 break; 00483 } 00484 case 'b': 00485 { 00486 event.SecondLocation = BOTTOM; 00487 break; 00488 } 00489 } 00490 break; 00491 } 00492 case 'r': 00493 { 00494 event.FirstLocation = RIGHT; 00495 switch( (tkId.nextToken().getBytes())[0] ){ 00496 case '0': 00497 { 00498 event.SecondLocation = CENTER; 00499 event.Number = 0; 00500 break; 00501 } 00502 case 't': 00503 { 00504 event.SecondLocation = TOP; 00505 break; 00506 } 00507 case 'b': 00508 { 00509 event.SecondLocation = BOTTOM; 00510 break; 00511 } 00512 } 00513 if( tkId.hasMoreTokens()){ 00514 event.Number = Integer.parseInt(tkId.nextToken()); 00515 }else{ 00516 event.Number = -1; 00517 } 00518 break; 00519 } 00520 case 'p': // line 00521 { 00522 event.FirstLocation = LINE; 00523 00524 // left or right or center 00525 switch(tkId.nextToken().getBytes()[0]){ 00526 case 'l': 00527 { 00528 event.SecondLocation = LEFT; 00529 break; 00530 } 00531 case 'c': 00532 { 00533 event.SecondLocation = CENTER; 00534 break; 00535 } 00536 case 'r': 00537 { 00538 event.SecondLocation = RIGHT; 00539 break; 00540 } 00541 } 00542 00543 // top or bottom 00544 switch( (tkId.nextToken().getBytes())[0] ){ 00545 case 't': 00546 event.ThirdLocation = TOP; 00547 break; 00548 case 'c': 00549 event.ThirdLocation = CENTER; 00550 break; 00551 case 'b': 00552 event.ThirdLocation = BOTTOM; 00553 break; 00554 } 00555 break; 00556 } 00557 case 'g': // goal 00558 { 00559 event.FirstLocation = GOAL; 00560 // left or right 00561 if( (tkId.nextToken().getBytes())[0] == 'l' ) 00562 event.SecondLocation = LEFT; 00563 else 00564 event.SecondLocation = RIGHT; 00565 00566 00567 if( tk.hasMoreTokens() == false ){ 00568 event.ThirdLocation = UNDEFINED; 00569 break; 00570 } 00571 00572 // top or bottom 00573 if ( (tkId.nextToken().getBytes())[0] == 't' ) 00574 event.ThirdLocation = TOP; 00575 else 00576 event.ThirdLocation = BOTTOM; 00577 00578 break; 00579 } 00580 case 't': 00581 { 00582 // top 00583 event.FirstLocation = TOP; 00584 switch( (tkId.nextToken().getBytes())[0] ){ 00585 case '0': 00586 { 00587 event.SecondLocation = CENTER; 00588 event.Number = 0; 00589 break; 00590 } 00591 case 'l': 00592 { 00593 event.SecondLocation = LEFT; 00594 break; 00595 } 00596 case 'r': 00597 { 00598 event.SecondLocation = RIGHT; 00599 break; 00600 } 00601 } 00602 if( tkId.hasMoreTokens()){ 00603 event.Number = Integer.parseInt(tkId.nextToken()); 00604 } 00605 break; 00606 } 00607 case 'b': 00608 { 00609 // bottom 00610 event.FirstLocation = BOTTOM; 00611 switch( (tkId.nextToken().getBytes())[0] ){ 00612 case '0': 00613 { 00614 event.SecondLocation = CENTER; 00615 event.Number = 0; 00616 break; 00617 } 00618 case 'l': 00619 { 00620 event.SecondLocation = LEFT; 00621 break; 00622 } 00623 case 'r': 00624 { 00625 event.SecondLocation = RIGHT; 00626 break; 00627 } 00628 } 00629 if( tkId.hasMoreTokens()){ 00630 event.Number = Integer.parseInt(tkId.nextToken()); 00631 } 00632 break; 00633 } 00634 } 00635 00636 break; 00637 } 00638 case 'l': 00639 { 00640 // line 00641 //System.out.println("LINE"); 00642 event.Object = LINE; 00643 String Pos = tkId.nextToken(); 00644 //System.out.println("Pos = " + Pos); 00645 switch( (Pos.getBytes())[0] ){ 00646 case 't': 00647 event.FirstLocation = TOP; 00648 break; 00649 case 'r': 00650 event.FirstLocation = RIGHT; 00651 break; 00652 case 'b': 00653 event.FirstLocation = BOTTOM; 00654 break; 00655 case 'l': 00656 event.FirstLocation = LEFT; 00657 break; 00658 } 00659 break; 00660 } 00661 case 'B': 00662 { 00663 AddToList = false; 00664 event.Object = BALL; 00665 break; 00666 } 00667 case 'F': 00668 { 00669 AddToList = false; 00670 event.Object = FLAGS; 00671 break; 00672 } 00673 case 'G': 00674 { 00675 AddToList = false; 00676 event.Object = GOAL; 00677 break; 00678 } 00679 case 'P': 00680 { 00681 AddToList = false; 00682 event.Object = PLAYER; 00683 break; 00684 } 00685 } 00686 00687 World.Log.Log("Player-"+World.PlayerNumber+" : parse see after object loop"); 00688 00689 // get metric 00690 StringTokenizer tkParam = new StringTokenizer(PARAM); 00691 int count = tkParam.countTokens(); 00692 switch(count){ 00693 case 1: 00694 { 00695 event.Direction = Double.parseDouble(tkParam.nextToken()); 00696 break; 00697 } 00698 case 2: 00699 { 00700 event.Distance = Double.parseDouble(tkParam.nextToken()); 00701 event.Direction = Double.parseDouble(tkParam.nextToken()); 00702 break; 00703 } 00704 case 4: 00705 { 00706 event.Distance = Double.parseDouble(tkParam.nextToken()); 00707 event.Direction = Double.parseDouble(tkParam.nextToken()); 00708 event.DistChange = Double.parseDouble(tkParam.nextToken()); 00709 event.DirChange = Double.parseDouble(tkParam.nextToken()); 00710 break; 00711 } 00712 case 6: 00713 { 00714 event.Distance = Double.parseDouble(tkParam.nextToken()); 00715 event.Direction = Double.parseDouble(tkParam.nextToken()); 00716 event.DistChange = Double.parseDouble(tkParam.nextToken()); 00717 event.DirChange = Double.parseDouble(tkParam.nextToken()); 00718 event.HeadFaceDir = Double.parseDouble(tkParam.nextToken()); 00719 event.BodyFaceDir = Double.parseDouble(tkParam.nextToken()); 00720 break; 00721 } 00722 } 00723 00724 // System.out.println("Distance = " + event.Distance + " Direction = " + event.Direction ); 00725 00726 World.Log.Log("Player-"+World.PlayerNumber+" : parse see after metric loop"); 00727 00728 // add standart values 00729 event.TimeStamp = TimeStamp; 00730 event.Type = SEE; 00731 00732 /* check for package lose */ 00733 if( (OldTimeStamp+1 < event.TimeStamp) && (onlyOneTime == false) ){ 00734 // World.Log.Debug("lost "+(event.TimeStamp-OldTimeStamp)+" packages("+OldTimeStamp+"/"+event.TimeStamp+")"); 00735 World.Log.Log("Player-"+World.PlayerNumber+" : lost "+(event.TimeStamp-OldTimeStamp)+" packages("+OldTimeStamp+"/"+event.TimeStamp+")"); 00736 onlyOneTime = true; 00737 } 00738 OldTimeStamp = event.TimeStamp; 00739 00740 00741 // add to list 00742 if( AddToList == true ){ 00743 if( (event.Object == FLAGS) || (event.Object == LINE) || (event.Object == GOAL) ){ 00744 l.addFirst(event); 00745 }else{ 00746 l.addLast(event); 00747 } 00748 } 00749 } 00750 00751 00752 World.Log.Log("Player-"+World.PlayerNumber+" : parse see after object loop"); 00753 00754 // deliver events 00755 World.receiveEvent(l); 00756 } 00757 00765 public void parseSenseBody(String Message, RCWorld World){ 00766 RCSenceEvent event = new RCSenceEvent(); 00767 event.Type = SENCE; 00768 00769 StringTokenizer tk = new StringTokenizer(Message.substring(SenceBody.length(), Message.length())); 00770 event.TimeStamp = Integer.parseInt(tk.nextToken()); 00771 00772 /* check for package lose */ 00773 if( OldTimeStamp+1 < event.TimeStamp){ 00774 World.Log.Debug("lost "+(event.TimeStamp-OldTimeStamp)+" packages("+OldTimeStamp+"/"+event.TimeStamp+")"); 00775 } 00776 OldTimeStamp = event.TimeStamp; 00777 00778 // view mode 00779 String ViewMode = tk.nextToken(")"); 00780 if( ViewMode.indexOf("high") != -1 ){ 00781 if(ViewMode.indexOf("narrow") != -1){ 00782 event.view_mode = HIGH_NARROW; 00783 }else if(ViewMode.indexOf("normal") != -1){ 00784 event.view_mode = HIGH_NORMAL; 00785 }else{ 00786 event.view_mode = HIGH_WIDE; 00787 } 00788 }else{ 00789 if(ViewMode.indexOf("narrow") != -1){ 00790 event.view_mode = LOW_NARROW; 00791 }else if(ViewMode.indexOf("normal") != -1){ 00792 event.view_mode = LOW_NORMAL; 00793 }else{ 00794 event.view_mode = LOW_WIDE; 00795 } 00796 } 00797 00798 // get stamia 00799 StringTokenizer tkStamia = new StringTokenizer(tk.nextToken().trim()); 00800 tkStamia.nextToken(); 00801 event.Stamia = Double.parseDouble(tkStamia.nextToken()); 00802 event.Effort = Double.parseDouble(tkStamia.nextToken()); 00803 00804 // get speed 00805 StringTokenizer tkSpeed = new StringTokenizer(tk.nextToken().trim()); 00806 tkSpeed.nextToken(); 00807 event.AmmountOfSpeed = Double.parseDouble(tkSpeed.nextToken()); 00808 event.DirectionOfSpeed = Double.parseDouble(tkSpeed.nextToken()); 00809 00810 00811 String Dummy; 00812 // headangle 00813 Dummy = tk.nextToken(); 00814 event.HeadAngle = Double.parseDouble(Dummy.substring(" (head_angle".length(), Dummy.length())); 00815 00816 // get kick 00817 Dummy = tk.nextToken(); 00818 event.KickCount = Double.parseDouble(Dummy.substring(" (kick".length(), Dummy.length())); 00819 00820 // get dash 00821 Dummy = tk.nextToken(); 00822 event.DashCount = Double.parseDouble(Dummy.substring(" (dash".length(), Dummy.length())); 00823 00824 // get turn 00825 Dummy = tk.nextToken(); 00826 event.TurnCount = Double.parseDouble(Dummy.substring(" (turn".length(), Dummy.length())); 00827 00828 // get say 00829 Dummy = tk.nextToken(); 00830 event.SayCount = Double.parseDouble(Dummy.substring(" (say".length(), Dummy.length())); 00831 00832 // get turn_neck 00833 Dummy = tk.nextToken(); 00834 event.TurnNeckCount = Double.parseDouble(Dummy.substring(" (turn_neck".length(), Dummy.length())); 00835 00836 // get catch 00837 Dummy = tk.nextToken(); 00838 event.CatchCount = Double.parseDouble(Dummy.substring(" (catch".length(), Dummy.length())); 00839 00840 // get move 00841 Dummy = tk.nextToken(); 00842 event.MoveCount = Double.parseDouble(Dummy.substring(" (move".length(), Dummy.length())); 00843 00844 // get turn 00845 Dummy = tk.nextToken(); 00846 event.ChangeViewCount = Double.parseDouble(Dummy.substring(" (change_view".length(), Dummy.length())); 00847 00848 while(tk.hasMoreTokens()){ 00849 System.out.println(tk.nextToken(")")); 00850 } 00851 00852 00853 // deliver event 00854 LinkedList l= new LinkedList(); 00855 l.add(event); 00856 World.receiveEvent(l); 00857 } 00858 }