From: <ge...@us...> - 2009-03-10 03:15:01
|
Revision: 7421 http://playerstage.svn.sourceforge.net/playerstage/?rev=7421&view=rev Author: gerkey Date: 2009-03-10 03:14:32 +0000 (Tue, 10 Mar 2009) Log Message: ----------- building and happy Modified Paths: -------------- code/websim/src/websim.cc code/websim/src/websim.h Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-03-10 03:07:02 UTC (rev 7420) +++ code/websim/src/websim.cc 2009-03-10 03:14:32 UTC (rev 7421) @@ -27,9 +27,13 @@ #include "websim.h" +#include <boost/lexical_cast.hpp> + #include <assert.h> #include <stdlib.h> +using namespace websim; + WebSim::WebSim(const std::string& _fedfile, const std::string& _host, int _port) : @@ -107,3 +111,185 @@ } return false; } + +bool +WebSim::HandleURI(const std::string& model, + const std::string& prop, + const std::string& action, + struct evkeyvalq* kv, + std::string& response) +{ + // The special simulation model + if(model == "sim") + { + return HandleSimRequest(prop, action, kv, response); + } + // Everything else must be an existing model + else + { + return HandleModelRequest(model, prop, action, kv, response); + } +} + +bool +WebSim::HandleSimRequest(const std::string& prop, + const std::string& action, + struct evkeyvalq* kv, + std::string& response) +{ + // The special factory property + if(prop == "factory") + { + if(action == "create") + { + std::string name, type; + if(!GetValue(name, kv, "name") || + !GetValue(type, kv, "type")) + { + response = "ERROR: Missing name and/or type argument for sim/factor/create"; + return false; + } + + return(CreateModel(name, type, response)); + } + else if(action == "create") + { + std::string name, type; + if(!GetValue(name, kv, "name")) + { + response = "ERROR: Missing name argument for sim/factor/create"; + return false; + } + + return(DeleteModel(name, response)); + } + else + { + response = "ERROR: Unknown action " + action + " for sim/factory"; + return false; + } + } + else + { + response = "ERROR: Unknown property " + prop + " for sim"; + return false; + } +} + +bool +WebSim::HandleModelRequest(const std::string& model, + const std::string& prop, + const std::string& action, + struct evkeyvalq* kv, + std::string& response) +{ + if(action == "get") + { + if(prop == "pose") + { + Pose p; + Velocity v; + Acceleration a; + if(GetModelState(model, p, v, a, response)) + { + char buf[1024]; + snprintf(buf, sizeof(buf), + "%s's state: \n pose: (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" + " vel : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" + " acc : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", + model.c_str(), + p.x, p.y, p.z, p.r, p.p, p.a, + v.x, v.y, v.z, v.r, v.p, v.a, + a.x, a.y, a.z, a.r, a.p, a.a); + response = buf; + return true; + } + else + { + response = "ERROR: Failed to get pose for model " + model; + return false; + } + } + else + { + response = "ERROR: Unknown property " + prop + " for model " + model; + return false; + } + } + else if(action == "set") + { + if(prop == "pose") + { + std::string sx, sy, sz, sroll, spitch, syaw; + + // Get pose first, fill in what the caller provided + Pose p; + Velocity v; + Acceleration a; + if(!GetModelState(model, p, v, a, response)) + { + response = "Failed to get pose before setting it"; + return false; + } + try + { + if(GetValue(sx, kv, "x")) + p.x = boost::lexical_cast<float>(sx); + if(GetValue(sy, kv, "y")) + p.y = boost::lexical_cast<float>(sy); + if(GetValue(sz, kv, "z")) + p.z = boost::lexical_cast<float>(sz); + if(GetValue(sroll, kv, "r")) + p.r = boost::lexical_cast<float>(sroll); + if(GetValue(spitch, kv, "p")) + p.p = boost::lexical_cast<float>(spitch); + if(GetValue(syaw, kv, "a")) + p.a = boost::lexical_cast<float>(syaw); + + if(GetValue(sx, kv, "vx")) + v.x = boost::lexical_cast<float>(sx); + if(GetValue(sy, kv, "vy")) + v.y = boost::lexical_cast<float>(sy); + if(GetValue(sz, kv, "vz")) + v.z = boost::lexical_cast<float>(sz); + if(GetValue(sroll, kv, "vr")) + v.r = boost::lexical_cast<float>(sroll); + if(GetValue(spitch, kv, "vp")) + v.p = boost::lexical_cast<float>(spitch); + if(GetValue(syaw, kv, "va")) + v.a = boost::lexical_cast<float>(syaw); + + if(GetValue(sx, kv, "ax")) + a.x = boost::lexical_cast<float>(sx); + if(GetValue(sy, kv, "ay")) + a.y = boost::lexical_cast<float>(sy); + if(GetValue(sz, kv, "az")) + a.z = boost::lexical_cast<float>(sz); + if(GetValue(sroll, kv, "ar")) + a.r = boost::lexical_cast<float>(sroll); + if(GetValue(spitch, kv, "ap")) + a.p = boost::lexical_cast<float>(spitch); + if(GetValue(syaw, kv, "aa")) + a.a = boost::lexical_cast<float>(syaw); + } + catch(boost::bad_lexical_cast e) + { + response = std::string("Failed to parse input value(s): ") + + e.what(); + return false; + } + + return(SetModelState(model, p, v, a, response)); + } + else + { + response = "ERROR: Unknown property " + prop + " for model " + model; + return false; + } + } + else + { + response = "ERROR: Unknown action " + action; + return false; + } +} Modified: code/websim/src/websim.h =================================================================== --- code/websim/src/websim.h 2009-03-10 03:07:02 UTC (rev 7420) +++ code/websim/src/websim.h 2009-03-10 03:14:32 UTC (rev 7421) @@ -37,16 +37,40 @@ #include <event.h> #include <evhttp.h> +namespace websim +{ + +class Pose; +class Velocity; +class Acceleration; + class WebSim { public: WebSim(const std::string& _fedfile, const std::string& _host, - int _port); // TODO: 3 callbacks + int _port); ~WebSim(); void Update(); + // Interface to be implemented by simulators + virtual bool CreateModel(const std::string& name, + const std::string& type, + std::string& error) = 0; + virtual bool DeleteModel(const std::string& name, + std::string& error) = 0; + virtual bool SetModelState(const std::string& name, + const Pose& p, + const Velocity& v, + const Acceleration& a, + std::string& error) = 0; + virtual bool GetModelState(const std::string& name, + Pose& p, + Velocity& v, + Acceleration& a, + std::string& error) = 0; + private: std::string fedfile; std::string host; @@ -84,3 +108,50 @@ std::string& response); void DeleteKeyVal(struct evkeyvalq* query_args); }; + +class Pose +{ +public: + double x,y,z,r,p,a; + + Pose() : + x(0), y(0), z(0), r(0), p(0), a(0) + { + // nothing to do + } + + Pose( double x, double y, double z, + double r, double p, double a ) : + x(x), y(y), z(z), r(r), p(p), a(a) + { + // nothing to do + } + +}; + +class Velocity : public Pose +{ +public: + Velocity() : Pose() + {} + + Velocity( double x, double y, double z, + double r, double p, double a ) : + Pose( x, y, z, r, p, a ) + {} +}; + +class Acceleration : public Pose +{ +public: + Acceleration() : Pose() + {} + + Acceleration( double x, double y, double z, + double r, double p, double a ) : + Pose( x, y, z, r, p, a ) + {} +}; + + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ge...@us...> - 2009-03-10 06:54:06
|
Revision: 7433 http://playerstage.svn.sourceforge.net/playerstage/?rev=7433&view=rev Author: gerkey Date: 2009-03-10 06:53:56 +0000 (Tue, 10 Mar 2009) Log Message: ----------- adding clock support to websim Modified Paths: -------------- code/websim/src/websim.cc code/websim/src/websim.h Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-03-10 06:52:24 UTC (rev 7432) +++ code/websim/src/websim.cc 2009-03-10 06:53:56 UTC (rev 7433) @@ -37,7 +37,7 @@ WebSim::WebSim(const std::string& _fedfile, const std::string& _host, int _port) : - fedfile(_fedfile), host(_host), port(_port) + fedfile(_fedfile), host(_host), port(_port), tick_count_expected(0) { // Set up the HTTP server // Not sure whether it's safe to do this more that once in one process @@ -63,7 +63,12 @@ void WebSim::Update() { - event_dispatch(); + tick_count = 0; + do + { + event_loop(EVLOOP_ONCE); + } while(tick_count < tick_count_expected); + tick_count = 0; } void @@ -169,6 +174,20 @@ return false; } } + else if(prop == "clock") + { + if(action == "tick") + { + tick_count++; + response = "Ticked the clock"; + return true; + } + else + { + response = "ERROR: Unknown action " + action + " for sim/clock"; + return false; + } + } else { response = "ERROR: Unknown property " + prop + " for sim"; @@ -185,7 +204,7 @@ { if(action == "get") { - if(prop == "pose") + if(prop == "pva") { Pose p; Velocity v; @@ -326,10 +345,6 @@ } evbuffer_add_printf(eb, "%s\n", response.c_str()); - /* - printf("[webgazebo] Sending reply: %d %s\n", - response_code, response_string.c_str()); - */ evhttp_send_reply(req, response_code, response_string.c_str(), eb); evbuffer_free(eb); Modified: code/websim/src/websim.h =================================================================== --- code/websim/src/websim.h 2009-03-10 06:52:24 UTC (rev 7432) +++ code/websim/src/websim.h 2009-03-10 06:53:56 UTC (rev 7433) @@ -57,19 +57,19 @@ // Interface to be implemented by simulators virtual bool CreateModel(const std::string& name, const std::string& type, - std::string& error) = 0; + std::string& response) = 0; virtual bool DeleteModel(const std::string& name, - std::string& error) = 0; + std::string& response) = 0; virtual bool SetModelPVA(const std::string& name, const Pose& p, const Velocity& v, const Acceleration& a, - std::string& error) = 0; + std::string& response) = 0; virtual bool GetModelPVA(const std::string& name, Pose& p, Velocity& v, Acceleration& a, - std::string& error) = 0; + std::string& response) = 0; protected: void StringSplit(const std::string &s, @@ -81,6 +81,11 @@ std::string host; int port; + // Number of ticks we require before exiting Update() + int tick_count_expected; + // Number of ticks we've received since the last Update() + int tick_count; + struct evhttp* eh; // Static, so that it can be passed as a callback to libevent This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rt...@us...> - 2009-03-10 07:01:35
|
Revision: 7435 http://playerstage.svn.sourceforge.net/playerstage/?rev=7435&view=rev Author: rtv Date: 2009-03-10 07:01:16 +0000 (Tue, 10 Mar 2009) Log Message: ----------- added rtv federation client side stuff Added Paths: ----------- code/websim/src/confederate.cc code/websim/src/parser.cc code/websim/src/puppet.cc Added: code/websim/src/confederate.cc =================================================================== --- code/websim/src/confederate.cc (rev 0) +++ code/websim/src/confederate.cc 2009-03-10 07:01:16 UTC (rev 7435) @@ -0,0 +1,152 @@ +#include <stdio.h> +#include <assert.h> + +#include "websim.hh" +using namespace websim; + +WebSim::Confederate::Confederate( WebSim* ws, const char* host, unsigned short port ) : + puppet_list( NULL ), + unacknowledged_pushes( 0 ) +{ + if(! (http_con = evhttp_connection_new( host, port )) ) + printf( "Error: Confederate object failed to connect to server at %s:%d\n", + host, port ); + + char* remote_host = NULL; + unsigned short remote_port = 0; + + // store the name and port post-connection for sanoty check + evhttp_connection_get_peer( http_con, + &remote_host, + &remote_port ); + + // build the canonical name for this confederate + char buf[512]; + snprintf( buf, 512, "%s:%u", remote_host, remote_port ); + + name = strdup(buf); + + g_hash_table_insert( ws->confederates, (void*)name, this ); + //printf( "\t\tConfederate %s constructed \n", name ); +} + +WebSim::Confederate::~Confederate() +{ + evhttp_connection_free( http_con ); +} + +void WebSim::Confederate::PuppetCreationCallback( evhttp_request* req, void* arg ) +{ + Puppet* pup = (Puppet*)arg; + if( req->response_code == 200 ) + pup->created = true; + else + { + printf( "bad response regarding puppet creation \"%s\"\n", pup->name ); + printf( "code: %d\n", req->response_code ); + printf( "response: %s\n", req->input_buffer->buffer ); + } +} + +void WebSim::Confederate::AddPuppet( Puppet* puppet, + const char* prototype ) +{ + // send a create message + //printf( "Creating puppet \"%s\" on %s using prototype \"%s\"\n", + // puppet->name, + // name, + // prototype ); + + struct evhttp_request* er = + evhttp_request_new( PuppetCreationCallback, puppet ); + assert(er); + + char buf[512]; + snprintf( buf, 512, "/sim/factory/create?name=%s&type=%s", + puppet->name, + prototype ); + + printf( "Emitting: http://%s%s\n", name, buf ); + + int ret = evhttp_make_request( http_con, er, EVHTTP_REQ_GET, buf ); + if( ret != 0 ) + { + printf( "make request returned error %d\n", ret ); + exit(0); + } + + // a successful response sets puppet->created to true + while( ! puppet->created ) + event_loop( EVLOOP_NONBLOCK ); // loops until the request has completed + + puppet_list = + g_list_append( puppet_list, puppet ); +} + +void WebSim::Confederate::PuppetPushCallback( evhttp_request* req, void* arg ) +{ + cb_chunk_t* ch = (cb_chunk_t*)arg; + + if( req->response_code == 200 ) + { + --ch->conf->unacknowledged_pushes; + printf( "puppet push for \"%s\" acked OK. Outstanding pushes %u\n", + ch->name, ch->conf->unacknowledged_pushes ); + } + else + { + printf( "bad response regarding puppet push \"%s\"\n", ch->name ); + printf( "code: %d\n", req->response_code ); + printf( "response: %s\n", req->input_buffer->buffer ); + } +} + +int WebSim::Confederate::Push( const char* name, Pose p, Velocity v, Acceleration a ) +{ + printf( "\tconfederate %s pushing state of \"%s\"\n", + this->name, + name ); + + // compose a struct to send into the callback + cb_chunk_t ch; + ch.name = name; + ch.conf = this; + + struct evhttp_request* er = + evhttp_request_new( PuppetPushCallback, &ch ); + assert(er); + + char buf[512]; + snprintf( buf, 512, "/%s/pva/set?" + "px=%.6f&py=%.6f&pz=%.6f&pr=%.6f&pp=%.6f&pa=%.6f&" + "vx=%.6f&vy=%.6f&vz=%.6f&vr=%.6f&vp=%.6f&va=%.6f&" + "ax=%.6f&ay=%.6f&az=%.6f&ar=%.6f&ap=%.6f&aa=%.6f", + name, + p.x, p.y, p.z, p.r, p.p, p.a, + v.x, v.y, v.z, v.r, v.p, v.a, + a.x, a.y, a.z, a.r, a.p, a.a ); + + printf( "Emitting: http://%s%s\n", this->name, buf ); + + ++unacknowledged_pushes; // decremented when reply is received + + int ret = evhttp_make_request( http_con, er, EVHTTP_REQ_GET, buf ); + if( ret != 0 ) + { + printf( "make request returned error %d\n", ret ); + exit(0); + } + + while( unacknowledged_pushes ) + event_loop( EVLOOP_NONBLOCK ); // loops until the request has completed +} + +int WebSim::Confederate::RunStep() +{ + // construct and send a tick message + printf( "Confederate %s clock tick\n", + name ); + return 0; +} + + Added: code/websim/src/parser.cc =================================================================== --- code/websim/src/parser.cc (rev 0) +++ code/websim/src/parser.cc 2009-03-10 07:01:16 UTC (rev 7435) @@ -0,0 +1,219 @@ + +#include <stdio.h> +#include <assert.h> +#include <string> +#include <iostream> + +#include <yaml.h> // YAML parser +using namespace std; + +#include "websim.hh" +using namespace websim; + +void httprequest( string req ) +{ + cout << "\t" << req << endl; +} + +void WebSim::Parser::parse_failed( const char* message ) +{ + printf( "federation file parse failed at line: %u column: %u type %u %s\n", + event.start_mark.line, + event.start_mark.column, + event.type, + message ); + exit(0); +} + +yaml_event_t WebSim::Parser::next_event( const char* msg ) +{ + yaml_event_delete( &event ); + + if (!yaml_parser_parse( &parser, &event)) + parse_failed( msg ); + + return event; +} + +void WebSim::Parser::expect( yaml_event_type_t event_type, const char* msg ) +{ + //printf( "expecting %s\n", msg ); + + if( next_event( "" ).type != event_type ) + parse_failed( msg ); +} + +WebSim::Confederate* WebSim::Parser::GetConfederate( const char* host, unsigned short port ) +{ + char lookup[256]; + snprintf( lookup, 256, "%s:%u", host, port ); + + Confederate* conf = (Confederate*) + g_hash_table_lookup( ws->confederates, lookup ); + + if( ! conf ) + conf = new Confederate( ws, host, port ); + + return conf; +} + + +WebSim::Confederate* WebSim::Parser::GetConfederate( const char* hostandport ) +{ + unsigned int port = ws->port; + char hostnoport[256]; + + // parse out port number from hostname + sscanf( hostandport, "%s %u", &hostnoport, &port ); + + return GetConfederate( hostnoport, port ); +} + +void WebSim::Parser::parse_puppet_mapping( Puppet* pup ) +{ + expect( YAML_SCALAR_EVENT, "puppet host" ); + const char* host = strdup((const char*)event.data.scalar.value); + + expect( YAML_SCALAR_EVENT, "puppet type" ); + const char* prototype = strdup((const char*)event.data.scalar.value); + + expect( YAML_MAPPING_END_EVENT, "puppet mapping" ); + + if( pup ) + pup->AddConfederate( GetConfederate( host ), + prototype ); + else + GetConfederate( host ); // federate for time sync only +} + +void WebSim:: Parser::parse_puppet_mapping_sequence( Puppet* pup ) +{ + expect( YAML_SEQUENCE_START_EVENT, "start of sequence of puppet mappings" ); + + while( 1 ) + { + next_event( "" ); + switch( event.type ) + { + case YAML_MAPPING_START_EVENT: + parse_puppet_mapping( pup ); + break; + case YAML_SEQUENCE_END_EVENT: + return; + default: + parse_failed( "expecting a puppet mapping or end of sequence" ); + } + } +} + +void WebSim::Parser::parse_model_mapping( string host ) +{ + expect( YAML_SCALAR_EVENT, "model name" ); + string model = (char*)event.data.scalar.value; + + Puppet* pup = NULL; + + if( host == ws->hostportname ) + pup = new Puppet( ws, model.c_str() ); + + parse_puppet_mapping_sequence( pup ); + + expect( YAML_MAPPING_END_EVENT, "end of model mapping" ); +} + +void WebSim::Parser::parse_model_mapping_sequence( string host ) +{ + expect( YAML_SEQUENCE_START_EVENT, "start of sequence of model mappings" ); + + while( 1 ) + { + next_event( "" ); + switch( event.type ) + { + case YAML_MAPPING_START_EVENT: + parse_model_mapping( host ); + break; + case YAML_SEQUENCE_END_EVENT: + return; + default: + parse_failed( "expecting a model mapping or end of sequence" ); + } + } +} + +void WebSim::Parser::parse_host_mapping() +{ + expect( YAML_MAPPING_START_EVENT, "host mapping start" ); + + while( 1 ) + { + next_event( "" ); + switch( event.type ) + { + case YAML_SCALAR_EVENT: + { + string host = (const char*)event.data.scalar.value; + + // cout << "HOST " << host << endl; + + Confederate* conf = GetConfederate( host.c_str() ); + parse_model_mapping_sequence( conf->name ); + } + break; + case YAML_MAPPING_END_EVENT: + return; + default: + parse_failed( "expecting a host scalar or a end of mapping" ); + } + } +} + +void WebSim::Parser::parse_document() +{ + expect( YAML_DOCUMENT_START_EVENT, "document start" ); + parse_host_mapping(); + expect( YAML_DOCUMENT_END_EVENT, "document end" ); +} + +void WebSim::Parser::parse_stream() +{ + expect( YAML_STREAM_START_EVENT, "stream start" ); + parse_document(); + expect( YAML_STREAM_END_EVENT, "stream end" ); +} + +WebSim::Parser::Parser( WebSim* ws, const char* filename ) : + ws( ws ) +{ +// char hst[256]; +// if( gethostname( hst, 256 ) ) +// { +// perror( "failed to get hostname" ); +// exit( 0 ); +// } + +// char buf[256]; +// snprintf( buf, 256, "%s:%u", hst, WebSim::DEFAULT_PORT ); + +// // copy the c string into a std:string +// ws->hostportname = buf; + + /* Create the Parser object. */ + yaml_parser_initialize(&parser); + + /* Set a file input. */ + FILE *input = fopen( filename, "rb"); + assert( input ); + + yaml_parser_set_input_file(&parser, input); + + parse_stream(); + + /* The application is responsible for destroying the event object. */ + yaml_event_delete(&event); + + /* Destroy the Parser object. */ + yaml_parser_delete(&parser); +} + + Added: code/websim/src/puppet.cc =================================================================== --- code/websim/src/puppet.cc (rev 0) +++ code/websim/src/puppet.cc 2009-03-10 07:01:16 UTC (rev 7435) @@ -0,0 +1,37 @@ + +#include <string.h> //for strdup() +#include <stdio.h> + +#include "websim.hh" +using namespace websim; + + +WebSim::Puppet::Puppet( WebSim* ws, const char* name ) : + name( strdup(name) ), + created( false ), + ws( ws ) +{ + g_hash_table_insert( ws->puppets, (void*)this->name, this ); +} + +void WebSim::Puppet::Push( Pose p, Velocity v, Acceleration a ) +{ + for( GList* it = confederates; + it; + it = it->next ) + { + Confederate* conf = (Confederate*)it->data; + conf->Push( name, p, v, a ); + } +} + +void WebSim::Puppet::AddConfederate( Confederate* conf, + const char* prototype ) +{ + conf->AddPuppet( this, prototype ); + confederates = g_list_append( confederates, conf ); +} + + + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <na...@us...> - 2009-03-13 05:28:44
|
Revision: 7470 http://playerstage.svn.sourceforge.net/playerstage/?rev=7470&view=rev Author: natepak Date: 2009-03-13 05:28:33 +0000 (Fri, 13 Mar 2009) Log Message: ----------- Added missing includes Modified Paths: -------------- code/websim/src/confederate.cc code/websim/src/parser.cc code/websim/src/websim.cc Modified: code/websim/src/confederate.cc =================================================================== --- code/websim/src/confederate.cc 2009-03-13 02:49:05 UTC (rev 7469) +++ code/websim/src/confederate.cc 2009-03-13 05:28:33 UTC (rev 7470) @@ -26,6 +26,7 @@ */ #include <stdio.h> +#include <stdlib.h> #include <assert.h> #include <iostream> @@ -34,9 +35,9 @@ WebSim::Confederate::Confederate( WebSim* ws, std::string uri ) : - name(uri), ws(ws), - puppet_list( NULL ) + puppet_list( NULL ), + name(uri) { size_t pos = uri.find( ":" ); // find the start of the port number Modified: code/websim/src/parser.cc =================================================================== --- code/websim/src/parser.cc 2009-03-13 02:49:05 UTC (rev 7469) +++ code/websim/src/parser.cc 2009-03-13 05:28:33 UTC (rev 7470) @@ -29,6 +29,8 @@ #include <assert.h> #include <string> #include <iostream> +#include <string.h> +#include <stdlib.h> #include "websim.hh" Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-03-13 02:49:05 UTC (rev 7469) +++ code/websim/src/websim.cc 2009-03-13 05:28:33 UTC (rev 7470) @@ -40,8 +40,8 @@ WebSim::WebSim(const std::string& _fedfile, const std::string& _host, unsigned short _port) : + tick_count_expected(0), ticks_remaining(0), - tick_count_expected(0), fedfile(_fedfile), host(_host), port(_port), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rt...@us...> - 2009-03-14 20:19:07
|
Revision: 7484 http://playerstage.svn.sourceforge.net/playerstage/?rev=7484&view=rev Author: rtv Date: 2009-03-14 20:19:06 +0000 (Sat, 14 Mar 2009) Log Message: ----------- working webstage demo. tweaks needed to webgazebo for WS API changes Modified Paths: -------------- code/websim/src/confederate.cc code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/confederate.cc =================================================================== --- code/websim/src/confederate.cc 2009-03-14 01:13:25 UTC (rev 7483) +++ code/websim/src/confederate.cc 2009-03-14 20:19:06 UTC (rev 7484) @@ -52,6 +52,8 @@ break; case 200: // OK (*created) = true; + printf( "[websim] server responds OK to greeting with %s\n", + req->input_buffer->buffer ); break; case 400: printf( "[websim] server responds to greeting with error (400): %s.\n", @@ -149,7 +151,11 @@ { Puppet* pup = (Puppet*)arg; if( req->response_code == 200 ) - pup->created = true; + { + pup->created = true; + //printf( "Puppet %s creation ACK.\n", + // pup->name.c_str() ); + } else { printf( "bad response regarding puppet creation \"%s\"\n", pup->name.c_str() ); @@ -170,7 +176,7 @@ puppet->name.c_str(), prototype.c_str() ); - printf( "Emitting: http://%s%s\n", name.c_str(), buf ); + //printf( "Emitting: http://%s%s\n", name.c_str(), buf ); int ret = evhttp_make_request( http_con, er, EVHTTP_REQ_GET, buf ); if( ret != 0 ) @@ -195,25 +201,22 @@ return; } - cb_chunk_t* ch = (cb_chunk_t*)arg; - assert(ch); + Confederate* conf = (Confederate*)arg; + assert(conf); if( req->response_code == 200 ) { - ch->conf->ws->unacknowledged_pushes--; - ch->conf->ws->EscapeLoopIfDone(); - - //printf( "puppet push for \"%s\" acked OK. Outstanding pushes %u\n", - // ch->name.c_str(), ch->conf->ws->unacknowledged_pushes ); + conf->ws->unacknowledged_pushes--; + + //printf( "conf %s puppet push ACK. Outstanding pushes %u\n", + // conf->name.c_str(), conf->ws->unacknowledged_pushes ); } else { - printf( "bad response regarding puppet push \"%s\"\n", ch->name.c_str() ); + printf( "bad response regarding puppet push \"%s\"\n", conf->name.c_str() ); printf( "code: %d\n", req->response_code ); printf( "response: %s\n", req->input_buffer->buffer ); } - - delete ch; } int WebSim::Confederate::Push( std::string name, Pose p, Velocity v, Acceleration a ) @@ -221,14 +224,9 @@ //printf( "\tconfederate %s pushing state of \"%s\"\n", // this->name.c_str(), // name.c_str() ); - - // compose a struct to send into the callback - cb_chunk_t* ch = new cb_chunk_t(); - ch->name = name; - ch->conf = this; struct evhttp_request* er = - evhttp_request_new( PuppetPushCallback, ch ); + evhttp_request_new( PuppetPushCallback, this ); assert(er); char buf[512]; @@ -264,15 +262,16 @@ return; } - WebSim* ws = (WebSim*)arg; + Confederate* conf = (Confederate*)arg; + assert(conf); if( req->response_code == 200 ) { - --ws->unacknowledged_ticks; - ws->EscapeLoopIfDone(); - - printf( "tick ACK. Outstanding ticks %u\n", - ws->unacknowledged_ticks ); + conf->ws->unacknowledged_ticks--; + + //printf( "tick ACK from %s. Outstanding ticks %u\n", + // conf->name.c_str(), + // conf->ws->unacknowledged_ticks ); } else { @@ -290,10 +289,10 @@ // name.c_str() ); struct evhttp_request* er = - evhttp_request_new( TickReplyCb, ws ); + evhttp_request_new( TickReplyCb, (void*)this ); assert(er); - ++ws->unacknowledged_ticks; // decremented when reply is received + ws->unacknowledged_ticks++; // decremented when reply is received int ret = evhttp_make_request( http_con, er, EVHTTP_REQ_GET, "/sim/clock/tick" ); if( ret != 0 ) Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-03-14 01:13:25 UTC (rev 7483) +++ code/websim/src/websim.cc 2009-03-14 20:19:06 UTC (rev 7484) @@ -90,19 +90,25 @@ WebSim::Go() { // tick all my confederates - ForEachConfederate( Confederate::TickCb, NULL ); + ForEachConfederate( Confederate::TickCb, NULL ); } void WebSim::Wait() { - ticks_remaining = tick_count_expected; - - // a callback will jump out of this loop when we've heard Ticks from - // all confederates - event_dispatch(); - - //printf( "STEP %lu\n", total_ticks++ ); + if( tick_count_expected ) // if we're federated with anyone + { + ticks_remaining = tick_count_expected; + + while( unacknowledged_ticks || unacknowledged_pushes || ticks_remaining ) + { + //printf( "event loop in wait (%d %d %d)\n", + // unacknowledged_ticks, unacknowledged_pushes, ticks_remaining ); + event_loop( EVLOOP_ONCE ); + } + } + else // not federated - just an isolated server + event_loop( EVLOOP_NONBLOCK ); } void @@ -170,17 +176,17 @@ } } -void WebSim::EscapeLoopIfDone() -{ - // if we're done waiting for things we can bail out of the event loop +// void WebSim::EscapeLoopIfDone() +// { +// // if we're done waiting for things we can bail out of the event loop - printf( "testing %d %d %d\n", ticks_remaining, unacknowledged_pushes, unacknowledged_ticks ); - if( ! (ticks_remaining || unacknowledged_pushes || unacknowledged_ticks) ) - { - puts( "OUTTA HERE" ); - event_loopbreak(); - } -} +// printf( "testing %d %d %d\n", ticks_remaining, unacknowledged_pushes, unacknowledged_ticks ); +// if( ! (ticks_remaining || unacknowledged_pushes || unacknowledged_ticks) ) +// { +// puts( "OUTTA HERE" ); +// event_loopbreak(); +// } +// } bool WebSim::HandleSimRequest(const std::string& prop, @@ -226,8 +232,6 @@ { ticks_remaining--; response = "Ticked the clock"; - - EscapeLoopIfDone(); return true; } else Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-03-14 01:13:25 UTC (rev 7483) +++ code/websim/src/websim.hh 2009-03-14 20:19:06 UTC (rev 7484) @@ -93,7 +93,7 @@ std::vector<std::string> &t, const std::string &d); - void EscapeLoopIfDone(); + //void EscapeLoopIfDone(); // Number of ticks we require before exiting Update() @@ -170,11 +170,11 @@ // manage a federated simulator class Confederate { - typedef struct - { - std::string name; - Confederate* conf; - } cb_chunk_t; +// typedef struct +// { +// std::string name; +// Confederate* conf; +// } cb_chunk_t; private: // connection to a remote http simulation server @@ -221,10 +221,10 @@ GHashTable* logical_hosts; // counts the number of status messages sent and replies not yet received - unsigned int unacknowledged_pushes; + int unacknowledged_pushes; // counts the number of clock ticks sent and replies not yet received - unsigned int unacknowledged_ticks; + int unacknowledged_ticks; unsigned long total_ticks; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rt...@us...> - 2009-03-18 02:58:42
|
Revision: 7528 http://playerstage.svn.sourceforge.net/playerstage/?rev=7528&view=rev Author: rtv Date: 2009-03-18 02:58:32 +0000 (Wed, 18 Mar 2009) Log Message: ----------- global const-correctness and added basic sim time support Modified Paths: -------------- code/websim/src/confederate.cc code/websim/src/parser.cc code/websim/src/puppet.cc code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/confederate.cc =================================================================== --- code/websim/src/confederate.cc 2009-03-17 23:48:36 UTC (rev 7527) +++ code/websim/src/confederate.cc 2009-03-18 02:58:32 UTC (rev 7528) @@ -69,7 +69,7 @@ WebSim::Confederate::Confederate( WebSim* ws, - std::string uri ) : + const std::string& uri ) : ws(ws), puppet_list( NULL ), name(uri) @@ -165,7 +165,7 @@ } void WebSim::Confederate::AddPuppet( Puppet* puppet, - std::string prototype ) + const std::string& prototype ) { struct evhttp_request* er = evhttp_request_new( PuppetCreationCallback, puppet ); @@ -219,7 +219,7 @@ } } -int WebSim::Confederate::Push( std::string name, Pose p, Velocity v, Acceleration a ) +int WebSim::Confederate::Push( const std::string& name, Pose p, Velocity v, Acceleration a ) { //printf( "\tconfederate %s pushing state of \"%s\"\n", // this->name.c_str(), Modified: code/websim/src/parser.cc =================================================================== --- code/websim/src/parser.cc 2009-03-17 23:48:36 UTC (rev 7527) +++ code/websim/src/parser.cc 2009-03-18 02:58:32 UTC (rev 7528) @@ -38,7 +38,7 @@ using namespace websim; -void WebSim::LoadFederationFile( std::string filename ) +void WebSim::LoadFederationFile( const std::string& filename ) { GError* err = NULL; GKeyFile* keyfile = g_key_file_new(); @@ -89,8 +89,8 @@ } } - cout << "Looking up logical name for myself " << hostportname << endl; - + // cout << "Looking up logical name for myself " << hostportname << endl; + // now we have made all the confederates. // Let's look up the confederate for this instance // read the array of entries for this host @@ -99,7 +99,7 @@ hostportname.c_str(), &err ); - cout << "my logical name is " << mylogicalname << endl; + // cout << "my logical name is " << mylogicalname << endl; // now we look up all the models listed under my logical name // get an array of confederate hosts Modified: code/websim/src/puppet.cc =================================================================== --- code/websim/src/puppet.cc 2009-03-17 23:48:36 UTC (rev 7527) +++ code/websim/src/puppet.cc 2009-03-18 02:58:32 UTC (rev 7528) @@ -32,7 +32,7 @@ using namespace websim; -WebSim::Puppet::Puppet( WebSim* ws, std::string name ) : +WebSim::Puppet::Puppet( WebSim* ws, const std::string& name ) : ws( ws ), name( name ), created( false ), @@ -54,7 +54,7 @@ } void WebSim::Puppet::AddConfederate( Confederate* conf, - std::string prototype ) + const std::string& prototype ) { conf->AddPuppet( this, prototype ); confederates = g_list_append( confederates, conf ); Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-03-17 23:48:36 UTC (rev 7527) +++ code/websim/src/websim.cc 2009-03-18 02:58:32 UTC (rev 7528) @@ -37,6 +37,14 @@ const std::string WebSim::package = "WebSim"; const std::string WebSim::version = "0.1"; + +std::string Time::String() +{ + std::string seconds = boost::lexical_cast<std::string>(sec); + std::string microseconds = boost::lexical_cast<std::string>(usec); + return( seconds + '.' + microseconds ); +} + WebSim::WebSim( const std::string& _host, const unsigned short _port) : tick_count_expected(0), @@ -81,7 +89,7 @@ // No event_fini() to call... } -void WebSim::Confederate::TickCb( std::string name, Confederate* conf, void* arg ) +void WebSim::Confederate::TickCb( const std::string& name, Confederate* conf, void* arg ) { conf->Tick(); } @@ -141,7 +149,7 @@ } bool -WebSim::GetValue(std::string& value, +WebSim::GetValue( std::string& value, struct evkeyvalq* query_args, const std::string& key) { @@ -176,18 +184,6 @@ } } -// void WebSim::EscapeLoopIfDone() -// { -// // if we're done waiting for things we can bail out of the event loop - -// printf( "testing %d %d %d\n", ticks_remaining, unacknowledged_pushes, unacknowledged_ticks ); -// if( ! (ticks_remaining || unacknowledged_pushes || unacknowledged_ticks) ) -// { -// puts( "OUTTA HERE" ); -// event_loopbreak(); -// } -// } - bool WebSim::HandleSimRequest(const std::string& prop, const std::string& action, @@ -234,6 +230,11 @@ response = "Ticked the clock"; return true; } + else if(action == "get") + { + response = "Current time: " + GetTime().String(); + return true; + } else { response = "ERROR: Unknown action " + action + " for sim/clock"; @@ -268,14 +269,16 @@ Pose p; Velocity v; Acceleration a; - if(GetModelPVA(model, p, v, a, response)) + Time t; + if(GetModelPVA(model, t, p, v, a, response)) { char buf[1024]; snprintf(buf, sizeof(buf), - "%s's state: \n pose: (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" + "%s's state @%s: \n pose: (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" " vel : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" " acc : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", model.c_str(), + t.String().c_str(), p.x, p.y, p.z, p.r, p.p, p.a, v.x, v.y, v.z, v.r, v.p, v.a, a.x, a.y, a.z, a.r, a.p, a.a); @@ -304,7 +307,8 @@ Pose p; Velocity v; Acceleration a; - if(!GetModelPVA(model, p, v, a, response)) + Time t; + if(!GetModelPVA(model, t, p, v, a, response)) { response = "Failed to get pose before setting it"; return false; @@ -411,10 +415,10 @@ } bool -WebSim::ParseURI(std::string& model, - std::string& prop, +WebSim::ParseURI( std::string& model, + std::string& prop, std::string& action, - std::string uri, + const std::string uri, std::string& response) { // Remove the query args @@ -441,16 +445,6 @@ return true; } -WebSim::Puppet* WebSim::GetPuppet( std::string name ) -{ - return( (Puppet*)g_hash_table_lookup( WebSim::puppets, name.c_str() ) ); -} - -WebSim::Confederate* WebSim::GetConfederate( std::string name ) -{ - return( (Confederate*)g_hash_table_lookup( WebSim::confederates, name.c_str() ) ); -} - bool WebSim::SetPuppetPVA( const std::string& name, Pose& p, @@ -470,16 +464,26 @@ return false; } - void WebSim::ForEachConfederate( void(*cb)(std::string, WebSim::Confederate*, void*), void* arg ) +void WebSim::ForEachConfederate( void(*cb)(const std::string&, WebSim::Confederate*, void*), void* arg ) { g_hash_table_foreach( WebSim::confederates, (GHFunc)cb, arg ); } -void WebSim::ForEachPuppet( void(*cb)(std::string, WebSim::Puppet*, void*), void* arg ) +void WebSim::ForEachPuppet( void(*cb)(const std::string&, WebSim::Puppet*, void*), void* arg ) { g_hash_table_foreach( WebSim::puppets, (GHFunc)cb, arg ); } + +WebSim::Puppet* WebSim::GetPuppet( const std::string& name ) +{ + return( (Puppet*)g_hash_table_lookup( WebSim::puppets, name.c_str() ) ); +} + +WebSim::Confederate* WebSim::GetConfederate( const std::string& name ) +{ + return( (Confederate*)g_hash_table_lookup( WebSim::confederates, name.c_str() ) ); +} Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-03-17 23:48:36 UTC (rev 7527) +++ code/websim/src/websim.hh 2009-03-18 02:58:32 UTC (rev 7528) @@ -40,15 +40,13 @@ // GLib-2.0 #include <glib.h> -// YAML -// #include <yaml.h> - namespace websim { class Pose; class Velocity; class Acceleration; +class Time; class WebSim { @@ -58,7 +56,7 @@ virtual ~WebSim(); - void LoadFederationFile( std::string filename ); + void LoadFederationFile( const std::string& filename ); /** Wait for go signals from all confederates */ void Wait(); @@ -78,11 +76,15 @@ const Acceleration& a, std::string& response) = 0; virtual bool GetModelPVA(const std::string& name, + Time& t, Pose& p, Velocity& v, Acceleration& a, std::string& response) = 0; - + + /** Get the current simulation time */ + virtual Time GetTime() = 0; + bool SetPuppetPVA( const std::string& name, Pose& p, Velocity& v, @@ -93,12 +95,9 @@ std::vector<std::string> &t, const std::string &d); - //void EscapeLoopIfDone(); - - - // Number of ticks we require before exiting Update() + /**Number of ticks we require each step before exiting Wait() */ int tick_count_expected; - // Number of ticks remaining before we can quit update + /** Number of ticks remaining in this step before we can quit Wait() */ int ticks_remaining; protected: @@ -111,7 +110,7 @@ // Static, so that it can be passed as a callback to libevent static void EventCallback(evhttp_request* req, void* arg); - bool GetValue(std::string& value, + bool GetValue( std::string& value, struct evkeyvalq* query_args, const std::string& key); bool HandleURI(const std::string& model, @@ -135,7 +134,6 @@ std::string& response); void DeleteKeyVal(struct evkeyvalq* query_args); - // forward decare class Confederate; @@ -146,7 +144,7 @@ WebSim* ws; public: - Puppet( WebSim* ws, std::string name ); + Puppet( WebSim* ws, const std::string& name ); // unique ID used as a system-wide handle for this puppet, used as // hash table key @@ -164,18 +162,12 @@ // create an instance of the puppet on this confederate, using the // named puppet prototype (defined locally at the conferderate) void AddConfederate( Confederate* conf, - std::string prototype ); + const std::string& prototype ); }; // manage a federated simulator class Confederate { -// typedef struct -// { -// std::string name; -// Confederate* conf; -// } cb_chunk_t; - private: // connection to a remote http simulation server struct evhttp_connection* http_con; @@ -187,18 +179,17 @@ WebSim* ws; public: - Confederate( WebSim* ws, std::string uri ); + Confederate( WebSim* ws, const std::string& uri ); ~Confederate(); void AddPuppet( Puppet* puppet, - std::string prototype ); + const std::string& prototype ); - int Push( std::string name, Pose p, Velocity v, Acceleration a ); + int Push( const std::string& name, Pose p, Velocity v, Acceleration a ); - static void TickCb( std::string name, Confederate* conf, void* arg ); + static void TickCb( const std::string& name, Confederate* conf, void* arg ); static void TickReplyCb( evhttp_request* req, void* arg ); - // send a tick request to this host int Tick(); @@ -230,18 +221,40 @@ public: /** Get a puppet by name */ - Puppet* GetPuppet( std::string name ); + Puppet* GetPuppet( const std::string& name ); /** Get a confederate by its logical name */ - Confederate* GetConfederate( std::string name ); + Confederate* GetConfederate( const std::string& name ); /** For each confederate, call the callback function */ - void ForEachConfederate( void(*cb)(std::string, Confederate*, void*), void* arg ); + void ForEachConfederate( void(*cb)(const std::string&, Confederate*, void*), void* arg ); /** For each puppet, call the callback function */ - void ForEachPuppet( void(*cb)(std::string, Puppet*, void*), void* arg ); + void ForEachPuppet( void(*cb)(const std::string&, Puppet*, void*), void* arg ); }; +class Time +{ +public: + Time( unsigned long sec, unsigned long usec ) : + sec(sec), usec(usec) + { /* nothing to do except initialize */ } + + Time() : sec(0), usec(0) {} + + Time( uint64_t microseconds ) + { + sec = microseconds / 1e6; + usec = microseconds - (sec * 1e6); + } + + unsigned long sec; ///< seconds since the start of simulation time + unsigned long usec; ///< millions of a second since the last whole second + + /** Returns the time in a human-readable string form "sec.usec" */ + std::string String(); +}; + class Pose { public: @@ -287,4 +300,5 @@ }; + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2009-05-27 19:43:23
|
Revision: 7729 http://playerstage.svn.sourceforge.net/playerstage/?rev=7729&view=rev Author: asadat Date: 2009-05-27 19:42:15 +0000 (Wed, 27 May 2009) Log Message: ----------- Added a method to get the extent of the world and models. And also did some refactoring Modified Paths: -------------- code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-05-27 19:39:57 UTC (rev 7728) +++ code/websim/src/websim.cc 2009-05-27 19:42:15 UTC (rev 7729) @@ -255,6 +255,13 @@ return false; } } + else if(prop == "extent") + { + double x,y,z; + GetModelExtent("sim", x, y, z, response); + GetXMLModelExtent("sim", x, y, z, response); + + } else if(prop == "greet") // action is the name of the greeting server { // TODO - check to see if this server was anticipated @@ -313,35 +320,16 @@ return false; } - }else if(prop=="lasercfg"){ - - Time t; - uint32_t res; - double fov; - Pose p; - - if(GetLaserCfgData(model, t, res, fov, p, response)) - { - - GetTextLaserCfgData(model, t, res, fov, p, response); - return true; - - } - else - { - response = "ERROR: Failed to get laser cfg data for model " + model; - return false; - } - }else if(prop=="ranger"){ Time t; std::vector<double> ranges; + std::vector<Pose> p; - if(GetRangerData(model, t, ranges, response)) + if(GetRangerData(model, t, p, ranges, response)) { - GetTextRangerData(model, t, ranges, response); + GetXMLRangerData(model, t, p, ranges, response); return true; } @@ -351,24 +339,13 @@ return false; } - }else if(prop=="rangercfg"){ - - Time t; - std::vector<Pose> p; - - if(GetRangerCfgData(model, t, p, response)) - { + }else if(prop == "extent") + { + double x,y,z; + GetModelExtent(model, x, y, z, response); + GetXMLModelExtent(model, x, y, z, response); - GetTextRangerCfgData(model, t, p, response); - return true; - - } - else - { - response = "ERROR: Failed to get ranger Cfg data for model " + model; - return false; } - } else { response = "ERROR: Unknown property " + prop + " for model " + model; @@ -720,28 +697,10 @@ xmlBufferFree(buf); } -void -WebSim::GetTextLaserCfgData(const std::string& name, - Time& t, - uint32_t& resolution, - double& fov, - Pose& p, - std::string& response) -{ - char buf[2048]; - snprintf(buf, sizeof(buf), - "%s's state @%s: \n resolution(%d)\n fov(%.2f)\n" - " pose (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", - name.c_str(), - t.String().c_str(), - resolution, - fov, - p.x,p.y,p.z,p.r,p.p,p.a); - response = buf; -} void WebSim::GetTextRangerData(const std::string& name, Time& t, + std::vector<Pose>& p, std::vector<double>& ranges, std::string& response) { std::string res; @@ -753,19 +712,30 @@ res.append(","); } + std::string pstr; + char ptmp[256]; + for(unsigned int i=0;i<p.size();i++){ + Pose pos = p.at(i); + sprintf(ptmp," (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)", + pos.x,pos.y,pos.x,pos.r,pos.p,pos.a); + pstr.append(ptmp); + + } char buf[2048]; snprintf(buf, sizeof(buf), - "%s's state @%s: \n ranger: (%s)\n", + "%s's state @%s: \n ranger\n ranges: (%s)\n pose: %s", name.c_str(), t.String().c_str(), - res.c_str()); + res.c_str(), + pstr.c_str()); response = buf; } void WebSim::GetXMLRangerData(const std::string& name, Time& t, + std::vector<Pose>& p, std::vector<double>& ranges, std::string& response) { @@ -776,7 +746,7 @@ std::string res; - char temp[128]; + char temp[1024]; for(unsigned int i=0;i<ranges.size();i++){ sprintf(temp,"%.3f",ranges.at(i)); res.append(temp); @@ -784,6 +754,14 @@ res.append(","); } + std::string pstr; + char ptmp[2048]; + for(unsigned int i=0;i<p.size();i++){ + Pose pos = p.at(i); + sprintf(ptmp," (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)", + pos.x,pos.y,pos.x,pos.r,pos.p,pos.a); + pstr.append(ptmp); + } buf = xmlBufferCreate(); writer = xmlNewTextWriterMemory(buf, 0); @@ -803,8 +781,10 @@ tmp = ConvertInput(res.c_str(), MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "samples", BAD_CAST tmp); + xmlTextWriterWriteAttribute(writer, BAD_CAST "Samples", BAD_CAST tmp); + tmp = ConvertInput(pstr.c_str(), MY_ENCODING); + xmlTextWriterWriteAttribute(writer, BAD_CAST "Positions", BAD_CAST tmp); xmlTextWriterEndElement(writer); @@ -823,37 +803,80 @@ } +void +WebSim::GetTextModelExtent(const std::string& name, + double& x, + double& y, + double& z, + std::string& response) +{ + char buf[1024]; + if(name == "sim") + snprintf(buf, sizeof(buf),"World Extent: (%.3f,%.3f,%.3f)\n", + x, y, z); + else + snprintf(buf, sizeof(buf),"%s's Extent: (%.3f,%.3f,%.3f)\n", + name.c_str(), x, y, z); + response = buf; + +} + void -WebSim::GetTextRangerCfgData(const std::string& name, - Time& t, - std::vector<Pose>& p, - std::string& response) +WebSim::GetXMLModelExtent(const std::string& name, + double& x, + double& y, + double& z, + std::string& response) { + + xmlTextWriterPtr writer; + xmlBufferPtr buf; + xmlChar *tmp; + char str[32]; - std::string res; - char temp[256]; - for(unsigned int i=0;i<p.size();i++){ - Pose pos = p.at(i); - sprintf(temp," (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)", - pos.x,pos.y,pos.x,pos.r,pos.p,pos.a); - res.append(temp); - - } + buf = xmlBufferCreate(); + writer = xmlNewTextWriterMemory(buf, 0); - - char buf[2048]; - snprintf(buf, sizeof(buf), - "%s's state @%s: \n rangerCfg:Pose (%s)\n", - name.c_str(), - t.String().c_str(), - res.c_str()); - response = buf; + + xmlTextWriterStartElement(writer, BAD_CAST "Data"); + + xmlTextWriterWriteAttribute(writer, BAD_CAST "Type", BAD_CAST "extent"); + + tmp = ConvertInput(name.c_str(),MY_ENCODING); + xmlTextWriterWriteAttribute(writer, BAD_CAST "Model", BAD_CAST tmp); + + xmlTextWriterStartElement(writer, BAD_CAST "ModelExtent"); + + + sprintf(str,"%.3f",x); + tmp = ConvertInput(str,MY_ENCODING); + xmlTextWriterWriteAttribute(writer, BAD_CAST "X", BAD_CAST tmp); + + sprintf(str,"%.3f",y); + tmp = ConvertInput(str,MY_ENCODING); + xmlTextWriterWriteAttribute(writer, BAD_CAST "Y", BAD_CAST tmp); + sprintf(str,"%.3f",z); + tmp = ConvertInput(str,MY_ENCODING); + xmlTextWriterWriteAttribute(writer, BAD_CAST "Z", BAD_CAST tmp); + + xmlTextWriterEndElement(writer); + + xmlTextWriterEndElement(writer); + xmlTextWriterEndDocument(writer); + xmlFreeTextWriter(writer); + + puts((const char*) buf->content); + + response = (const char*) buf->content; + + xmlBufferFree(buf); + + } - xmlChar * ConvertInput(const char *in, const char *encoding) { Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-05-27 19:39:57 UTC (rev 7728) +++ code/websim/src/websim.hh 2009-05-27 19:42:15 UTC (rev 7729) @@ -122,47 +122,44 @@ std::vector<double>& ranges, std::string& response); - virtual bool GetLaserCfgData(const std::string& name, - Time& t, - uint32_t& resolution, - double& fov, - Pose& p, - std::string& response) = 0; - - void GetTextLaserCfgData(const std::string& name, - Time& t, - uint32_t& resolution, - double& fov, - Pose& p, - std::string& response); virtual bool GetRangerData(const std::string& name, Time& t, + std::vector<Pose>& p, std::vector<double>& ranges, std::string& response) = 0; void GetTextRangerData(const std::string& name, Time& t, + std::vector<Pose>& p, std::vector<double>& ranges, std::string& response); void GetXMLRangerData(const std::string& name, Time& t, + std::vector<Pose>& p, std::vector<double>& ranges, std::string& response); - - virtual bool GetRangerCfgData(const std::string& name, - Time& t, - std::vector<Pose>& p, - std::string& response) = 0; - void GetTextRangerCfgData(const std::string& name, - Time& t, - std::vector<Pose>& p, + + virtual bool GetModelExtent(const std::string& name, + double& x, + double& y, + double& z, + std::string& response) = 0; + void GetTextModelExtent(const std::string& name, + double& x, + double& y, + double& z, std::string& response); + void GetXMLModelExtent(const std::string&, + double& x, + double& y, + double& z, + std::string& response); /** Get the current simulation time */ virtual Time GetTime() = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2009-05-28 00:48:48
|
Revision: 7732 http://playerstage.svn.sourceforge.net/playerstage/?rev=7732&view=rev Author: asadat Date: 2009-05-28 00:48:43 +0000 (Thu, 28 May 2009) Log Message: ----------- added GetNumberOfRobots() and GetSayString() methods Modified Paths: -------------- code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-05-28 00:47:31 UTC (rev 7731) +++ code/websim/src/websim.cc 2009-05-28 00:48:43 UTC (rev 7732) @@ -262,6 +262,21 @@ GetXMLModelExtent("sim", x, y, z, response); } + else if(prop == "robots") + { + unsigned int n=0; + GetNumberOfRobots(n); + char tmp[256]; + sprintf(tmp, "Number of Robots: %d",n); + response = tmp; + } + else if(prop == "sayings") + { + std::vector<std::string> says; + GetSayStrings(says); + for(int i=0;i<says.size();i++) + response += says.at(i) + "\n"; + } else if(prop == "greet") // action is the name of the greeting server { // TODO - check to see if this server was anticipated Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-05-28 00:47:31 UTC (rev 7731) +++ code/websim/src/websim.hh 2009-05-28 00:48:43 UTC (rev 7732) @@ -160,6 +160,10 @@ double& y, double& z, std::string& response); + virtual bool GetNumberOfRobots(unsigned int& n) = 0; + + virtual bool GetSayStrings(std::vector<std::string>& sayings) = 0; + /** Get the current simulation time */ virtual Time GetTime() = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2009-05-29 21:11:06
|
Revision: 7741 http://playerstage.svn.sourceforge.net/playerstage/?rev=7741&view=rev Author: asadat Date: 2009-05-29 21:10:46 +0000 (Fri, 29 May 2009) Log Message: ----------- added 'format' as a parameter of http request to specify response format Modified Paths: -------------- code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-05-29 21:09:08 UTC (rev 7740) +++ code/websim/src/websim.cc 2009-05-29 21:10:46 UTC (rev 7741) @@ -186,21 +186,34 @@ struct evkeyvalq* kv, std::string& response) { + + bool xmlresponse = false; + std::string format; + // specify the format of the response: Text or Xml + if(GetValue(format,kv,"format")){ + + if(format == "xml") + xmlresponse = true; + else + xmlresponse = false; + } + // The special simulation model if(model == "sim") { - return HandleSimRequest(prop, action, kv, response); + return HandleSimRequest(prop, action, xmlresponse, kv, response); } // Everything else must be an existing model else { - return HandleModelRequest(model, prop, action, kv, response); + return HandleModelRequest(model, prop, action, xmlresponse, kv, response); } } bool WebSim::HandleSimRequest(const std::string& prop, const std::string& action, + bool xmlresponse, struct evkeyvalq* kv, std::string& response) { @@ -258,8 +271,9 @@ else if(prop == "extent") { double x,y,z; - GetModelExtent("sim", x, y, z, response); - GetXMLModelExtent("sim", x, y, z, response); + Pose center; + GetModelExtent("sim", x, y, z, center, response); + GetXMLModelExtent("sim", x, y, z, center, response); } else if(prop == "robots") @@ -295,6 +309,7 @@ WebSim::HandleModelRequest(const std::string& model, const std::string& prop, const std::string& action, + bool xmlresponse, struct evkeyvalq* kv, std::string& response) { @@ -308,7 +323,12 @@ Time t; if(GetModelPVA(model, t, p, v, a, response)) { - GetTextPVA(model, t, p, v, a, response); + + if(xmlresponse) + GetXMLPVA(model, t, p, v, a, response); + else + GetTextPVA(model, t, p, v, a, response); + return true; } @@ -325,8 +345,12 @@ std::vector<double> ranges; if(GetLaserData(model, t, res, fov, p,ranges, response)) { - GetTextLaserData(model, t, res, fov, p, ranges, response); - return true; + if(xmlresponse) + GetXMLLaserData(model, t, res, fov, p, ranges, response); + else + GetTextLaserData(model, t, res, fov, p, ranges, response); + + return true; } else @@ -343,9 +367,13 @@ if(GetRangerData(model, t, p, ranges, response)) { - - GetXMLRangerData(model, t, p, ranges, response); - return true; + if(xmlresponse) + + GetXMLRangerData(model, t, p, ranges, response); + else + GetTextRangerData(model, t, p, ranges, response); + + return true; } else @@ -354,23 +382,32 @@ return false; } - }else if(prop == "extent") - { - double x,y,z; - GetModelExtent(model, x, y, z, response); - GetXMLModelExtent(model, x, y, z, response); + }else if(prop == "extent"){ + double x,y,z; + Pose center; + if(GetModelExtent(model, x, y, z, center, response)) + { + if(xmlresponse) + GetXMLModelExtent(model, x, y, z, center, response); + else + GetTextModelExtent(model, x, y, z, center, response); - } - else - { - response = "ERROR: Unknown property " + prop + " for model " + model; - return false; - } - } - else if(action == "set") + }else{ + + response = "ERROR: failed to get the extent of model " + model; + return false; + + } + }else{ + response = "ERROR: Unknown property " + prop + " for model " + model; + return false; + } + + +}else if(action == "set") { if(prop == "pva") - { + { std::string sx, sy, sz, sroll, spitch, syaw; // Get pose first, fill in what the caller provided @@ -625,7 +662,7 @@ } - char buf[2048]; + char buf[4096]; snprintf(buf, sizeof(buf), "%s's state @%s: \n laser: (%s)\n resolution: (%d)\n fov(%.2f)\n" " pose (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", @@ -652,7 +689,7 @@ xmlTextWriterPtr writer; xmlBufferPtr buf; xmlChar *tmp; - char str[32]; + char str[128]; std::string res; @@ -671,9 +708,8 @@ xmlTextWriterStartElement(writer, BAD_CAST "Data"); - sprintf(str,"%s",t.String().c_str()); - tmp = ConvertInput(str,MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Time", BAD_CAST tmp); + + xmlTextWriterWriteAttribute(writer, BAD_CAST "Time", BAD_CAST t.String().c_str()); xmlTextWriterWriteAttribute(writer, BAD_CAST "Type", BAD_CAST "laser"); tmp = ConvertInput(name.c_str(),MY_ENCODING); @@ -689,7 +725,7 @@ tmp = ConvertInput(str,MY_ENCODING); xmlTextWriterWriteAttribute(writer, BAD_CAST "FOV", BAD_CAST tmp); - sprintf(str,"%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",p.x, p.y, 0.f, 0.f, 0.f, p.a); + sprintf(str,"%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",p.x, p.y, p.z, p.r, p.p, p.a); tmp = ConvertInput(str,MY_ENCODING); xmlTextWriterWriteAttribute(writer, BAD_CAST "Pose", BAD_CAST tmp); @@ -823,15 +859,16 @@ double& x, double& y, double& z, + Pose& center, std::string& response) { char buf[1024]; if(name == "sim") - snprintf(buf, sizeof(buf),"World Extent: (%.3f,%.3f,%.3f)\n", - x, y, z); + snprintf(buf, sizeof(buf),"World Extent: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", + x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); else - snprintf(buf, sizeof(buf),"%s's Extent: (%.3f,%.3f,%.3f)\n", - name.c_str(), x, y, z); + snprintf(buf, sizeof(buf),"%s's Extent: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", + name.c_str(), x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); response = buf; @@ -842,13 +879,14 @@ double& x, double& y, double& z, + Pose& center, std::string& response) { xmlTextWriterPtr writer; xmlBufferPtr buf; xmlChar *tmp; - char str[32]; + char str[1024]; buf = xmlBufferCreate(); writer = xmlNewTextWriterMemory(buf, 0); @@ -876,6 +914,10 @@ tmp = ConvertInput(str,MY_ENCODING); xmlTextWriterWriteAttribute(writer, BAD_CAST "Z", BAD_CAST tmp); + sprintf(str,"%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",center.x,center.y,center.z,center.r,center.p,center.a); + tmp = ConvertInput(str,MY_ENCODING); + xmlTextWriterWriteAttribute(writer, BAD_CAST "Origin", BAD_CAST tmp); + xmlTextWriterEndElement(writer); xmlTextWriterEndElement(writer); Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-05-29 21:09:08 UTC (rev 7740) +++ code/websim/src/websim.hh 2009-05-29 21:10:46 UTC (rev 7741) @@ -48,6 +48,7 @@ class Velocity; class Acceleration; class Time; +class Bounds; class WebSim { @@ -83,19 +84,6 @@ Acceleration& a, std::string& response) = 0; - void GetTextPVA(const std::string& name, - Time& t, - const Pose& p, - const Velocity& v, - const Acceleration& a, - std::string& response); - - void GetXMLPVA(const std::string& name, - Time& t, - const Pose& p, - const Velocity& v, - const Acceleration& a, - std::string& response); virtual bool GetLaserData(const std::string& name, Time& t, uint32_t& resolution, @@ -103,25 +91,7 @@ Pose& p, std::vector<double>& ranges, std::string& response) = 0; - - void GetTextLaserData(const std::string& name, - Time& t, - uint32_t& resolution, - double& fov, - Pose& p, - - std::vector<double>& ranges, - std::string& response); - - void GetXMLLaserData(const std::string& name, - Time& t, - uint32_t& resolution, - double& fov, - Pose& p, - std::vector<double>& ranges, - std::string& response); - virtual bool GetRangerData(const std::string& name, Time& t, @@ -130,36 +100,14 @@ std::string& response) = 0; - void GetTextRangerData(const std::string& name, - Time& t, - std::vector<Pose>& p, - std::vector<double>& ranges, - std::string& response); - - void GetXMLRangerData(const std::string& name, - Time& t, - std::vector<Pose>& p, - std::vector<double>& ranges, - std::string& response); - virtual bool GetModelExtent(const std::string& name, - double& x, - double& y, - double& z, + double& bx, + double& by, + double& bz, + Pose& center, std::string& response) = 0; - void GetTextModelExtent(const std::string& name, - double& x, - double& y, - double& z, - std::string& response); - - void GetXMLModelExtent(const std::string&, - double& x, - double& y, - double& z, - std::string& response); virtual bool GetNumberOfRobots(unsigned int& n) = 0; virtual bool GetSayStrings(std::vector<std::string>& sayings) = 0; @@ -202,11 +150,13 @@ std::string& response); bool HandleSimRequest(const std::string& prop, const std::string& action, + bool xmlresponse, struct evkeyvalq* kv, std::string& response); bool HandleModelRequest(const std::string& model, const std::string& prop, const std::string& action, + bool xmlresponse, struct evkeyvalq* kv, std::string& response); bool ParseURI(std::string& model, @@ -216,6 +166,62 @@ std::string& response); void DeleteKeyVal(struct evkeyvalq* query_args); + void GetTextPVA(const std::string& name, + Time& t, + const Pose& p, + const Velocity& v, + const Acceleration& a, + std::string& response); + + void GetXMLPVA(const std::string& name, + Time& t, + const Pose& p, + const Velocity& v, + const Acceleration& a, + std::string& response); + + void GetTextLaserData(const std::string& name, + Time& t, + uint32_t& resolution, + double& fov, + Pose& p, + + std::vector<double>& ranges, + std::string& response); + + + void GetXMLLaserData(const std::string& name, + Time& t, + uint32_t& resolution, + double& fov, + Pose& p, + std::vector<double>& ranges, + std::string& response); + void GetTextRangerData(const std::string& name, + Time& t, + std::vector<Pose>& p, + std::vector<double>& ranges, + std::string& response); + + + void GetXMLRangerData(const std::string& name, + Time& t, + std::vector<Pose>& p, + std::vector<double>& ranges, + std::string& response); + void GetTextModelExtent(const std::string& name, + double& x, + double& y, + double& z, + Pose& center, + std::string& response); + + void GetXMLModelExtent(const std::string&, + double& x, + double& y, + double& z, + Pose& center, + std::string& response); // forward decare class Confederate; @@ -383,6 +389,15 @@ {} }; +class Bounds +{ +public: + /// largest value in range, initially zero + double max; + /// smallest value in range, initially zero + double min; + + Bounds() : max(0), min(0) { /* empty*/ } +}; - } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2009-06-19 22:31:52
|
Revision: 7861 http://playerstage.svn.sourceforge.net/playerstage/?rev=7861&view=rev Author: asadat Date: 2009-06-19 22:31:41 +0000 (Fri, 19 Jun 2009) Log Message: ----------- GetModelData() is added to get the data of all sensor types Modified Paths: -------------- code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-06-19 07:12:55 UTC (rev 7860) +++ code/websim/src/websim.cc 2009-06-19 22:31:41 UTC (rev 7861) @@ -33,7 +33,8 @@ #include <stdlib.h> #include <string.h> #include <libxml/encoding.h> -#include <libxml/xmlwriter.h> +//#include <libxml/xmlwriter.h> +//#include <libxml/tree.h> #define MY_ENCODING "ISO-8859-1" @@ -187,33 +188,86 @@ std::string& response) { - bool xmlresponse = false; - std::string format; + Format format; + std::string f; // specify the format of the response: Text or Xml - if(GetValue(format,kv,"format")){ + if(GetValue(f, kv, "format")){ - if(format == "xml") - xmlresponse = true; - else - xmlresponse = false; - } + if(f == "xml") + format = XML; + else + format = TEXT; + }else + format = TEXT; // The special simulation model if(model == "sim") { - return HandleSimRequest(prop, action, xmlresponse, kv, response); + return HandleSimRequest(prop, action, format, kv, response); + }else if(model == "viz"){ + if(prop ==""){ + puts("viz request"); + //response = "<html><header></header><body><img src=\"viz/1.png\" ></body></html>"; + + response = "<HTML><HEAD><TITLE>A Simple Program</TITLE></HEAD>"; + response += "<BODY> <CENTER><APPLET CODE=\"ScrollingSimple.class\" WIDTH=\"1500\" HEIGHT=\"1000\" id=\"TheApplet\"></APPLET></CENTER>"; + response += "<b>The returned data is:</b><br /><script type=\"text/javascript\"> document.write(TheApplet.getResponseText());</script></BODY></HTML>"; + }else{ + + puts("SendingFile:"); + puts(prop.c_str()); + + + } + return true; + + }else if(model == ""){ + + std::vector<std::string> links; + char tmp[2048]; + sprintf(tmp,"%s %s", WebSim::package.c_str(), WebSim::version.c_str()); + response = "<html><head ><title>WebSim</title></head><body><h3>"; + response.append(tmp); + + response.append( "</h3><p>Welcome to WebSim, a web based interface to robot simulation. Through this program, you can get the state of the robots and their sensors using URIs. Here are some examples that might be useful: "); + + + sprintf(tmp,"</p><p><a href=\"http://%s/sim/tree/get\">http://%s/sim/tree/get</a></p>",hostportname.c_str(), hostportname.c_str()); + links.push_back(std::string(tmp)); + + + sprintf(tmp,"<p><a href=\"http://%s/position:1/pva/get\">http://%s/position:1/pva/get</a></p>", hostportname.c_str(), hostportname.c_str()); + links.push_back(std::string(tmp)); + + + sprintf(tmp, "<p><a href=\"http://%s/position:1/laser:0/data/get\">http://%s/position:1/laser:0/data/get</a></p>", hostportname.c_str(), hostportname.c_str()); + links.push_back(std::string(tmp)); + + + sprintf(tmp,"<p><a href=\"http://%s/position:1/ranger:0/data/get\">http://%s/position:1/ranger:0:/data/get</a></p>", hostportname.c_str(), hostportname.c_str()); + links.push_back(std::string(tmp)); + + + sprintf(tmp,"<p><a href=\"http://%s/position:1/model:0/fiducial:0/data/get\">http://%s/position:1/model:0/fiducial:0/data/get</a></p>",hostportname.c_str(), hostportname.c_str()); + links.push_back(std::string(tmp)); + + + response += links[0]+links[1]+links[2]+ links[3]+links[4]+ "</body></html>"; + + + return true; } // Everything else must be an existing model - else + else { - return HandleModelRequest(model, prop, action, xmlresponse, kv, response); + return HandleModelRequest(model, prop, action, format, kv, response); } } bool WebSim::HandleSimRequest(const std::string& prop, const std::string& action, - bool xmlresponse, + Format format, struct evkeyvalq* kv, std::string& response) { @@ -269,27 +323,27 @@ } } else if(prop == "extent") - { + {/* double x,y,z; Pose center; GetModelExtent("sim", x, y, z, center, response); GetXMLModelExtent("sim", x, y, z, center, response); - + */ + return true; } - else if(prop == "robots") + else if(prop == "children") { - unsigned int n=0; - GetNumberOfRobots(n); - char tmp[256]; - sprintf(tmp, "Number of Robots: %d",n); - response = tmp; + std::vector<std::string> children; + GetModelChildren("",children); + + for(unsigned int i=0;i<children.size();i++) + response += "-" + children[i]; } - else if(prop == "sayings") + else if(prop == "tree") { - std::vector<std::string> says; - GetSayStrings(says); - for(int i=0;i<says.size();i++) - response += says.at(i) + "\n"; + GetModelTree("", format, response, false); + return true; + } else if(prop == "greet") // action is the name of the greeting server { @@ -303,95 +357,61 @@ response = "ERROR: Unknown property " + prop + " for sim"; return false; } + + return false; } bool WebSim::HandleModelRequest(const std::string& model, const std::string& prop, const std::string& action, - bool xmlresponse, + Format format, struct evkeyvalq* kv, std::string& response) { if(action == "get") { - if(prop == "pva") - { - Pose p; - Velocity v; - Acceleration a; - Time t; - if(GetModelPVA(model, t, p, v, a, response)) - { + if(prop == "data" || prop == ""){ + + return(GetModelData(model, response, format, NULL)); - if(xmlresponse) - GetXMLPVA(model, t, p, v, a, response); + }else if(prop == "pva"){ + Pose p; + Velocity v; + Acceleration a; + Time t; + if(GetModelPVA(model, t, p, v, a, response)){ + + GetPVA(model, t, p, v, a, format, response, NULL); + return true; + } else - GetTextPVA(model, t, p, v, a, response); - - - return true; - } - else - { - response = "ERROR: Failed to get pose for model " + model; - return false; - } - }else if(prop == "laser"){ - Time t; - uint32_t res; - double fov; - Pose p; - std::vector<double> ranges; - if(GetLaserData(model, t, res, fov, p,ranges, response)) - { - if(xmlresponse) - GetXMLLaserData(model, t, res, fov, p, ranges, response); - else - GetTextLaserData(model, t, res, fov, p, ranges, response); + return false; - return true; - - } - else - { - response = "ERROR: Failed to get laser data for model " + model; - return false; - } + }else if(prop == "children"){ + std::vector<std::string> children; + GetModelChildren(model,children); + + for(unsigned int i=0;i<children.size();i++) + response += children[i] + "\n"; - }else if(prop=="ranger"){ + return true; - Time t; - std::vector<double> ranges; - std::vector<Pose> p; + }else if(prop == "tree"){ - if(GetRangerData(model, t, p, ranges, response)) - { - if(xmlresponse) - GetXMLRangerData(model, t, p, ranges, response); - else - GetTextRangerData(model, t, p, ranges, response); - - return true; - - } - else - { - response = "ERROR: Failed to get ranger data for model " + model; - return false; - } - + return(GetModelTree(model, format, response, true)); + + }else if(prop == "extent"){ double x,y,z; Pose center; if(GetModelExtent(model, x, y, z, center, response)) { - if(xmlresponse) - GetXMLModelExtent(model, x, y, z, center, response); - else - GetTextModelExtent(model, x, y, z, center, response); + GetModelExtent(model, x, y, z, center, format, response, NULL); + return true; + }else{ response = "ERROR: failed to get the extent of model " + model; @@ -481,177 +501,107 @@ response = "ERROR: Unknown action " + action; return false; } + + return false; } void -WebSim::GetTextPVA(const std::string& name, +WebSim::GetPVA(const std::string& name, Time& t, const Pose& p, const Velocity& v, const Acceleration& a, - std::string& response) + Format format, + std::string& response, + void* xmlnode) { + if(format == TEXT){ + char buf[1024]; + snprintf(buf, sizeof(buf), + "%s's state @%s: \n pose: (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" + " vel : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" + " acc : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", + name.c_str(), + t.String().c_str(), + p.x, p.y, p.z, p.r, p.p, p.a, + v.x, v.y, v.z, v.r, v.p, v.a, + a.x, a.y, a.z, a.r, a.p, a.a); + response = buf; - char buf[1024]; - snprintf(buf, sizeof(buf), - "%s's state @%s: \n pose: (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" - " vel : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" - " acc : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", - name.c_str(), - t.String().c_str(), - p.x, p.y, p.z, p.r, p.p, p.a, - v.x, v.y, v.z, v.r, v.p, v.a, - a.x, a.y, a.z, a.r, a.p, a.a); - response = buf; + }else if (format == XML){ -} + xmlNodePtr root_node = NULL; + xmlDocPtr doc = NULL; + xmlNodePtr node; + xmlChar *tmp; + char str[128]; + if(xmlnode == NULL){ -void -WebSim::GetXMLPVA(const std::string& name, - Time& t, - const Pose& p, - const Velocity& v, - const Acceleration& a, - std::string& response) -{ - - xmlTextWriterPtr writer; - xmlBufferPtr buf; - xmlChar *tmp; - char str[32]; + doc = xmlNewDoc(BAD_CAST "1.0"); + root_node = xmlNewNode(NULL, BAD_CAST "root"); + xmlDocSetRootElement(doc, root_node); + node = xmlNewChild(root_node, NULL, BAD_CAST "Model", NULL); + }else{ + node = (xmlNodePtr) xmlnode; + xmlNodeSetName(node, xmlCharStrdup("Model")); + //node = xmlNewChild((xmlNodePtr)parent, NULL, BAD_CAST "PVA", NULL); + //root_node = (xmlNodePtr)parent; + } - buf = xmlBufferCreate(); - writer = xmlNewTextWriterMemory(buf, 0); + + + sprintf(str,"%s",t.String().c_str()); + tmp = ConvertInput(str,MY_ENCODING); + xmlNewProp(node, BAD_CAST "Time", BAD_CAST tmp); + xmlNewProp(node, BAD_CAST "Type", BAD_CAST "pva"); - xmlTextWriterStartElement(writer, BAD_CAST "Data"); - - sprintf(str,"%s",t.String().c_str()); - tmp = ConvertInput(str,MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Time", BAD_CAST tmp); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Type", BAD_CAST "pva"); + tmp = ConvertInput(name.c_str(),MY_ENCODING); + xmlNewProp(node, BAD_CAST "Name", BAD_CAST tmp); + + sprintf(str,"%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",p.x, p.y, p.z, p.r, p.p, p.a); + tmp = ConvertInput(str, MY_ENCODING); + xmlNewProp(node, BAD_CAST "Pose", BAD_CAST tmp); - tmp = ConvertInput(name.c_str(),MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Model", BAD_CAST tmp); + sprintf(str,"%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",v.x, v.y, v.z, v.r, v.p, v.a); + tmp = ConvertInput(str, MY_ENCODING); + xmlNewProp(node, BAD_CAST "Velocity", BAD_CAST tmp); - xmlTextWriterStartElement(writer, BAD_CAST "Pose"); - - sprintf(str,"%.3f",p.x); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "x", BAD_CAST tmp); - - sprintf(str,"%.3f",p.y); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "y", BAD_CAST tmp); + sprintf(str,"%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",a.x, a.y, a.z, a.r, a.p, a.a); + tmp = ConvertInput(str, MY_ENCODING); + xmlNewProp(node, BAD_CAST "Acceleration", BAD_CAST tmp); + + if(xmlnode == NULL){ + xmlBufferPtr buf = xmlBufferCreate(); + xmlKeepBlanksDefault(0); + xmlNodeDump(buf, doc,node, 0, 1); + response = (const char*) buf->content; + puts(response.c_str()); + xmlBufferFree(buf); + xmlFreeDoc(doc); + } + } - sprintf(str,"%.3f",p.z); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "z", BAD_CAST tmp); +} - sprintf(str,"%.3f",p.r); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "r", BAD_CAST tmp); - sprintf(str,"%.3f",p.p); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "p", BAD_CAST tmp); - - sprintf(str,"%.3f",p.a); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "a", BAD_CAST tmp); - - xmlTextWriterEndElement(writer); - - - - xmlTextWriterStartElement(writer, BAD_CAST "Velocity"); - - sprintf(str,"%.3f",v.x); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "x", BAD_CAST tmp); - - sprintf(str,"%.3f",v.y); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "y", BAD_CAST tmp); - - sprintf(str,"%.3f",v.z); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "z", BAD_CAST tmp); - - sprintf(str,"%.3f",v.r); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "r", BAD_CAST tmp); - - sprintf(str,"%.3f",v.p); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "p", BAD_CAST tmp); - - sprintf(str,"%.3f",v.a); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "a", BAD_CAST tmp); - - xmlTextWriterEndElement(writer); - - - - - xmlTextWriterStartElement(writer, BAD_CAST "Acceleration"); - - sprintf(str,"%.3f",a.x); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "x", BAD_CAST tmp); - - sprintf(str,"%.3f",a.y); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "y", BAD_CAST tmp); - - sprintf(str,"%.3f",a.z); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "z", BAD_CAST tmp); - - sprintf(str,"%.3f",a.r); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "r", BAD_CAST tmp); - - sprintf(str,"%.3f",a.p); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "p", BAD_CAST tmp); - - sprintf(str,"%.3f",a.a); - tmp = ConvertInput(str, MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "a", BAD_CAST tmp); - - xmlTextWriterEndElement(writer); - - xmlTextWriterEndElement(writer); - - xmlTextWriterEndDocument(writer); - xmlFreeTextWriter(writer); - - - puts((const char*) buf->content); - - response = (const char*) buf->content; - - xmlBufferFree(buf); - - - -} - void -WebSim::GetTextLaserData(const std::string& name, +WebSim::GetLaserData(const std::string& name, Time& t, uint32_t& resolution, double& fov, Pose& p, std::vector<double>& ranges, - std::string& response) + Format format, + std::string& response, + void* xmlnode) { + if(format == TEXT){ + std::string res; char temp[128]; for(unsigned int i=0;i<ranges.size();i++){ @@ -673,87 +623,89 @@ fov, p.x,p.y,p.z,p.r,p.p,p.a); response = buf; -} -void -WebSim::GetXMLLaserData(const std::string& name, - Time& t, - uint32_t& resolution, - double& fov, - Pose& p, - std::vector<double>& ranges, - std::string& response) -{ + }else if(format == XML){ + + xmlNodePtr root_node = NULL; + xmlDocPtr doc = NULL; + xmlNodePtr node; + xmlChar *tmp; + char str[128]; - - xmlTextWriterPtr writer; - xmlBufferPtr buf; - xmlChar *tmp; - char str[128]; + if(xmlnode == NULL){ + puts("no parent\n"); + doc = xmlNewDoc(BAD_CAST "1.0"); + root_node = xmlNewNode(NULL, BAD_CAST "root"); + xmlDocSetRootElement(doc, root_node); + node = xmlNewChild(root_node, NULL, BAD_CAST "Model", NULL); + }else{ + node = (xmlNodePtr) xmlnode; + xmlNodeSetName(node, xmlCharStrdup("Model")); + //node = xmlNewChild((xmlNodePtr)parent, NULL, BAD_CAST "Laser", NULL); + //root_node = (xmlNodePtr)parent; + } - - std::string res; - char temp[128]; - for(unsigned int i=0;i<ranges.size();i++){ - sprintf(temp,"%.3f",ranges.at(i)); - res.append(temp); - if(i+1 != ranges.size()) - res.append(","); - } + std::string res; + char temp[128]; + for(unsigned int i=0;i<ranges.size();i++){ + sprintf(temp,"%.3f",ranges.at(i)); + res.append(temp); + if(i+1 != ranges.size()) + res.append(","); + } - buf = xmlBufferCreate(); - writer = xmlNewTextWriterMemory(buf, 0); - + + xmlNewProp(node, BAD_CAST "Time", BAD_CAST t.String().c_str()); + xmlNewProp(node, BAD_CAST "Type", BAD_CAST "laser"); - xmlTextWriterStartElement(writer, BAD_CAST "Data"); - - - xmlTextWriterWriteAttribute(writer, BAD_CAST "Time", BAD_CAST t.String().c_str()); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Type", BAD_CAST "laser"); + tmp = ConvertInput(name.c_str(),MY_ENCODING); + xmlNewProp(node, BAD_CAST "Name", BAD_CAST tmp); + + sprintf(str,"%d",resolution); + tmp = ConvertInput(str,MY_ENCODING); + xmlNewProp(node, BAD_CAST "Resolution", BAD_CAST tmp); - tmp = ConvertInput(name.c_str(),MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Model", BAD_CAST tmp); - - xmlTextWriterStartElement(writer, BAD_CAST "Laser"); - - sprintf(str,"%d",resolution); - tmp = ConvertInput(str,MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Resolution", BAD_CAST tmp); - - sprintf(str,"%.3f",fov); - tmp = ConvertInput(str,MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "FOV", BAD_CAST tmp); - - sprintf(str,"%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",p.x, p.y, p.z, p.r, p.p, p.a); - tmp = ConvertInput(str,MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Pose", BAD_CAST tmp); + sprintf(str,"%.3f",fov); + tmp = ConvertInput(str,MY_ENCODING); + xmlNewProp(node, BAD_CAST "FOV", BAD_CAST tmp); + + sprintf(str,"%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",p.x, p.y, p.z, p.r, p.p, p.a); + tmp = ConvertInput(str,MY_ENCODING); + xmlNewProp(node, BAD_CAST "Pose", BAD_CAST tmp); - tmp = ConvertInput(res.c_str(), MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Samples", BAD_CAST tmp); + tmp = ConvertInput(res.c_str(), MY_ENCODING); + xmlNewProp(node, BAD_CAST "Samples", BAD_CAST tmp); - xmlTextWriterEndElement(writer); - - xmlTextWriterEndElement(writer); + if(xmlnode == NULL){ + xmlBufferPtr buf = xmlBufferCreate(); + xmlKeepBlanksDefault(0); + xmlNodeDump(buf, doc,node, 0, 1); - xmlTextWriterEndDocument(writer); - xmlFreeTextWriter(writer); - + response = (const char*) buf->content; + puts(response.c_str()); + xmlBufferFree(buf); + xmlFreeDoc(doc); + } - puts((const char*) buf->content); + + - response = (const char*) buf->content; - - xmlBufferFree(buf); - -} + } +} + void -WebSim::GetTextRangerData(const std::string& name, +WebSim::GetRangerData(const std::string& name, Time& t, std::vector<Pose>& p, - std::vector<double>& ranges, std::string& response) + std::vector<double>& ranges, + Format format, + std::string& response, + void* xmlnode) { + if(format == TEXT){ + std::string res; char temp[128]; for(unsigned int i=0;i<ranges.size();i++){ @@ -781,159 +733,345 @@ res.c_str(), pstr.c_str()); response = buf; -} + + }else if(format == XML){ + + xmlNodePtr root_node = NULL; + xmlDocPtr doc = NULL; + xmlNodePtr node; + xmlChar *tmp; + char str[128]; -void -WebSim::GetXMLRangerData(const std::string& name, - Time& t, - std::vector<Pose>& p, - std::vector<double>& ranges, std::string& response) -{ + if(xmlnode == NULL){ + puts("no parent\n"); + doc = xmlNewDoc(BAD_CAST "1.0"); + root_node = xmlNewNode(NULL, BAD_CAST "root"); + xmlDocSetRootElement(doc, root_node); + node = xmlNewChild(root_node, NULL, BAD_CAST "Model", NULL); + }else{ + node = (xmlNodePtr)xmlnode; + xmlNodeSetName(node, xmlCharStrdup("Model")); + //node = xmlNewChild((xmlNodePtr)parent, NULL, BAD_CAST "Ranger", NULL); + //root_node = (xmlNodePtr)parent; + } - xmlTextWriterPtr writer; - xmlBufferPtr buf; - xmlChar *tmp; - char str[32]; - - std::string res; - char temp[1024]; - for(unsigned int i=0;i<ranges.size();i++){ - sprintf(temp,"%.3f",ranges.at(i)); - res.append(temp); - if(i+1 != ranges.size()) - res.append(","); - } + std::string res; + char temp[1024]; + for(unsigned int i=0;i<ranges.size();i++){ + sprintf(temp,"%.3f",ranges.at(i)); + res.append(temp); + if(i+1 != ranges.size()) + res.append(","); + } - std::string pstr; - char ptmp[2048]; - for(unsigned int i=0;i<p.size();i++){ - Pose pos = p.at(i); - sprintf(ptmp," (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)", - pos.x,pos.y,pos.x,pos.r,pos.p,pos.a); - pstr.append(ptmp); - } - - buf = xmlBufferCreate(); - writer = xmlNewTextWriterMemory(buf, 0); - + std::string pstr; + char ptmp[2048]; + for(unsigned int i=0;i<p.size();i++){ + Pose pos = p.at(i); + sprintf(ptmp," (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)", + pos.x,pos.y,pos.x,pos.r,pos.p,pos.a); + pstr.append(ptmp); + } + + //xmlNodePtr node = xmlNewChild(root_node, NULL, BAD_CAST "Ranger", NULL); + + + sprintf(str,"%s",t.String().c_str()); + tmp = ConvertInput(str,MY_ENCODING); + xmlNewProp(node, BAD_CAST "Time", BAD_CAST tmp); + xmlNewProp(node, BAD_CAST "Type", BAD_CAST "ranger"); - xmlTextWriterStartElement(writer, BAD_CAST "Data"); - - sprintf(str,"%s",t.String().c_str()); - tmp = ConvertInput(str,MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Time", BAD_CAST tmp); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Type", BAD_CAST "ranger"); + tmp = ConvertInput(name.c_str(),MY_ENCODING); + xmlNewProp(node, BAD_CAST "Name", BAD_CAST tmp); - tmp = ConvertInput(name.c_str(),MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Model", BAD_CAST tmp); + tmp = ConvertInput(res.c_str(), MY_ENCODING); + xmlNewProp(node, BAD_CAST "Samples", BAD_CAST tmp); - xmlTextWriterStartElement(writer, BAD_CAST "Ranger"); - - - tmp = ConvertInput(res.c_str(), MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Samples", BAD_CAST tmp); - - tmp = ConvertInput(pstr.c_str(), MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Positions", BAD_CAST tmp); + tmp = ConvertInput(pstr.c_str(), MY_ENCODING); + xmlNewProp(node, BAD_CAST "Positions", BAD_CAST tmp); - xmlTextWriterEndElement(writer); - - xmlTextWriterEndElement(writer); - xmlTextWriterEndDocument(writer); - xmlFreeTextWriter(writer); - + if(xmlnode == NULL){ + xmlBufferPtr buf = xmlBufferCreate(); + xmlKeepBlanksDefault(0); + xmlNodeDump(buf, doc,node, 0, 1); - puts((const char*) buf->content); + response = (const char*) buf->content; + puts(response.c_str()); + xmlBufferFree(buf); + xmlFreeDoc(doc); + } + - response = (const char*) buf->content; - - xmlBufferFree(buf); + } - } void -WebSim::GetTextModelExtent(const std::string& name, - double& x, - double& y, - double& z, - Pose& center, - std::string& response) +WebSim::GetFiducialData(const std::string& name, + Time& t, + std::vector<Fiducial>& f, + Format format, + std::string& response, + void* xmlnode ) { - char buf[1024]; - if(name == "sim") - snprintf(buf, sizeof(buf),"World Extent: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", - x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); - else - snprintf(buf, sizeof(buf),"%s's Extent: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", - name.c_str(), x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); - response = buf; + + if(format == TEXT){ + + std::string res; + char temp[128]; + for(unsigned int i=0;i<f.size();i++){ + sprintf(temp,"(%.3f,%.3f,%d)\n", f.at(i).range, f.at(i).bearing, f.at(i).id); + res.append(temp); + + } + + + char buf[1024]; + snprintf(buf, sizeof(buf), + "%s's state @%s: \n Fiducial:\n", + name.c_str(), + t.String().c_str()); + + response = buf; + response.append(res); + }else if(format == XML){ + + xmlNodePtr root_node = NULL; + xmlDocPtr doc = NULL; + xmlNodePtr node; + xmlChar *tmp; + char str[128]; + + if(xmlnode == NULL){ + puts("no parent\n"); + doc = xmlNewDoc(BAD_CAST "1.0"); + root_node = xmlNewNode(NULL, BAD_CAST "root"); + xmlDocSetRootElement(doc, root_node); + node = xmlNewChild(root_node, NULL, BAD_CAST "Model", NULL); + }else{ + node = (xmlNodePtr)xmlnode; + xmlNodeSetName(node, xmlCharStrdup("Model")); + //node = xmlNewChild((xmlNodePtr)parent, NULL, BAD_CAST "Ranger", NULL); + //root_node = (xmlNodePtr)parent; + } + + + std::string res; + char temp[128]; + for(unsigned int i=0;i<f.size();i++){ + sprintf(temp,"(%.3f,%.3f,%d)", f.at(i).range, f.at(i).bearing, f.at(i).id); + res.append(temp); + + } + + + sprintf(str,"%s",t.String().c_str()); + tmp = ConvertInput(str,MY_ENCODING); + xmlNewProp(node, BAD_CAST "Time", BAD_CAST tmp); + xmlNewProp(node, BAD_CAST "Type", BAD_CAST "fiducial"); + + tmp = ConvertInput(name.c_str(),MY_ENCODING); + xmlNewProp(node, BAD_CAST "Name", BAD_CAST tmp); + + tmp = ConvertInput(res.c_str(), MY_ENCODING); + xmlNewProp(node, BAD_CAST "Targets", BAD_CAST tmp); + + if(xmlnode == NULL){ + xmlBufferPtr buf = xmlBufferCreate(); + xmlKeepBlanksDefault(0); + xmlNodeDump(buf, doc,node, 0, 1); + + response = (const char*) buf->content; + puts(response.c_str()); + xmlBufferFree(buf); + xmlFreeDoc(doc); + } + + + } + } void -WebSim::GetXMLModelExtent(const std::string& name, +WebSim::GetModelExtent(const std::string& name, double& x, double& y, double& z, Pose& center, - std::string& response) + Format format, + std::string& response, + void* xmlnode) { - - xmlTextWriterPtr writer; - xmlBufferPtr buf; - xmlChar *tmp; - char str[1024]; + if(format == TEXT){ + char buf[1024]; + if(name == "sim") + snprintf(buf, sizeof(buf),"World Extent: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", + x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); + else + snprintf(buf, sizeof(buf),"%s's Extent: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", + name.c_str(), x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); - buf = xmlBufferCreate(); - writer = xmlNewTextWriterMemory(buf, 0); + response = buf; + }else if(format == XML){ + xmlNodePtr root_node = NULL; + xmlDocPtr doc = NULL; + xmlNodePtr node; + xmlChar *tmp; + char str[128]; + + if(xmlnode == NULL){ + puts("no parent\n"); + doc = xmlNewDoc(BAD_CAST "1.0"); + root_node = xmlNewNode(NULL, BAD_CAST "root"); + xmlDocSetRootElement(doc, root_node); + node = xmlNewChild(root_node, NULL, BAD_CAST "ModelExtent", NULL); + }else{ + node = (xmlNodePtr)xmlnode; + xmlNodeSetName(node, xmlCharStrdup("ModelExtent")); + //node = xmlNewChild((xmlNodePtr)parent, NULL, BAD_CAST "ModelExtent", NULL); + //root_node = (xmlNodePtr)parent; + } + + + xmlNewProp(node, BAD_CAST "Type", BAD_CAST "extent"); - xmlTextWriterStartElement(writer, BAD_CAST "Data"); - - xmlTextWriterWriteAttribute(writer, BAD_CAST "Type", BAD_CAST "extent"); + tmp = ConvertInput(name.c_str(),MY_ENCODING); + xmlNewProp(node, BAD_CAST "Name", BAD_CAST tmp); - tmp = ConvertInput(name.c_str(),MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Model", BAD_CAST tmp); + sprintf(str,"%.3f",x); + tmp = ConvertInput(str,MY_ENCODING); + xmlNewProp(node, BAD_CAST "X", BAD_CAST tmp); - xmlTextWriterStartElement(writer, BAD_CAST "ModelExtent"); - - - sprintf(str,"%.3f",x); - tmp = ConvertInput(str,MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "X", BAD_CAST tmp); - - sprintf(str,"%.3f",y); - tmp = ConvertInput(str,MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Y", BAD_CAST tmp); + sprintf(str,"%.3f",y); + tmp = ConvertInput(str,MY_ENCODING); + xmlNewProp(node, BAD_CAST "Y", BAD_CAST tmp); - sprintf(str,"%.3f",z); - tmp = ConvertInput(str,MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Z", BAD_CAST tmp); + sprintf(str,"%.3f",z); + tmp = ConvertInput(str,MY_ENCODING); + xmlNewProp(node, BAD_CAST "Z", BAD_CAST tmp); - sprintf(str,"%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",center.x,center.y,center.z,center.r,center.p,center.a); - tmp = ConvertInput(str,MY_ENCODING); - xmlTextWriterWriteAttribute(writer, BAD_CAST "Origin", BAD_CAST tmp); - - xmlTextWriterEndElement(writer); - - xmlTextWriterEndElement(writer); + sprintf(str,"%.3f,%.3f,%.3f,%.3f,%.3f,%.3f",center.x,center.y,center.z,center.r,center.p,center.a); + tmp = ConvertInput(str,MY_ENCODING); + xmlNewProp(node, BAD_CAST "Origin", BAD_CAST tmp); - xmlTextWriterEndDocument(writer); - xmlFreeTextWriter(writer); - - puts((const char*) buf->content); + if(xmlnode == NULL){ + xmlBufferPtr buf = xmlBufferCreate(); + xmlKeepBlanksDefault(0); + xmlNodeDump(buf, doc,node, 0, 1); - response = (const char*) buf->content; - - xmlBufferFree(buf); + response = (const char*) buf->content; + puts(response.c_str()); + xmlBufferFree(buf); + xmlFreeDoc(doc); + } + } + +} +bool +WebSim::GetModelTree(const std::string& model,Format format, std::string& response, bool everything){ + if(format == XML){ + xmlNodePtr root_node = NULL; + xmlDocPtr doc = NULL; + xmlBufferPtr buf; + + doc = xmlNewDoc(BAD_CAST "1.0"); + buf = xmlBufferCreate(); + root_node = xmlNewNode(NULL, BAD_CAST "ModelTree"); + xmlDocSetRootElement(doc, root_node); + + if(GetModelTreeXML(model, root_node, everything)){ + + xmlKeepBlanksDefault(0); + xmlNodeDump(buf, doc, root_node, 0, 1); + response = (const char*) buf->content; + }else{ + response = "Error in generating model tree.\n"; + + } + + xmlBufferFree(buf); + xmlFreeDoc(doc); + + std::string out = "Model Tree:\n " + response + "\n"; + puts(out.c_str()); + + return true; + + }else if(format == TEXT){ + + std::string str,type; + GetModelType(model, type); + str+= model + "("+type+")"+ "\n"; + std::vector<std::string> children; + GetModelChildren(model, children); + for(unsigned int i=0; i<children.size(); i++){ + + std::string sub; + GetModelTree(children[i], TEXT, sub, false); + str += sub + "\n"; + } + + response = str; + return false; + } + + return false; } + +bool +WebSim::GetModelTreeXML(const std::string& model, void* xmlparent, bool everything){ + + std::string res; + xmlNodePtr node; + + if(!xmlparent){ + printf("Invalid xmlNode pointer. \n"); + return false; + } + + if(model != ""){ + + node = xmlNewChild((xmlNodePtr)xmlparent, NULL, BAD_CAST "Model", NULL); + + bool flag = false; + std::string type; + + if(everything){ + std::string error; + flag = !GetModelData(model, error, XML, node); + + } + + if(!everything || flag){ + + GetModelType(model, type); + xmlNodeSetName(node, xmlCharStrdup("Model")); + xmlNewProp(node, BAD_CAST "Name", BAD_CAST model.c_str()); + xmlNewProp(node, BAD_CAST "Type", BAD_CAST type.c_str()); + } + + }else + node = (xmlNodePtr) xmlparent; + + std::vector<std::string> children; + GetModelChildren(model, children); + for(unsigned int i=0;i<children.size();i++) + GetModelTreeXML(children[i], node, everything); + + + + return true; + +} + xmlChar * ConvertInput(const char *in, const char *encoding) { @@ -1001,6 +1139,7 @@ int response_code; std::string response_string; std::string model, prop, action, response; + puts(req->uri); if(!obj->ParseURI(model, prop, action, req->uri, response)) { response_code = 400; @@ -1017,6 +1156,8 @@ response_string = "OK"; } + //puts(response.c_str()); + evbuffer_add_printf(eb, "%s\n", response.c_str()); evhttp_send_reply(req, response_code, response_string.c_str(), eb); evbuffer_free(eb); @@ -1031,27 +1172,71 @@ const std::string uri, std::string& response) { + //puts(uri.c_str()); // Remove the query args std::vector<std::string> uri_parts; StringSplit(uri, uri_parts, "?"); assert(uri_parts.size() > 0); std::string bare_uri = uri_parts[0]; - // We require 3 path components: model/property/action + StringSplit(bare_uri, uri_parts, "/"); + + //puts("parts:"); + /*for(int j=0;j<uri_parts.size();j++) + puts(uri_parts[j].c_str()); - - // otherwise there should be 4 parts, with the first one empty - if(uri_parts.size() != 4) + puts("Here I am!");*/ + if(uri_parts.size() < 2) { - response = "Must be 3 slash-separated parts in the URI"; - return false; + // return true, then generate the welcome html + return false; } + + // example: http://localhost:8000/viz + if(uri_parts.size() ==2){ + + //puts("1 Here I am!"); + model = uri_parts[1]; + prop = ""; + action = ""; + //puts("1.1 Here I am!"); + return true; + } - model = uri_parts[1]; - prop = uri_parts[2]; - action = uri_parts[3]; + // example: http://localhost:8000/viz/applet.class + if(uri_parts.size() ==3){ + + //puts("2 Here I am!"); + + model = uri_parts[1]; + prop = uri_parts[2]; + action = ""; + return true; + } + + //puts("3 here I am"); + unsigned int size = uri_parts.size(); + unsigned int modelendindex = 0; + + if(uri_parts[size-1] == "get" || uri_parts[size-1]== "set"){ + action = uri_parts[size-1]; + modelendindex = size-3; + } + else{ + action = "get"; + modelendindex = size-2; + } + + prop = uri_parts[modelendindex+1]; + + for(unsigned int i=1;i <= modelendindex;i++){ + model += uri_parts[i]; + if(i!=modelendindex) + model += "."; + } + return true; } Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-06-19 07:12:55 UTC (rev 7860) +++ code/websim/src/websim.hh 2009-06-19 22:31:41 UTC (rev 7861) @@ -41,14 +41,19 @@ // GLib-2.0 #include <glib.h> + + namespace websim { +enum Format { TEXT=0, XML }; + class Pose; class Velocity; class Acceleration; class Time; class Bounds; +class Fiducial; class WebSim { @@ -72,11 +77,59 @@ std::string& response) = 0; virtual bool DeleteModel(const std::string& name, std::string& response) = 0; + + /** Gets the type of the model from simulation. + + @param name The name of the model + @param tyep the type of the model + + @returns TRUE if the method is successful. + */ + virtual bool GetModelType(const std::string& name, std::string& type) = 0; + + /** Gets the data of the model. If the format is XML and a valid xmlNode is passed, + the data will be added to the xmlNode, otherwise the text/xml will be put in + the response parameter. + + @param name The name of the model + @param response the output string containing data in text/xml format + @param format specifies the format of response (text or xml) + @param xmlnode the xmlNode pointer of this model + + @returns TRUE if the method is successful. + */ + virtual bool GetModelData(const std::string& name, + std::string& response, + Format format, + void* xmlnode ) = 0; + + /** Gets the PVA of the model. + + @param name The name of the model + @param p position + @param v velocity + @param a acceleration + @param response the error message + + @returns TRUE if the method is successful and FALSE otherwise. + */ virtual bool SetModelPVA(const std::string& name, const Pose& p, const Velocity& v, const Acceleration& a, std::string& response) = 0; + + + /** Gets PVA of the model. + + @param name The name of the model + @param t the time of simulation returned by the method + @param p position + @param v velocity + @param a acceleration + + @returns TRUE if the method is successful anf FALSE otherwise. + */ virtual bool GetModelPVA(const std::string& name, Time& t, Pose& p, @@ -84,37 +137,52 @@ Acceleration& a, std::string& response) = 0; - virtual bool GetLaserData(const std::string& name, - Time& t, - uint32_t& resolution, - double& fov, - Pose& p, - std::vector<double>& ranges, - std::string& response) = 0; - - - virtual bool GetRangerData(const std::string& name, - Time& t, - std::vector<Pose>& p, - std::vector<double>& ranges, - std::string& response) = 0; - - - - - virtual bool GetModelExtent(const std::string& name, + /** Gets the extent and center of the model + + @param name The name of the model + @param bx length + @param by width + @param bz height + @param center the center of the model + + @returns TRUE if the method is successful. + */ + virtual bool GetModelExtent(const std::string& name, double& bx, double& by, double& bz, Pose& center, std::string& response) = 0; - virtual bool GetNumberOfRobots(unsigned int& n) = 0; - - virtual bool GetSayStrings(std::vector<std::string>& sayings) = 0; + - /** Get the current simulation time */ + /** Gets the tree of the model. If no model is specified as input, + the tree of the world will be generated. + + @param name The name of the model + @param response the output string containing the tree in text/xml format + @param format specifies the format of response (text or xml) + + @returns TRUE if the method is successful. + */ + bool GetModelTree(const std::string& model, Format format, std::string& response, bool everything); + + /** Get the current simulation time + + @returns time of simulation */ virtual Time GetTime() = 0; + + + /** Sets the PVA of the model. + + @param name The name of the model + @param p position + @param v velocity + @param a acceleration + @param response the error message + + @returns TRUE if the method is successful and FALSE otherwise. + */ bool SetPuppetPVA( const std::string& name, Pose& p, Velocity& v, @@ -140,6 +208,14 @@ // Static, so that it can be passed as a callback to libevent static void EventCallback(evhttp_request* req, void* arg); + /** Gets the uri parameters. + + @param value the output variable + @param query_args the query structure + @param key the name of the parameter + + @returns TRUE if a parameter with the given key exists. + */ bool GetValue( std::string& value, struct evkeyvalq* query_args, const std::string& key); @@ -150,14 +226,14 @@ std::string& response); bool HandleSimRequest(const std::string& prop, const std::string& action, - bool xmlresponse, + Format format, struct evkeyvalq* kv, std::string& response); bool HandleModelRequest(const std::string& model, const std::string& prop, const std::string& action, - bool xmlresponse, - struct evkeyvalq* kv, + Format format, + struct evkeyvalq* kv, std::string& response); bool ParseURI(std::string& model, std::string& prop, @@ -166,62 +242,147 @@ std::string& response); void DeleteKeyVal(struct evkeyvalq* query_args); - void GetTextPVA(const std::string& name, + + + /** Puts the PVA data in the desired format: text/xml. If the format parameter is TEXT, the output is + in the response parameter. If the format is XML and xmlnode is NULL, the xml content will be stored + in the response parameter. If the forma is XML and xmlnode is not NULL, the data will be added to the + xml node as attributes. + + @param name the name of the model + @param p position + @param v velocity + @param a acceleration + @param format the output format + @param response the string output + @param xmlnode the xml node output +*/ + void GetPVA(const std::string& name, Time& t, const Pose& p, const Velocity& v, const Acceleration& a, - std::string& response); + Format format, + std::string& response, + void* xmlnode ); + + + /** Puts the laser data in the desired format: text/xml. If the format parameter is TEXT, the output is + in the response parameter. If the format is XML and xmlnode is NULL, the xml content will be stored + in the response parameter. If the forma is XML and xmlnode is not NULL, the data will be added to the + xml node as attributes. - void GetXMLPVA(const std::string& name, + @param name the name of the model + @param t time of the simulation + @param resolution the resolution of the laser + @param fov the field of view of the laser + @param p position of the laser model + @param ranges the data of the laser + @param format the output format + @param response the string output + @param xmlnode the xml node output +*/ + void GetLaserData(const std::string& name, Time& t, - const Pose& p, - const Velocity& v, - const Acceleration& a, - std::string& response); - - void GetTextLaserData(const std::string& name, - Time& t, uint32_t& resolution, double& fov, - Pose& p, - + Pose& p, std::vector<double>& ranges, - std::string& response); + Format format, + std::string& response, + void* xmlnode ); - - void GetXMLLaserData(const std::string& name, + + + + + /** Puts the ranger data in the desired format: text/xml. If the format parameter is TEXT, the output is + in the response parameter. If the format is XML and xmlnode is NULL, the xml content will be stored + in the response parameter. If the forma is XML and xmlnode is not NULL, the data will be added to the + xml node as attributes. + + @param name the name of the model + @param t time of the simulation + @param p positions of the ranger sensors + @param ranges the data of the ranger sensor + @param format the output format + @param response the string output + @param xmlnode the xml node output +*/ + void GetRangerData(const std::string& name, Time& t, - uint32_t& resolution, - double& fov, - Pose& p, - std::vector<double>& ranges, - std::string& response); - void GetTextRangerData(const std::string& name, - Time& t, std::vector<Pose>& p, std::vector<double>& ranges, - std::string& response); + Format format, + std::string& response, + void* xmlnode ); - - void GetXMLRangerData(const std::string& name, + /** Puts the fiducial data in the desired format: text/xml. If the format parameter is TEXT, the output is + in the response parameter. If the format is XML and xmlnode is NULL, the xml content will be stored + in the response parameter. If the forma is XML and xmlnode is not NULL, the data will be added to the + xml node as attributes. + + @param name the name of the model + @param t time of the simulation + @param f the detected targets + @param format the output format + @param response the string output + @param xmlnode the xml node output +*/ + void GetFiducialData(const std::string& name, Time& t, - std::vector<Pose>& p, - std::vector<double>& ranges, - std::string& response); - void GetTextModelExtent(const std::string& name, + std::vector<Fiducial>& f, + Format format, + std::string& response, + void* xmlnode ); + + /** Puts the extent information of the model in the desired format: text/xml. If the format parameter is TEXT, the output is + in the response parameter. If the format is XML and xmlnode is NULL, the xml content will be stored + in the response parameter. If the forma is XML and xmlnode is not NULL, the data will be added to the + xml node as attributes. + + @param name the name of the model + @param bx length + @param by width + @param bz height + @param center center of the model + @param format output format + @param response the string output + @param xmlnode the xml node output +*/ + void GetModelExtent(const std::string& name, double& x, double& y, double& z, Pose& center, - std::string& response); + Format format, + std::string& response, + void* xmlnode ); - void GetXMLModelExtent(const std::string&, - double& x, - double& y, - double& z, - Pose& center, - std::string& response); + + /** Gets the children of the model. + + @param name the name of the model + @param children the names of the children + + @returns TRUE if successful. +*/ + virtual bool GetModelChildren(const std::string& model, + std::vector<std::string>& children) = 0; + + /** Adds the model tree of the specified model to the xml node. If dumpdata parameter if true, + the data od the models are also included in the tree, otherwise, the tree will only contain + the name of the models. + + @param name the name of the model + @param xmlparent parent node of the model + @param dumpdata If TRUE, the data of the models will be included in the tree. + + @returns TRUE if successful. +*/ + bool GetModelTreeXML(const std::string& model, void* xmlparent, bool everything); + + // forward decare class Confederate; @@ -400,4 +561,13 @@ Bounds() : max(0), min(0) { /* empty*/ } }; +class Fiducial +{ + public: + double range; + double bearing; + int id; + Fiducial():range(0),bearing(0),id(-1){ } +}; + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rt...@us...> - 2009-06-24 23:58:03
|
Revision: 7895 http://playerstage.svn.sourceforge.net/playerstage/?rev=7895&view=rev Author: rtv Date: 2009-06-24 23:57:57 +0000 (Wed, 24 Jun 2009) Log Message: ----------- header tweaking Modified Paths: -------------- code/websim/src/parser.cc code/websim/src/websim.hh Modified: code/websim/src/parser.cc =================================================================== --- code/websim/src/parser.cc 2009-06-24 23:55:46 UTC (rev 7894) +++ code/websim/src/parser.cc 2009-06-24 23:57:57 UTC (rev 7895) @@ -34,6 +34,9 @@ #include "websim.hh" +// GLib-2.0 for keyfile parsing +#include <glib.h> + using namespace std; using namespace websim; Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-06-24 23:55:46 UTC (rev 7894) +++ code/websim/src/websim.hh 2009-06-24 23:57:57 UTC (rev 7895) @@ -38,11 +38,6 @@ #include <event.h> #include <evhttp.h> -// GLib-2.0 -#include <glib.h> - - - namespace websim { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2009-06-25 19:56:36
|
Revision: 7905 http://playerstage.svn.sourceforge.net/playerstage/?rev=7905&view=rev Author: asadat Date: 2009-06-25 19:56:33 +0000 (Thu, 25 Jun 2009) Log Message: ----------- added HandleSimHomepageRequest() to generate the html intro page Modified Paths: -------------- code/websim/src/req_sim.cc code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/req_sim.cc =================================================================== --- code/websim/src/req_sim.cc 2009-06-25 19:40:16 UTC (rev 7904) +++ code/websim/src/req_sim.cc 2009-06-25 19:56:33 UTC (rev 7905) @@ -30,10 +30,57 @@ if(prop == "greet") return HandleSimGreetRequest( action, format, kv, response ); + if(prop == "homepage") + return HandleSimHomepageRequest( action, format, kv, response ); + response = "ERROR: Unknown property " + prop + " for sim. Candidates are: children clock factory greet tree."; return false; } +bool WebSim::HandleSimHomepageRequest( std::string action, + Format format, + struct evkeyvalq* kv, + std::string& response) +{ + + std::vector<std::string> links; + char tmp[2048]; + sprintf(tmp,"%s %s", WebSim::package.c_str(), WebSim::version.c_str()); + response = "<html><head ><title>WebSim</title></head><body><h3>"; + response.append(tmp); + + response.append( "</h3><p>Welcome to WebSim, an HTTP interface to robot simulation. Through this program, you can get the state of the robots and their sensors using URIs. Here are some examples: "); + + + sprintf(tmp,"</p><p><a href=\"http://%s/sim/tree/get\">http://%s/sim/tree/get</a></p>",hostportname.c_str(), hostportname.c_str()); + links.push_back(std::string(tmp)); + + // todo - these should be automatically generated working links + + sprintf(tmp,"<p><a href=\"http://%s/position:1/pva/get\">http://%s/position:1/pva/get</a></p>", hostportname.c_str(), hostportname.c_str()); + links.push_back(std::string(tmp)); + + + sprintf(tmp, "<p><a href=\"http://%s/position:1/laser:0/data/get\">http://%s/position:1/laser:0/data/get</a></p>", hostportname.c_str(), hostportname.c_str()); + links.push_back(std::string(tmp)); + + + sprintf(tmp,"<p><a href=\"http://%s/position:1/ranger:0/data/get\">http://%s/position:1/ranger:0:/data/get</a></p>", hostportname.c_str(), hostportname.c_str()); + links.push_back(std::string(tmp)); + + + sprintf(tmp,"<p><a href=\"http://%s/position:1/model:0/fiducial:0/data/get\">http://%s/position:1/model:0/fiducial:0/data/get</a></p>",hostportname.c_str(), hostportname.c_str()); + links.push_back(std::string(tmp)); + + response += links[0]+links[1]+links[2]+ links[3]+links[4]+ "</body></html>"; + + return true; + + + +} + + bool WebSim::HandleSimGeometryRequest( std::string action, Format format, struct evkeyvalq* kv, Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-06-25 19:40:16 UTC (rev 7904) +++ code/websim/src/websim.cc 2009-06-25 19:56:33 UTC (rev 7905) @@ -209,9 +209,13 @@ format = XML; else format = TEXT; - }else + + }else{ + format = TEXT; + } + // The special simulation model if(model == "sim") { @@ -233,41 +237,7 @@ puts(prop.c_str()); } return true; - - }else if(model == ""){ - - std::vector<std::string> links; - char tmp[2048]; - sprintf(tmp,"%s %s", WebSim::package.c_str(), WebSim::version.c_str()); - response = "<html><head ><title>WebSim</title></head><body><h3>"; - response.append(tmp); - - response.append( "</h3><p>Welcome to WebSim, an HTTP interface to robot simulation. Through this program, you can get the state of the robots and their sensors using URIs. Here are some examples: "); - - - sprintf(tmp,"</p><p><a href=\"http://%s/sim/tree/get\">http://%s/sim/tree/get</a></p>",hostportname.c_str(), hostportname.c_str()); - links.push_back(std::string(tmp)); - - // todo - these should be automatically generated working links - - sprintf(tmp,"<p><a href=\"http://%s/position:1/pva/get\">http://%s/position:1/pva/get</a></p>", hostportname.c_str(), hostportname.c_str()); - links.push_back(std::string(tmp)); - - - sprintf(tmp, "<p><a href=\"http://%s/position:1/laser:0/data/get\">http://%s/position:1/laser:0/data/get</a></p>", hostportname.c_str(), hostportname.c_str()); - links.push_back(std::string(tmp)); - - - sprintf(tmp,"<p><a href=\"http://%s/position:1/ranger:0/data/get\">http://%s/position:1/ranger:0:/data/get</a></p>", hostportname.c_str(), hostportname.c_str()); - links.push_back(std::string(tmp)); - - - sprintf(tmp,"<p><a href=\"http://%s/position:1/model:0/fiducial:0/data/get\">http://%s/position:1/model:0/fiducial:0/data/get</a></p>",hostportname.c_str(), hostportname.c_str()); - links.push_back(std::string(tmp)); - - response += links[0]+links[1]+links[2]+ links[3]+links[4]+ "</body></html>"; - - return true; + } // Everything else must be an existing model else @@ -319,7 +289,7 @@ }else if(prop == "tree"){ - return(GetModelTree(model, format, response, true)); + return(GetModelTree(model, format, response, false)); }else if(prop == "extent"){ @@ -1100,7 +1070,16 @@ // We require 3 path components: model/property/action StringSplit(bare_uri, uri_parts, "/"); - + //check if the web page is requested + if(uri_parts.size()==1 || (uri_parts.size()==2 && uri_parts[1]=="")){ + + model ="sim"; + prop = "homepage"; + action = "get"; + return true; + } + + // otherwise there should be 4 parts, with the first one empty if(uri_parts.size() != 4) { Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-06-25 19:40:16 UTC (rev 7904) +++ code/websim/src/websim.hh 2009-06-25 19:56:33 UTC (rev 7905) @@ -229,6 +229,8 @@ // Static, so that it can be passed as a callback to libevent static void EventCallback(evhttp_request* req, void* arg); + + /** Gets the uri parameters. @@ -284,13 +286,18 @@ struct evkeyvalq* kv, std::string& response); + bool HandleSimHomepageRequest( std::string action, + Format format, + struct evkeyvalq* kv, + std::string& response); + bool HandleModelRequest(const std::string& model, const std::string& prop, const std::string& action, Format format, struct evkeyvalq* kv, std::string& response); - + bool ParseURI(std::string& model, std::string& prop, std::string& action, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2009-06-25 22:47:24
|
Revision: 7907 http://playerstage.svn.sourceforge.net/playerstage/?rev=7907&view=rev Author: asadat Date: 2009-06-25 22:47:23 +0000 (Thu, 25 Jun 2009) Log Message: ----------- added webpage string for html code in the websim class Modified Paths: -------------- code/websim/src/req_sim.cc code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/req_sim.cc =================================================================== --- code/websim/src/req_sim.cc 2009-06-25 20:34:46 UTC (rev 7906) +++ code/websim/src/req_sim.cc 2009-06-25 22:47:23 UTC (rev 7907) @@ -43,41 +43,17 @@ std::string& response) { - std::vector<std::string> links; - char tmp[2048]; - sprintf(tmp,"%s %s", WebSim::package.c_str(), WebSim::version.c_str()); - response = "<html><head ><title>WebSim</title></head><body><h3>"; - response.append(tmp); - - response.append( "</h3><p>Welcome to WebSim, an HTTP interface to robot simulation. Through this program, you can get the state of the robots and their sensors using URIs. Here are some examples: "); + response = WebSim::webpage; - - sprintf(tmp,"</p><p><a href=\"http://%s/sim/tree/get\">http://%s/sim/tree/get</a></p>",hostportname.c_str(), hostportname.c_str()); - links.push_back(std::string(tmp)); + // replacing 'HOST' by actual 'host:port' term + unsigned int i=0; + i = response.find("HOST"); + while(i!=std::string::npos){ - // todo - these should be automatically generated working links - - sprintf(tmp,"<p><a href=\"http://%s/position:1/pva/get\">http://%s/position:1/pva/get</a></p>", hostportname.c_str(), hostportname.c_str()); - links.push_back(std::string(tmp)); - - - sprintf(tmp, "<p><a href=\"http://%s/position:1/laser:0/data/get\">http://%s/position:1/laser:0/data/get</a></p>", hostportname.c_str(), hostportname.c_str()); - links.push_back(std::string(tmp)); - - - sprintf(tmp,"<p><a href=\"http://%s/position:1/ranger:0/data/get\">http://%s/position:1/ranger:0:/data/get</a></p>", hostportname.c_str(), hostportname.c_str()); - links.push_back(std::string(tmp)); - - - sprintf(tmp,"<p><a href=\"http://%s/position:1/model:0/fiducial:0/data/get\">http://%s/position:1/model:0/fiducial:0/data/get</a></p>",hostportname.c_str(), hostportname.c_str()); - links.push_back(std::string(tmp)); - - response += links[0]+links[1]+links[2]+ links[3]+links[4]+ "</body></html>"; - + response.replace(i, 4, hostportname); + i = response.find("HOST"); + } return true; - - - } Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-06-25 20:34:46 UTC (rev 7906) +++ code/websim/src/websim.cc 2009-06-25 22:47:23 UTC (rev 7907) @@ -43,6 +43,19 @@ const std::string WebSim::package = "WebSim"; const std::string WebSim::version = "0.1"; +std::string WebSim::webpage = + "<html><head ><title>WebSim</title></head><body><h3>" + WebSim::package + " " + WebSim::version + + "</h3><p>Welcome to WebSim, an Http-based interface to robot simulations." + " Through this interface, you can get the state of the robots as well as sensors' data using URIs. Here are some examples:" + "</p><p><a href=\"http://HOST/sim/tree/get\"> http://HOST/sim/tree/get </a></p>" + "<p><a href=\"http://HOST/position:1/pva/get\"> http://HOST/position:1/pva/get </a></p>" + "<p><a href=\"http://HOST/position:1/laser:0/data/get\"> http://HOST/position:1.laser:0/data/get </a></p>" + "<p><a href=\"http://HOST/position:1/ranger:0/data/get\"> http://HOST/position:1/ranger:0:/data/get </a></p>" + "<p><a href=\"http://HOST/position:1/model:0/fiducial:0/data/get\"> http://HOST/position:1/model:0/fiducial:0/data/get </a></p>" + "</body></html>"; + + + xmlChar * ConvertInput(const char *in, const char *encoding); @@ -1071,7 +1084,7 @@ StringSplit(bare_uri, uri_parts, "/"); //check if the web page is requested - if(uri_parts.size()==1 || (uri_parts.size()==2 && uri_parts[1]=="")){ + if(uri_parts.size()==2){ model ="sim"; prop = "homepage"; Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-06-25 20:34:46 UTC (rev 7906) +++ code/websim/src/websim.hh 2009-06-25 22:47:23 UTC (rev 7907) @@ -50,6 +50,9 @@ class Bounds; class Fiducial; + + + class WebSim { public: @@ -226,6 +229,9 @@ unsigned short port; struct evhttp* eh; + + // the string which contains the html code of the home page + static std::string webpage; // Static, so that it can be passed as a callback to libevent static void EventCallback(evhttp_request* req, void* arg); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2009-06-27 00:01:41
|
Revision: 7914 http://playerstage.svn.sourceforge.net/playerstage/?rev=7914&view=rev Author: asadat Date: 2009-06-27 00:01:32 +0000 (Sat, 27 Jun 2009) Log Message: ----------- added GetGeometryData() and xml response for getting clock Modified Paths: -------------- code/websim/src/req_sim.cc code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/req_sim.cc =================================================================== --- code/websim/src/req_sim.cc 2009-06-26 19:59:28 UTC (rev 7913) +++ code/websim/src/req_sim.cc 2009-06-27 00:01:32 UTC (rev 7914) @@ -62,14 +62,15 @@ struct evkeyvalq* kv, std::string& response) { - /* + double x,y,z; Pose center; - GetModelExtent("sim", x, y, z, center, response); - GetXMLModelExtent("sim", x, y, z, center, response); - */ - - response = "Warning: geometry not yet implemented"; + if(GetModelGeometry("sim", x, y, z, center, response)){ + this->GetGeometryData("sim", x, y, z, center, format, response, NULL); + }else{ + response = "Warning: geometry not yet implemented"; + return false; + } return true; } @@ -183,7 +184,11 @@ if( action == "get" ) { - response = "Current time: " + GetTime().String() + " seconds."; + if(format == TEXT){ + response = "Current time: " + GetTime().String() + " seconds."; + }else if(format == XML){ + response = "<Time value=\""+GetTime().String()+"\" />"; + } return true; } Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-06-26 19:59:28 UTC (rev 7913) +++ code/websim/src/websim.cc 2009-06-27 00:01:32 UTC (rev 7914) @@ -305,13 +305,13 @@ return(GetModelTree(model, format, response, false)); - }else if(prop == "extent"){ + }else if(prop == "geometry"){ double x,y,z; Pose center; - if(GetModelExtent(model, x, y, z, center, response)) + if(GetModelGeometry(model, x, y, z, center, response)) { - GetModelExtent(model, x, y, z, center, format, response, NULL); + GetGeometryData(model, x, y, z, center, format, response, NULL); return true; }else{ @@ -723,15 +723,19 @@ if(format == TEXT){ std::string res; - char temp[128]; + char temp[512]; + puts("here1\n"); for(unsigned int i=0;i<f.size();i++){ - sprintf(temp,"(%.3f,%.3f,%d)\n", f.at(i).range, f.at(i).bearing, f.at(i).id); + sprintf(temp,"((%.3f,%.3f,%.3f),(%.3f,%.3f,%.3f),%d)\n", f.at(i).pos.x, f.at(i).pos.y, f.at(i).pos.z, + f.at(i).pos.r, f.at(i).pos.p, f.at(i).pos.a, f.at(i).id); + puts("here2\n"); res.append(temp); } + puts("here3\n"); - char buf[1024]; + char buf[2048]; snprintf(buf, sizeof(buf), "%s's state @%s: \n Fiducial:\n", name.c_str(), @@ -763,9 +767,10 @@ std::string res; - char temp[128]; + char temp[512]; for(unsigned int i=0;i<f.size();i++){ - sprintf(temp,"(%.3f,%.3f,%d)", f.at(i).range, f.at(i).bearing, f.at(i).id); + sprintf(temp,"((%.3f,%.3f,%.3f),(%.3f,%.3f,%.3f),%d)", f.at(i).pos.x, f.at(i).pos.y, f.at(i).pos.z, + f.at(i).pos.r, f.at(i).pos.p, f.at(i).pos.a, f.at(i).id); res.append(temp); } @@ -799,7 +804,7 @@ } void -WebSim::GetModelExtent(const std::string& name, +WebSim::GetGeometryData(const std::string& name, double& x, double& y, double& z, @@ -811,10 +816,10 @@ if(format == TEXT){ char buf[1024]; if(name == "sim") - snprintf(buf, sizeof(buf),"World Extent: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", + snprintf(buf, sizeof(buf),"World Size: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); else - snprintf(buf, sizeof(buf),"%s's Extent: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", + snprintf(buf, sizeof(buf),"%s's Size: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", name.c_str(), x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); response = buf; @@ -831,16 +836,16 @@ doc = xmlNewDoc(BAD_CAST "1.0"); root_node = xmlNewNode(NULL, BAD_CAST "root"); xmlDocSetRootElement(doc, root_node); - node = xmlNewChild(root_node, NULL, BAD_CAST "ModelExtent", NULL); + node = xmlNewChild(root_node, NULL, BAD_CAST "ModelGeometry", NULL); }else{ node = (xmlNodePtr)xmlnode; - xmlNodeSetName(node, xmlCharStrdup("ModelExtent")); + xmlNodeSetName(node, xmlCharStrdup("ModelGeometry")); //node = xmlNewChild((xmlNodePtr)parent, NULL, BAD_CAST "ModelExtent", NULL); //root_node = (xmlNodePtr)parent; } - xmlNewProp(node, BAD_CAST "Type", BAD_CAST "extent"); + xmlNewProp(node, BAD_CAST "Type", BAD_CAST "geometry"); tmp = ConvertInput(name.c_str(),MY_ENCODING); xmlNewProp(node, BAD_CAST "Name", BAD_CAST tmp); Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-06-26 19:59:28 UTC (rev 7913) +++ code/websim/src/websim.hh 2009-06-27 00:01:32 UTC (rev 7914) @@ -172,7 +172,7 @@ @returns TRUE if the method is successful. */ - virtual bool GetModelExtent(const std::string& name, + virtual bool GetModelGeometry(const std::string& name, double& bx, double& by, double& bz, @@ -405,7 +405,7 @@ std::string& response, void* xmlnode ); - /** Puts the extent information of the model in the desired format: text/xml. If the format parameter is TEXT, the output is + /** Puts the geometry information of the model in the desired format: text/xml. If the format parameter is TEXT, the output is in the response parameter. If the format is XML and xmlnode is NULL, the xml content will be stored in the response parameter. If the forma is XML and xmlnode is not NULL, the data will be added to the xml node as attributes. @@ -419,7 +419,7 @@ @param response the string output @param xmlnode the xml node output */ - void GetModelExtent(const std::string& name, + void GetGeometryData(const std::string& name, double& x, double& y, double& z, @@ -633,10 +633,12 @@ class Fiducial { public: + Pose pos; double range; double bearing; int id; - Fiducial():range(0),bearing(0),id(-1){ } + Fiducial():range(0),bearing(0),id(-1){} + }; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2009-06-29 19:35:48
|
Revision: 7929 http://playerstage.svn.sourceforge.net/playerstage/?rev=7929&view=rev Author: asadat Date: 2009-06-29 19:35:46 +0000 (Mon, 29 Jun 2009) Log Message: ----------- added visualization page HOST/sim/viz/get Modified Paths: -------------- code/websim/src/req_sim.cc code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/req_sim.cc =================================================================== --- code/websim/src/req_sim.cc 2009-06-29 17:34:12 UTC (rev 7928) +++ code/websim/src/req_sim.cc 2009-06-29 19:35:46 UTC (rev 7929) @@ -33,10 +33,23 @@ if(prop == "homepage") return HandleSimHomepageRequest( action, format, kv, response ); + if(prop == "viz") + return HandleSimVisualizationRequest( action, format, kv, response ); + response = "ERROR: Unknown property " + prop + " for sim. Candidates are: children clock factory greet tree."; return false; } +bool WebSim::HandleSimVisualizationRequest( std::string action, + Format format, + struct evkeyvalq* kv, + std::string& response) +{ + response = WebSim::vizpage; + + return true; +} + bool WebSim::HandleSimHomepageRequest( std::string action, Format format, struct evkeyvalq* kv, Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-06-29 17:34:12 UTC (rev 7928) +++ code/websim/src/websim.cc 2009-06-29 19:35:46 UTC (rev 7929) @@ -54,6 +54,10 @@ "<p><a href=\"http://HOST/position:1/model:0/fiducial:0/data/get\"> http://HOST/position:1/model:0/fiducial:0/data/get </a></p>" "</body></html>"; +std::string WebSim::vizpage = + "<HTML><HEAD><TITLE>Websim Visualization</TITLE></HEAD>" + "<BODY><iframe id=\"visualization\" frameborder=0 width=\"1000\" height=\"1000\" " + "src=\"http://192.168.1.210/viz.html\"></iframe></BODY></HTML>"; xmlChar * @@ -234,25 +238,6 @@ { return HandleSimRequest(prop, action, format, kv, response); } - else if(model == "viz") - { - if(prop ==""){ - puts("viz request"); - //response = "<html><header></header><body><img src=\"viz/1.png\" ></body></html>"; - - response = "<HTML><HEAD><TITLE>A Simple Program</TITLE></HEAD>"; - response += "<BODY> <CENTER><APPLET CODE=\"ScrollingSimple.class\" WIDTH=\"1500\" HEIGHT=\"1000\" id=\"TheApplet\"></APPLET></CENTER>"; - response += "<b>The returned data is:</b><br /><script type=\"text/javascript\"> document.write(TheApplet.getResponseText());</script></BODY></HTML>"; - } - else - { - puts("SendingFile:"); - puts(prop.c_str()); - } - return true; - - } - // Everything else must be an existing model else { return HandleModelRequest(model, prop, action, format, kv, response); Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-06-29 17:34:12 UTC (rev 7928) +++ code/websim/src/websim.hh 2009-06-29 19:35:46 UTC (rev 7929) @@ -232,6 +232,9 @@ // the string which contains the html code of the home page static std::string webpage; + + // the html code of visualization page + static std::string vizpage; // Static, so that it can be passed as a callback to libevent static void EventCallback(evhttp_request* req, void* arg); @@ -297,6 +300,11 @@ struct evkeyvalq* kv, std::string& response); + bool HandleSimVisualizationRequest( std::string action, + Format format, + struct evkeyvalq* kv, + std::string& response); + bool HandleModelRequest(const std::string& model, const std::string& prop, const std::string& action, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rt...@us...> - 2009-07-11 22:51:28
|
Revision: 7996 http://playerstage.svn.sourceforge.net/playerstage/?rev=7996&view=rev Author: rtv Date: 2009-07-11 22:51:21 +0000 (Sat, 11 Jul 2009) Log Message: ----------- improving usability and working on federation Modified Paths: -------------- code/websim/src/req_model.cc code/websim/src/req_sim.cc code/websim/src/websim.cc code/websim/src/websim.hh Modified: code/websim/src/req_model.cc =================================================================== --- code/websim/src/req_model.cc 2009-07-11 22:49:28 UTC (rev 7995) +++ code/websim/src/req_model.cc 2009-07-11 22:51:21 UTC (rev 7996) @@ -1,10 +1,7 @@ -#include "websim.hh" #include <boost/lexical_cast.hpp> - -//#include <assert.h> -//#include <stdlib.h> -//#include <string.h> #include <libxml/encoding.h> + +#include "websim.hh" using namespace websim; #define MY_ENCODING "ISO-8859-1" @@ -14,11 +11,11 @@ bool WebSim::HandleModelRequest(const std::string& model, - const std::string& prop, - const std::string& action, - Format format, - struct evkeyvalq* kv, - std::string& response) + const std::string& prop, + const std::string& action, + Format format, + struct evkeyvalq* kv, + std::string& response) { if(prop == "pva") return HandleModelPVARequest(model, action, format, kv, response ); @@ -40,47 +37,47 @@ bool WebSim::HandleModelDataRequest( std::string model, - std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + std::string action, + Format format, + struct evkeyvalq* kv, + std::string& response) { - if(action == "get"){ + if(action == "get"){ - if(!GetModelData(model, response, format, NULL)){ - response = "ERROR: failed to get the Data of model " + model; - return false; + if(!GetModelData(model, response, format, NULL)){ + response = "ERROR: failed to get the Data of model " + model; + return false; + } } - } - return true; + return true; } bool WebSim::HandleModelTreeRequest( std::string model, - std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + std::string action, + Format format, + struct evkeyvalq* kv, + std::string& response) { - if(action == "get"){ - if(!GetModelTree(model, format, response, false)){ + if(action == "get"){ + if(!GetModelTree(model, format, response, false)){ response = "ERROR: failed to get the tree of model " + model; - return false; + return false; + } } - } - return true; + return true; } bool WebSim::HandleModelGeometryRequest( std::string model, - std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + std::string action, + Format format, + struct evkeyvalq* kv, + std::string& response) { double x,y,z; @@ -98,17 +95,17 @@ } - return true; + return true; } bool WebSim::HandleModelPVARequest( std::string model, - std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + std::string action, + Format format, + struct evkeyvalq* kv, + std::string& response) { - if(action == "get"){ + if(action == "get"){ Pose p; Velocity v; @@ -116,17 +113,17 @@ Time t; if(GetModelPVA(model, t, p, v, a, response)){ - GetPVA(model, t, p, v, a, format, response, NULL); + GetPVA(model, t, p, v, a, format, response, NULL); return true; }else{ - response = "ERROR: failed to get the PVA of model "+model; - return false; + response = "ERROR: failed to get the PVA of model "+model; + return false; } - }else if(action == "set"){ + }else if(action == "set"){ std::string sx, sy, sz, sroll, spitch, syaw; @@ -143,78 +140,78 @@ try { if(GetValue(sx, kv, "px")) - p.x = boost::lexical_cast<float>(sx); + p.x = boost::lexical_cast<float>(sx); if(GetValue(sy, kv, "py")) - p.y = boost::lexical_cast<float>(sy); + p.y = boost::lexical_cast<float>(sy); if(GetValue(sz, kv, "pz")) - p.z = boost::lexical_cast<float>(sz); + p.z = boost::lexical_cast<float>(sz); if(GetValue(sroll, kv, "pr")) - p.r = boost::lexical_cast<float>(sroll); + p.r = boost::lexical_cast<float>(sroll); if(GetValue(spitch, kv, "pp")) - p.p = boost::lexical_cast<float>(spitch); + p.p = boost::lexical_cast<float>(spitch); if(GetValue(syaw, kv, "pa")) - p.a = boost::lexical_cast<float>(syaw); + p.a = boost::lexical_cast<float>(syaw); if(GetValue(sx, kv, "vx")) - v.x = boost::lexical_cast<float>(sx); + v.x = boost::lexical_cast<float>(sx); if(GetValue(sy, kv, "vy")) - v.y = boost::lexical_cast<float>(sy); + v.y = boost::lexical_cast<float>(sy); if(GetValue(sz, kv, "vz")) - v.z = boost::lexical_cast<float>(sz); + v.z = boost::lexical_cast<float>(sz); if(GetValue(sroll, kv, "vr")) - v.r = boost::lexical_cast<float>(sroll); + v.r = boost::lexical_cast<float>(sroll); if(GetValue(spitch, kv, "vp")) - v.p = boost::lexical_cast<float>(spitch); + v.p = boost::lexical_cast<float>(spitch); if(GetValue(syaw, kv, "va")) - v.a = boost::lexical_cast<float>(syaw); + v.a = boost::lexical_cast<float>(syaw); if(GetValue(sx, kv, "ax")) - a.x = boost::lexical_cast<float>(sx); + a.x = boost::lexical_cast<float>(sx); if(GetValue(sy, kv, "ay")) - a.y = boost::lexical_cast<float>(sy); + a.y = boost::lexical_cast<float>(sy); if(GetValue(sz, kv, "az")) - a.z = boost::lexical_cast<float>(sz); + a.z = boost::lexical_cast<float>(sz); if(GetValue(sroll, kv, "ar")) - a.r = boost::lexical_cast<float>(sroll); + a.r = boost::lexical_cast<float>(sroll); if(GetValue(spitch, kv, "ap")) - a.p = boost::lexical_cast<float>(spitch); + a.p = boost::lexical_cast<float>(spitch); if(GetValue(syaw, kv, "aa")) - a.a = boost::lexical_cast<float>(syaw); + a.a = boost::lexical_cast<float>(syaw); } catch(boost::bad_lexical_cast e) { response = std::string("Failed to parse input value(s): ") + - e.what(); + e.what(); return false; } return(SetModelPVA(model, p, v, a, response)); - } + } - return false; + return false; } void WebSim::GetPVA(const std::string& name, - Time& t, - const Pose& p, - const Velocity& v, - const Acceleration& a, - Format format, - std::string& response, - void* xmlnode) + Time& t, + const Pose& p, + const Velocity& v, + const Acceleration& a, + Format format, + std::string& response, + void* xmlnode) { if(format == TEXT){ char buf[1024]; snprintf(buf, sizeof(buf), - "%s's state @%s: \n pose: (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" - " vel : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" - " acc : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", - name.c_str(), - t.String().c_str(), - p.x, p.y, p.z, p.r, p.p, p.a, - v.x, v.y, v.z, v.r, v.p, v.a, - a.x, a.y, a.z, a.r, a.p, a.a); + "%s's state @%s: \n pose: (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" + " vel : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n" + " acc : (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", + name.c_str(), + t.String().c_str(), + p.x, p.y, p.z, p.r, p.p, p.a, + v.x, v.y, v.z, v.r, v.p, v.a, + a.x, a.y, a.z, a.r, a.p, a.a); response = buf; }else if (format == XML){ @@ -277,14 +274,14 @@ void WebSim::GetLaserData(const std::string& name, - Time& t, - uint32_t& resolution, - double& fov, - Pose& p, - std::vector<double>& ranges, - Format format, - std::string& response, - void* xmlnode) + Time& t, + uint32_t& resolution, + double& fov, + Pose& p, + std::vector<double>& ranges, + Format format, + std::string& response, + void* xmlnode) { if(format == TEXT){ @@ -294,20 +291,20 @@ sprintf(temp,"%.3f",ranges.at(i)); res.append(temp); if(i+1 != ranges.size()) - res.append(","); + res.append(","); } char buf[4096]; snprintf(buf, sizeof(buf), - "%s's state @%s: \n laser: (%s)\n resolution: (%d)\n fov(%.2f)\n" - " pose (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", - name.c_str(), - t.String().c_str(), - res.c_str(), - resolution, - fov, - p.x,p.y,p.z,p.r,p.p,p.a); + "%s's state @%s: \n laser: (%s)\n resolution: (%d)\n fov(%.2f)\n" + " pose (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)\n", + name.c_str(), + t.String().c_str(), + res.c_str(), + resolution, + fov, + p.x,p.y,p.z,p.r,p.p,p.a); response = buf; }else if(format == XML){ @@ -337,7 +334,7 @@ sprintf(temp,"%.3f",ranges.at(i)); res.append(temp); if(i+1 != ranges.size()) - res.append(","); + res.append(","); } @@ -383,12 +380,12 @@ void WebSim::GetRangerData(const std::string& name, - Time& t, - std::vector<Pose>& p, - std::vector<double>& ranges, - Format format, - std::string& response, - void* xmlnode) + Time& t, + std::vector<Pose>& p, + std::vector<double>& ranges, + Format format, + std::string& response, + void* xmlnode) { if(format == TEXT){ @@ -398,7 +395,7 @@ sprintf(temp,"%.3f",ranges.at(i)); res.append(temp); if(i+1 != ranges.size()) - res.append(","); + res.append(","); } std::string pstr; @@ -406,18 +403,18 @@ for(unsigned int i=0;i<p.size();i++){ Pose pos = p.at(i); sprintf(ptmp," (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)", - pos.x,pos.y,pos.x,pos.r,pos.p,pos.a); + pos.x,pos.y,pos.x,pos.r,pos.p,pos.a); pstr.append(ptmp); } char buf[2048]; snprintf(buf, sizeof(buf), - "%s's state @%s: \n ranger\n ranges: (%s)\n pose: %s", - name.c_str(), - t.String().c_str(), - res.c_str(), - pstr.c_str()); + "%s's state @%s: \n ranger\n ranges: (%s)\n pose: %s", + name.c_str(), + t.String().c_str(), + res.c_str(), + pstr.c_str()); response = buf; }else if(format == XML){ @@ -448,7 +445,7 @@ sprintf(temp,"%.3f",ranges.at(i)); res.append(temp); if(i+1 != ranges.size()) - res.append(","); + res.append(","); } std::string pstr; @@ -456,7 +453,7 @@ for(unsigned int i=0;i<p.size();i++){ Pose pos = p.at(i); sprintf(ptmp," (%.3f,%.3f,%.3f) (%.3f,%.3f,%.3f)", - pos.x,pos.y,pos.x,pos.r,pos.p,pos.a); + pos.x,pos.y,pos.x,pos.r,pos.p,pos.a); pstr.append(ptmp); } @@ -496,11 +493,11 @@ void WebSim::GetFiducialData(const std::string& name, - Time& t, - std::vector<Fiducial>& f, - Format format, - std::string& response, - void* xmlnode ) + Time& t, + std::vector<Fiducial>& f, + Format format, + std::string& response, + void* xmlnode ) { @@ -510,7 +507,7 @@ char temp[512]; for(unsigned int i=0;i<f.size();i++){ sprintf(temp,"((%.3f,%.3f,%.3f),(%.3f,%.3f,%.3f),%d)\n", f.at(i).pos.x, f.at(i).pos.y, f.at(i).pos.z, - f.at(i).pos.r, f.at(i).pos.p, f.at(i).pos.a, f.at(i).id); + f.at(i).pos.r, f.at(i).pos.p, f.at(i).pos.a, f.at(i).id); res.append(temp); } @@ -518,9 +515,9 @@ char buf[2048]; snprintf(buf, sizeof(buf), - "%s's state @%s: \n Fiducial:\n", - name.c_str(), - t.String().c_str()); + "%s's state @%s: \n Fiducial:\n", + name.c_str(), + t.String().c_str()); response = buf; response.append(res); @@ -550,7 +547,7 @@ char temp[512]; for(unsigned int i=0;i<f.size();i++){ sprintf(temp,"((%.3f,%.3f,%.3f),(%.3f,%.3f,%.3f),%d)", f.at(i).pos.x, f.at(i).pos.y, f.at(i).pos.z, - f.at(i).pos.r, f.at(i).pos.p, f.at(i).pos.a, f.at(i).id); + f.at(i).pos.r, f.at(i).pos.p, f.at(i).pos.a, f.at(i).id); res.append(temp); } @@ -585,22 +582,22 @@ void WebSim::GetGeometryData(const std::string& name, - double& x, - double& y, - double& z, - Pose& center, - Format format, - std::string& response, - void* xmlnode) + double& x, + double& y, + double& z, + Pose& center, + Format format, + std::string& response, + void* xmlnode) { if(format == TEXT){ char buf[1024]; if(name == "sim") snprintf(buf, sizeof(buf),"World Size: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", - x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); + x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); else snprintf(buf, sizeof(buf),"%s's Size: (%.3f,%.3f,%.3f)\n Origin (%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)", - name.c_str(), x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); + name.c_str(), x, y, z, center.x, center.y, center.z, center.r, center.p, center.a); response = buf; }else if(format == XML){ Modified: code/websim/src/req_sim.cc =================================================================== --- code/websim/src/req_sim.cc 2009-07-11 22:49:28 UTC (rev 7995) +++ code/websim/src/req_sim.cc 2009-07-11 22:51:21 UTC (rev 7996) @@ -1,16 +1,20 @@ #include "websim.hh" using namespace websim; -// todo: XML format for sim requests +const double TICK_INTERVAL = 1.0; +// todo: XML format for more sim requests + + + bool WebSim::HandleSimRequest(const std::string& prop, - const std::string& action, - Format format, - struct evkeyvalq* kv, - std::string& response) + const std::string& action, + Format format, + struct evkeyvalq* kv, + std::string& response) { printf( "[%s] sim %s %s\n", - IdentificationString().c_str(), prop.c_str(), action.c_str() ); + IdentificationString().c_str(), prop.c_str(), action.c_str() ); if(prop == "factory") return HandleSimFactoryRequest( action, format, kv, response ); @@ -41,56 +45,68 @@ } bool WebSim::HandleSimVisualizationRequest( std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + Format format, + struct evkeyvalq* kv, + std::string& response) { - response = WebSim::vizpage; - - return true; + response = + "<HTML><HEAD><TITLE>Websim Visualization</TITLE></HEAD>" + "<BODY><iframe id=\"visualization\" frameborder=0 width=\"1000\" height=\"1000\" " + "src=\"viz.html\"></iframe></BODY></HTML>"; + + return true; } bool WebSim::HandleSimHomepageRequest( std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + Format format, + struct evkeyvalq* kv, + std::string& response) { + response = "<html><head><title>WebSim</title></head>" + "<body>" + "<h1>Welcome to " + IdentificationString() + "</h1>" + "<p>" + package + "-" + version + " HTTP interface to " + + IdentificationString() + "-" + VersionString() + + "</h1>" + "<hr>" + "<p><a href=\"http://playerstage.org/index.php?src=websim\">WebSim</a>" + " is part of the <a href=\"http://playerstage.org\">Player Project</a>" + "</body></html>"; + +// // replacing 'HOST' by actual 'host:port' term +// unsigned int i=0; +// i = response.find("HOST"); +// while(i!=std::string::npos){ - response = WebSim::webpage; +// response.replace(i, 4, hostportname); +// i = response.find("HOST"); +// } - // replacing 'HOST' by actual 'host:port' term - unsigned int i=0; - i = response.find("HOST"); - while(i!=std::string::npos){ - - response.replace(i, 4, hostportname); - i = response.find("HOST"); - } - return true; + return true; } bool WebSim::HandleSimGeometryRequest( std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + Format format, + struct evkeyvalq* kv, + std::string& response) { - double x,y,z; - Pose center; - if(GetModelGeometry("sim", x, y, z, center, response)){ - this->GetGeometryData("sim", x, y, z, center, format, response, NULL); - }else{ - response = "Warning: geometry not yet implemented"; - return false; - } + double x,y,z; + Pose center; + if(GetModelGeometry("sim", x, y, z, center, response)){ + this->GetGeometryData("sim", x, y, z, center, format, response, NULL); + }else{ + response = "Warning: geometry not yet implemented"; + return false; + } return true; } bool WebSim::HandleSimChildrenRequest( std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + Format format, + struct evkeyvalq* kv, + std::string& response) { if( action == "" ) action = "get"; // default action @@ -101,7 +117,7 @@ GetModelChildren("",children); for(unsigned int i=0;i<children.size();i++) - response += "-" + children[i]; + response += "-" + children[i]; return true; } @@ -111,9 +127,9 @@ } bool WebSim::HandleSimTreeRequest( std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + Format format, + struct evkeyvalq* kv, + std::string& response) { if( action == "" ) action = "get"; // default action @@ -129,9 +145,9 @@ } bool WebSim::HandleSimGreetRequest( std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + Format format, + struct evkeyvalq* kv, + std::string& response) { if( action == "" ) action = "get"; // default action @@ -149,24 +165,24 @@ } bool WebSim::HandleSimFactoryRequest( std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + Format format, + struct evkeyvalq* kv, + std::string& response) { if(action == "create") { std::string name, type; if(!GetValue(name, kv, "name")) - { - response = "ERROR: Missing name argument for sim/factory/create"; - return false; - } + { + response = "ERROR: Missing name argument for sim/factory/create"; + return false; + } if( !GetValue(type, kv, "type")) - { - response = "ERROR: Missing name type argument for sim/factory/create"; - return false; - } + { + response = "ERROR: Missing name type argument for sim/factory/create"; + return false; + } return(CreateModel(name, type, response)); } @@ -175,10 +191,10 @@ { std::string name, type; if(!GetValue(name, kv, "name")) - { - response = "ERROR: Missing name argument for sim/factory/destroy"; - return false; - } + { + response = "ERROR: Missing name argument for sim/factory/destroy"; + return false; + } return(DeleteModel(name, response)); } @@ -188,9 +204,9 @@ } bool WebSim::HandleSimClockRequest( std::string action, - Format format, - struct evkeyvalq* kv, - std::string& response) + Format format, + struct evkeyvalq* kv, + std::string& response) { if( action == "" ) // DEFAULT ACTION action = "get"; @@ -198,35 +214,40 @@ if( action == "get" ) { if(format == TEXT){ - response = "Current time: " + GetTime().String() + " seconds."; + response = "Current time: " + GetTime().String() + " seconds."; }else if(format == XML){ - response = "<Time value=\""+GetTime().String()+"\" />"; + response = "<Time value=\""+GetTime().String()+"\" />"; } return true; } if(action == "tick") { - ticks_remaining--; - response = "Ticked the clock"; - return true; + if( ClockRunFor( TICK_INTERVAL ) ) + { + ticks_remaining--; + response = "Ticked the clock"; + } + else + response = "Failed to tick the clock"; + return true; } if(action == "start") { if( ClockStart() ) - response = "Started the clock"; + response = "Started the clock"; else - response = "Failed to start the clock"; + response = "Failed to start the clock"; return true; } if(action == "stop") { if( ClockStop() ) - response = "Stopped the clock"; + response = "Stopped the clock"; else - response = "Failed to stop the clock"; + response = "Failed to stop the clock"; return true; } Modified: code/websim/src/websim.cc =================================================================== --- code/websim/src/websim.cc 2009-07-11 22:49:28 UTC (rev 7995) +++ code/websim/src/websim.cc 2009-07-11 22:51:21 UTC (rev 7996) @@ -25,41 +25,19 @@ * SVN: $Id: gazebo.h 7398 2009-03-09 07:21:49Z natepak $ */ -#include "websim.hh" #include <boost/lexical_cast.hpp> - #include <assert.h> #include <stdlib.h> #include <string.h> #include <libxml/encoding.h> - - - +#include "websim.hh" using namespace websim; const std::string WebSim::package = "WebSim"; const std::string WebSim::version = "0.1"; -std::string WebSim::webpage = - "<html><head ><title>WebSim</title></head><body><h3>" + WebSim::package + " " + WebSim::version + - "</h3><p>Welcome to WebSim, an Http-based interface to robot simulations." - " Through this interface, you can get the state of the robots as well as sensors' data using URIs. Here are some examples:" - "</p><p><a href=\"http://HOST/sim/tree/get\"> http://HOST/sim/tree/get </a></p>" - "<p><a href=\"http://HOST/position:1/pva/get\"> http://HOST/position:1/pva/get </a></p>" - "<p><a href=\"http://HOST/position:1/laser:0/data/get\"> http://HOST/position:1.laser:0/data/get </a></p>" - "<p><a href=\"http://HOST/position:1/ranger:0/data/get\"> http://HOST/position:1/ranger:0:/data/get </a></p>" - "<p><a href=\"http://HOST/position:1/model:0/fiducial:0/data/get\"> http://HOST/position:1/model:0/fiducial:0/data/get </a></p>" - "</body></html>"; - -std::string WebSim::vizpage = - "<HTML><HEAD><TITLE>Websim Visualization</TITLE></HEAD>" - "<BODY><iframe id=\"visualization\" frameborder=0 width=\"1000\" height=\"1000\" " - "src=\"http://192.168.1.210/viz.html\"></iframe></BODY></HTML>"; - - - std::string Time::String() { std::string seconds = boost::lexical_cast<std::string>(sec); Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-07-11 22:49:28 UTC (rev 7995) +++ code/websim/src/websim.hh 2009-07-11 22:51:21 UTC (rev 7996) @@ -73,7 +73,7 @@ /** Send go signals to all confederates */ void Go(); - // Interface to be implemented by simulators + // Interface to be implemented by simulators ========================================================== /** Return a string that usefully identifies the simulator for a human reader, e.g. "MyRobotSimulator" */ @@ -96,6 +96,14 @@ @return true on succes, false on failure. */ virtual bool ClockStop()=0; + + /** Run for a specified amount of simulated time, then pause. This should work + whether or not the clock is currently paused. WebSim uses this to implement + clock synchronization in simulator federation, but it can also be used by end-users. + + @param seconds The amount of simulated time to run until pausing, in seconds. + */ + virtual bool ClockRunFor( double seconds )=0; virtual bool CreateModel(const std::string& name, const std::string& type, @@ -230,16 +238,8 @@ struct evhttp* eh; - // the string which contains the html code of the home page - static std::string webpage; - - // the html code of visualization page - static std::string vizpage; - // Static, so that it can be passed as a callback to libevent static void EventCallback(evhttp_request* req, void* arg); - - /** Gets the uri parameters. @@ -556,7 +556,6 @@ }; protected: -// static const unsigned short DEFAULT_PORT; static const std::string package; static const std::string version; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2009-07-13 23:38:13
|
Revision: 8011 http://playerstage.svn.sourceforge.net/playerstage/?rev=8011&view=rev Author: asadat Date: 2009-07-13 23:38:04 +0000 (Mon, 13 Jul 2009) Log Message: ----------- added some code to generate the sample links at runtime Modified Paths: -------------- code/websim/src/req_sim.cc code/websim/src/websim.hh Modified: code/websim/src/req_sim.cc =================================================================== --- code/websim/src/req_sim.cc 2009-07-13 23:37:43 UTC (rev 8010) +++ code/websim/src/req_sim.cc 2009-07-13 23:38:04 UTC (rev 8011) @@ -41,14 +41,7 @@ if(prop == "viz") return HandleSimVisualizationRequest( action, format, kv, response ); - if(prop == "applet"){ - - - - return true; - } - response = "ERROR: Unknown property " + prop + " for sim. Candidates are: clock factory greet tree."; return false; } @@ -73,26 +66,38 @@ struct evkeyvalq* kv, std::string& response) { + + std::vector<std::string> links; + GenerateSampleUrls(links); + + //replacing 'HOST' by actual 'host:port' term + for(unsigned int j=0;j<links.size();j++){ + unsigned int i=0; + i = links[j].find("HOST"); + while(i!=std::string::npos){ + + links[j].replace(i, 4, hostportname); + i = links[j].find("HOST"); + } + } + response = "<html><head><title>WebSim</title></head>" "<body>" "<h1>Welcome to " + IdentificationString() + "</h1>" "<p>" + package + "-" + version + " HTTP interface to " + IdentificationString() + "-" + VersionString() + "</h1>" - "<hr>" - "<p><a href=\"http://playerstage.org/index.php?src=websim\">WebSim</a>" + "<hr>"; + + for(unsigned int k=0;k<links.size();k++) + response += links[k]; + + response +="<hr>" + "<p><a href=\"http://playerstage.org/index.php?src=websim\">WebSim</a>" " is part of the <a href=\"http://playerstage.org\">Player Project</a>" "</body></html>"; -// // replacing 'HOST' by actual 'host:port' term -// unsigned int i=0; -// i = response.find("HOST"); -// while(i!=std::string::npos){ -// response.replace(i, 4, hostportname); -// i = response.find("HOST"); -// } - return true; } @@ -265,3 +270,37 @@ response = "ERROR: Unknown action " + action + " for sim/clock. Candidates are: get (default) start stop."; return false; } + +void WebSim::GenerateSampleUrls(std::vector<std::string> &list){ + + std::vector<std::string> interfaces; + std::vector<std::string> temp; + + + GetModelChildren("",temp); + while(temp.size()>0 && interfaces.size() < 6){ + + std::string m = temp.at(0); + temp.erase(temp.begin()); + + int size = temp.size(); + GetModelChildren(m, temp); + if(temp.size()==size){ + + interfaces.push_back(m); + + } + + + } + + for(unsigned int i=0;i<interfaces.size();i++){ + if(interfaces[i].find("laser")!=std::string::npos || interfaces[i].find("fiducial")!=std::string::npos || + interfaces[i].find("irarray")!=std::string::npos) + list.push_back("<a href=http://HOST/"+interfaces[i]+"/data/get > http://HOST/"+interfaces[i]+"/data/get</a> <br>"); + + } + +} + + Modified: code/websim/src/websim.hh =================================================================== --- code/websim/src/websim.hh 2009-07-13 23:37:43 UTC (rev 8010) +++ code/websim/src/websim.hh 2009-07-13 23:38:04 UTC (rev 8011) @@ -224,6 +224,7 @@ Acceleration& a ); protected: + void GenerateSampleUrls(std::vector<std::string> &list); void StringSplit(const std::string &s, std::vector<std::string> &t, const std::string &d); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2009-07-14 18:36:32
|
Revision: 8016 http://playerstage.svn.sourceforge.net/playerstage/?rev=8016&view=rev Author: asadat Date: 2009-07-14 18:36:30 +0000 (Tue, 14 Jul 2009) Log Message: ----------- changed how sample links are generated Modified Paths: -------------- code/websim/src/req_model.cc code/websim/src/req_sim.cc Modified: code/websim/src/req_model.cc =================================================================== --- code/websim/src/req_model.cc 2009-07-14 08:53:51 UTC (rev 8015) +++ code/websim/src/req_model.cc 2009-07-14 18:36:30 UTC (rev 8016) @@ -284,7 +284,7 @@ void* xmlnode) { if(format == TEXT){ - + std::string res; char temp[128]; for(unsigned int i=0;i<ranges.size();i++){ Modified: code/websim/src/req_sim.cc =================================================================== --- code/websim/src/req_sim.cc 2009-07-14 08:53:51 UTC (rev 8015) +++ code/websim/src/req_sim.cc 2009-07-14 18:36:30 UTC (rev 8016) @@ -273,32 +273,48 @@ void WebSim::GenerateSampleUrls(std::vector<std::string> &list){ - std::vector<std::string> interfaces; + std::vector<std::string> sensors; std::vector<std::string> temp; GetModelChildren("",temp); - while(temp.size()>0 && interfaces.size() < 6){ + while(temp.size()>0 && sensors.size() < 50){ std::string m = temp.at(0); temp.erase(temp.begin()); - int size = temp.size(); + unsigned int size = temp.size(); GetModelChildren(m, temp); if(temp.size()==size){ - interfaces.push_back(m); + sensors.push_back(m); } } - for(unsigned int i=0;i<interfaces.size();i++){ - if(interfaces[i].find("laser")!=std::string::npos || interfaces[i].find("fiducial")!=std::string::npos || - interfaces[i].find("irarray")!=std::string::npos) - list.push_back("<a href=http://HOST/"+interfaces[i]+"/data/get > http://HOST/"+interfaces[i]+"/data/get</a> <br>"); + bool laser=false,ranger=false,fiducial=false; + + for(unsigned int i=0;i<sensors.size();i++){ + + if(sensors[i].find("laser")!=std::string::npos && !laser){ + list.push_back("<a href=http://HOST/"+sensors[i]+"/data/get > http://HOST/"+sensors[i]+"/data/get</a> <br>"); + laser = true; + } + + if(sensors[i].find("fiducial")!=std::string::npos && !fiducial){ + list.push_back("<a href=http://HOST/"+sensors[i]+"/data/get > http://HOST/"+sensors[i]+"/data/get</a> <br>"); + fiducial = true; + } + + if((sensors[i].find("ranger")!=std::string::npos || sensors[i].find("irarray")!=std::string::npos) && !ranger){ + list.push_back("<a href=http://HOST/"+sensors[i]+"/data/get > http://HOST/"+sensors[i]+"/data/get</a> <br>"); + ranger = true; + } + + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |