Added timeout to ::read()

This commit is contained in:
Ingo Ruhnke 2008-12-26 00:06:02 +01:00
parent 18c8d03e57
commit 4c23a0e1dc
8 changed files with 38 additions and 17 deletions

View file

@ -16,6 +16,7 @@
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <errno.h>
#include <stdexcept>
#include <sstream>
#include <iostream>
@ -91,12 +92,16 @@ Xbox360Controller::set_led(uint8_t status)
}
bool
Xbox360Controller::read(XboxGenericMsg& msg, bool verbose)
Xbox360Controller::read(XboxGenericMsg& msg, bool verbose, int timeout)
{
uint8_t data[32];
int ret = usb_interrupt_read(handle, 1 /*EndPoint*/, (char*)data, sizeof(data), 0 /*Timeout*/);
int ret = usb_interrupt_read(handle, 1 /*EndPoint*/, (char*)data, sizeof(data), timeout);
if (ret < 0)
if (ret == -ETIMEDOUT)
{
return false;
}
else if (ret < 0)
{ // Error
std::ostringstream str;
str << "USBError: " << ret << "\n" << usb_strerror();

View file

@ -40,7 +40,7 @@ public:
void set_rumble(uint8_t left, uint8_t right);
void set_led(uint8_t status);
void send_raw(char* buffer, int len);
bool read(XboxGenericMsg& msg, bool verbose);
bool read(XboxGenericMsg& msg, bool verbose, int timeout);
private:
Xbox360Controller (const Xbox360Controller&);

View file

@ -76,12 +76,16 @@ Xbox360WirelessController::set_led(uint8_t status)
}
bool
Xbox360WirelessController::read(XboxGenericMsg& msg, bool verbose)
Xbox360WirelessController::read(XboxGenericMsg& msg, bool verbose, int timeout)
{
uint8_t data[32];
int ret = usb_interrupt_read(handle, endpoint, (char*)data, sizeof(data), 0 /*Timeout*/);
if (ret < 0)
int ret = usb_interrupt_read(handle, endpoint, (char*)data, sizeof(data), timeout);
if (ret == -ETIMEDOUT)
{
return false;
}
else if (ret < 0)
{ // Error
std::ostringstream str;
str << "USBError: " << ret << "\n" << usb_strerror();

View file

@ -41,7 +41,7 @@ public:
void set_rumble(uint8_t left, uint8_t right);
void set_led(uint8_t status);
bool read(XboxGenericMsg& msg, bool verbose);
bool read(XboxGenericMsg& msg, bool verbose, int timeout);
uint8_t get_battery_status() const;
private:
Xbox360WirelessController (const Xbox360WirelessController&);

View file

@ -16,6 +16,7 @@
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <errno.h>
#include <stdexcept>
#include <sstream>
#include "xboxmsg.hpp"
@ -58,13 +59,17 @@ XboxController::set_led(uint8_t status)
}
bool
XboxController::read(XboxGenericMsg& msg, bool verbose)
XboxController::read(XboxGenericMsg& msg, bool verbose, int timeout)
{
// FIXME: Add tracking for duplicate data packages (send by logitech controller)
uint8_t data[32];
int ret = usb_interrupt_read(handle, 1 /*EndPoint*/, (char*)data, sizeof(data), 0 /*Timeout*/);
if (ret < 0)
int ret = usb_interrupt_read(handle, 1 /*EndPoint*/, (char*)data, sizeof(data), timeout);
if (ret == -ETIMEDOUT)
{
return false;
}
else if (ret < 0)
{ // Error
std::ostringstream str;
str << "USBError: " << ret << "\n" << usb_strerror();

View file

@ -37,7 +37,7 @@ public:
void set_rumble(uint8_t left, uint8_t right);
void set_led(uint8_t status);
bool read(XboxGenericMsg& msg, bool verbose);
bool read(XboxGenericMsg& msg, bool verbose, int timeout);
private:
XboxController (const XboxController&);

View file

@ -30,7 +30,9 @@ public:
virtual void set_rumble(uint8_t left, uint8_t right) =0;
virtual void set_led(uint8_t status) =0;
virtual void send_raw(char* buffer, int len) {}
virtual bool read(XboxGenericMsg& msg, bool verbose) =0;
/** @param timeout timeout in msec, 0 means forever */
virtual bool read(XboxGenericMsg& msg, bool verbose, int timeout) =0;
private:
XboxGenericController (const XboxGenericController&);

View file

@ -851,15 +851,17 @@ void squarify_axis_(int16_t& x_inout, int16_t& y_inout)
{
if (x_inout != 0 || y_inout != 0)
{
// Convert values to float
float x = (x_inout < 0) ? x_inout / 32768.0f : x_inout / 32767.0f;
float y = (y_inout < 0) ? y_inout / 32768.0f : y_inout / 32767.0f;
// Transform values to square range
float l = sqrtf(x*x + y*y);
float v = fabs((fabsf(x) > fabsf(y)) ? l/x : l/y);
x *= v;
y *= v;
// Convert values to int16_t
x_inout = static_cast<int16_t>(Math::clamp(-32768, static_cast<int>((x < 0) ? x * 32768 : x * 32767), 32767));
y_inout = static_cast<int16_t>(Math::clamp(-32768, static_cast<int>((y < 0) ? y * 32768 : y * 32767), 32767));
}
@ -934,13 +936,16 @@ void apply_deadzone(XboxGenericMsg& msg, int deadzone)
void controller_loop(uInput* uinput, XboxGenericController* controller, CommandLineOptions& opts)
{
int timeout = 0; // 0 == no timeout
XboxGenericMsg oldmsg;
memset(&oldmsg, 0, sizeof(oldmsg));
while(!global_exit_xboxdrv)
{
XboxGenericMsg msg;
if (controller->read(msg, opts.verbose))
if (controller->read(msg, opts.verbose, timeout))
{
apply_deadzone(msg, opts.deadzone);