1
0
Fork 0

Maik JUSTUS: update (messages are only temporary and for testing purposes)

This commit is contained in:
mfranz 2007-01-20 21:08:04 +00:00
parent 46d16035fb
commit 5e2f46e232
2 changed files with 133 additions and 137 deletions

View file

@ -1,8 +1,8 @@
#include "Math.hpp" #include "Math.hpp"
#include "BodyEnvironment.hpp" #include "BodyEnvironment.hpp"
#include "RigidBody.hpp" #include "RigidBody.hpp"
#include <Main/fg_props.hxx>
#include <string.h> #include <string.h>
#include <sstream>
@ -64,93 +64,90 @@ Hitch::Hitch(const char *name)
//tie the properties //tie the properties
char text[128]; char text[128];
sprintf(text,"/sim/hitches/%s", _name); sprintf(text,"/sim/hitches/%s", _name);
SGPropertyNode * node = fgGetNode(text, true); _node = fgGetNode(text, true);
node->tie("tow/length",SGRawValuePointer<float>(&_towLength)); _node->tie("tow/length",SGRawValuePointer<float>(&_towLength));
node->tie("tow/elastic-constant",SGRawValuePointer<float>(&_towElasticConstant)); _node->tie("tow/elastic-constant",SGRawValuePointer<float>(&_towElasticConstant));
node->tie("tow/weight-per-m-kg-m",SGRawValuePointer<float>(&_towWeightPerM)); _node->tie("tow/weight-per-m-kg-m",SGRawValuePointer<float>(&_towWeightPerM));
node->tie("tow/brake-force",SGRawValuePointer<float>(&_towBrakeForce)); _node->tie("tow/brake-force",SGRawValuePointer<float>(&_towBrakeForce));
node->tie("winch/max-speed-m-s",SGRawValuePointer<float>(&_winchMaxSpeed)); _node->tie("winch/max-speed-m-s",SGRawValuePointer<float>(&_winchMaxSpeed));
node->tie("winch/rel-speed",SGRawValuePointer<float>(&_winchRelSpeed)); _node->tie("winch/rel-speed",SGRawValuePointer<float>(&_winchRelSpeed));
node->tie("winch/initial-tow-length-m",SGRawValuePointer<float>(&_winchInitialTowLength)); _node->tie("winch/initial-tow-length-m",SGRawValuePointer<float>(&_winchInitialTowLength));
node->tie("winch/min-tow-length-m",SGRawValuePointer<float>(&_winchMinTowLength)); _node->tie("winch/min-tow-length-m",SGRawValuePointer<float>(&_winchMinTowLength));
node->tie("winch/max-tow-length-m",SGRawValuePointer<float>(&_winchMaxTowLength)); _node->tie("winch/max-tow-length-m",SGRawValuePointer<float>(&_winchMaxTowLength));
node->tie("winch/global-pos-x",SGRawValuePointer<double>(&_winchPos[0])); _node->tie("winch/global-pos-x",SGRawValuePointer<double>(&_winchPos[0]));
node->tie("winch/global-pos-y",SGRawValuePointer<double>(&_winchPos[1])); _node->tie("winch/global-pos-y",SGRawValuePointer<double>(&_winchPos[1]));
node->tie("winch/global-pos-z",SGRawValuePointer<double>(&_winchPos[2])); _node->tie("winch/global-pos-z",SGRawValuePointer<double>(&_winchPos[2]));
node->tie("winch/max-power",SGRawValuePointer<float>(&_winchPower)); _node->tie("winch/max-power",SGRawValuePointer<float>(&_winchPower));
node->tie("winch/max-force",SGRawValuePointer<float>(&_winchMaxForce)); _node->tie("winch/max-force",SGRawValuePointer<float>(&_winchMaxForce));
node->tie("winch/actual-force",SGRawValuePointer<float>(&_winchActualForce)); _node->tie("winch/actual-force",SGRawValuePointer<float>(&_winchActualForce));
node->tie("tow/end-force-x",SGRawValuePointer<float>(&_reportTowEndForce[0])); _node->tie("tow/end-force-x",SGRawValuePointer<float>(&_reportTowEndForce[0]));
node->tie("tow/end-force-y",SGRawValuePointer<float>(&_reportTowEndForce[1])); _node->tie("tow/end-force-y",SGRawValuePointer<float>(&_reportTowEndForce[1]));
node->tie("tow/end-force-z",SGRawValuePointer<float>(&_reportTowEndForce[2])); _node->tie("tow/end-force-z",SGRawValuePointer<float>(&_reportTowEndForce[2]));
node->tie("force",SGRawValuePointer<float>(&_forceMagnitude)); _node->tie("force",SGRawValuePointer<float>(&_forceMagnitude));
node->tie("open",SGRawValuePointer<bool>(&_open)); _node->tie("open",SGRawValuePointer<bool>(&_open));
node->tie("force-is-calculated-by-other",SGRawValuePointer<bool>(&_forceIsCalculatedByMaster)); _node->tie("force-is-calculated-by-other",SGRawValuePointer<bool>(&_forceIsCalculatedByMaster));
node->tie("local-pos-x",SGRawValuePointer<float>(&_pos[0])); _node->tie("local-pos-x",SGRawValuePointer<float>(&_pos[0]));
node->tie("local-pos-y",SGRawValuePointer<float>(&_pos[1])); _node->tie("local-pos-y",SGRawValuePointer<float>(&_pos[1]));
node->tie("local-pos-z",SGRawValuePointer<float>(&_pos[2])); _node->tie("local-pos-z",SGRawValuePointer<float>(&_pos[2]));
node->tie("tow/dist",SGRawValuePointer<float>(&_dist)); _node->tie("tow/dist",SGRawValuePointer<float>(&_dist));
node->tie("tow/dist-time-lag-corrected",SGRawValuePointer<float>(&_timeLagCorrectedDist)); _node->tie("tow/dist-time-lag-corrected",SGRawValuePointer<float>(&_timeLagCorrectedDist));
node->tie("tow/connected-to-property-node",SGRawValuePointer<bool>(&_towEndIsConnectedToProperty)); _node->tie("tow/connected-to-property-node",SGRawValuePointer<bool>(&_towEndIsConnectedToProperty));
node->tie("tow/connected-to-mp-node",SGRawValuePointer<bool>(&_nodeIsMultiplayer)); _node->tie("tow/connected-to-mp-node",SGRawValuePointer<bool>(&_nodeIsMultiplayer));
node->tie("tow/connected-to-ai-node",SGRawValuePointer<bool>(&_nodeIsAiAircraft)); _node->tie("tow/connected-to-ai-node",SGRawValuePointer<bool>(&_nodeIsAiAircraft));
node->tie("tow/connected-to-ai-or-mp-id",SGRawValuePointer<int>(&_nodeID)); _node->tie("tow/connected-to-ai-or-mp-id",SGRawValuePointer<int>(&_nodeID));
node->tie("debug/hitch-height-above-ground",SGRawValuePointer<float>(&_height_above_ground)); _node->tie("debug/hitch-height-above-ground",SGRawValuePointer<float>(&_height_above_ground));
node->tie("debug/tow-end-height-above-ground",SGRawValuePointer<float>(&_winch_height_above_ground)); _node->tie("debug/tow-end-height-above-ground",SGRawValuePointer<float>(&_winch_height_above_ground));
node->tie("debug/tow-rel-lo-pos",SGRawValuePointer<float>(&_loPosFrac)); _node->tie("debug/tow-rel-lo-pos",SGRawValuePointer<float>(&_loPosFrac));
node->tie("debug/tow-lowest-pos-height",SGRawValuePointer<float>(&_lowest_tow_height)); _node->tie("debug/tow-lowest-pos-height",SGRawValuePointer<float>(&_lowest_tow_height));
node->tie("is-slave",SGRawValuePointer<bool>(&_isSlave)); _node->tie("is-slave",SGRawValuePointer<bool>(&_isSlave));
node->tie("speed-in-tow-direction",SGRawValuePointer<float>(&_speed_in_tow_direction)); _node->tie("speed-in-tow-direction",SGRawValuePointer<float>(&_speed_in_tow_direction));
node->tie("mp-auto-connect-period",SGRawValuePointer<float>(&_mpAutoConnectPeriod)); _node->tie("mp-auto-connect-period",SGRawValuePointer<float>(&_mpAutoConnectPeriod));
node->tie("mp-time-lag",SGRawValuePointer<float>(&_mp_time_lag)); _node->tie("mp-time-lag",SGRawValuePointer<float>(&_mp_time_lag));
node->setStringValue("tow/node",""); _node->setStringValue("tow/node","");
node->setStringValue("tow/connected-to-ai-or-mp-callsign"); _node->setStringValue("tow/connected-to-ai-or-mp-callsign");
node->setBoolValue("broken",false); _node->setBoolValue("broken",false);
} }
Hitch::~Hitch() Hitch::~Hitch()
{ {
char text[128]; _node->untie("tow/length");
sprintf(text,"/sim/hitches/%s", _name); _node->untie("tow/elastic-constant");
SGPropertyNode * node = fgGetNode(text, true); _node->untie("tow/weight-per-m-kg-m");
node->untie("tow/length"); _node->untie("tow/brake-force");
node->untie("tow/elastic-constant"); _node->untie("winch/max-speed-m-s");
node->untie("tow/weight-per-m-kg-m"); _node->untie("winch/rel-speed");
node->untie("tow/brake-force"); _node->untie("winch/initial-tow-length-m");
node->untie("winch/max-speed-m-s"); _node->untie("winch/min-tow-length-m");
node->untie("winch/rel-speed"); _node->untie("winch/max-tow-length-m");
node->untie("winch/initial-tow-length-m"); _node->untie("winch/global-pos-x");
node->untie("winch/min-tow-length-m"); _node->untie("winch/global-pos-y");
node->untie("winch/max-tow-length-m"); _node->untie("winch/global-pos-z");
node->untie("winch/global-pos-x"); _node->untie("winch/max-power");
node->untie("winch/global-pos-y"); _node->untie("winch/max-force");
node->untie("winch/global-pos-z"); _node->untie("winch/actual-force");
node->untie("winch/max-power"); _node->untie("tow/end-force-x");
node->untie("winch/max-force"); _node->untie("tow/end-force-y");
node->untie("winch/actual-force"); _node->untie("tow/end-force-z");
node->untie("tow/end-force-x"); _node->untie("force");
node->untie("tow/end-force-y"); _node->untie("open");
node->untie("tow/end-force-z"); _node->untie("force-is-calculated-by-other");
node->untie("force"); _node->untie("local-pos-x");
node->untie("open"); _node->untie("local-pos-y");
node->untie("force-is-calculated-by-other"); _node->untie("local-pos-z");
node->untie("local-pos-x"); _node->untie("tow/dist");
node->untie("local-pos-y"); _node->untie("tow/dist-time-lag-corrected");
node->untie("local-pos-z"); _node->untie("tow/connected-to-property-node");
node->untie("tow/dist"); _node->untie("tow/connected-to-mp-node");
node->untie("tow/dist-time-lag-corrected"); _node->untie("tow/connected-to-ai-node");
node->untie("tow/connected-to-property-node"); _node->untie("tow/connected-to-ai-or-mp-id");
node->untie("tow/connected-to-mp-node"); _node->untie("debug/hitch-height-above-ground");
node->untie("tow/connected-to-ai-node"); _node->untie("debug/tow-end-height-above-ground");
node->untie("tow/connected-to-ai-or-mp-id"); _node->untie("debug/tow-rel-lo-pos");
node->untie("debug/hitch-height-above-ground"); _node->untie("debug/tow-lowest-pos-height");
node->untie("debug/tow-end-height-above-ground"); _node->untie("is-slave");
node->untie("debug/tow-rel-lo-pos"); _node->untie("speed-in-tow-direction");
node->untie("debug/tow-lowest-pos-height"); _node->untie("mp-auto-connect-period");
node->untie("is-slave"); _node->untie("mp-time-lag");
node->untie("speed-in-tow-direction");
node->untie("mp-auto-connect-period");
node->untie("mp-time-lag");
delete _state; delete _state;
} }
@ -275,13 +272,10 @@ void Hitch::setWinchPositionAuto(bool doit)
_state->posLocalToGlobal(lWinchPos,_winchPos); _state->posLocalToGlobal(lWinchPos,_winchPos);
_towLength=_winchInitialTowLength; _towLength=_winchInitialTowLength;
SG_LOG(SG_GENERAL, SG_ALERT,"Set the winch pos to "<<_winchPos[0]<<","<<_winchPos[1]<<","<<_winchPos[2]<<endl); fgGetNode("/sim/messages/pilot", true)->setStringValue("coonected to winch!");
_open=false; _open=false;
char text[512]; _node->setBoolValue("broken",false);
sprintf(text,"/sim/hitches/%s", _name);
SGPropertyNode * node = fgGetNode(text, true);
node->setBoolValue("broken",false);
//set the dist value (if not, the hitch would open in the next calcforce run //set the dist value (if not, the hitch would open in the next calcforce run
//float delta[3]; //float delta[3];
@ -354,27 +348,30 @@ void Hitch::findBestAIObject(bool doit,bool running_as_autoconnect)
bestdist=dist; bestdist=dist;
_towEndNode=n; _towEndNode=n;
_towEndIsConnectedToProperty=true; _towEndIsConnectedToProperty=true;
char text[512]; //_node->setStringValue("tow/node",n->getPath());
sprintf(text,"/sim/hitches/%s", _name); _node->setStringValue("tow/node",n->getDisplayName());
SGPropertyNode * node = fgGetNode(text, true);
//node->setStringValue("tow/node",n->getPath());
node->setStringValue("tow/node",n->getDisplayName());
_nodeID=n->getIntValue("id",0); _nodeID=n->getIntValue("id",0);
node->setStringValue("tow/connected-to-ai-or-mp-callsign",n->getStringValue("callsign")); _node->setStringValue("tow/connected-to-ai-or-mp-callsign",n->getStringValue("callsign"));
_open=false; _open=false;
found = true; found = true;
} }
} }
if (found) if (found)
{ {
char text[512]; if (!running_as_autoconnect)
sprintf(text,"/sim/hitches/%s", _name); {
SGPropertyNode * node = fgGetNode(text, true); std::stringstream message;
//if (!running_as_autoconnect) message<<_node->getStringValue("tow/connected-to-ai-or-mp-callsign")
SG_LOG(SG_GENERAL, SG_ALERT,"Found aircraft for aerotow: " <<", I am on your hook, distance "<<Math::sqrt(bestdist)<<"m";
<<node->getStringValue("tow/connected-to-ai-or-mp-callsign") fgGetNode("/sim/messages/pilot", true)->setStringValue(message.str().c_str());
<<", distance "<<Math::sqrt(bestdist)<<"m at " }
<<node->getStringValue("tow/node")<<endl); else
{
std::stringstream message;
message<<_node->getStringValue("tow/connected-to-ai-or-mp-callsign")
<<": I am on your hook, distance "<<Math::sqrt(bestdist)<<"m";
fgGetNode("/sim/messages/ai-plane", true)->setStringValue(message.str().c_str());
}
if (running_as_autoconnect) if (running_as_autoconnect)
_isSlave=true; _isSlave=true;
//set the dist value to some value below the tow lentgh (if not, the hitch //set the dist value to some value below the tow lentgh (if not, the hitch
@ -384,7 +381,9 @@ void Hitch::findBestAIObject(bool doit,bool running_as_autoconnect)
} }
else else
if (!running_as_autoconnect) if (!running_as_autoconnect)
SG_LOG(SG_GENERAL, SG_ALERT,"Found no aircraft for aerotow!"<<endl); {
fgGetNode("/sim/messages/atc", true)->setStringValue("Sorry, no aircraft for aerotow!");
}
} }
void Hitch::setWinchInitialTowLength(float length) void Hitch::setWinchInitialTowLength(float length)
@ -467,10 +466,7 @@ void Hitch::calcForce(Ground *g_cb, RigidBody* body, State* s)
{ {
_forceMagnitude=0; _forceMagnitude=0;
_open=true; _open=true;
char text[128]; _node->setBoolValue("broken",true);
sprintf(text,"/sim/hitches/%s", _name);
SGPropertyNode * node = fgGetNode(text, true);
node->setBoolValue("broken",true);
_force[0]=_force[1]=_force[2]=0; _force[0]=_force[1]=_force[2]=0;
_towEndForce[0]=_towEndForce[1]=_towEndForce[2]=0; _towEndForce[0]=_towEndForce[1]=_towEndForce[2]=0;
_reportTowEndForce[0]=_reportTowEndForce[1]=_reportTowEndForce[2]=0; _reportTowEndForce[0]=_reportTowEndForce[1]=_reportTowEndForce[2]=0;
@ -561,10 +557,7 @@ void Hitch::calcForce(Ground *g_cb, RigidBody* body, State* s)
{ {
_forceMagnitude=0; _forceMagnitude=0;
_open=true; _open=true;
char text[128]; _node->setBoolValue("broken",true);
sprintf(text,"/sim/hitches/%s", _name);
SGPropertyNode * node = fgGetNode(text, true);
node->setBoolValue("broken",true);
_force[0]=_force[1]=_force[2]=0; _force[0]=_force[1]=_force[2]=0;
_towEndForce[0]=_towEndForce[1]=_towEndForce[2]=0; _towEndForce[0]=_towEndForce[1]=_towEndForce[2]=0;
} }
@ -588,16 +581,20 @@ void Hitch::integrate (float dt)
{ {
if (_dist>_towLength*1.00001) if (_dist>_towLength*1.00001)
{ {
SG_LOG(SG_GENERAL, SG_ALERT,"Could not lock Hinch (tow length is insufficient) on hitch '"<<_name<<"' !"<<endl); std::stringstream message;
message<<"Could not lock Hitch (tow length is insufficient) on hitch '"<<_name<<"' !";
fgGetNode("/sim/messages/pilot", true)->setStringValue(message.str().c_str());
_open=true; _open=true;
return; return;
} }
char text[512]; _node->setBoolValue("broken",false);
sprintf(text,"/sim/hitches/%s", _name);
SGPropertyNode * node = fgGetNode(text, true);
node->setBoolValue("broken",false);
} }
SG_LOG(SG_GENERAL, SG_ALERT,(_open?"Opened hitch (or broken tow) '":"Locked hitch '")<<_name<<"' !"<<endl); std::stringstream message;
if (_node->getBoolValue("broken",false)&&_open)
message<<"Oh no, the tow is broken";
else
message<<(_open?"Opened hitch '":"Locked hitch '")<<_name<<"' !";
fgGetNode("/sim/messages/pilot", true)->setStringValue(message.str().c_str());
_oldOpen=_open; _oldOpen=_open;
} }
@ -616,14 +613,11 @@ void Hitch::integrate (float dt)
//check, if tow end can be modified by property, if yes: update //check, if tow end can be modified by property, if yes: update
if(_towEndIsConnectedToProperty) if(_towEndIsConnectedToProperty)
{ {
char text[128]; if (_node)
sprintf(text,"/sim/hitches/%s", _name);
SGPropertyNode * node = fgGetNode(text, true);
if (node)
{ {
//_towEndNode=fgGetNode(node->getStringValue("tow/node"), false); //_towEndNode=fgGetNode(_node->getStringValue("tow/node"), false);
char towNode[256]; char towNode[256];
strncpy(towNode,node->getStringValue("tow/node"),256); strncpy(towNode,_node->getStringValue("tow/node"),256);
towNode[255]=0; towNode[255]=0;
_towEndNode=fgGetNode("ai/models")->getNode(towNode, false); _towEndNode=fgGetNode("ai/models")->getNode(towNode, false);
//AI and multiplayer objects seem to change node? //AI and multiplayer objects seem to change node?
@ -632,7 +626,7 @@ void Hitch::integrate (float dt)
{ {
char MPcallsign[256]=""; char MPcallsign[256]="";
const char *MPc; const char *MPc;
MPc=node->getStringValue("tow/connected-to-ai-or-mp-callsign"); MPc=_node->getStringValue("tow/connected-to-ai-or-mp-callsign");
if (MPc) if (MPc)
{ {
strncpy(MPcallsign,MPc,256); strncpy(MPcallsign,MPc,256);
@ -654,8 +648,8 @@ void Hitch::integrate (float dt)
if (strcmp(n->getStringValue("callsign"),MPcallsign)==0)//found if (strcmp(n->getStringValue("callsign"),MPcallsign)==0)//found
{ {
_towEndNode=n; _towEndNode=n;
//node->setStringValue("tow/node",n->getPath()); //_node->setStringValue("tow/node",n->getPath());
node->setStringValue("tow/node",n->getDisplayName()); _node->setStringValue("tow/node",n->getDisplayName());
} }
} }
} }
@ -701,12 +695,11 @@ void Hitch::integrate (float dt)
{ {
if(mp_open) if(mp_open)
{ {
_open=true; _oldOpen=_open=true;
char text[512]; std::stringstream message;
sprintf(text,"/sim/hitches/%s", _name); message<<_node->getStringValue("tow/connected-to-ai-or-mp-callsign")
SGPropertyNode * node = fgGetNode(text, true); <<": I have released the tow!";
node->getStringValue("tow/node",""); fgGetNode("/sim/messages/ai-plane", true)->setStringValue(message.str().c_str());
SG_LOG(SG_GENERAL, SG_ALERT,"'"<<node->getStringValue("tow/node","")<<"' has opened hitch!"<<endl);
} }
} }
} }
@ -775,4 +768,4 @@ void Hitch::integrate (float dt)
}; // namespace yasim }; // namespace yasim

View file

@ -1,6 +1,8 @@
#ifndef _HITCH_HPP #ifndef _HITCH_HPP
#define _HITCH_HPP #define _HITCH_HPP
class SGPropertyNode;
#include <Main/fg_props.hxx>
namespace yasim { namespace yasim {
class Ground; class Ground;
@ -76,7 +78,7 @@ private:
State* _state; State* _state;
float _dist; float _dist;
float _timeLagCorrectedDist; float _timeLagCorrectedDist;
SGPropertyNode *_towEndNode; SGPropertyNode_ptr _towEndNode;
const char *_towEndPropertyName; const char *_towEndPropertyName;
bool _towEndIsConnectedToProperty; bool _towEndIsConnectedToProperty;
bool _nodeIsMultiplayer; bool _nodeIsMultiplayer;
@ -102,10 +104,11 @@ private:
float _mp_force[3]; float _mp_force[3];
bool _mp_is_slave; bool _mp_is_slave;
bool _mp_open_last_state; bool _mp_open_last_state;
bool _displayed_len_lower_dist_message; bool _displayed_len_lower_dist_message;
bool _last_wish; bool _last_wish;
SGPropertyNode_ptr _node;
}; };
}; // namespace yasim }; // namespace yasim