dispsender.cpp
来自「2009 ROBOCUP 仿真2DSERVER 源码」· C++ 代码 · 共 971 行 · 第 1/2 页
CPP
971 行
{}voidDispSenderMonitorV4::sendShow(){ static std::string message; static int last_sent_time = -1; static int last_sent_stoppage_time = -1; // // send cached data // if ( stadium().time() == last_sent_time && stadium().stoppageTime() == last_sent_stoppage_time ) { transport() << message << std::ends << std::flush; return; } last_sent_time = stadium().time(); last_sent_stoppage_time = stadium().stoppageTime(); message.erase(); // // create new data // std::ostringstream ostr; serializer().serializeShowBegin( ostr, stadium().time() ); serializer().serializePlayModeId( ostr, stadium().playmode() ); serializer().serializeScore( ostr, stadium().teamLeft(), stadium().teamRight() ); serializer().serializeBall( ostr, stadium().ball() ); const Stadium::PlayerCont::const_iterator end = stadium().players().end(); for ( Stadium::PlayerCont::const_iterator p = stadium().players().begin(); p != end; ++p ) { serializer().serializePlayerBegin( ostr, **p ); serializer().serializePlayerPos( ostr, **p ); serializer().serializePlayerArm( ostr, **p ); serializer().serializePlayerViewMode( ostr, **p ); serializer().serializePlayerStamina( ostr, **p ); serializer().serializePlayerFocus( ostr, **p ); serializer().serializePlayerCounts( ostr, **p ); serializer().serializePlayerEnd( ostr ); } serializer().serializeShowEnd( ostr ); message = ostr.str(); transport() << message << std::ends << std::flush;}voidDispSenderMonitorV4::sendMsg(){}/*!//===================================================================//// CLASS: DispSenderLogger//// DESC: Base class for the display protocol for logger.////===================================================================*/DispSenderLogger::FactoryHolder &DispSenderLogger::factory(){ static FactoryHolder rval; return rval;}DispSenderLogger::DispSenderLogger( const Params & params ) : DispSender( params.M_transport ) , M_serializer( params.M_serializer ) , M_self( params.M_self ) , M_stadium( params.M_stadium ){}DispSenderLogger::~DispSenderLogger(){ //std::cerr << "delete DispSenderLogger" << std::endl;}/*!//===================================================================//// CLASS: DispSenderLoggerV1//// DESC: version 1 log format////===================================================================*/DispSenderLoggerV1::DispSenderLoggerV1( const Params & params ) : DispSenderLogger( params ){}DispSenderLoggerV1::~DispSenderLoggerV1(){}voidDispSenderLoggerV1::sendShow(){ dispinfo_t disp; disp.mode = htons( SHOW_MODE ); disp.body.show.time = htons( stadium().time() ); disp.body.show.pmode = static_cast< char >( stadium().playmode() ); disp.body.show.pos[0].x = htons( (Int16)rint( ( stadium().ball().pos().x * SHOWINFO_SCALE ) ) ); disp.body.show.pos[0].y = htons( (Int16)rint( ( stadium().ball().pos().y * SHOWINFO_SCALE ) ) ); const Stadium::PlayerCont & players = stadium().players(); for ( int i = 0; i < MAX_PLAYER * 2; ++i ) { disp.body.show.pos[i+1].enable = htons( players[i]->state() ); disp.body.show.pos[i+1].x = htons( (Int16)rint( players[i]->pos().x * SHOWINFO_SCALE ) ); disp.body.show.pos[i+1].y = htons( (Int16)rint( players[i]->pos().y * SHOWINFO_SCALE ) ); disp.body.show.pos[i+1].angle = htons( (Int16)Rad2IDegRound( players[i]->angleBodyCommitted() ) ); disp.body.show.pos[i+1].side = htons( players[i]->side() ); disp.body.show.pos[i+1].unum = htons( players[i]->unum() ); } if ( ! stadium().teamLeft().name().empty() ) { std::strncpy( disp.body.show.team[0].name, stadium().teamLeft().name().c_str(), std::min( stadium().teamLeft().name().length() + 1, size_t( 16 ) ) ); disp.body.show.team[0].score = htons( stadium().teamLeft().point() ); } else { std::memset( &disp.body.show.team[0].name, 0, sizeof( disp.body.show.team[0].name ) ); } if ( ! stadium().teamRight().name().empty() ) { std::strncpy( disp.body.show.team[1].name, stadium().teamRight().name().c_str(), std::min( stadium().teamRight().name().length() + 1, size_t( 16 ) ) ); disp.body.show.team[1].score = htons( stadium().teamRight().point() ); } else { std::memset( &disp.body.show.team[1].name, 0, sizeof( disp.body.show.team[1].name ) ); } transport().write( reinterpret_cast< const char * >( &disp ), sizeof( dispinfo_t ) ); //transport().flush();}voidDispSenderLoggerV1::sendMsg(){}/*!//===================================================================//// CLASS: DispSenderLoggerV2//// DESC: version 2 log format////===================================================================*/DispSenderLoggerV2::DispSenderLoggerV2( const Params & params ) : DispSenderLoggerV1( params ){}DispSenderLoggerV2::~DispSenderLoggerV2(){}voidDispSenderLoggerV2::sendShow(){ Int16 mode = htons( SHOW_MODE ); showinfo_t show; show.time = htons( stadium().time() ); show.pmode = static_cast< char >( stadium().playmode() ); show.pos[0].x = htons( (Int16)rint( ( stadium().ball().pos().x * SHOWINFO_SCALE ) ) ); show.pos[0].y = htons( (Int16)rint( ( stadium().ball().pos().y * SHOWINFO_SCALE ) ) ); const Stadium::PlayerCont & players = stadium().players(); for ( int i = 0; i < MAX_PLAYER * 2; ++i ) { show.pos[i+1].enable = htons( players[i]->state() ); show.pos[i+1].x = htons( (Int16)rint( players[i]->pos().x * SHOWINFO_SCALE ) ); show.pos[i+1].y = htons( (Int16)rint( players[i]->pos().y * SHOWINFO_SCALE ) ); show.pos[i+1].angle = htons( (Int16)Rad2IDegRound( players[i]->angleBodyCommitted() ) ); show.pos[i+1].side = htons( players[i]->side() ); show.pos[i+1].unum = htons( players[i]->unum() ); } if ( ! stadium().teamLeft().name().empty() ) { std::strncpy( show.team[0].name, stadium().teamLeft().name().c_str(), std::min( stadium().teamLeft().name().length() + 1, size_t( 16 ) ) ); show.team[0].score = htons( stadium().teamLeft().point() ); } else { std::memset( &show.team[0].name, 0, sizeof( show.team[0].name ) ); show.team[0].score = htons( 0 ); } if ( ! stadium().teamRight().name().empty() ) { std::strncpy( show.team[1].name, stadium().teamRight().name().c_str(), std::min( stadium().teamRight().name().length() + 1, size_t( 16 ) ) ); show.team[1].score = htons( stadium().teamRight().point() ); } else { std::memset( &show.team[1].name, 0, sizeof( show.team[1].name ) ); show.team[1].score = htons( 0 ); } // write a show struct transport().write( reinterpret_cast< const char * >( &mode ), sizeof( Int16 ) ); transport().write( reinterpret_cast< const char * >( &show ), sizeof( showinfo_t ) ); //transport().flush();}voidDispSenderLoggerV2::sendMsg(){}/*!//===================================================================//// CLASS: DispSenderLoggerV3//// DESC: version 3 log format////===================================================================*/DispSenderLoggerV3::DispSenderLoggerV3( const Params & params ) : DispSenderLoggerV2( params ){}DispSenderLoggerV3::~DispSenderLoggerV3(){}voidDispSenderLoggerV3::sendShow(){ Int16 mode = htons( SHOW_MODE ); short_showinfo_t2 show; show.time = htons( stadium().time() ); show.ball.x = htonl( (Int32)rint( ( stadium().ball().pos().x * SHOWINFO_SCALE2 ) ) ); show.ball.y = htonl( (Int32)rint( ( stadium().ball().pos().y * SHOWINFO_SCALE2 ) ) ); show.ball.deltax = htonl( (Int32)rint( ( stadium().ball().vel().x * SHOWINFO_SCALE2 ) ) ); show.ball.deltay = htonl( (Int32)rint( ( stadium().ball().vel().y * SHOWINFO_SCALE2) ) ); const Stadium::PlayerCont & players = stadium().players(); for ( int i = 0; i < MAX_PLAYER * 2; ++i ) { show.pos[i].mode = htons( players[i]->state() ); show.pos[i].type = htons( players[i]->playerTypeId() ); show.pos[i].x = htonl( (Int32)rint( players[i]->pos().x * SHOWINFO_SCALE2 ) ); show.pos[i].y = htonl( (Int32)rint( players[i]->pos().y * SHOWINFO_SCALE2 ) ); show.pos[i].deltax = htonl( (Int32)rint( players[i]->vel().x * SHOWINFO_SCALE2 ) ); show.pos[i].deltay = htonl( (Int32)rint( players[i]->vel().y * SHOWINFO_SCALE2 ) ); show.pos[i].body_angle = htonl( (Int32)rint( players[i]->angleBodyCommitted() * SHOWINFO_SCALE2 ) ); show.pos[i].head_angle = htonl( (Int32)rint( players[i]->angleNeckCommitted() * SHOWINFO_SCALE2 ) ); show.pos[i].view_width = htonl( (Int32)rint( players[i]->visibleAngle() * SHOWINFO_SCALE2 ) ); show.pos[i].view_quality = htons( (Int16)rint( players[i]->highquality() ) ); show.pos[i].stamina = htonl( (Int32)rint( players[i]->stamina() * SHOWINFO_SCALE2 ) ); show.pos[i].effort = htonl( (Int32)rint( players[i]->effort() * SHOWINFO_SCALE2 ) ); show.pos[i].recovery = htonl( (Int32)rint( players[i]->recovery() * SHOWINFO_SCALE2 ) ); show.pos[i].kick_count = htons( players[i]->kickCount() ); show.pos[i].dash_count = htons( players[i]->dashCount() ); show.pos[i].turn_count = htons( players[i]->turnCount() ); show.pos[i].say_count = htons( players[i]->sayCount() ); show.pos[i].tneck_count = htons( players[i]->turnNeckCount() ); show.pos[i].catch_count = htons( players[i]->catchCount() ); show.pos[i].move_count = htons( players[i]->moveCount() ); show.pos[i].chg_view_count = htons( players[i]->changeViewCount() ); } transport().write( reinterpret_cast< const char * >( &mode ), sizeof( mode ) ); transport().write( reinterpret_cast< const char * >( &show ), sizeof( short_showinfo_t2 ) ); //transport().flush();}voidDispSenderLoggerV3::sendMsg(){}/*!//===================================================================//// CLASS: DispSenderLoggerV4//// DESC: version 4 log format////===================================================================*/DispSenderLoggerV4::DispSenderLoggerV4( const Params & params ) : DispSenderLoggerV3( params ){}DispSenderLoggerV4::~DispSenderLoggerV4(){}voidDispSenderLoggerV4::sendShow(){ serializer().serializeShowBegin( transport(), stadium().time() ); serializer().serializeBall( transport(), stadium().ball() ); const Stadium::PlayerCont::const_iterator end = stadium().players().end(); for ( Stadium::PlayerCont::const_iterator p = stadium().players().begin(); p != end; ++p ) { serializer().serializePlayerBegin( transport(), **p ); serializer().serializePlayerPos( transport(), **p ); serializer().serializePlayerArm( transport(), **p ); serializer().serializePlayerViewMode( transport(), **p ); serializer().serializePlayerStamina( transport(), **p ); serializer().serializePlayerFocus( transport(), **p ); serializer().serializePlayerCounts( transport(), **p ); serializer().serializePlayerEnd( transport() ); } serializer().serializeShowEnd( transport() ); transport() << '\n';}voidDispSenderLoggerV4::sendMsg(){}// /*!// //===================================================================// //// // CLASS: DispSenderLoggerV5// //// // DESC: version 5 log format// //// //===================================================================// */// DispSenderLoggerV5::DispSenderLoggerV5( const Params & params )// : DispSenderLoggerV4( params )// {// }// DispSenderLoggerV5::~DispSenderLoggerV5()// {// }// void// DispSenderLoggerV5::sendShow()// {// DispSenderLoggerV4::sendShow();// }// void// DispSenderLoggerV4::sendMsg()// {// }namespace dispsender {template< typename Sender >DispSenderMonitor::Ptrcreate( const DispSenderMonitor::Params & params ){ return DispSenderMonitor::Ptr( new Sender( params ) );}RegHolder vm1 = DispSenderMonitor::factory().autoReg( &create< DispSenderMonitorV1 >, 1 );RegHolder vm2 = DispSenderMonitor::factory().autoReg( &create< DispSenderMonitorV2 >, 2 );RegHolder vm3 = DispSenderMonitor::factory().autoReg( &create< DispSenderMonitorV3 >, 3 );RegHolder vm4 = DispSenderMonitor::factory().autoReg( &create< DispSenderMonitorV4 >, 4 );template< typename Sender >DispSenderLogger::Ptrcreate( const DispSenderLogger::Params & params ){ return DispSenderLogger::Ptr( new Sender( params ) );}RegHolder vl1 = DispSenderLogger::factory().autoReg( &create< DispSenderLoggerV1 >, 1 );RegHolder vl2 = DispSenderLogger::factory().autoReg( &create< DispSenderLoggerV2 >, 2 );RegHolder vl3 = DispSenderLogger::factory().autoReg( &create< DispSenderLoggerV3 >, 3 );RegHolder vl4 = DispSenderLogger::factory().autoReg( &create< DispSenderLoggerV4 >, 4 );RegHolder vl5 = DispSenderLogger::factory().autoReg( &create< DispSenderLoggerV4 >, 5 );}}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?