From: <rt...@us...> - 2009-03-08 05:30:53
|
Revision: 7388 http://playerstage.svn.sourceforge.net/playerstage/?rev=7388&view=rev Author: rtv Date: 2009-03-08 05:30:35 +0000 (Sun, 08 Mar 2009) Log Message: ----------- demo... Modified Paths: -------------- code/branches/federation/stage/examples/gzfed/gzwander.cc code/branches/federation/stage/examples/gzfed/stage.world Modified: code/branches/federation/stage/examples/gzfed/gzwander.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/gzwander.cc 2009-03-08 05:30:33 UTC (rev 7387) +++ code/branches/federation/stage/examples/gzfed/gzwander.cc 2009-03-08 05:30:35 UTC (rev 7388) @@ -219,16 +219,20 @@ vel.x, vel.y, vel.z, vel.a ); - static int skip = 10; + + static int last_second = 0; - if( --skip == 0 ) + int now_second = mod->GetWorld()->SimTimeNow() / 1e5; + + if( last_second < now_second ) { + printf( "%d seconds - pushing state\n", now_second ); // tell gazebo the new position gzPush( robot->gazeboid, pose.x, pose.y, pose.z+0.146, 0,0, pose.a, vel.x, vel.y, vel.z, 0,0, vel.a ); - skip = 10; + last_second = now_second; } return 0; // run again Modified: code/branches/federation/stage/examples/gzfed/stage.world =================================================================== --- code/branches/federation/stage/examples/gzfed/stage.world 2009-03-08 05:30:33 UTC (rev 7387) +++ code/branches/federation/stage/examples/gzfed/stage.world 2009-03-08 05:30:35 UTC (rev 7388) @@ -41,7 +41,7 @@ name "r0" pose [ 0.892 0.800 0 56.500 ] - sicklaser() + sicklaser( samples 180 ) ctrl "gzwander" ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rt...@us...> - 2009-03-09 07:55:00
|
Revision: 7401 http://playerstage.svn.sourceforge.net/playerstage/?rev=7401&view=rev Author: rtv Date: 2009-03-09 07:54:57 +0000 (Mon, 09 Mar 2009) Log Message: ----------- federation file parsing code Added Paths: ----------- code/branches/federation/stage/examples/gzfed/Makefile code/branches/federation/stage/examples/gzfed/main.cc code/branches/federation/stage/examples/gzfed/parser.cc Added: code/branches/federation/stage/examples/gzfed/Makefile =================================================================== --- code/branches/federation/stage/examples/gzfed/Makefile (rev 0) +++ code/branches/federation/stage/examples/gzfed/Makefile 2009-03-09 07:54:57 UTC (rev 7401) @@ -0,0 +1,4 @@ + + +parser: parser.cc main.cc + g++ parser.cc main.cc -o parser -lyaml \ No newline at end of file Added: code/branches/federation/stage/examples/gzfed/main.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/main.cc (rev 0) +++ code/branches/federation/stage/examples/gzfed/main.cc 2009-03-09 07:54:57 UTC (rev 7401) @@ -0,0 +1,17 @@ + +#include "stdio.h" + +// declaration +int parse_federation_file( const char* filename ); + +int main( int argc, char** argv ) +{ + printf( "parsing file %s\n", argv[1] ); + + if( parse_federation_file( argv[1] ) ) + printf( "failed to parse file." ); + else + printf( "file parsed OK" ); + + return 0; +} Added: code/branches/federation/stage/examples/gzfed/parser.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/parser.cc (rev 0) +++ code/branches/federation/stage/examples/gzfed/parser.cc 2009-03-09 07:54:57 UTC (rev 7401) @@ -0,0 +1,191 @@ +#include <yaml.h> +#include <stdio.h> +#include <assert.h> +#include <string> +#include <iostream> + +using namespace std; + +static yaml_event_t event; +static yaml_parser_t parser; +static string hostname; + +void httprequest( string req ) +{ + cout << "\t" << req << endl; +} + +void 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 next_event( const char* msg ) +{ + yaml_event_delete( &event ); + + if (!yaml_parser_parse( &parser, &event)) + parse_failed( msg ); + + return event; +} + +void expect( yaml_event_type_t event_type, const char* msg ) +{ + //printf( "expecting %s\n", msg ); + + if( next_event( "" ).type != event_type ) + parse_failed( msg ); +} + +bool test( yaml_event_type_t event_type, const char* msg ) +{ + printf( "expecting %s\n", msg ); + + return( next_event( "" ).type != event_type ); +} + + +void parse_ghost_mapping( string host, + string model ) +{ + expect( YAML_SCALAR_EVENT, "ghost host" ); + string ghosthost = (const char*)event.data.scalar.value; + + expect( YAML_SCALAR_EVENT, "ghost type" ); + string ghosttype = (const char*)event.data.scalar.value; + + expect( YAML_MAPPING_END_EVENT, "ghost mapping" ); + + if( host == hostname ) + httprequest( "http://" + ghosthost + "/sim/create?type=" + ghosttype ); +} + + +void parse_ghost_mapping_sequence( string host, + string model ) +{ + expect( YAML_SEQUENCE_START_EVENT, "start of sequence of ghost mappings" ); + + while( 1 ) + { + next_event( "" ); + switch( event.type ) + { + case YAML_MAPPING_START_EVENT: + parse_ghost_mapping( host, model ); + break; + case YAML_SEQUENCE_END_EVENT: + return; + default: + parse_failed( "expecting a ghost mapping or end of sequence" ); + } + } +} + +void parse_model_mapping( string host ) +{ + expect( YAML_SCALAR_EVENT, "model name" ); + string model = (char*)event.data.scalar.value; + + parse_ghost_mapping_sequence( host, model ); + + expect( YAML_MAPPING_END_EVENT, "end of model mapping" ); +} + +void 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 parse_host_mapping() +{ + expect( YAML_MAPPING_START_EVENT, "host mapping start" ); + + while( 1 ) + { + next_event( "" ); + switch( event.type ) + { + case YAML_SCALAR_EVENT: + { + string host = (char*)event.data.scalar.value; + cout << "HOST " << host << endl; + parse_model_mapping_sequence( host ); + } + break; + case YAML_MAPPING_END_EVENT: + return; + default: + parse_failed( "expecting a host scalar or a end of mapping" ); + } + } +} + +void parse_document() +{ + expect( YAML_DOCUMENT_START_EVENT, "document start" ); + parse_host_mapping(); + expect( YAML_DOCUMENT_END_EVENT, "document end" ); +} + +void parse_stream() +{ + expect( YAML_STREAM_START_EVENT, "stream start" ); + parse_document(); + expect( YAML_STREAM_END_EVENT, "stream end" ); +} + +int parse_federation_file( const char* filename ) +{ + char hst[256]; + if( gethostname( hst, 256 ) ) + { + perror( "failed to get hostname" ); + exit( 0 ); + } + + // copy the c string into a std:string + hostname = hst; + + /* 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); + + return 0; +} + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rt...@us...> - 2009-03-10 02:23:02
|
Revision: 7410 http://playerstage.svn.sourceforge.net/playerstage/?rev=7410&view=rev Author: rtv Date: 2009-03-10 01:44:08 +0000 (Tue, 10 Mar 2009) Log Message: ----------- working on clientside of websim Modified Paths: -------------- code/branches/federation/stage/examples/gzfed/Makefile code/branches/federation/stage/examples/gzfed/main.cc code/branches/federation/stage/examples/gzfed/parser.cc code/branches/federation/stage/examples/gzfed/world.fed Added Paths: ----------- code/branches/federation/stage/examples/gzfed/confederate.cc code/branches/federation/stage/examples/gzfed/puppet.cc code/branches/federation/stage/examples/gzfed/websim.cc code/branches/federation/stage/examples/gzfed/websim.hh Modified: code/branches/federation/stage/examples/gzfed/Makefile =================================================================== --- code/branches/federation/stage/examples/gzfed/Makefile 2009-03-10 01:07:25 UTC (rev 7409) +++ code/branches/federation/stage/examples/gzfed/Makefile 2009-03-10 01:44:08 UTC (rev 7410) @@ -1,4 +1,6 @@ +CFLAGS=`pkg-config --cflags glib-2.0` +LIBS=-levent -lyaml `pkg-config --libs glib-2.0` -parser: parser.cc main.cc - g++ parser.cc main.cc -o parser -lyaml \ No newline at end of file +websim: websim.hh websim.cc parser.cc main.cc puppet.cc confederate.cc + g++ $(CFLAGS) websim.cc parser.cc main.cc puppet.cc confederate.cc -o $@ $(LIBS) \ No newline at end of file Added: code/branches/federation/stage/examples/gzfed/confederate.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/confederate.cc (rev 0) +++ code/branches/federation/stage/examples/gzfed/confederate.cc 2009-03-10 01:44:08 UTC (rev 7410) @@ -0,0 +1,96 @@ +#include <stdio.h> +#include <assert.h> + +#include "websim.hh" + +Confederate::Confederate( const char* host, unsigned short port ) : + puppet_list( NULL ) +{ + 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 + snprintf( name, 512, "%s:%u", remote_host, remote_port ); + + g_hash_table_insert( WebSim::confederates, name, this ); + //printf( "\t\tConfederate %s constructed \n", name ); +} + +Confederate::~Confederate() +{ + evhttp_connection_free( http_con ); +} + +void Confederate::PuppetCreationCallback( evhttp_request* req, void* arg ) +{ + Puppet* pup = (Puppet*)arg; + printf( "response regarding puppet \"%s\"\n", pup->name ); + + printf( "code: %d\n", req->response_code ); + + printf( "response: %s\n", req->input_buffer->buffer ); + + if( req->response_code == 200 ) + pup->created = true; +} + +void 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( "URI: %s\n", 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_dispatch(); // loops until the request has completed + + puppet_list = + g_list_append( puppet_list, puppet ); +} + +int Confederate::Push( Puppet* puppet ) +{ + printf( "\tpushing \"%s\" to %s.\n", + puppet->name, + name ); +} + +int Confederate::RunStep() +{ + // construct and send a tick message + printf( "Confederate %s clock tick\n", + name ); + return 0; +} + + Modified: code/branches/federation/stage/examples/gzfed/main.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/main.cc 2009-03-10 01:07:25 UTC (rev 7409) +++ code/branches/federation/stage/examples/gzfed/main.cc 2009-03-10 01:44:08 UTC (rev 7410) @@ -1,17 +1,61 @@ -#include "stdio.h" +#include <unistd.h> +#include <stdio.h> -// declaration -int parse_federation_file( const char* filename ); +#include "websim.hh" +void print_confederate( const char* name, Confederate* conf, void* prefix ) +{ + //printf( "%skey: %s name :%s\n", prefix, name, conf->name ); + printf( "%s%s\n", prefix, conf->name ); +} + +void update_puppet( const char* name, Puppet* pup, void* dummy ) +{ + // poke new state into puppet here + pup->pose.x = 10; + pup->pose.y = 10; + pup->pose.z = 10; + pup->pose.a = 10; + + // and send the changes to the remote simulator + pup->Push(); +} + int main( int argc, char** argv ) { - printf( "parsing file %s\n", argv[1] ); + WebSim ws( argv[1], createcallback, stateupdatecallback ); - if( parse_federation_file( argv[1] ) ) - printf( "failed to parse file." ); - else - printf( "file parsed OK" ); + puts( "\nConfederates:" ); + ws.ForEachConfederate( print_confederate, + (void*)"\t" ); + + while( 1 ) + { + + // native loop + + until( simtime >= (lasttime + ws.interval) ) + { + for each model + update model + } + + for each model + ws.Push( "monkey", x,y,z ) + + ws.Update(); + } + return 0; } + + + //puts( "\nUpdating puppets" ); + //WebSim::ForEachPuppet( update_puppet, + // NULL ); + // if( pup = WebSim::getPuppet( model->name ) ) +// pup->Push() + + Modified: code/branches/federation/stage/examples/gzfed/parser.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/parser.cc 2009-03-10 01:07:25 UTC (rev 7409) +++ code/branches/federation/stage/examples/gzfed/parser.cc 2009-03-10 01:44:08 UTC (rev 7410) @@ -1,11 +1,14 @@ -#include <yaml.h> + #include <stdio.h> #include <assert.h> #include <string> #include <iostream> +#include <yaml.h> // YAML parser using namespace std; +#include "websim.hh" + static yaml_event_t event; static yaml_parser_t parser; static string hostname; @@ -51,39 +54,68 @@ } -void parse_ghost_mapping( string host, - string model ) +Confederate* GetConfederate( const char* host, unsigned short port ) { - expect( YAML_SCALAR_EVENT, "ghost host" ); - string ghosthost = (const char*)event.data.scalar.value; + char lookup[256]; + snprintf( lookup, 256, "%s:%u", host, port ); + + Confederate* conf = (Confederate*) + g_hash_table_lookup( WebSim::confederates, lookup ); - expect( YAML_SCALAR_EVENT, "ghost type" ); - string ghosttype = (const char*)event.data.scalar.value; + if( ! conf ) + conf = new Confederate( host, port ); - expect( YAML_MAPPING_END_EVENT, "ghost mapping" ); - - if( host == hostname ) - httprequest( "http://" + ghosthost + "/sim/create?type=" + ghosttype ); + return conf; } -void parse_ghost_mapping_sequence( string host, - string model ) +Confederate* GetConfederate( const char* hostandport ) { - expect( YAML_SEQUENCE_START_EVENT, "start of sequence of ghost mappings" ); + unsigned int port = WebSim::DEFAULT_PORT; + char hostnoport[256]; + // parse out port number from hostname + sscanf( hostandport, "%s %u", &hostnoport, &port ); + + //printf( " \"%s\" -> %s:%u\n", + // hostandport, hostnoport, port ); + + return GetConfederate( hostnoport, port ); +} + +void 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 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_ghost_mapping( host, model ); + parse_puppet_mapping( pup ); break; case YAML_SEQUENCE_END_EVENT: return; default: - parse_failed( "expecting a ghost mapping or end of sequence" ); + parse_failed( "expecting a puppet mapping or end of sequence" ); } } } @@ -92,8 +124,13 @@ { expect( YAML_SCALAR_EVENT, "model name" ); string model = (char*)event.data.scalar.value; + + Puppet* pup = NULL; - parse_ghost_mapping_sequence( host, model ); + if( host == hostname ) + pup = new Puppet( model.c_str() ); + + parse_puppet_mapping_sequence( pup ); expect( YAML_MAPPING_END_EVENT, "end of model mapping" ); } @@ -129,9 +166,12 @@ { case YAML_SCALAR_EVENT: { - string host = (char*)event.data.scalar.value; - cout << "HOST " << host << endl; - parse_model_mapping_sequence( host ); + 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: @@ -165,8 +205,11 @@ exit( 0 ); } + char buf[256]; + snprintf( buf, 256, "%s:%u", hst, WebSim::DEFAULT_PORT ); + // copy the c string into a std:string - hostname = hst; + hostname = buf; /* Create the Parser object. */ yaml_parser_initialize(&parser); Added: code/branches/federation/stage/examples/gzfed/puppet.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/puppet.cc (rev 0) +++ code/branches/federation/stage/examples/gzfed/puppet.cc 2009-03-10 01:44:08 UTC (rev 7410) @@ -0,0 +1,38 @@ + +#include <string.h> //for strdup() +#include <stdio.h> + +#include "websim.hh" + + +Puppet::Puppet( const char* name ) : + name( strdup(name) ), + created( false ) +{ + g_hash_table_insert( WebSim::puppets, (void*)this->name, this ); + + //printf( "\t Puppet \"%s\" constructed\n", this->name ); +} + + +void Puppet::Push() +{ + for( GList* it = confederates; + it; + it = it->next ) + { + Confederate* conf = (Confederate*)it->data; + conf->Push( this ); + } +} + +void Puppet::AddConfederate( Confederate* conf, + const char* prototype ) +{ + conf->AddPuppet( this, prototype ); + confederates = g_list_append( confederates, conf ); +} + + + + Added: code/branches/federation/stage/examples/gzfed/websim.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/websim.cc (rev 0) +++ code/branches/federation/stage/examples/gzfed/websim.cc 2009-03-10 01:44:08 UTC (rev 7410) @@ -0,0 +1,66 @@ +#include <iostream> + +#include "websim.hh" + +// declaration - parser defined in parser.cc +int parse_federation_file( const char* filename ); + +// static members + GHashTable* WebSim::confederates = + g_hash_table_new( g_str_hash, g_str_equal ); + +GHashTable* WebSim::puppets = + g_hash_table_new( g_str_hash, g_str_equal ); + +const unsigned short WebSim::DEFAULT_PORT = 8000; + +const std::string WebSim::package = "WebSim"; +const std::string WebSim::version = "0.1"; + + +// WebSim::WebSim( const char* filename ) +// { +// std::cout << package << ' ' << version << std::endl; +// parse_federation_file( filename ); +// std::cout << package << " ready." << std::endl; +// } + +void WebSim::Init( const char* filename ) +{ + std::cout << package << ' ' << version << std::endl; + + event_init(); // libevent startup + parse_federation_file( filename ); + + std::cout << package << " ready." << std::endl; +} + +void WebSim::ForEachConfederate( void(*cb)(const char*, Confederate*, void*), void* arg ) +{ + g_hash_table_foreach( WebSim::confederates, + (GHFunc)cb, + arg ); +} + +void WebSim::ForEachPuppet( void(*cb)(const char*, Puppet*, void*), void* arg ) +{ + g_hash_table_foreach( WebSim::puppets, + (GHFunc)cb, + arg ); +} + + +Puppet* WebSim::GetPuppet( const char* name ) +{ + return( (Puppet*)g_hash_table_lookup( WebSim::puppets, name ) ); +} + +Confederate* WebSim::GetConfederate( const char* name ) +{ + return( (Confederate*)g_hash_table_lookup( WebSim::confederates, name ) ); +} + +void WebSim::Update() +{ + event_loop( EVLOOP_ONCE ); +} Added: code/branches/federation/stage/examples/gzfed/websim.hh =================================================================== --- code/branches/federation/stage/examples/gzfed/websim.hh (rev 0) +++ code/branches/federation/stage/examples/gzfed/websim.hh 2009-03-10 01:44:08 UTC (rev 7410) @@ -0,0 +1,146 @@ +#include <sys/types.h> +#include <sys/queue.h> + +#include <event.h> // libevent +#include <evhttp.h> // libevent's http tools +#include <string> + +#include <glib.h> + +class Pose +{ +public: + double x,y,z,r,p,a; + + Pose() : + x(0), y(0), z(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), 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 ) + {} +}; + + +// forward decl. +class Confederate; + +// manage an object we control on some federated simulators +class Puppet +{ +public: + Puppet( const char* name ); + + // unique ID used as a system-widel handle for this puppet, used as + // hash table key + const char* name; + + Pose pose; + Velocity vel; + Acceleration acc; + + bool created; + + // the remote servers that are hosting an instance of this puppet + GList* confederates; + + // sends the current physical state of the puppet to all + // confederates + void Push(); + + // create an instance of the puppet on this confederate, using the + // named puppet prototype (defined locally at the conferderate) + void AddConfederate( Confederate* conf, + const char* prototype ); +}; + + +// manage a federated simulator +class Confederate +{ +private: + // connection to a remote http simulation server + struct evhttp_connection* http_con; + struct evhttp_request* http_req; + + static void PuppetCreationCallback( evhttp_request* req, void* arg ); + + +public: + Confederate( const char* host, unsigned short port ); + ~Confederate(); + + void AddPuppet( Puppet* puppet, + const char* prototype ); + + int Push( Puppet* puppet ); + int RunStep(); + + // list of pointers to Puppet objects that are hosted on this + // connection - can iterate over these to update all puppets + GList* puppet_list; + + + // unique ID for this confederate in format "hostname:port", used as + // hash table key + char name[512]; +}; + + +class WebSim +{ +public: + static const unsigned short DEFAULT_PORT; + static const std::string package; + static const std::string version; + static GHashTable* puppets; + static GHashTable* confederates; + + static void Init( const char* federation_filename ); + + //WebSim( const char* federation_filename ); + + /** For each confederate, call the callback function */ + static void ForEachConfederate( void(*cb)(const char*, Confederate*, void*), void* arg ); + + /** For each puppet, call the callback function */ + static void ForEachPuppet( void(*cb)(const char*, Puppet*, void*), void* arg ); + + /** Get a puppet by name */ + static Puppet* GetPuppet( const char* name ); + + /** Get a confederate by name in format "host:port" */ + static Confederate* GetConfederate( const char* name ); + + static void Update(); +}; Modified: code/branches/federation/stage/examples/gzfed/world.fed =================================================================== --- code/branches/federation/stage/examples/gzfed/world.fed 2009-03-10 01:07:25 UTC (rev 7409) +++ code/branches/federation/stage/examples/gzfed/world.fed 2009-03-10 01:44:08 UTC (rev 7410) @@ -3,17 +3,27 @@ # - desthost: prototype gort: - - pioneer2dx_model1: - - deckard: pioneer - - roy: pioneer - - priss: pioneer - - pioneer2dx_model2: - - deckard: pioneer + - monkey: + - localhost: pioneer2dx + - punky: + - localhost: pioneer2dx + - chunky: + - localhost: pioneer2dx + - funky: + - localhost: pioneer2dx -tenner: - - pr2_1: - - deckard: pr2 -priss: - - pr2_1: - - deckard: pr2 +# - roy: pioneer +# - "priss 8888": pioneer +# - pioneer2dx_model2: +# - deckard: pioneer +# - pioneer2dx_model3: +# - deckard: pioneer + +#"tenner 9999": +# - pr2_1: +# - deckard: pr2 + +#priss: +# - pr2_1: +# - "deckard 1234": pr2 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rt...@us...> - 2009-03-10 03:07:12
|
Revision: 7420 http://playerstage.svn.sourceforge.net/playerstage/?rev=7420&view=rev Author: rtv Date: 2009-03-10 03:07:02 +0000 (Tue, 10 Mar 2009) Log Message: ----------- refactored to get instance of websim Modified Paths: -------------- code/branches/federation/stage/examples/gzfed/confederate.cc code/branches/federation/stage/examples/gzfed/main.cc code/branches/federation/stage/examples/gzfed/parser.cc code/branches/federation/stage/examples/gzfed/puppet.cc code/branches/federation/stage/examples/gzfed/websim.cc code/branches/federation/stage/examples/gzfed/websim.hh Modified: code/branches/federation/stage/examples/gzfed/confederate.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/confederate.cc 2009-03-10 02:28:14 UTC (rev 7419) +++ code/branches/federation/stage/examples/gzfed/confederate.cc 2009-03-10 03:07:02 UTC (rev 7420) @@ -3,7 +3,7 @@ #include "websim.hh" -Confederate::Confederate( const char* host, unsigned short port ) : +WebSim::Confederate::Confederate( WebSim* ws, const char* host, unsigned short port ) : puppet_list( NULL ) { if(! (http_con = evhttp_connection_new( host, port )) ) @@ -19,18 +19,21 @@ &remote_port ); // build the canonical name for this confederate - snprintf( name, 512, "%s:%u", remote_host, remote_port ); - - g_hash_table_insert( WebSim::confederates, name, this ); + 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 ); } -Confederate::~Confederate() +WebSim::Confederate::~Confederate() { evhttp_connection_free( http_con ); } -void Confederate::PuppetCreationCallback( evhttp_request* req, void* arg ) +void WebSim::Confederate::PuppetCreationCallback( evhttp_request* req, void* arg ) { Puppet* pup = (Puppet*)arg; printf( "response regarding puppet \"%s\"\n", pup->name ); @@ -43,7 +46,7 @@ pup->created = true; } -void Confederate::AddPuppet( Puppet* puppet, +void WebSim::Confederate::AddPuppet( Puppet* puppet, const char* prototype ) { // send a create message @@ -78,14 +81,14 @@ g_list_append( puppet_list, puppet ); } -int Confederate::Push( Puppet* puppet ) +int WebSim::Confederate::Push( const char* name, Pose p, Velocity v, Acceleration a ) { - printf( "\tpushing \"%s\" to %s.\n", - puppet->name, + printf( "\tconfederate %s pushing state of \"%s\"\n", + this->name, name ); } -int Confederate::RunStep() +int WebSim::Confederate::RunStep() { // construct and send a tick message printf( "Confederate %s clock tick\n", Modified: code/branches/federation/stage/examples/gzfed/main.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/main.cc 2009-03-10 02:28:14 UTC (rev 7419) +++ code/branches/federation/stage/examples/gzfed/main.cc 2009-03-10 03:07:02 UTC (rev 7420) @@ -4,48 +4,25 @@ #include "websim.hh" -void print_confederate( const char* name, Confederate* conf, void* prefix ) -{ - //printf( "%skey: %s name :%s\n", prefix, name, conf->name ); - printf( "%s%s\n", prefix, conf->name ); -} - -void update_puppet( const char* name, Puppet* pup, void* dummy ) -{ - // poke new state into puppet here - pup->pose.x = 10; - pup->pose.y = 10; - pup->pose.z = 10; - pup->pose.a = 10; - - // and send the changes to the remote simulator - pup->Push(); -} - int main( int argc, char** argv ) { - WebSim ws( argv[1], createcallback, stateupdatecallback ); + WebSim ws( argv[1] );//, createcallback, stateupdatecallback ); - puts( "\nConfederates:" ); - ws.ForEachConfederate( print_confederate, - (void*)"\t" ); - while( 1 ) { - // native loop - until( simtime >= (lasttime + ws.interval) ) - { - for each model - update model - } + // until( simtime >= (lasttime + ws.interval) ) + //{ + // for each model + // update model + //} - for each model - ws.Push( "monkey", x,y,z ) + //for each model + // ws.Push( "monkey", x,y,z ) - ws.Update(); + //ws.Update(); } return 0; Modified: code/branches/federation/stage/examples/gzfed/parser.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/parser.cc 2009-03-10 02:28:14 UTC (rev 7419) +++ code/branches/federation/stage/examples/gzfed/parser.cc 2009-03-10 03:07:02 UTC (rev 7420) @@ -9,16 +9,13 @@ #include "websim.hh" -static yaml_event_t event; -static yaml_parser_t parser; -static string hostname; void httprequest( string req ) { cout << "\t" << req << endl; } -void parse_failed( const char* message ) +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, @@ -28,7 +25,7 @@ exit(0); } -yaml_event_t next_event( const char* msg ) +yaml_event_t WebSim::Parser::next_event( const char* msg ) { yaml_event_delete( &event ); @@ -38,7 +35,7 @@ return event; } -void expect( yaml_event_type_t event_type, const char* msg ) +void WebSim::Parser::expect( yaml_event_type_t event_type, const char* msg ) { //printf( "expecting %s\n", msg ); @@ -46,30 +43,30 @@ parse_failed( msg ); } -bool test( yaml_event_type_t event_type, const char* msg ) -{ - printf( "expecting %s\n", msg ); +// bool test( yaml_event_type_t event_type, const char* msg ) +// { +// printf( "expecting %s\n", msg ); - return( next_event( "" ).type != event_type ); -} +// return( next_event( "" ).type != event_type ); +// } -Confederate* GetConfederate( const char* host, unsigned short port ) +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( WebSim::confederates, lookup ); + g_hash_table_lookup( ws->confederates, lookup ); if( ! conf ) - conf = new Confederate( host, port ); + conf = new Confederate( ws, host, port ); return conf; } -Confederate* GetConfederate( const char* hostandport ) +WebSim::Confederate* WebSim::Parser::GetConfederate( const char* hostandport ) { unsigned int port = WebSim::DEFAULT_PORT; char hostnoport[256]; @@ -83,7 +80,7 @@ return GetConfederate( hostnoport, port ); } -void parse_puppet_mapping( Puppet* pup ) +void WebSim::Parser::parse_puppet_mapping( Puppet* pup ) { expect( YAML_SCALAR_EVENT, "puppet host" ); const char* host = strdup((const char*)event.data.scalar.value); @@ -100,7 +97,7 @@ GetConfederate( host ); // federate for time sync only } -void parse_puppet_mapping_sequence( Puppet* pup ) +void WebSim:: Parser::parse_puppet_mapping_sequence( Puppet* pup ) { expect( YAML_SEQUENCE_START_EVENT, "start of sequence of puppet mappings" ); @@ -120,22 +117,22 @@ } } -void parse_model_mapping( string host ) +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 == hostname ) - pup = new Puppet( model.c_str() ); + if( host == ws->hostname ) + pup = new Puppet( ws, model.c_str() ); parse_puppet_mapping_sequence( pup ); expect( YAML_MAPPING_END_EVENT, "end of model mapping" ); } -void parse_model_mapping_sequence( string host ) +void WebSim::Parser::parse_model_mapping_sequence( string host ) { expect( YAML_SEQUENCE_START_EVENT, "start of sequence of model mappings" ); @@ -155,7 +152,7 @@ } } -void parse_host_mapping() +void WebSim::Parser::parse_host_mapping() { expect( YAML_MAPPING_START_EVENT, "host mapping start" ); @@ -182,21 +179,22 @@ } } -void parse_document() +void WebSim::Parser::parse_document() { expect( YAML_DOCUMENT_START_EVENT, "document start" ); parse_host_mapping(); expect( YAML_DOCUMENT_END_EVENT, "document end" ); } -void parse_stream() +void WebSim::Parser::parse_stream() { expect( YAML_STREAM_START_EVENT, "stream start" ); parse_document(); expect( YAML_STREAM_END_EVENT, "stream end" ); } -int parse_federation_file( const char* filename ) +WebSim::Parser::Parser( WebSim* ws, const char* filename ) : + ws( ws ) { char hst[256]; if( gethostname( hst, 256 ) ) @@ -204,31 +202,29 @@ 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 - hostname = buf; + ws->hostname = 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); - - return 0; } Modified: code/branches/federation/stage/examples/gzfed/puppet.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/puppet.cc 2009-03-10 02:28:14 UTC (rev 7419) +++ code/branches/federation/stage/examples/gzfed/puppet.cc 2009-03-10 03:07:02 UTC (rev 7420) @@ -5,29 +5,30 @@ #include "websim.hh" -Puppet::Puppet( const char* name ) : +WebSim::Puppet::Puppet( WebSim* ws, const char* name ) : name( strdup(name) ), - created( false ) + created( false ), + ws( ws ) { - g_hash_table_insert( WebSim::puppets, (void*)this->name, this ); + g_hash_table_insert( ws->puppets, (void*)this->name, this ); //printf( "\t Puppet \"%s\" constructed\n", this->name ); } -void Puppet::Push() +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( this ); + conf->Push( name, p, v, a ); } } -void Puppet::AddConfederate( Confederate* conf, - const char* prototype ) +void WebSim::Puppet::AddConfederate( Confederate* conf, + const char* prototype ) { conf->AddPuppet( this, prototype ); confederates = g_list_append( confederates, conf ); Modified: code/branches/federation/stage/examples/gzfed/websim.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/websim.cc 2009-03-10 02:28:14 UTC (rev 7419) +++ code/branches/federation/stage/examples/gzfed/websim.cc 2009-03-10 03:07:02 UTC (rev 7420) @@ -2,36 +2,22 @@ #include "websim.hh" -// declaration - parser defined in parser.cc -int parse_federation_file( const char* filename ); // static members - GHashTable* WebSim::confederates = - g_hash_table_new( g_str_hash, g_str_equal ); - -GHashTable* WebSim::puppets = - g_hash_table_new( g_str_hash, g_str_equal ); - const unsigned short WebSim::DEFAULT_PORT = 8000; - const std::string WebSim::package = "WebSim"; const std::string WebSim::version = "0.1"; -// WebSim::WebSim( const char* filename ) -// { -// std::cout << package << ' ' << version << std::endl; -// parse_federation_file( filename ); -// std::cout << package << " ready." << std::endl; -// } - -void WebSim::Init( const char* filename ) +WebSim::WebSim( const char* filename ) : + confederates( g_hash_table_new( g_str_hash, g_str_equal ) ), + puppets( g_hash_table_new( g_str_hash, g_str_equal ) ) { std::cout << package << ' ' << version << std::endl; - event_init(); // libevent startup - parse_federation_file( filename ); - + + Parser p( this, filename ); + std::cout << package << " ready." << std::endl; } @@ -42,25 +28,36 @@ arg ); } -void WebSim::ForEachPuppet( void(*cb)(const char*, Puppet*, void*), void* arg ) +void WebSim::ForEachPuppet( void(*cb)(const char*, WebSim::Puppet*, void*), void* arg ) { g_hash_table_foreach( WebSim::puppets, (GHFunc)cb, arg ); } - -Puppet* WebSim::GetPuppet( const char* name ) +WebSim::Puppet* WebSim::GetPuppet( const char* name ) { return( (Puppet*)g_hash_table_lookup( WebSim::puppets, name ) ); } -Confederate* WebSim::GetConfederate( const char* name ) +WebSim::Confederate* WebSim::GetConfederate( const char* name ) { return( (Confederate*)g_hash_table_lookup( WebSim::confederates, name ) ); } void WebSim::Update() { - event_loop( EVLOOP_ONCE ); + //event_loop( EVLOOP_ONCE ); } + + +void WebSim::Push( const char* name, Pose p, Velocity v, Acceleration a ) +{ + Puppet* pup = GetPuppet( name ); + + if( pup ) + pup->Push( p, v, a ); + else + printf( "websim warning: failed to push state for non-existent model \"%s\"\n", + name ); +} Modified: code/branches/federation/stage/examples/gzfed/websim.hh =================================================================== --- code/branches/federation/stage/examples/gzfed/websim.hh 2009-03-10 02:28:14 UTC (rev 7419) +++ code/branches/federation/stage/examples/gzfed/websim.hh 2009-03-10 03:07:02 UTC (rev 7420) @@ -1,5 +1,6 @@ #include <sys/types.h> #include <sys/queue.h> +#include <yaml.h> #include <event.h> // libevent #include <evhttp.h> // libevent's http tools @@ -7,140 +8,171 @@ #include <glib.h> -class Pose +#define MODELNAMEMAX 512 + +// forward decl. + +class WebSim { -public: - double x,y,z,r,p,a; +public: + class Pose + { + public: + double x,y,z,r,p,a; + + Pose() : + x(0), y(0), z(0), a(0) + {} + + Pose( double x, double y, double z, + double r, double p, double a ) : + x(x), y(y), z(z), a(a) + {} + }; - Pose() : - x(0), y(0), z(0), a(0) + class Velocity : public Pose { - // nothing to do - } + public: + Velocity() : Pose() + {} + + Velocity( double x, double y, double z, + double r, double p, double a ) : + Pose( x, y, z, r, p, a ) + {} + }; - Pose( double x, double y, double z, - double r, double p, double a ) : - x(x), y(y), z(z), a(a) + class Acceleration : public Pose { - // nothing to do - } + public: + Acceleration() : Pose() + {} + + Acceleration( double x, double y, double z, + double r, double p, double a ) : + Pose( x, y, z, r, p, a ) + {} + }; -}; +private: -class Velocity : public Pose -{ -public: - Velocity() : Pose() - {} + // forward decare + class Confederate; - Velocity( double x, double y, double z, - double r, double p, double a ) : - Pose( x, y, z, r, p, a ) - {} -}; + // manage an object we control on some federated simulators + class Puppet + { + private: + WebSim* ws; -class Acceleration : public Pose -{ -public: - Acceleration() : Pose() - {} + public: + Puppet( WebSim* ws, const char* name ); - Acceleration( double x, double y, double z, - double r, double p, double a ) : - Pose( x, y, z, r, p, a ) - {} -}; + // unique ID used as a system-widel handle for this puppet, used as + // hash table key + const char* name; + + bool created; + + // the remote servers that are hosting an instance of this puppet + GList* confederates; + + // sends the current physical state of the puppet to all + // confederates + void Push( Pose p, Velocity v, Acceleration a ); + + // create an instance of the puppet on this confederate, using the + // named puppet prototype (defined locally at the conferderate) + void AddConfederate( Confederate* conf, + const char* prototype ); + }; + + // manage a federated simulator + class Confederate + { + private: + // connection to a remote http simulation server + struct evhttp_connection* http_con; + struct evhttp_request* http_req; + + static void PuppetCreationCallback( evhttp_request* req, void* arg ); + + WebSim* ws; + public: + Confederate( WebSim* ws, const char* host, unsigned short port ); + ~Confederate(); + + void AddPuppet( Puppet* puppet, + const char* prototype ); + + int Push( const char* name, Pose p, Velocity v, Acceleration a ); -// forward decl. -class Confederate; - -// manage an object we control on some federated simulators -class Puppet -{ -public: - Puppet( const char* name ); + int RunStep(); + + // list of pointers to Puppet objects that are hosted on this + // connection - can iterate over these to update all puppets + GList* puppet_list; + + // unique ID for this confederate in format "hostname:port", used as + // hash table key + const char* name; + }; - // unique ID used as a system-widel handle for this puppet, used as - // hash table key - const char* name; - - Pose pose; - Velocity vel; - Acceleration acc; - - bool created; + class Parser + { + private: + yaml_event_t event; + yaml_parser_t parser; + WebSim* ws; + + void parse_failed( const char* message ); + yaml_event_t next_event( const char* msg ); + void expect( yaml_event_type_t event_type, const char* msg ); + bool test( yaml_event_type_t event_type, const char* msg ); + Confederate* GetConfederate( const char* host, unsigned short port ); + Confederate* GetConfederate( const char* hostandport ); + void parse_puppet_mapping( Puppet* pup ); + void parse_puppet_mapping_sequence( Puppet* pup ); + void parse_model_mapping( std::string host ); + void parse_model_mapping_sequence( std::string host ); + void parse_host_mapping(); + void parse_document(); + void parse_stream(); + + public: + Parser( WebSim* ws, const char* filename ); + }; - // the remote servers that are hosting an instance of this puppet - GList* confederates; - // sends the current physical state of the puppet to all - // confederates - void Push(); - - // create an instance of the puppet on this confederate, using the - // named puppet prototype (defined locally at the conferderate) - void AddConfederate( Confederate* conf, - const char* prototype ); -}; - -// manage a federated simulator -class Confederate -{ private: - // connection to a remote http simulation server - struct evhttp_connection* http_con; - struct evhttp_request* http_req; - - static void PuppetCreationCallback( evhttp_request* req, void* arg ); - - -public: - Confederate( const char* host, unsigned short port ); - ~Confederate(); + static const unsigned short DEFAULT_PORT; + static const std::string package; + static const std::string version; - void AddPuppet( Puppet* puppet, - const char* prototype ); + std::string hostname; - int Push( Puppet* puppet ); - int RunStep(); + GHashTable* puppets; + GHashTable* confederates; - // list of pointers to Puppet objects that are hosted on this - // connection - can iterate over these to update all puppets - GList* puppet_list; + /** Get a puppet by name */ + Puppet* GetPuppet( const char* name ); + + /** Get a confederate by name in format "host:port" */ + Confederate* GetConfederate( const char* name ); +public: + WebSim( const char* federation_filename ); - // unique ID for this confederate in format "hostname:port", used as - // hash table key - char name[512]; -}; - - -class WebSim -{ -public: - static const unsigned short DEFAULT_PORT; - static const std::string package; - static const std::string version; - static GHashTable* puppets; - static GHashTable* confederates; - - static void Init( const char* federation_filename ); - - //WebSim( const char* federation_filename ); - /** For each confederate, call the callback function */ - static void ForEachConfederate( void(*cb)(const char*, Confederate*, void*), void* arg ); - + void ForEachConfederate( void(*cb)(const char*, Confederate*, void*), void* arg ); + /** For each puppet, call the callback function */ - static void ForEachPuppet( void(*cb)(const char*, Puppet*, void*), void* arg ); + void ForEachPuppet( void(*cb)(const char*, Puppet*, void*), void* arg ); - /** Get a puppet by name */ - static Puppet* GetPuppet( const char* name ); + + void Push( const char* name, Pose p, Velocity v, Acceleration a ); - /** Get a confederate by name in format "host:port" */ - static Confederate* GetConfederate( const char* name ); - - static void Update(); + void Update(); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rt...@us...> - 2009-03-10 03:20:11
|
Revision: 7424 http://playerstage.svn.sourceforge.net/playerstage/?rev=7424&view=rev Author: rtv Date: 2009-03-10 03:19:57 +0000 (Tue, 10 Mar 2009) Log Message: ----------- creates multiple models ok Modified Paths: -------------- code/branches/federation/stage/examples/gzfed/confederate.cc code/branches/federation/stage/examples/gzfed/parser.cc Modified: code/branches/federation/stage/examples/gzfed/confederate.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/confederate.cc 2009-03-10 03:16:00 UTC (rev 7423) +++ code/branches/federation/stage/examples/gzfed/confederate.cc 2009-03-10 03:19:57 UTC (rev 7424) @@ -36,24 +36,24 @@ void WebSim::Confederate::PuppetCreationCallback( evhttp_request* req, void* arg ) { Puppet* pup = (Puppet*)arg; - printf( "response regarding puppet \"%s\"\n", pup->name ); - - printf( "code: %d\n", req->response_code ); - - printf( "response: %s\n", req->input_buffer->buffer ); - if( req->response_code == 200 ) pup->created = true; + else + { + printf( "bad response regarding puppet \"%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 ); + //printf( "Creating puppet \"%s\" on %s using prototype \"%s\"\n", + // puppet->name, + // name, + // prototype ); struct evhttp_request* er = evhttp_request_new( PuppetCreationCallback, puppet ); @@ -64,7 +64,7 @@ puppet->name, prototype ); - printf( "URI: %s\n", buf ); + printf( "Emitting: http://%s%s\n", name, buf ); int ret = evhttp_make_request( http_con, er, EVHTTP_REQ_GET, buf ); if( ret != 0 ) @@ -75,8 +75,8 @@ // a successful response sets puppet->created to true while( ! puppet->created ) - event_dispatch(); // loops until the request has completed - + event_loop( EVLOOP_NONBLOCK ); // loops until the request has completed + puppet_list = g_list_append( puppet_list, puppet ); } Modified: code/branches/federation/stage/examples/gzfed/parser.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/parser.cc 2009-03-10 03:16:00 UTC (rev 7423) +++ code/branches/federation/stage/examples/gzfed/parser.cc 2009-03-10 03:19:57 UTC (rev 7424) @@ -43,14 +43,6 @@ parse_failed( msg ); } -// bool test( yaml_event_type_t event_type, const char* msg ) -// { -// printf( "expecting %s\n", msg ); - -// return( next_event( "" ).type != event_type ); -// } - - WebSim::Confederate* WebSim::Parser::GetConfederate( const char* host, unsigned short port ) { char lookup[256]; @@ -74,9 +66,6 @@ // parse out port number from hostname sscanf( hostandport, "%s %u", &hostnoport, &port ); - //printf( " \"%s\" -> %s:%u\n", - // hostandport, hostnoport, port ); - return GetConfederate( hostnoport, port ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rt...@us...> - 2009-03-10 05:52:35
|
Revision: 7428 http://playerstage.svn.sourceforge.net/playerstage/?rev=7428&view=rev Author: rtv Date: 2009-03-10 05:52:20 +0000 (Tue, 10 Mar 2009) Log Message: ----------- functional client Modified Paths: -------------- code/branches/federation/stage/examples/gzfed/confederate.cc code/branches/federation/stage/examples/gzfed/main.cc code/branches/federation/stage/examples/gzfed/websim.hh Modified: code/branches/federation/stage/examples/gzfed/confederate.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/confederate.cc 2009-03-10 05:48:01 UTC (rev 7427) +++ code/branches/federation/stage/examples/gzfed/confederate.cc 2009-03-10 05:52:20 UTC (rev 7428) @@ -4,7 +4,8 @@ #include "websim.hh" WebSim::Confederate::Confederate( WebSim* ws, const char* host, unsigned short port ) : - puppet_list( NULL ) + 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", @@ -40,7 +41,7 @@ pup->created = true; else { - printf( "bad response regarding puppet \"%s\"\n", pup->name ); + 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 ); } @@ -81,11 +82,62 @@ 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() Modified: code/branches/federation/stage/examples/gzfed/main.cc =================================================================== --- code/branches/federation/stage/examples/gzfed/main.cc 2009-03-10 05:48:01 UTC (rev 7427) +++ code/branches/federation/stage/examples/gzfed/main.cc 2009-03-10 05:52:20 UTC (rev 7428) @@ -8,6 +8,10 @@ { WebSim ws( argv[1] );//, createcallback, stateupdatecallback ); + WebSim::Pose p( 0,0,0,0,0,0 ); + WebSim::Velocity v( 0,0,0,0,0,0 ); + WebSim::Acceleration a( 0,0,0,0,0,0 ); + while( 1 ) { @@ -20,9 +24,11 @@ //} //for each model - // ws.Push( "monkey", x,y,z ) - - //ws.Update(); + + sleep( 1 ); + + ws.Push( "monkey", p, v, a ); + ws.Update(); } return 0; Modified: code/branches/federation/stage/examples/gzfed/websim.hh =================================================================== --- code/branches/federation/stage/examples/gzfed/websim.hh 2009-03-10 05:48:01 UTC (rev 7427) +++ code/branches/federation/stage/examples/gzfed/websim.hh 2009-03-10 05:52:20 UTC (rev 7428) @@ -90,13 +90,23 @@ // manage a federated simulator class Confederate { + typedef struct + { + const char* name; + Confederate* conf; + } cb_chunk_t; + private: // connection to a remote http simulation server struct evhttp_connection* http_con; struct evhttp_request* http_req; static void PuppetCreationCallback( evhttp_request* req, void* arg ); - + static void PuppetPushCallback( evhttp_request* req, void* arg ); + + // counts the number of status messages sent and replies not yet received + unsigned int unacknowledged_pushes; + WebSim* ws; public: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |