X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2Fmultiplay.cxx;h=d37c42fdf5040cb98cdf7293e091b74f5a83669e;hb=ff408dc540b0944061b0b88bdad93b5de17dbab9;hp=ea286926b8112cda409ddb4d791941f31fd63863;hpb=5fe860750eb8b99401a64b6aca68cc7b3da5eac9;p=flightgear.git diff --git a/src/Network/multiplay.cxx b/src/Network/multiplay.cxx index ea286926b..d37c42fdf 100644 --- a/src/Network/multiplay.cxx +++ b/src/Network/multiplay.cxx @@ -19,7 +19,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // #ifdef HAVE_CONFIG_H @@ -28,7 +28,7 @@ #include -#include STL_STRING +#include #include #include @@ -37,12 +37,12 @@ #include #include -#include +#include #include #include "multiplay.hxx" -SG_USING_STD(string); +using std::string; // These constants are provided so that the ident command can list file versions. @@ -101,13 +101,12 @@ bool FGMultiplay::open() { SGPropertyNode* root = globals->get_props(); /// Build up the id to property map - unsigned i = 0; - while (FGMultiplayMgr::sIdPropertyList[i].name) { + + for (unsigned i = 0; i < FGMultiplayMgr::numProperties; ++i) { const char* name = FGMultiplayMgr::sIdPropertyList[i].name; SGPropertyNode* pNode = root->getNode(name); if (pNode) mPropertyMap[FGMultiplayMgr::sIdPropertyList[i].id] = pNode; - ++i; } return is_enabled(); @@ -120,7 +119,7 @@ bool FGMultiplay::open() { * or receive data over the network ******************************************************************/ bool FGMultiplay::process() { - + using namespace simgear; if (get_direction() == SG_IO_OUT) { // check if we have left initialization phase. That will not provide @@ -130,7 +129,7 @@ bool FGMultiplay::process() { // if (sim_time < 20) // return true; - FGInterface *ifce = cur_fdm_state; + FlightProperties ifce; // put together a motion info struct, you will get that later // from FGInterface directly ... @@ -151,39 +150,39 @@ bool FGMultiplay::process() { // These are for now converted from lat/lon/alt and euler angles. // But this should change in FGInterface ... - double lon = ifce->get_Longitude(); - double lat = ifce->get_Latitude(); + double lon = ifce.get_Longitude(); + double lat = ifce.get_Latitude(); // first the aprioriate structure for the geodetic one - SGGeod geod = SGGeod::fromRadFt(lon, lat, ifce->get_Altitude()); + SGGeod geod = SGGeod::fromRadFt(lon, lat, ifce.get_Altitude()); // Convert to cartesion coordinate - motionInfo.position = geod; + motionInfo.position = SGVec3d::fromGeod(geod); // The quaternion rotating from the earth centered frame to the // horizontal local frame SGQuatf qEc2Hl = SGQuatf::fromLonLatRad((float)lon, (float)lat); // The orientation wrt the horizontal local frame - float heading = ifce->get_Psi(); - float pitch = ifce->get_Theta(); - float roll = ifce->get_Phi(); + float heading = ifce.get_Psi(); + float pitch = ifce.get_Theta(); + float roll = ifce.get_Phi(); SGQuatf hlOr = SGQuatf::fromYawPitchRoll(heading, pitch, roll); // The orientation of the vehicle wrt the earth centered frame motionInfo.orientation = qEc2Hl*hlOr; - if (!ifce->is_suspended()) { + if (!globals->get_subsystem("flight")->is_suspended()) { // velocities - motionInfo.linearVel = SG_FEET_TO_METER*SGVec3f(ifce->get_U_body(), - ifce->get_V_body(), - ifce->get_W_body()); - motionInfo.angularVel = SGVec3f(ifce->get_P_body(), - ifce->get_Q_body(), - ifce->get_R_body()); + motionInfo.linearVel = SG_FEET_TO_METER*SGVec3f(ifce.get_uBody(), + ifce.get_vBody(), + ifce.get_wBody()); + motionInfo.angularVel = SGVec3f(ifce.get_P_body(), + ifce.get_Q_body(), + ifce.get_R_body()); // accels, set that to zero for now. // Angular accelerations are missing from the interface anyway, // linear accelerations are screwed up at least for JSBSim. -// motionInfo.linearAccel = SG_FEET_TO_METER*SGVec3f(ifce->get_U_dot_body(), -// ifce->get_V_dot_body(), -// ifce->get_W_dot_body()); +// motionInfo.linearAccel = SG_FEET_TO_METER*SGVec3f(ifce.get_U_dot_body(), +// ifce.get_V_dot_body(), +// ifce.get_W_dot_body()); motionInfo.linearAccel = SGVec3f::zeros(); motionInfo.angularAccel = SGVec3f::zeros(); } else { @@ -198,14 +197,68 @@ bool FGMultiplay::process() { // now send the properties PropertyMap::iterator it; for (it = mPropertyMap.begin(); it != mPropertyMap.end(); ++it) { - FGFloatPropertyData pData; - pData.id = it->first; - pData.value = it->second->getFloatValue(); + FGPropertyData* pData = new FGPropertyData; + pData->id = it->first; + pData->type = it->second->getType(); + + switch (pData->type) { + case props::INT: + case props::LONG: + case props::BOOL: + pData->int_value = it->second->getIntValue(); + break; + case props::FLOAT: + case props::DOUBLE: + pData->float_value = it->second->getFloatValue(); + break; + case props::STRING: + case props::UNSPECIFIED: + { + // FIXME: We assume unspecified are strings for the moment. + + const char* cstr = it->second->getStringValue(); + int len = strlen(cstr); + + if (len > 0) + { + pData->string_value = new char[len + 1]; + strcpy(pData->string_value, cstr); + } + else + { + // Size 0 - ignore + pData->string_value = 0; + } + + //cout << " Sending property " << pData->id << " " << pData->type << " " << pData->string_value << "\n"; + break; + } + default: + // FIXME Currently default to a float. + //cout << "Unknown type when iterating through props: " << pData->type << "\n"; + pData->float_value = it->second->getFloatValue(); + break; + } + motionInfo.properties.push_back(pData); } FGMultiplayMgr* mpmgr = globals->get_multiplayer_mgr(); mpmgr->SendMyPosition(motionInfo); + + // Now remove the data + std::vector::const_iterator propIt; + std::vector::const_iterator propItEnd; + propIt = motionInfo.properties.begin(); + propItEnd = motionInfo.properties.end(); + + //cout << "Deleting data\n"; + + while (propIt != propItEnd) + { + delete *propIt; + propIt++; + } } return true; @@ -219,13 +272,19 @@ bool FGMultiplay::process() { ******************************************************************/ bool FGMultiplay::close() { + FGMultiplayMgr *mgr = globals->get_multiplayer_mgr(); + + if (mgr == 0) { + return false; + } + if (get_direction() == SG_IO_IN) { - globals->get_multiplayer_mgr()->Close(); + mgr->Close(); } else if (get_direction() == SG_IO_OUT) { - globals->get_multiplayer_mgr()->Close(); + mgr->Close(); }