From 92939b1ff61c4f3675db5d223b77a59599e6f242 Mon Sep 17 00:00:00 2001 From: WenZheng Li Date: Fri, 15 Jun 2018 17:56:43 +0900 Subject: added TR1 device for vive tracker(2018) --- src/survive_default_devices.c | 4 +++ src/survive_default_devices.h | 2 ++ src/survive_vive.c | 68 ++++++++++++++++++++++++++++++------------- 3 files changed, 54 insertions(+), 20 deletions(-) diff --git a/src/survive_default_devices.c b/src/survive_default_devices.c index 05dd10d..48f3b41 100644 --- a/src/survive_default_devices.c +++ b/src/survive_default_devices.c @@ -40,6 +40,10 @@ SurviveObject *survive_create_tr0(SurviveContext *ctx, const char *driver_name, void *driver) { return survive_create_device(ctx, driver_name, driver, "TR0", 0); } +SurviveObject *survive_create_tr1(SurviveContext *ctx, const char *driver_name, + void *driver) { + return survive_create_device(ctx, driver_name, driver, "TR1", 0); +} SurviveObject *survive_create_ww0(SurviveContext *ctx, const char *driver_name, void *driver) { return survive_create_device(ctx, driver_name, driver, "WW0", 0); diff --git a/src/survive_default_devices.h b/src/survive_default_devices.h index de7f0d4..2af6280 100644 --- a/src/survive_default_devices.h +++ b/src/survive_default_devices.h @@ -11,6 +11,8 @@ SurviveObject *survive_create_wm1(SurviveContext *ctx, const char *driver_name, void *driver, haptic_func cb); SurviveObject *survive_create_tr0(SurviveContext *ctx, const char *driver_name, void *driver); +SurviveObject *survive_create_tr1(SurviveContext *ctx, const char *driver_name, + void *driver); SurviveObject *survive_create_ww0(SurviveContext *ctx, const char *driver_name, void *driver); diff --git a/src/survive_vive.c b/src/survive_vive.c index ef94677..87ec1fe 100755 --- a/src/survive_vive.c +++ b/src/survive_vive.c @@ -58,7 +58,7 @@ const short vidpids[] = { 0x28de, 0x2000, 2, //Valve HMD lighthouse(B) (only used on HIDAPI, for lightcap) 0x28de, 0x2022, 2, //HTC Tracker (only used on HIDAPI, for lightcap) - 0x28de, 0x2300, 2, //HTC Tracker (only used on HIDAPI, for lightcap) + 0x28de, 0x2300, 2, //HTC Tracker 2018 (only used on HIDAPI, for lightcap) 0x28de, 0x2012, 2, //Valve Watchman, USB connected (only used on HIDAPI, for lightcap) #endif @@ -70,64 +70,64 @@ const char * devnames[] = { "Watchman 1", "Watchman 2", "Tracker 0", - "Tracker(2018) 0", + "Tracker 1", "Wired Watchman 1", #ifdef HIDAPI "HMD Lightcap", "Tracker 0 Lightcap", - "Tracker(2018) 0 Lightcap", + "Tracker 1 Lightcap", "Wired Watchman 1 Lightcap", "HMD Buttons", "Tracker 0 Buttons", - "Tracker(2018) Buttons", + "Tracker 1 Buttons", "Wired Watchman 1 Buttons", #endif }; //length MAX_USB_INTERFACES enum { - USB_DEV_HMD = 0, + USB_DEV_HMD = 0, USB_DEV_HMD_IMU_LH, USB_DEV_WATCHMAN1, USB_DEV_WATCHMAN2, USB_DEV_TRACKER0, - USB_DEV_TRACKER0_2018, + USB_DEV_TRACKER1, USB_DEV_W_WATCHMAN1, // Wired Watchman attached via USB #ifdef HIDAPI USB_DEV_HMD_IMU_LHB, USB_DEV_TRACKER0_LIGHTCAP, - USB_DEV_TRACKER0_2018_LIGHTCAP, + USB_DEV_TRACKER1_LIGHTCAP, USB_DEV_W_WATCHMAN1_LIGHTCAP, USB_DEV_HMD_BUTTONS, USB_DEV_TRACKER0_BUTTONS, - USB_DEV_TRACKER0_2018_BUTTONS, + USB_DEV_TRACKER1_BUTTONS, USB_DEV_W_WATCHMAN1_BUTTONS, #endif MAX_USB_DEVS -} +}; enum { - USB_IF_HMD = 0 + USB_IF_HMD = 0, USB_IF_HMD_IMU_LH, USB_IF_WATCHMAN1, USB_IF_WATCHMAN2, USB_IF_TRACKER0, - USB_IF_TRACKER0_2018, + USB_IF_TRACKER1, USB_IF_W_WATCHMAN1, USB_IF_LIGHTCAP, USB_IF_TRACKER0_LIGHTCAP, - USB_IF_TRACKER0_2018_LIGHTCAP, + USB_IF_TRACKER1_LIGHTCAP, USB_IF_W_WATCHMAN1_LIGHTCAP, USB_IF_HMD_BUTTONS, - USB_IF_TRACKER0_BUTTON, - USB_IF_TRACKER0_2018_BUTTON, + USB_IF_TRACKER0_BUTTONS, + USB_IF_TRACKER1_BUTTONS, USB_IF_W_WATCHMAN1_BUTTONS, MAX_INTERFACES -} +}; typedef struct SurviveUSBInterface SurviveUSBInterface; typedef struct SurviveViveData SurviveViveData; @@ -182,7 +182,7 @@ void survive_data_cb( SurviveUSBInterface * si ); //USB Subsystem void survive_usb_close( SurviveContext * t ); -int survive_usb_init( SurviveViveData * sv, SurviveObject * hmd, SurviveObject *wm0, SurviveObject * wm1, SurviveObject * tr0 , SurviveObject * ww0 ); +int survive_usb_init( SurviveViveData * sv, SurviveObject * hmd, SurviveObject *wm0, SurviveObject * wm1, SurviveObject * tr0 , SurviveObject * tr1, SurviveObject * ww0 ); int survive_usb_poll( SurviveContext * ctx ); int survive_get_config( char ** config, SurviveViveData * ctx, int devno, int iface, int send_extra_magic ); int survive_vive_send_magic(SurviveContext * ctx, void * drv, int magic_code, void * data, int datalen ); @@ -349,7 +349,7 @@ static inline int hid_get_feature_report_timeout(USBHANDLE device, uint16_t ifac return -1; } -int survive_usb_init( SurviveViveData * sv, SurviveObject * hmd, SurviveObject *wm0, SurviveObject * wm1, SurviveObject * tr0 , SurviveObject * ww0 ) +int survive_usb_init( SurviveViveData * sv, SurviveObject * hmd, SurviveObject *wm0, SurviveObject * wm1, SurviveObject * tr0, SurviveObject * tr1, SurviveObject * ww0 ) { SurviveContext * ctx = sv->ctx; #ifdef HIDAPI @@ -517,6 +517,7 @@ int survive_usb_init( SurviveViveData * sv, SurviveObject * hmd, SurviveObject * if( sv->udev[USB_DEV_WATCHMAN1] ) { survive_add_object( ctx, wm0 ); } if( sv->udev[USB_DEV_WATCHMAN2] ) { survive_add_object( ctx, wm1 ); } if( sv->udev[USB_DEV_TRACKER0] ) { survive_add_object( ctx, tr0 ); } + if( sv->udev[USB_DEV_TRACKER1] ) { survive_add_object( ctx, tr1 ); } if( sv->udev[USB_DEV_W_WATCHMAN1] ) { survive_add_object( ctx, ww0 ); } if( sv->udev[USB_DEV_HMD] && AttachInterface( sv, hmd, USB_IF_HMD, sv->udev[USB_DEV_HMD], 0x81, survive_data_cb, "Mainboard" ) ) { return -6; } @@ -524,6 +525,7 @@ int survive_usb_init( SurviveViveData * sv, SurviveObject * hmd, SurviveObject * if( sv->udev[USB_DEV_WATCHMAN1] && AttachInterface( sv, wm0, USB_IF_WATCHMAN1, sv->udev[USB_DEV_WATCHMAN1], 0x81, survive_data_cb, "Watchman 1" ) ) { return -8; } if( sv->udev[USB_DEV_WATCHMAN2] && AttachInterface( sv, wm1, USB_IF_WATCHMAN2, sv->udev[USB_DEV_WATCHMAN2], 0x81, survive_data_cb, "Watchman 2")) { return -9; } if( sv->udev[USB_DEV_TRACKER0] && AttachInterface( sv, tr0, USB_IF_TRACKER0, sv->udev[USB_DEV_TRACKER0], 0x81, survive_data_cb, "Tracker 1")) { return -10; } + if( sv->udev[USB_DEV_TRACKER1] && AttachInterface( sv, tr0, USB_IF_TRACKER1, sv->udev[USB_DEV_TRACKER1], 0x81, survive_data_cb, "Tracker 2")) { return -10; } if( sv->udev[USB_DEV_W_WATCHMAN1] && AttachInterface( sv, ww0, USB_IF_W_WATCHMAN1, sv->udev[USB_DEV_W_WATCHMAN1], 0x81, survive_data_cb, "Wired Watchman 1")) { return -11; } #ifdef HIDAPI //Tricky: use other interface for actual lightcap. XXX THIS IS NOT YET RIGHT!!! @@ -531,7 +533,9 @@ int survive_usb_init( SurviveViveData * sv, SurviveObject * hmd, SurviveObject * // This is a HACK! But it works. Need to investigate further sv->uiface[USB_DEV_TRACKER0_LIGHTCAP].actual_len = 64; + sv->uiface[USB_DEV_TRACKER1_LIGHTCAP].actual_len = 64; if( sv->udev[USB_DEV_TRACKER0_LIGHTCAP] && AttachInterface( sv, tr0, USB_IF_TRACKER0_LIGHTCAP, sv->udev[USB_DEV_TRACKER0_LIGHTCAP], 0x82, survive_data_cb, "Tracker 1 Lightcap")) { return -13; } + if( sv->udev[USB_DEV_TRACKER1_LIGHTCAP] && AttachInterface( sv, tr0, USB_IF_TRACKER1_LIGHTCAP, sv->udev[USB_DEV_TRACKER1_LIGHTCAP], 0x82, survive_data_cb, "Tracker 2 Lightcap")) { return -13; } if( sv->udev[USB_DEV_W_WATCHMAN1_LIGHTCAP] && AttachInterface( sv, ww0, USB_IF_W_WATCHMAN1_LIGHTCAP, sv->udev[USB_DEV_W_WATCHMAN1_LIGHTCAP], 0x82, survive_data_cb, "Wired Watchman 1 Lightcap")) { return -13; } @@ -542,6 +546,7 @@ int survive_usb_init( SurviveViveData * sv, SurviveObject * hmd, SurviveObject * #else if( sv->udev[USB_DEV_HMD_IMU_LH] && AttachInterface( sv, hmd, USB_IF_LIGHTCAP, sv->udev[USB_DEV_HMD_IMU_LH], 0x82, survive_data_cb, "Lightcap")) { return -12; } if( sv->udev[USB_DEV_TRACKER0] && AttachInterface( sv, tr0, USB_IF_TRACKER0_LIGHTCAP, sv->udev[USB_DEV_TRACKER0], 0x82, survive_data_cb, "Tracker 0 Lightcap")) { return -13; } + if( sv->udev[USB_DEV_TRACKER1] && AttachInterface( sv, tr0, USB_IF_TRACKER1_LIGHTCAP, sv->udev[USB_DEV_TRACKER1], 0x82, survive_data_cb, "Tracker 1 Lightcap")) { return -13; } if( sv->udev[USB_DEV_W_WATCHMAN1] && AttachInterface( sv, ww0, USB_IF_W_WATCHMAN1_LIGHTCAP, sv->udev[USB_DEV_W_WATCHMAN1], 0x82, survive_data_cb, "Wired Watchman 1 Lightcap")) { return -13; } #endif SV_INFO( "All enumerated devices attached." ); @@ -1529,8 +1534,7 @@ void survive_data_cb( SurviveUSBInterface * si ) break; } case USB_IF_LIGHTCAP: - case USB_IF_TRACKER0_LIGHTCAP: - case USB_IF_W_WATCHMAN1_LIGHTCAP: + case USB_IF_TRACKER1_LIGHTCAP: { int i; for( i = 0; i < 9; i++ ) @@ -1544,6 +1548,29 @@ void survive_data_cb( SurviveUSBInterface * si ) } break; } + case USB_IF_W_WATCHMAN1_LIGHTCAP: + case USB_IF_TRACKER0_LIGHTCAP: + { + int i=0; + for( i = 0; i < 7; i++ ) + { + unsigned short *sensorId = (unsigned short *)readdata; + unsigned short *length = (unsigned short *)(&(readdata[2])); + unsigned long *time = (unsigned long *)(&(readdata[4])); + LightcapElement le; + le.sensor_id = (uint8_t)POP2; + le.length = POP2; + le.timestamp = POP4; + if( le.sensor_id > 0xfd ) continue; // + handle_lightcap( obj, &le ); + } + break; + + if (id != 33) + { + int a = 0; // breakpoint here + } + } case USB_IF_TRACKER0_BUTTONS: case USB_IF_W_WATCHMAN1_BUTTONS: { @@ -1690,6 +1717,7 @@ int DriverRegHTCVive( SurviveContext * ctx ) SurviveObject * wm0 = survive_create_wm0(ctx, "HTC", sv, 0); SurviveObject * wm1 = survive_create_wm1(ctx, "HTC", sv, 0); SurviveObject * tr0 = survive_create_tr0(ctx, "HTC", sv); + SurviveObject * tr1 = survive_create_tr1(ctx, "HTC", sv); SurviveObject * ww0 = survive_create_ww0(ctx, "HTC", sv); sv->ctx = ctx; @@ -1703,7 +1731,7 @@ int DriverRegHTCVive( SurviveContext * ctx ) #endif //USB must happen last. - if (survive_usb_init(sv, hmd, wm0, wm1, tr0, ww0)) { + if (survive_usb_init(sv, hmd, wm0, wm1, tr0, tr1, ww0)) { // TODO: Cleanup any libUSB stuff sitting around. goto fail_gracefully; } -- cgit v1.2.3