int input_event( const input_event_t *event ) { switch( event->type ) { case INPUT_EVENT_KEYPRESS: return keypress( &( event->types.key ) ); case INPUT_EVENT_KEYRELEASE: return keyrelease( &( event->types.key ) ); case INPUT_EVENT_JOYSTICK_PRESS: return do_joystick( &( event->types.joystick ), 1 ); case INPUT_EVENT_JOYSTICK_RELEASE: return do_joystick( &( event->types.joystick ), 0 ); } ui_error( UI_ERROR_ERROR, "unknown input event type %d", event->type ); return 1; }
static void process_remote(struct device_settings settings, const char *mac, int modes) { int br; bool msg = true; unsigned char buf[128]; int last_time_action = get_time(); while (!io_canceled()) { br = read(isk, buf, sizeof(buf)); if (msg) { syslog(LOG_INFO, "Connected 'PLAYSTATION(R)3 Remote (%s)'", mac); msg = false; } if (settings.timeout.enabled) { int current_time = get_time(); if (was_active()) { last_time_action = current_time; set_active(false); } else if (current_time-last_time_action >= settings.timeout.timeout) { syslog(LOG_INFO, "Remote was not in use, and timeout reached, disconneting..."); sig_term(0); break; } } if (br < 0) { break; } else if (br==13 && buf[0]==0xa1 && buf[1]==0x01) { //only continue if we've got a Remote if (settings.joystick.enabled) do_joystick(ufd->js, buf, settings.joystick); if (settings.remote.enabled) do_remote(ufd->mk, buf, modes); if (settings.input.enabled) do_input(ufd->mk, buf, settings.input); } else { if (debug) syslog(LOG_ERR, "Non-Remote packet received and ignored (0x%02x|0x%02x|0x%02x)", buf[0], buf[1], buf[2]); } } if (debug) syslog(LOG_ERR, "Read loop was broken on the Remote process"); }
int main(int argc, char **argv) { int i, fd, nr; unsigned char buf[128]; struct uinput_fd *ufd; struct device_settings settings; if (argc < 2) { std::cout << "Usage: " << argv[0] << " /dev/hidrawX" << std::endl; return 1; } if ((fd = open(argv[1], O_RDONLY)) < 0) { std::cerr << "sixad-raw::open(hidrawX) - failed to open hidraw device" << std::endl; return 1; } if ((nr=read(fd, buf, sizeof(buf))) < 0) { std::cerr << "sixad-raw::read(fd) - failed to read from device" << std::endl; return 1; } if (nr < 49 || nr > 50) { std::cerr << "sixad-raw::read(fd) - not a sixaxis (nr = " << nr << ")" << std::endl; return 1; } open_log("sixad-raw"); settings = init_values("hidraw"); // hidraw has no rumble/led support settings.remote.enabled = false; settings.led.enabled = false; settings.rumble.enabled = false; ufd = uinput_open(DEV_TYPE_SIXAXIS, "hidraw", settings); if (ufd->js < 0 || ufd->mk < 0) { return 1; } else if (ufd->js == 0 && ufd->mk == 0) { syslog(LOG_ERR, "sixaxis config has no joystick or input mode selected - please choose one!"); return 1; } bool msg = true; while (true) { nr=read(fd, buf, sizeof(buf)); if (nr < 49 || nr > 50) { std::cerr << "sixad-raw::read(fd, buf) - failed to read from device" << std::endl; break; } else if (nr == 49) { for (i=50; i>0; i--) { buf[i] = buf[i-1]; } } if (msg) { syslog(LOG_INFO, "Connected 'PLAYSTATION(R)3 Controller (hidraw)' [Battery %02X]", buf[31]); if (nr == 49) syslog(LOG_INFO, "Notice: non-standard Sixaxis buffer size (49)"); msg = false; } if (settings.joystick.enabled) do_joystick(ufd->js, buf, settings.joystick); if (settings.input.enabled) do_input(ufd->mk, buf, settings.input); } if (settings.joystick.enabled) { uinput_close(ufd->js, 0); } if (settings.input.enabled) { uinput_close(ufd->mk, 0); } std::cerr << "sixad-raw::read(buf) - connection has been broken" << std::endl; delete ufd; return 0; }