// ================================================ // OnPacketReceived(CigiBasePacket *Packet) // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv void PositionRequestP::OnPacketReceived(CigiBasePacket *Packet) { CigiPositionReqV3 *pr = (CigiPositionReqV3 *)(Packet); if( !trackerParamsMap ) return; if( pr->GetObjectClass() != CigiBasePositionReq::MotionTracker ) return; int trackerID = pr->GetObjectID(); std::map< int, TrackerParams * >::iterator tpIter = trackerParamsMap->find( trackerID ); if( tpIter == trackerParamsMap->end() ) { std::cout << "Warning: Host requested position for unknown motion tracker #" << trackerID << std::endl; return; } TrackerParams *trackerParams = (*tpIter).second; switch( pr->GetUpdateMode() ) { case CigiBasePositionReq::Continuous: trackerParams->positionRequestStatus = TrackerParams::PositionReqContinuous; break; case CigiBasePositionReq::OneShot: default: trackerParams->positionRequestStatus = TrackerParams::PositionReqOneShot; break; } }
// ================================================ // ProcPositionReq // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv void Entity::ProcPositionReq( CigiPositionReqV3 &Packet, CigiOutgoingMsg &Omsg ) { bool Valid = false; CigiPositionRespV3 Resp; if( Packet.GetObjectClass() == CigiBasePositionReq::Entity ) { Resp.SetObjectID( Packet.GetObjectID(), false ); Resp.SetArtPartID( Packet.GetArtPartID(), false ); Resp.SetObjectClass( ( CigiBasePositionResp::ObjectClassGrp )Packet.GetObjectClass(), false ); Resp.SetCoordSys( ( CigiBasePositionResp::CoordSysGrp )Packet.GetCoordSys(), false ); if( Packet.GetCoordSys() == CigiBasePositionReq::Geodetic ) { if( !IsChild ) { Resp.SetLatOrXoff( CigiPos.LatX, false ); Resp.SetLonOrYoff( CigiPos.LonY, false ); Resp.SetAltOrZoff( CigiPos.AltZ, false ); Resp.SetYaw(( float )CigiPos.Yaw, false ); Resp.SetPitch(( float )CigiPos.Pitch, false ); Resp.SetRoll(( float )CigiPos.Roll, false ); Valid = true; } // If a geodetic coord position request for a child entity // is received, the entity manager will process it // because the manager will have to go through all the // parents and develop a complete transformation // matrix. } else if( Packet.GetCoordSys() == CigiBasePositionReq::ParentEntity ) { if( IsChild ) { Resp.SetLatOrXoff( CigiPos.LatX, false ); Resp.SetLonOrYoff( CigiPos.LonY, false ); Resp.SetAltOrZoff( CigiPos.AltZ, false ); Resp.SetYaw(( float )CigiPos.Yaw, false ); Resp.SetPitch(( float )CigiPos.Pitch, false ); Resp.SetRoll(( float )CigiPos.Roll, false ); Valid = true; } } } else if( Packet.GetCoordSys() == CigiBasePositionReq::Submodel ) // Articulated part { // Only respond to Submodel coordinate system requests for // an articulated response ProcArtPartPositionReq( Packet, Omsg ); } if( Valid ) Omsg << Resp; }
void XPositionReqV3::OnPacketReceived(CigiBasePacket *Packet) { CigiPositionReqV3 *InPckt = (CigiPositionReqV3 *)Packet; bool ok = true; printf("Position Request\n"); printf("\tObject ID = %d\n",InPckt->GetObjectID()); printf("\tArticulated Part ID = %d\n",InPckt->GetArtPartID()); printf("\tUpdate Mode = %d : ",InPckt->GetUpdateMode()); switch(InPckt->GetUpdateMode()) { case 0: printf("OneShot\n"); break; case 1: printf("Continuous\n"); break; default: printf("\n"); break; } printf("\tObject Class = %d : ",InPckt->GetObjectClass()); switch(InPckt->GetObjectClass()) { case 0: printf("Entity\n"); break; case 1: printf("ArtPart\n"); break; case 2: printf("View\n"); break; case 3: printf("ViewGrp\n"); break; case 4: printf("MotionTracker\n"); break; default: printf("\n"); break; } printf("\tCoordinate System = %d : ",InPckt->GetCoordSys()); switch(InPckt->GetCoordSys()) { case 0: printf("Geodetic\n"); break; case 1: printf("ParentEntity\n"); break; case 2: printf("Submodel\n"); break; default: printf("\n"); break; } }