From: <bla...@us...> - 2009-08-06 18:18:32
|
Revision: 20914 http://personalrobots.svn.sourceforge.net/personalrobots/?rev=20914&view=rev Author: blaisegassend Date: 2009-08-06 18:18:14 +0000 (Thu, 06 Aug 2009) Log Message: ----------- Added pairing tools and instructions Modified Paths: -------------- pkg/trunk/stacks/joystick_drivers/ps3joy/CMakeLists.txt Added Paths: ----------- pkg/trunk/stacks/joystick_drivers/ps3joy/README pkg/trunk/stacks/joystick_drivers/ps3joy/sixpair.c Modified: pkg/trunk/stacks/joystick_drivers/ps3joy/CMakeLists.txt =================================================================== --- pkg/trunk/stacks/joystick_drivers/ps3joy/CMakeLists.txt 2009-08-06 18:16:23 UTC (rev 20913) +++ pkg/trunk/stacks/joystick_drivers/ps3joy/CMakeLists.txt 2009-08-06 18:18:14 UTC (rev 20914) @@ -21,10 +21,12 @@ #uncomment if you have defined services #gensrv() +rospack_add_executable(sixpair sixpair.c) +target_link_libraries(sixpair -lusb) + #common commands for building c++ executables and libraries #rospack_add_library(${PROJECT_NAME} src/example.cpp) #target_link_libraries(${PROJECT_NAME} another_library) #rospack_add_boost_directories() #rospack_link_boost(${PROJECT_NAME} thread) #rospack_add_executable(example examples/example.cpp) -#target_link_libraries(example ${PROJECT_NAME}) Added: pkg/trunk/stacks/joystick_drivers/ps3joy/README =================================================================== --- pkg/trunk/stacks/joystick_drivers/ps3joy/README (rev 0) +++ pkg/trunk/stacks/joystick_drivers/ps3joy/README 2009-08-06 18:18:14 UTC (rev 20914) @@ -0,0 +1,46 @@ +Packages that need to be installed +---------------------------------- +joystick +libusb-dev + +Pairing instructions +-------------------- + +1) If you can connect the joystick and the bluetooth dongle into the same +computer. + +Connect the joystick to the computer using a USB cable. + +Load the bluetooth dongle's MAC address into the ps3 joystick using: + +sudo bash +rosrun ps3joy sixpair + +2) If you cannot connect the joystick to the same computer as the dongle. + +Find out the bluetooth dongle's MAC address by running (on the computer +that has the bluetooth dongle): + +hciconfig + +If this does not work, you may need to do +sudo hciconfig hci0 up +and retry +hciconfig + +Plug the PS3 joystick into some other computer using a USB cable. + +Replace the joystick's mac address in the following command: +sudo rosrun ps3joy sixpair 01:23:45:67:89:ab + +Starting the PS3 joystick +------------------------- + +rosrun ps3joy ps3joy.py + +This should make a joystick appear at /dev/input/js? + +You can check that it is working with +jstest /dev/input/js? +(replace ? with the name of your joystick) + Added: pkg/trunk/stacks/joystick_drivers/ps3joy/sixpair.c =================================================================== --- pkg/trunk/stacks/joystick_drivers/ps3joy/sixpair.c (rev 0) +++ pkg/trunk/stacks/joystick_drivers/ps3joy/sixpair.c 2009-08-06 18:18:14 UTC (rev 20914) @@ -0,0 +1,122 @@ +/* + * sixpair.c version 2007-04-18 + * Compile with: gcc -o sixpair sixpair.c -lusb + */ + +#include <string.h> +#include <unistd.h> +#include <stdio.h> +#include <usb.h> + +#define VENDOR 0x054c +#define PRODUCT 0x0268 + +#define USB_DIR_IN 0x80 +#define USB_DIR_OUT 0 + +void fatal(char *msg) { perror(msg); exit(1); } + +void show_master(usb_dev_handle *devh, int itfnum) { + printf("Current Bluetooth master: "); + unsigned char msg[8]; + int res = usb_control_msg + (devh, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0x01, 0x03f5, itfnum, (void*)msg, sizeof(msg), 5000); + if ( res < 0 ) { perror("USB_REQ_GET_CONFIGURATION"); return; } + printf("%02x:%02x:%02x:%02x:%02x:%02x\n", + msg[2], msg[3], msg[4], msg[5], msg[6], msg[7]); +} + +void set_master(usb_dev_handle *devh, int itfnum, int mac[6]) { + printf("Setting master bd_addr to %02x:%02x:%02x:%02x:%02x:%02x\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + char msg[8]= { 0x01, 0x00, mac[0],mac[1],mac[2],mac[3],mac[4],mac[5] }; + int res = usb_control_msg + (devh, + USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0x09, + 0x03f5, itfnum, msg, sizeof(msg), + 5000); + if ( res < 0 ) fatal("USB_REQ_SET_CONFIGURATION"); +} + +void process_device(int argc, char **argv, struct usb_device *dev, + struct usb_config_descriptor *cfg, int itfnum) { + int mac[6], have_mac=0; + + usb_dev_handle *devh = usb_open(dev); + if ( ! devh ) fatal("usb_open"); + + usb_detach_kernel_driver_np(devh, itfnum); + + int res = usb_claim_interface(devh, itfnum); + if ( res < 0 ) fatal("usb_claim_interface"); + + show_master(devh, itfnum); + + if ( argc >= 2 ) { + if ( sscanf(argv[1], "%x:%x:%x:%x:%x:%x", + &mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]) != 6 ) { + + printf("usage: %s [<bd_addr of master>]\n", argv[0]); + exit(1); + } + } else { + FILE *f = popen("hcitool dev", "r"); + if ( !f || + fscanf(f, "%*s\n%*s %x:%x:%x:%x:%x:%x", + &mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]) != 6 ) { + printf("Unable to retrieve local bd_addr from `hcitool dev`.\n"); + printf("Please enable Bluetooth or specify an address manually.\n"); + exit(1); + } + pclose(f); + } + + set_master(devh, itfnum, mac); + + usb_close(devh); +} + +int main(int argc, char *argv[]) { + + usb_init(); + if ( usb_find_busses() < 0 ) fatal("usb_find_busses"); + if ( usb_find_devices() < 0 ) fatal("usb_find_devices"); + struct usb_bus *busses = usb_get_busses(); + if ( ! busses ) fatal("usb_get_busses"); + + int found = 0; + + struct usb_bus *bus; + for ( bus=busses; bus; bus=bus->next ) { + struct usb_device *dev; + for ( dev=bus->devices; dev; dev=dev->next) { + struct usb_config_descriptor *cfg; + for ( cfg = dev->config; + cfg < dev->config + dev->descriptor.bNumConfigurations; + ++cfg ) { + int itfnum; + for ( itfnum=0; itfnum<cfg->bNumInterfaces; ++itfnum ) { + struct usb_interface *itf = &cfg->interface[itfnum]; + struct usb_interface_descriptor *alt; + for ( alt = itf->altsetting; + alt < itf->altsetting + itf->num_altsetting; + ++alt ) { + if ( dev->descriptor.idVendor == VENDOR && + dev->descriptor.idProduct == PRODUCT && + alt->bInterfaceClass == 3 ) { + process_device(argc, argv, dev, cfg, itfnum); + ++found; + } + } + } + } + } + } + + if ( ! found ) printf("No controller found on USB busses.\n"); + return 0; + +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |