+ if( dev_index < 0 ) return;
+ const char *dev_name = shuttle_devs[dev_index].path;
+
+#ifdef HAVE_SHUTTLE_USB
+ if( usb_direct )
+ usb_probe(dev_index);
+
+ disable_cancel();
+ while( devsh && !done ) {
+ int len = 0;
+ static const int IN_ENDPOINT = 0x81;
+ unsigned char dat[5];
+ int ret = libusb_interrupt_transfer(devsh,
+ IN_ENDPOINT, dat, sizeof(dat), &len, 100);
+ if( ret != 0 ) {
+ if( ret == LIBUSB_ERROR_TIMEOUT ) continue;
+ printf("shuttle: %s\n %s\n",
+ dev_name, libusb_strerror((libusb_error)ret));
+ sleep(1); continue;
+ }
+ if( load_translation() ) break;
+ if( debug ) {
+ printf("shuttle: ");
+ for( int i=0; i<len; ++i ) printf(" %02x", dat[i]);
+ printf("\n");
+ }
+ if( last_shuttle != dat[0] )
+ shuttle((char)(last_shuttle = dat[0]));
+
+ if( last_jog != dat[1] )
+ jog(last_jog = dat[1]);
+
+ unsigned btns = (dat[4]<<8) | dat[3];
+ unsigned dif = last_btns ^ btns;
+ if( dif ) {
+ last_btns = btns;
+ for( int i=0; i<15; ++i ) {
+ unsigned msk = 1 << i;
+ if( !(dif & msk) ) continue;
+ key(i+EVENT_CODE_KEY1, btns & msk ? 1 : 0);
+ }
+ }
+ }
+ usb_done();
+#endif
+ usb_direct = 0;
+ enable_cancel();
+
+ for( ; !done; sleep(1) ) {