From 95e3d00a172b6a1deecc25d274cfccf89aa6b8bd Mon Sep 17 00:00:00 2001 From: www2 Date: Fri, 11 Dec 2015 03:24:43 +0100 Subject: [PATCH 1/2] Add new commands to telnet protocall New comands: setb set a Boolean value setd set a Floaring point value seti set a integer value del delete a node --- src/Network/props.cxx | 58 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/src/Network/props.cxx b/src/Network/props.cxx index 58905e2f3..e15b682b5 100644 --- a/src/Network/props.cxx +++ b/src/Network/props.cxx @@ -3,6 +3,7 @@ // // Written by Curtis Olson, started September 2000. // Modified by Bernie Bright, May 2002. +// Modified by Jean-Paul Anceaux, Dec 2015. // // Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt // @@ -147,7 +148,7 @@ PropsChannel::PropsChannel() PropsChannel::~PropsChannel() { // clean up all registered listeners - BOOST_FOREACH(SGPropertyNode_ptr l, _listeners) { + BOOST_FOREACH(SGPropertyNode_ptr l, _listeners) { l->removeChangeListener( this ); } } @@ -165,11 +166,11 @@ void PropsChannel::subscribe(const ParameterList ¶m) { push( getTerminator() ); SGPropertyNode *n = globals->get_props()->getNode( p,true ); - if ( n->isTied() ) { - error("Error:Tied properties cannot register listeners"); + if ( n->isTied() ) { + error("Error:Tied properties cannot register listeners"); return; } - + if (n) { n->addChangeListener( this ); _listeners.push_back( n ); // housekeeping, save for deletion in dtor later on @@ -192,8 +193,8 @@ void PropsChannel::unsubscribe(const ParameterList ¶m) { //TODO: provide support for different types of subscriptions MODES ? (child added/removed, thesholds, min/max) -void PropsChannel::valueChanged(SGPropertyNode* ptr) { - //SG_LOG(SG_GENERAL, SG_ALERT, __FILE__<< "@"<<__LINE__ << ":" << __FUNCTION__ << std::endl); + void PropsChannel::valueChanged(SGPropertyNode* ptr) { + //SG_LOG(SG_GENERAL, SG_ALERT, __FILE__<< "@"<<__LINE__ << ":" << __FUNCTION__ << std::endl); std::stringstream response; response << ptr->getPath(true) << "=" << ptr->getStringValue() << getTerminator(); //TODO: use hashes, echo several properties at once push( response.str().c_str() ); @@ -480,12 +481,43 @@ PropsChannel::foundTerminator() } else if ( command == "prompt" ) { mode = PROMPT; } else if (callback_map.find(command) != callback_map.end() ) { - TelnetCallback t = callback_map[ command ]; - if (t) - (this->*t) (tokens); + TelnetCallback t = callback_map[ command ]; + if (t) + (this->*t) (tokens); else error("No matching callback found for command:"+command); } + else if ( command == "seti" ) { + if (tokens.size() == 3) { + node->getNode( tokens[1].c_str(), true ) + ->setIntValue(atoi(tokens[2].c_str())); + } + const char* msg = "set init\r\n"; + push( msg ); + } + else if ( command == "setd" ) { + if (tokens.size() == 3) { + node->getNode( tokens[1].c_str(), true ) + ->setDoubleValue(atof(tokens[2].c_str())); + } + } + else if ( command == "setb" ) { + if (tokens.size() == 3) { + if (tokens[2] == "false" || tokens[2] == "0") { + node->getNode( tokens[1].c_str(), true ) + ->setBoolValue(false); + } + if (tokens[2] == "true" || tokens[2] == "1"){ + node->getNode( tokens[1].c_str(), true ) + ->setBoolValue(true); + } + } + } + else if ( command == "del" ) { + if (tokens.size() == 3){ + node->getNode( tokens[1].c_str(), true )->removeChild(tokens[2].c_str(),0); + } + } else { const char* msg = "\ Valid commands are:\r\n\ @@ -500,7 +532,11 @@ prompt switch to interactive mode (default)\r\n\ pwd display your current path\r\n\ quit terminate connection\r\n\ run run built in command\r\n\ -set set to a new \r\n\ +set set String to a new \r\n\ +setb set Bool to a new only work with the foling value 0, 1, true, false\r\n\ +setd set Double to a new \r\n\ +seti set Int to a new \r\n\ +del delete in \r\n\ subscribe subscribe to property changes \r\n\ unscubscribe unscubscribe from property changes (var must be the property name/path used by subscribe)\r\n"; push( msg ); @@ -595,7 +631,7 @@ FGProps::open() } poller.addChannel(this); - + SG_LOG( SG_IO, SG_INFO, "Props server started on port " << port ); set_enabled( true ); From 2da55419012f4570b472120cf7e7d9a44070388c Mon Sep 17 00:00:00 2001 From: www2 Date: Sun, 13 Dec 2015 15:57:53 +0100 Subject: [PATCH 2/2] Add feedback if prompt mode is use --- src/Network/props.cxx | 53 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/src/Network/props.cxx b/src/Network/props.cxx index e15b682b5..5574b3402 100644 --- a/src/Network/props.cxx +++ b/src/Network/props.cxx @@ -488,35 +488,75 @@ PropsChannel::foundTerminator() error("No matching callback found for command:"+command); } else if ( command == "seti" ) { - if (tokens.size() == 3) { - node->getNode( tokens[1].c_str(), true ) - ->setIntValue(atoi(tokens[2].c_str())); + string value, tmp; + if (tokens.size() == 3) { + node->getNode( tokens[1].c_str(), true ) + ->setIntValue(atoi(tokens[2].c_str())); + } + if ( mode == PROMPT ) { + tmp = tokens[1].c_str(); + tmp += " " + tokens[2]; + tmp += " ("; + tmp += getValueTypeString( node->getNode( tokens[1].c_str() ) ); + tmp += ")"; + push( tmp.c_str() ); + push( getTerminator() ); } - const char* msg = "set init\r\n"; - push( msg ); } - else if ( command == "setd" ) { + else if ( command == "setd" || command == "setf") { + string value, tmp; if (tokens.size() == 3) { node->getNode( tokens[1].c_str(), true ) ->setDoubleValue(atof(tokens[2].c_str())); } + if ( mode == PROMPT ) { + tmp = tokens[1].c_str(); + tmp += " "; + tmp += tokens[2].c_str(); + tmp += " ("; + tmp += getValueTypeString( node->getNode( tokens[1].c_str() ) ); + tmp += ")"; + push( tmp.c_str() ); + push( getTerminator() ); + } } else if ( command == "setb" ) { + string tmp, value; if (tokens.size() == 3) { if (tokens[2] == "false" || tokens[2] == "0") { node->getNode( tokens[1].c_str(), true ) ->setBoolValue(false); + value = " False "; } if (tokens[2] == "true" || tokens[2] == "1"){ node->getNode( tokens[1].c_str(), true ) ->setBoolValue(true); + value = " True "; } + if ( mode == PROMPT ) { + tmp = tokens[1].c_str(); + tmp += value; + tmp += " ("; + tmp += getValueTypeString( node->getNode( tokens[1].c_str() ) ); + tmp += ")"; + push( tmp.c_str() ); + push( getTerminator() ); + } + } } else if ( command == "del" ) { + string tmp; if (tokens.size() == 3){ node->getNode( tokens[1].c_str(), true )->removeChild(tokens[2].c_str(),0); } + if ( mode == PROMPT ) { + tmp = "Delete "; + tmp += tokens[1].c_str(); + tmp += tokens[2]; + push( tmp.c_str() ); + push( getTerminator() ); + } } else { const char* msg = "\ @@ -535,6 +575,7 @@ run run built in command\r\n\ set set String to a new \r\n\ setb set Bool to a new only work with the foling value 0, 1, true, false\r\n\ setd set Double to a new \r\n\ +setf alias for setd\r\n\ seti set Int to a new \r\n\ del delete in \r\n\ subscribe subscribe to property changes \r\n\