From: Tim A. <ta...@en...> - 2004-05-19 05:28:54
|
Hi, I'm having a problem using my own driver. I've probably missed something quite obvious, but here's what's happening. I have a driver called "walker_player" (walker_player.cc) which is heavily based on the trogdor driver. I am building it as a shared object as per the player-mod example. The driver is being registered in walker_player.cc: ________________________________ void Walker_Register(DriverTable* table) { table->AddDriver("walker_player", PLAYER_ALL_MODE, Walker_Init); } ________________________________ I am making it without a problem: ________________________________ make g++ -Wall -g3 -I/home/tarney/player/player/server -c walker_player.cc g++ -shared -nostartfiles -o walker_player.so walker_player.o rm walker_player.o ________________________________ Then in my configuration file, walker.cfg, I tell the position device to use my driver: ________________________________ position (driver "walker_player") ________________________________ Then when I run player with the shared object and my config file it tells me that it can't find the driver: ________________________________ player -d ./walker_player.so walker.cfg ** Player v1.4rc2 ** Opening shared object ./walker_player.so...Success! [TCP] Parsing configuration file "walker.cfg"... loading driver "walker_player" as device "6665:position:0" player error : main.cc:parse_config_file(): Couldn't find driver "walker_player" ________________________________ Any help would be appreciated. Regards, Tim |
From: Brian G. <ge...@ro...> - 2004-05-19 05:33:55
|
On Wed, 19 May 2004, Tim Arney wrote: > I'm having a problem using my own driver. I've probably missed > something quite obvious, but here's what's happening. I have a driver > called "walker_player" (walker_player.cc) which is heavily based on the > trogdor driver. I am building it as a shared object as per the > player-mod example. > > The driver is being registered in walker_player.cc: > ________________________________ > > void Walker_Register(DriverTable* table) > { > table->AddDriver("walker_player", PLAYER_ALL_MODE, Walker_Init); > } > ________________________________ Are you calling Walker_Register() from _init()? The loader invokes _init() when it loads your shared object, to give you a chance to do anything that you need in order to initialize (e.g., register your driver with the server). -- Brian P. Gerkey ge...@ro... Stanford AI Lab http://ai.stanford.edu/~gerkey |
From: Tim A. <ta...@en...> - 2004-05-19 05:44:33
|
No I'm not calling Register() from Init(). I'm doing it pretty much exactly as your example driver does: _______ Snippet from walker_player.cc_____ CDevice* Walker_Init(char* interface, ConfigFile* cf, int section) { if(strcmp(interface, PLAYER_POSITION_STRING)) { PLAYER_ERROR1("driver \"walker_player\" does not support interface " "\"%s\"\n", interface); return(NULL); } else return((CDevice*)(new Walker(interface, cf, section))); } ____________________________________ Thanks for the speedy reply, Tim Brian Gerkey wrote: > On Wed, 19 May 2004, Tim Arney wrote: > > > I'm having a problem using my own driver. I've probably missed > > something quite obvious, but here's what's happening. I have a driver > > called "walker_player" (walker_player.cc) which is heavily based on the > > trogdor driver. I am building it as a shared object as per the > > player-mod example. > > > > The driver is being registered in walker_player.cc: > > ________________________________ > > > > void Walker_Register(DriverTable* table) > > { > > table->AddDriver("walker_player", PLAYER_ALL_MODE, Walker_Init); > > } > > ________________________________ > > Are you calling Walker_Register() from _init()? The loader invokes > _init() when it loads your shared object, to give you a chance to do > anything that you need in order to initialize (e.g., register your driver > with the server). > > -- > Brian P. Gerkey ge...@ro... > Stanford AI Lab http://ai.stanford.edu/~gerkey |
From: Richard V. <va...@cs...> - 2004-05-19 13:15:39
|
On May 18, 2004, at 10:57 PM, Tim Arney wrote: > No. Do I need to hard code it in the registry? > > Would I just have to do something like: > > #ifdef INCLUDE_WALKER > void Walker_Register(DriverTable* table); > #endif yep, and you need to call the function lower down in the same file. Look closely and you should see that's the case for everything in that file. > Then where do I define INCLUDE_WALKER? this comes from <player>/m4.d/drivertests.m4 you need to use the PLAYER_ADD_DRIVER macro to add your driver to the build system. You'll figure out the arguments. Yes, it's a lot of work to add a driver! We're thinking about how to improve this in the future. cheers, Richard. > > Richard Vaughan wrote: > >> Have you entered your device in server/deviceregistry.cc? >> >> On 18-May-04, at 10:44 PM, Tim Arney wrote: >> >>> No I'm not calling Register() from Init(). I'm doing it pretty much >>> exactly >>> as your example driver does: >>> >>> _______ Snippet from walker_player.cc_____ >>> >>> CDevice* Walker_Init(char* interface, ConfigFile* cf, int section) >>> { >>> if(strcmp(interface, PLAYER_POSITION_STRING)) >>> { >>> PLAYER_ERROR1("driver \"walker_player\" does not support >>> interface >>> " >>> "\"%s\"\n", interface); >>> return(NULL); >>> } >>> else >>> return((CDevice*)(new Walker(interface, cf, section))); >>> } >>> ____________________________________ >>> >>> Thanks for the speedy reply, >>> >>> Tim >>> >>> >>> Brian Gerkey wrote: >>> >>>> On Wed, 19 May 2004, Tim Arney wrote: >>>> >>>>> I'm having a problem using my own driver. I've probably missed >>>>> something quite obvious, but here's what's happening. I have a >>>>> driver >>>>> called "walker_player" (walker_player.cc) which is heavily based on >>>>> the >>>>> trogdor driver. I am building it as a shared object as per the >>>>> player-mod example. >>>>> >>>>> The driver is being registered in walker_player.cc: >>>>> ________________________________ >>>>> >>>>> void Walker_Register(DriverTable* table) >>>>> { >>>>> table->AddDriver("walker_player", PLAYER_ALL_MODE, Walker_Init); >>>>> } >>>>> ________________________________ >>>> >>>> Are you calling Walker_Register() from _init()? The loader invokes >>>> _init() when it loads your shared object, to give you a chance to do >>>> anything that you need in order to initialize (e.g., register your >>>> driver >>>> with the server). >>>> >>>> -- >>>> Brian P. Gerkey ge...@ro... >>>> Stanford AI Lab http://ai.stanford.edu/~gerkey >>> >>> >>> >>> >>> >>> ------------------------------------------------------- >>> This SF.Net email is sponsored by: SourceForge.net Broadband >>> Sign-up now for SourceForge Broadband and get the fastest >>> 6.0/768 connection for only $19.95/mo for the first 3 months! >>> http://ads.osdn.com/?ad_id=2562&alloc_id=6184&op=click >>> _______________________________________________ >>> Playerstage-developers mailing list >>> Pla...@li... >>> https://lists.sourceforge.net/lists/listinfo/playerstage-developers > > -- > Tim Arney > Centre of Excellence for Autonomous Systems > Faculty of Engineering > University of Technology, Sydney > Mail: PO Box 123, Broadway, NSW 2007, Australia > Phone: +61 2 9514 3140 > Email: ta...@en... > > > -- Richard Vaughan School of Computing Science / Simon Fraser University |
From: Brian G. <ge...@ro...> - 2004-05-19 15:55:50
|
On Tue, 18 May 2004, Richard Vaughan wrote: > On May 18, 2004, at 10:57 PM, Tim Arney wrote: > > > No. Do I need to hard code it in the registry? > > > > Would I just have to do something like: > > > > #ifdef INCLUDE_WALKER > > void Walker_Register(DriverTable* table); > > #endif > > yep, and you need to call the function lower down in the same file. > Look closely and you should see that's the case for everything in that > file. > > > Then where do I define INCLUDE_WALKER? > > this comes from <player>/m4.d/drivertests.m4 > > you need to use the PLAYER_ADD_DRIVER macro to add your driver to the > build system. You'll figure out the arguments. No, don't do any of this. You only need to do this if you're adding your driver directly into the Player source tree. If you instead use player-mod and build your driver as a shared object, you don't need to modify *anything* in the Player source, not even the device registry. The trick is to call your registration function, say Walker_Register(), from a specially named function, _init(), which you also define in your driver. The function _init(), if defined, will be called by the loader when it opens your shared object. So if you call Walker_Register() from _init(), your driver will be registered. The player-mod package includes of example of doing this, in exampledriver.cc, near the bottom of the file. As that example does, be sure to wrap your declaration of _init() (and _fini(), if you define it) in an 'extern "C" {}', to keep those symbols from being mangled by the C++ compiler. brian. -- Brian P. Gerkey ge...@ro... Stanford AI Lab http://ai.stanford.edu/~gerkey |