From 080541f30ec073a3396522500e2e4599f0ffe61f Mon Sep 17 00:00:00 2001 From: Ingo Ruhnke <grumbel@gmx.de> Date: Fri, 19 Jun 2009 01:54:53 +0200 Subject: [PATCH] More cleanup --- src/xboxdrv.cpp | 119 +++++++++++++++++++++++++----------------------- src/xboxdrv.hpp | 6 ++- 2 files changed, 68 insertions(+), 57 deletions(-) diff --git a/src/xboxdrv.cpp b/src/xboxdrv.cpp index 6e0647e..a47041b 100644 --- a/src/xboxdrv.cpp +++ b/src/xboxdrv.cpp @@ -30,6 +30,7 @@ #include <unistd.h> #include <iostream> #include <string.h> + #include "uinput.hpp" #include "xboxmsg.hpp" #include "xbox_controller.hpp" @@ -77,7 +78,7 @@ void set_rumble(XboxGenericController* controller, int gain, uint8_t lhs, uint8_ } void -Xboxdrv::list_controller() +Xboxdrv::run_list_controller() { usb_init(); usb_find_busses(); @@ -449,41 +450,40 @@ Xboxdrv::run_main(const CommandLineOptions& opts) if (!opts.quiet) print_info(dev, dev_type, opts); - XboxGenericController* controller = 0; + std::auto_ptr<XboxGenericController> controller; switch (dev_type.type) { case GAMEPAD_XBOX: case GAMEPAD_XBOX_MAT: - controller = new XboxController(dev); + controller = std::auto_ptr<XboxGenericController>(new XboxController(dev)); break; case GAMEPAD_XBOX360_GUITAR: - controller = new Xbox360Controller(dev, true); + controller = std::auto_ptr<XboxGenericController>(new Xbox360Controller(dev, true)); break; case GAMEPAD_XBOX360: - controller = new Xbox360Controller(dev, false); + controller = std::auto_ptr<XboxGenericController>(new Xbox360Controller(dev, false)); break; case GAMEPAD_XBOX360_WIRELESS: - controller = new Xbox360WirelessController(dev, opts.wireless_id); + controller = std::auto_ptr<XboxGenericController>(new Xbox360WirelessController(dev, opts.wireless_id)); break; case GAMEPAD_FIRESTORM: - controller = new FirestormDualController(dev); + controller = std::auto_ptr<XboxGenericController>(new FirestormDualController(dev)); break; default: assert(!"Unknown gamepad type"); } - global_controller = controller; + global_controller = controller.get(); int jsdev_number = find_jsdev_number(); int evdev_number = find_evdev_number(); - // FIXME: insert /dev/input/jsX detection magic here if (opts.led == -1) controller->set_led(2 + jsdev_number % 4); else @@ -500,13 +500,13 @@ Xboxdrv::run_main(const CommandLineOptions& opts) } else { - uInput* uinput = 0; + std::auto_ptr<uInput> uinput; if (!opts.no_uinput) { if (!opts.quiet) std::cout << "\nStarting with uinput... " << std::flush; - uinput = new uInput(dev_type, opts.uinput_config); - uinput->set_ff_callback(boost::bind(&set_rumble, controller, opts.rumble_gain, _1, _2)); + uinput = std::auto_ptr<uInput>(new uInput(dev_type, opts.uinput_config)); + uinput->set_ff_callback(boost::bind(&set_rumble, controller.get(), opts.rumble_gain, _1, _2)); if (!opts.quiet) std::cout << "done" << std::endl; } @@ -526,11 +526,8 @@ Xboxdrv::run_main(const CommandLineOptions& opts) } global_exit_xboxdrv = false; - controller_loop(dev_type.type, uinput, controller, opts); + controller_loop(dev_type.type, uinput.get(), controller.get(), opts); - delete controller; - delete uinput; - if (!opts.quiet) std::cout << "Shutdown complete" << std::endl; } @@ -622,6 +619,52 @@ Xboxdrv::print_info(struct usb_device* dev, std::cout << "ForceFeedback: " << ((opts.uinput_config.force_feedback) ? "enabled" : "disabled") << std::endl; } +void +Xboxdrv::run_list_supported_devices() +{ + for(int i = 0; i < xpad_devices_count; ++i) + { + std::cout << boost::format("%s 0x%04x 0x%04x %s\n") + % gamepadtype_to_string(xpad_devices[i].type) + % int(xpad_devices[i].idVendor) + % int(xpad_devices[i].idProduct) + % xpad_devices[i].name; + } +} + +void +Xboxdrv::run_help_devices() +{ + std::cout << " idVendor | idProduct | Name" << std::endl; + std::cout << "----------+-----------+---------------------------------" << std::endl; + for(int i = 0; i < xpad_devices_count; ++i) + { + std::cout << boost::format(" 0x%04x | 0x%04x | %s") + % int(xpad_devices[i].idVendor) + % int(xpad_devices[i].idProduct) + % xpad_devices[i].name + << std::endl; + } +} + +void +Xboxdrv::run_daemon(const CommandLineOptions& opts) +{ + pid_t pid = fork(); + + if (pid < 0) exit(EXIT_FAILURE); /* fork error */ + if (pid > 0) exit(EXIT_SUCCESS); /* parent exits */ + + pid_t sid = setsid(); + std::cout << "Sid: " << sid << std::endl; + if (chdir("/") != 0) + { + throw std::runtime_error(strerror(errno)); + } + + run_main(opts); +} + int Xboxdrv::main(int argc, char** argv) { @@ -636,31 +679,11 @@ Xboxdrv::main(int argc, char** argv) switch(opts.mode) { case CommandLineOptions::PRINT_HELP_DEVICES: - { - std::cout << " idVendor | idProduct | Name" << std::endl; - std::cout << "----------+-----------+---------------------------------" << std::endl; - for(int i = 0; i < xpad_devices_count; ++i) - { - std::cout << boost::format(" 0x%04x | 0x%04x | %s") - % int(xpad_devices[i].idVendor) - % int(xpad_devices[i].idProduct) - % xpad_devices[i].name - << std::endl; - } - } + run_help_devices(); break; case CommandLineOptions::RUN_LIST_SUPPORTED_DEVICES: - { - for(int i = 0; i < xpad_devices_count; ++i) - { - std::cout << boost::format("%s 0x%04x 0x%04x %s\n") - % gamepadtype_to_string(xpad_devices[i].type) - % int(xpad_devices[i].idVendor) - % int(xpad_devices[i].idProduct) - % xpad_devices[i].name; - } - } + run_list_supported_devices(); break; case CommandLineOptions::PRINT_VERSION: @@ -680,27 +703,11 @@ Xboxdrv::main(int argc, char** argv) break; case CommandLineOptions::RUN_DAEMON: - { - pid_t pid = fork(); - - if (pid < 0) exit(EXIT_FAILURE); /* fork error */ - if (pid > 0) exit(EXIT_SUCCESS); /* parent exits */ - - pid_t sid = setsid(); - std::cout << "Sid: " << sid << std::endl; - if (chdir("/") != 0) - { - throw std::runtime_error(strerror(errno)); - } - - run_main(opts); - } + run_daemon(opts); break; case CommandLineOptions::RUN_LIST_CONTROLLER: - { - list_controller(); - } + run_list_controller(); break; } } diff --git a/src/xboxdrv.hpp b/src/xboxdrv.hpp index 217ef9e..d232cb3 100644 --- a/src/xboxdrv.hpp +++ b/src/xboxdrv.hpp @@ -29,13 +29,17 @@ class Xboxdrv { private: void run_main(const CommandLineOptions& opts); + void run_daemon(const CommandLineOptions& opts); + void run_list_supported_devices(); + void run_help_devices(); + void run_list_controller(); + void print_info(struct usb_device* dev, const XPadDevice& dev_type, const CommandLineOptions& opts) const; void controller_loop(GamepadType type, uInput* uinput, XboxGenericController* controller, const CommandLineOptions& opts); - void list_controller(); bool find_controller_by_path(const char* busid, const char* devid,struct usb_device** xbox_device) const; void find_controller(struct usb_device*& dev,