📄 smonitor_dev.c
字号:
const int SMonitorDevice::BUTTON_SCALE_LEVEL= 2;const int SMonitorDevice::BUTTON_INFO_LEVEL= 3;const int SMonitorDevice::BUTTON_MODE= 4;const int SMonitorDevice::BUTTON_UNZOOM= 5;const int SMonitorDevice::BUTTON_QUIT= 6;const int SMonitorDevice::BUTTON_NUMBER= 7;const int SMonitorDevice::POPUP_BUTTON_DROP_BALL= 0;const int SMonitorDevice::POPUP_BUTTON_FREE_KICK_LEFT= 1;const int SMonitorDevice::POPUP_BUTTON_FREE_KICK_RIGHT= 2;const int SMonitorDevice::POPUP_BUTTON_NUMBER= 3;const int SMonitorDevice::Options::info_level_min= 0;const int SMonitorDevice::Options::info_level_def= 1;const int SMonitorDevice::Options::info_level_max= 3;const int SMonitorDevice::Options::scale_level_min= 0;const int SMonitorDevice::Options::scale_level_def= 0;const int SMonitorDevice::Options::scale_level_max= 5;const double SMonitorDevice::Options::scale_level_inc= 0.2;const double SMonitorDevice::Options::scale_level_beg= 1.0;const int SMonitorDevice::Options::MODE_STANDARD= 0;const int SMonitorDevice::Options::MODE_MOVE= 1;const int SMonitorDevice::Options::MODE_SHOW_VIEW_AREA= 2;const int SMonitorDevice::id_ball= -1;const int SMonitorDevice::id_invalid= -2;SMonitorDevice::Options::Options() { server_port= 6000; strcpy(server_host,"localhost"); coach_port= server_port+1; protocol_version= 2; connect_on_start= true; keepaway = false; keepaway_length = 20.0; keepaway_width = 20.0; list_player_types= false; show_ball_collisions= false; just_edit= false; track_ball= false; show_ball_vel= false; player_radius= 0.3; player_skin= 1; kick_radius= 1.085; ball_radius= 0.3;//0.085; ball_skin= 1; c_team_l= RGBcolor(255,255,0); c_goalie_l= RGBcolor(0,255,0); c_font_l= RGBcolor(255,0,0);//(255,0,0); c_invalid_l= RGBcolor(0,0,0); c_team_r= RGBcolor(0,255,255); c_goalie_r= RGBcolor(255,153,255); c_font_r= RGBcolor(0,0,139); //(0,255,0);//(255,0,0); c_invalid_r= RGBcolor(0,0,0); c_ball= RGBcolor(255,255,255); c_field= RGBcolor(0,153,0);//(153,204,51); //(204,204,204); c_marigin= RGBcolor(204,51,51); c_line= RGBcolor(255,255,255); c_goal= RGBcolor(0,0,0); c_varea_exact= RGBcolor(0,180,0); // 0, 0xB4, 0 c_varea_fuzzy= RGBcolor(0,170,0); // 0, 0xAA, 0 info_level= info_level_def; scale_level= scale_level_def; mode= MODE_STANDARD; //mode= MODE_SHOW_VIEW_AREA; active_in_mode= id_invalid; lt_show_spare_space_to_offside_line= false; rt_show_spare_space_to_offside_line= false;}double SMonitorDevice::Options::scale_factor() const { return scale_level_beg + scale_level * scale_level_inc;}bool SMonitorDevice::Options::set_scale_level_from_double(double s) { for (int i=scale_level_max; i >= 0; i--) if ( s >= scale_level_beg + i * scale_level_inc - 0.0001) { scale_level= i; return true; } scale_level= scale_level_min; return true;}const char * SMonitorDevice::Options::get_mode_string() const { if (mode == MODE_STANDARD) return "mode std "; if (mode == MODE_MOVE) return "mode move"; if (mode == MODE_SHOW_VIEW_AREA) return "mode view"; return "mode ????";}const char * SMonitorDevice::Options::get_mode_value_string() const { if (mode == MODE_STANDARD) return "std"; if (mode == MODE_MOVE) return "move"; if (mode == MODE_SHOW_VIEW_AREA) return "view"; return "????";}bool SMonitorDevice::Options::set_mode_from_string(const char * s) { if ( strcmp("std",s) == 0) mode= MODE_STANDARD; else if ( strcmp("move",s) == 0) mode= MODE_MOVE; else if ( strcmp("view",s) == 0) mode= MODE_SHOW_VIEW_AREA; else return false; return true;}SMonitorDevice::ServerState::ServerState() { reset();}void SMonitorDevice::ServerState::reset() { //last_packet_ms_time= -1; reconnected= true; left_teamname.reset(); right_teamname.reset(); match_information.reset();}void SMonitorDevice::Positions::set_player(int i,const Point2d & p,const Angle & a) { player[i].pos= p; player[i].body_angle= a;}bool SMonitorDevice::Positions::max_x_pos(int p1, int p2, double & x1) const { bool res= false; for (int i=p1; i < p2; i++) { const Player & p = player[i]; if ( ! p.alive) continue; if (!res) { x1= p.pos.x; res= true; } else if ( p.pos.x > x1) x1= p.pos.x; } return res;}//copy of max_x_pos with > replaced by <bool SMonitorDevice::Positions::min_x_pos(int p1, int p2, double & x1) const { bool res= false; for (int i=p1; i < p2; i++) { const Player & p = player[i]; if ( ! p.alive) continue; if (!res) { x1= p.pos.x; res= true; } else if ( p.pos.x < x1) x1= p.pos.x; } return res;}bool SMonitorDevice::Positions::max_x_pos(int p1, int p2, double & x1, double & x2) const { int res= 0; for (int i=p1; i < p2; i++) { const Player & p = player[i]; if (!p.alive) continue; if (res == 0) { x1= p.pos.x; res= 1; } else if (res == 1) { res= 2; if (p.pos.x > x1) { x2= x1; x1= p.pos.x; } else x2= p.pos.x; } else if ( p.pos.x > x2) { if ( p.pos.x > x1) { x2= x1; x1= p.pos.x; } else x2= p.pos.x; } } return (res==2);}//copy of max_x_pos with > replaced by <bool SMonitorDevice::Positions::min_x_pos(int p1, int p2, double & x1, double & x2) const { int res= 0; for (int i=p1; i < p2; i++) { const Player & p = player[i]; if (!p.alive) continue; if (res == 0) { x1= p.pos.x; res= 1; } else if (res == 1) { res= 2; if (p.pos.x < x1) { x2= x1; x1= p.pos.x; } else x2= p.pos.x; } else if ( p.pos.x < x2) { if ( p.pos.x < x1) { x2= x1; x1= p.pos.x; } else x2= p.pos.x; } } return (res==2);}void SMonitorDevice::Positions::print_inline(std::ostream & out) { int prec= 4; out << std::setprecision(prec) << ball.pos.x << " " << std::setprecision(prec) << ball.pos.y << " " << std::setprecision(prec) << ball.vel.x << " " << std::setprecision(prec) << ball.vel.y; for (int i= 0; i < MAX_PLAYER*2; i++) out << " " << std::setprecision(prec) << player[i].pos.x << " " << std::setprecision(prec) << player[i].pos.y << " " << std::setprecision(prec) << player[i].body_angle.get_value() << " 0 0"; // the velocity is 0}void SMonitorDevice::Positions::print_formation(std::ostream & out, bool left_half, bool left_team) { int start_idx= 0; double dum= 0.0; if (left_half) { out << "\n[left half"; dum= 52.5; } else out << "\n[right half"; if (left_team) out << ", left team]"; else { out << ", right team]"; start_idx= 11; } char buffer[200]; for (int i= 1+start_idx; i< MAX_PLAYER+start_idx; i++) { float x= (player[i].pos.x + dum)/52.5; if (x<0.0) x= 0.0; if (x>1.0) x= 1.0; float y= (player[i].pos.y + 34.0)/68.0; if (y<0.0) y= 0.0; if (y>1.0) y= 1.0; sprintf(buffer,"\npos_%-2d = %.2f %.2f *",i-start_idx,x,y); out << buffer; } out << std::flush;}/*****************************************************************************//*****************************************************************************/double x_SERVER_2_LP(double x) { return x;}double y_SERVER_2_LP(double y) { return -y;}double ang_SERVER_2_LP(double a) { a= (a*PI)/180.0; if (a < 0.0) return -a; return -a+2*PI;}/*****************************************************************************//*****************************************************************************/SMonitorDevice::SMonitorDevice() : timeover( false ){ server_state.reset(); //init_connection(); //vorlaeufig}void SMonitorDevice::generic_description_of_options(std::ostream & o, int mode) const { print_option_entry(o,mode,"port",options.server_port,"defines the socket port for communication"); print_option_entry(o,mode,"host",options.server_host,"defines the host on which the soccer server is running"); print_option_entry(o,mode,"version",options.protocol_version,"version of monitor <-> server protocol"); print_option_entry(o,mode,"connect_on_start",options.connect_on_start,"if set then a connection to the server is established during the start"); print_option_entry(o,mode,"keepaway",options.keepaway,"if set then the field will be laid out for a keepaway match"); print_option_entry(o,mode,"keepaway_length",options.keepaway_length,"length of the keepaway region"); print_option_entry(o,mode,"keepaway_width",options.keepaway_width,"width of the keepaway region"); print_option_entry(o,mode,"list_player_types",options.list_player_types,"print all player types after a connection"); print_option_entry(o,mode,"show_ball_collisions",options.show_ball_collisions,"show if a player collides with the ball"); print_option_entry(o,mode,"just_edit",options.just_edit,"don't connect to the soccer server"); print_option_entry(o,mode,"scale",options.scale_factor(),"factor all player's and the ball sizes are multiplied by"); print_option_entry(o,mode,"detail",options.info_level,"level of player information such as his number, stamina and type"); print_option_entry(o,mode,"mode",options.get_mode_value_string(),"initial mode to use"); print_option_entry(o,mode,"player_radius",options.player_radius,"default inner player radius (if server doesn't provide type info)"); print_option_entry(o,mode,"kick_radius",options.kick_radius,"default outer player radius (if server doesn't provide type info)"); print_option_entry(o,mode,"player_num_pos_x",options.player_num_pos.x,"x position of player number relative to player's center"); print_option_entry(o,mode,"player_num_pos_y",options.player_num_pos.y,"y position of player number relative to player's center"); print_option_entry(o,mode,"ball_radius",options.ball_radius,"define how large the inner circle of the ball should be"); o << "\n"; print_option_entry(o,mode,"c_team_l",options.c_team_l,"color of left team players"); print_option_entry(o,mode,"c_goalie_l",options.c_goalie_l,"color of left goalie"); print_option_entry(o,mode,"c_font_l",options.c_font_l,"color of left team number strings"); print_option_entry(o,mode,"c_team_r",options.c_team_r,"color of right team players"); print_option_entry(o,mode,"c_goalie_r",options.c_goalie_r,"color of right goalie"); print_option_entry(o,mode,"c_font_r",options.c_font_r,"color of right team number strings"); print_option_entry(o,mode,"c_ball",options.c_ball,"color of the ball"); print_option_entry(o,mode,"c_field",options.c_field,"color of the soccer field"); print_option_entry(o,mode,"c_line",options.c_line,"color of the soccer field lines"); print_option_entry(o,mode,"c_goal",options.c_goal,"color of the soccer field goals"); print_option_entry(o,mode,"c_varea_exact",options.c_varea_exact,"color of the exact view area"); print_option_entry(o,mode,"c_varea_fuzzy",options.c_varea_fuzzy,"color of the fuzzy view area"); o << "\n";}bool SMonitorDevice::process_options(const ValueParser & vp) { double tmp_double; int res; vp.get("port", options.server_port); vp.get("host", options.server_host,STRING_MAX_SIZE);#if USE_COACH vp.get("coach_port", options.coach_port);#endif vp.get("version", options.protocol_version); vp.get("connect_on_start",options.connect_on_start); vp.get("keepaway",options.keepaway); vp.get("keepaway_length",options.keepaway_length); vp.get("keepaway_width",options.keepaway_width); vp.get("list_player_types",options.list_player_types); vp.get("show_ball_collisions",options.show_ball_collisions); vp.get("just_edit",options.just_edit); res= vp.get("scale",tmp_double); if ( res == 1 ) options.set_scale_level_from_double(tmp_double); vp.get("detail", options.info_level); if (options.info_level < options.info_level_min) options.info_level= options.info_level_min; else if (options.info_level > options.info_level_max) options.info_level= options.info_level_max; char tmp_str[MAX_NAME_LEN]; res= vp.get("mode",tmp_str,MAX_NAME_LEN); if ( res > 0 ) { std::cout << "\nsetting mode [" << tmp_str << "]"; options.set_mode_from_string(tmp_str); std::cout << "\nnew mode: " << options.get_mode_string() << std::flush; } vp.get("player_radius",options.player_radius); vp.get("player_skin",options.player_skin); vp.get("kick_radius",options.kick_radius); vp.get("player_num_pos_x",options.player_num_pos.x); vp.get("player_num_pos_y",options.player_num_pos.y); vp.get("ball_radius",options.ball_radius); vp.get("ball_skin",options.ball_skin); char rgb_str[20]; vp.get("c_team_l",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_team_l); vp.get("c_goalie_l",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_goalie_l); vp.get("c_font_l",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_font_l); vp.get("c_team_r",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_team_r); vp.get("c_goalie_r",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_goalie_r); vp.get("c_font_r",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_font_r); vp.get("c_ball",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_ball); vp.get("c_field",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_field); vp.get("c_marigin",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_marigin); vp.get("c_line",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_line); vp.get("c_goal",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_goal); vp.get("c_varea_exact",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_varea_exact); vp.get("c_varea_fuzzy",rgb_str,20,'\0'); AsciiProcessor::get_col(rgb_str,options.c_varea_fuzzy); if ( vp.num_of_not_accessed_entries() ) { ERROR_OUT << "\nSMonitorDevice: not recognized options:"; vp.show_not_accessed_entries(ERROR_STREAM); return false; } return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -