X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIMultiplayer.cxx;h=a34a92775635f1bbd2353b9ce71a528e56d74f6b;hb=7e73a8788223c9c2af3c26435162e0667b412279;hp=e7a3abd47eaad07591e9d7662dc27c75930c00ab;hpb=13ce1e48fb3d108865f51cd2c07898ecf12c900e;p=flightgear.git diff --git a/src/AIModel/AIMultiplayer.cxx b/src/AIModel/AIMultiplayer.cxx index e7a3abd47..a34a92775 100755 --- a/src/AIModel/AIMultiplayer.cxx +++ b/src/AIModel/AIMultiplayer.cxx @@ -43,21 +43,22 @@ FGAIMultiplayer::FGAIMultiplayer() : FGAIBase(otMultiplayer) { FGAIMultiplayer::~FGAIMultiplayer() { } -bool FGAIMultiplayer::init() { +bool FGAIMultiplayer::init(bool search_in_AI_path) { + props->setStringValue("sim/model/path", model_path.c_str()); //refuel_node = fgGetNode("systems/refuel/contact", true); isTanker = false; // do this until this property is // passed over the net - string str1 = mCallSign; + string str1 = _getCallsign(); string str2 = "MOBIL"; - unsigned int loc1= str1.find( str2, 0 ); + string::size_type loc1= str1.find( str2, 0 ); if ( (loc1 != string::npos && str2 != "") ){ // cout << " string found " << str2 << " in " << str1 << endl; isTanker = true; // cout << "isTanker " << isTanker << " " << mCallSign <(*this, &FGAIMultiplayer::get##name) SGRawValueMethods(*this, \ &FGAIMultiplayer::get##name, &FGAIMultiplayer::set##name) - props->tie("callsign", AIMPROProp(const char *, CallSign)); + //props->tie("callsign", AIMPROProp(const char *, CallSign)); props->tie("controls/allow-extrapolation", AIMPRWProp(bool, AllowExtrapolation)); @@ -88,7 +89,7 @@ SGRawValueMethods(*this, \ void FGAIMultiplayer::unbind() { FGAIBase::unbind(); - props->untie("callsign"); + //props->untie("callsign"); props->untie("controls/allow-extrapolation"); props->untie("controls/lag-adjust-system-speed"); props->untie("refuel/contact"); @@ -129,7 +130,8 @@ void FGAIMultiplayer::update(double dt) mTimeOffset = curentPkgTime - curtime - lag; } else { double offset = curentPkgTime - curtime - lag; - if (!mAllowExtrapolation && offset + lag < mTimeOffset) { + if ((!mAllowExtrapolation && offset + lag < mTimeOffset) + || (offset - 10 > mTimeOffset)) { mTimeOffset = offset; SG_LOG(SG_GENERAL, SG_DEBUG, "Resetting time offset adjust system to " "avoid extrapolation: time offset = " << mTimeOffset); @@ -187,15 +189,44 @@ void FGAIMultiplayer::update(double dt) ecOrient = firstIt->second.orientation; speed = norm(firstIt->second.linearVel) * SG_METER_TO_NM * 3600.0; - std::vector::const_iterator firstPropIt; - std::vector::const_iterator firstPropItEnd; + std::vector::const_iterator firstPropIt; + std::vector::const_iterator firstPropItEnd; firstPropIt = firstIt->second.properties.begin(); firstPropItEnd = firstIt->second.properties.end(); while (firstPropIt != firstPropItEnd) { - float val = firstPropIt->value; - PropertyMap::iterator pIt = mPropertyMap.find(firstPropIt->id); + //cout << " Setting property..." << (*firstPropIt)->id; + PropertyMap::iterator pIt = mPropertyMap.find((*firstPropIt)->id); if (pIt != mPropertyMap.end()) - pIt->second->setFloatValue(val); + { + //cout << "Found " << pIt->second->getPath() << ":"; + switch ((*firstPropIt)->type) { + case SGPropertyNode::INT: + case SGPropertyNode::BOOL: + case SGPropertyNode::LONG: + pIt->second->setIntValue((*firstPropIt)->int_value); + //cout << "Int: " << (*firstPropIt)->int_value << "\n"; + break; + case SGPropertyNode::FLOAT: + case SGPropertyNode::DOUBLE: + pIt->second->setFloatValue((*firstPropIt)->float_value); + //cout << "Flo: " << (*firstPropIt)->float_value << "\n"; + break; + case SGPropertyNode::STRING: + case SGPropertyNode::UNSPECIFIED: + pIt->second->setStringValue((*firstPropIt)->string_value); + //cout << "Str: " << (*firstPropIt)->string_value << "\n"; + break; + default: + // FIXME - currently defaults to float values + pIt->second->setFloatValue((*firstPropIt)->float_value); + //cout << "Unknown: " << (*firstPropIt)->float_value << "\n"; + break; + } + } + else + { + SG_LOG(SG_GENERAL, SG_DEBUG, "Unable to find property: " << (*firstPropIt)->id << "\n"); + } ++firstPropIt; } @@ -224,27 +255,90 @@ void FGAIMultiplayer::update(double dt) if (prevIt->second.properties.size() == nextIt->second.properties.size()) { - std::vector::const_iterator prevPropIt; - std::vector::const_iterator prevPropItEnd; - std::vector::const_iterator nextPropIt; - std::vector::const_iterator nextPropItEnd; + std::vector::const_iterator prevPropIt; + std::vector::const_iterator prevPropItEnd; + std::vector::const_iterator nextPropIt; + std::vector::const_iterator nextPropItEnd; prevPropIt = prevIt->second.properties.begin(); prevPropItEnd = prevIt->second.properties.end(); nextPropIt = nextIt->second.properties.begin(); nextPropItEnd = nextIt->second.properties.end(); while (prevPropIt != prevPropItEnd) { - float val = (1-tau)*prevPropIt->value + tau*nextPropIt->value; - PropertyMap::iterator pIt = mPropertyMap.find(prevPropIt->id); + PropertyMap::iterator pIt = mPropertyMap.find((*prevPropIt)->id); + //cout << " Setting property..." << (*prevPropIt)->id; + if (pIt != mPropertyMap.end()) - pIt->second->setFloatValue(val); + { + //cout << "Found " << pIt->second->getPath() << ":"; + + int ival; + float val; + switch ((*prevPropIt)->type) { + case SGPropertyNode::INT: + case SGPropertyNode::BOOL: + case SGPropertyNode::LONG: + ival = (int) (0.5+(1-tau)*((double) (*prevPropIt)->int_value) + + tau*((double) (*nextPropIt)->int_value)); + pIt->second->setIntValue(ival); + //cout << "Int: " << ival << "\n"; + break; + case SGPropertyNode::FLOAT: + case SGPropertyNode::DOUBLE: + val = (1-tau)*(*prevPropIt)->float_value + + tau*(*nextPropIt)->float_value; + //cout << "Flo: " << val << "\n"; + pIt->second->setFloatValue(val); + break; + case SGPropertyNode::STRING: + case SGPropertyNode::UNSPECIFIED: + //cout << "Str: " << (*nextPropIt)->string_value << "\n"; + pIt->second->setStringValue((*nextPropIt)->string_value); + break; + default: + // FIXME - currently defaults to float values + val = (1-tau)*(*prevPropIt)->float_value + + tau*(*nextPropIt)->float_value; + //cout << "Unk: " << val << "\n"; + pIt->second->setFloatValue(val); + break; + } + } + else + { + SG_LOG(SG_GENERAL, SG_DEBUG, "Unable to find property: " << (*prevPropIt)->id << "\n"); + } + ++prevPropIt; ++nextPropIt; } } // Now throw away too old data - if (prevIt != mMotionInfo.begin()) { + if (prevIt != mMotionInfo.begin()) + { --prevIt; + + MotionInfo::iterator delIt; + delIt = mMotionInfo.begin(); + + while (delIt != prevIt) + { + std::vector::const_iterator propIt; + std::vector::const_iterator propItEnd; + propIt = delIt->second.properties.begin(); + propItEnd = delIt->second.properties.end(); + + //cout << "Deleting data\n"; + + while (propIt != propItEnd) + { + delete *propIt; + propIt++; + } + + delIt++; + } + mMotionInfo.erase(mMotionInfo.begin(), prevIt); } } @@ -281,17 +375,46 @@ void FGAIMultiplayer::update(double dt) t -= h; } + std::vector::const_iterator firstPropIt; + std::vector::const_iterator firstPropItEnd; speed = norm(linearVel) * SG_METER_TO_NM * 3600.0; - - std::vector::const_iterator firstPropIt; - std::vector::const_iterator firstPropItEnd; firstPropIt = it->second.properties.begin(); firstPropItEnd = it->second.properties.end(); while (firstPropIt != firstPropItEnd) { - float val = firstPropIt->value; - PropertyMap::iterator pIt = mPropertyMap.find(firstPropIt->id); + PropertyMap::iterator pIt = mPropertyMap.find((*firstPropIt)->id); + //cout << " Setting property..." << (*firstPropIt)->id; + if (pIt != mPropertyMap.end()) - pIt->second->setFloatValue(val); + { + switch ((*firstPropIt)->type) { + case SGPropertyNode::INT: + case SGPropertyNode::BOOL: + case SGPropertyNode::LONG: + pIt->second->setIntValue((*firstPropIt)->int_value); + //cout << "Int: " << (*firstPropIt)->int_value << "\n"; + break; + case SGPropertyNode::FLOAT: + case SGPropertyNode::DOUBLE: + pIt->second->setFloatValue((*firstPropIt)->float_value); + //cout << "Flo: " << (*firstPropIt)->float_value << "\n"; + break; + case SGPropertyNode::STRING: + case SGPropertyNode::UNSPECIFIED: + pIt->second->setStringValue((*firstPropIt)->string_value); + //cout << "Str: " << (*firstPropIt)->string_value << "\n"; + break; + default: + // FIXME - currently defaults to float values + pIt->second->setFloatValue((*firstPropIt)->float_value); + //cout << "Unk: " << (*firstPropIt)->float_value << "\n"; + break; + } + } + else + { + SG_LOG(SG_GENERAL, SG_DEBUG, "Unable to find property: " << (*firstPropIt)->id << "\n"); + } + ++firstPropIt; } } @@ -347,9 +470,18 @@ FGAIMultiplayer::addMotionInfo(const FGExternalMotionData& motionInfo, long stamp) { mLastTimestamp = stamp; - // Drop packets arriving out of order - if (!mMotionInfo.empty() && motionInfo.time < mMotionInfo.rbegin()->first) - return; + + if (!mMotionInfo.empty()) { + double diff = motionInfo.time - mMotionInfo.rbegin()->first; + + // packet is very old -- MP has probably reset (incl. his timebase) + if (diff < -10.0) + mMotionInfo.clear(); + + // drop packets arriving out of order + else if (diff < 0.0) + return; + } mMotionInfo[motionInfo.time] = motionInfo; } @@ -359,4 +491,3 @@ FGAIMultiplayer::setDoubleProperty(const std::string& prop, double val) SGPropertyNode* pNode = props->getChild(prop.c_str(), true); pNode->setDoubleValue(val); } -