From 2b93b2c57f8fea99ed9a5de520b274696e058faf Mon Sep 17 00:00:00 2001 From: cnlohr Date: Wed, 15 Mar 2017 21:32:09 -0400 Subject: fix puff for headset. --- src/survive_vive.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/survive_vive.c') diff --git a/src/survive_vive.c b/src/survive_vive.c index fc05647..12d8c16 100755 --- a/src/survive_vive.c +++ b/src/survive_vive.c @@ -711,7 +711,7 @@ int survive_get_config( char ** config, struct SurviveViveData * sv, int devno, int len = survive_simple_inflate( ctx, compressed_data, count, uncompressed_data, sizeof(uncompressed_data)-1 ); if( len <= 0 ) { - SV_INFO( "Error: data for config descriptor %d:%d is bad.", devno, iface ); + SV_INFO( "Error: data for config descriptor %d:%d is bad. (%d)", devno, iface, len ); return -5; } -- cgit v1.2.3 From 2eaf385fdd769c232be5826353fcf0dba13b827e Mon Sep 17 00:00:00 2001 From: CNLohr Date: Thu, 16 Mar 2017 01:57:36 -0400 Subject: Make the vive able to deal with data in new-valve-mode or old-valve-mode. --- src/survive_vive.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) (limited to 'src/survive_vive.c') diff --git a/src/survive_vive.c b/src/survive_vive.c index 12d8c16..c3967cd 100755 --- a/src/survive_vive.c +++ b/src/survive_vive.c @@ -1082,24 +1082,28 @@ void survive_data_cb( SurviveUSBInterface * si ) case USB_IF_LIGHTCAP: { int i; - #ifdef HIDAPI - for( i = 0; i < 7; i++ ) + + if( si->buffer[0] == 0x25 ) //Once the valve drivers run, they somehow put the HMD into 7-byte-width messages. { - LightcapElement le; - le.sensor_id = POP1; - le.type = 0xfe; - le.length = POP2; - le.timestamp = POP4; - if( le.sensor_id == 0xff ) break; - handle_lightcap( obj, &le ); - } - #else - for( i = 0; i < 7; i++ ) + for( i = 0; i < 9; i++ ) + { + LightcapElement le; + le.sensor_id = POP1; + le.type = 0xfe; + le.length = POP2; + le.timestamp = POP4; + if( le.sensor_id == 0xff ) break; + handle_lightcap( obj, &le ); + } + } + else //Otherwise, we're in the old mode. { - handle_lightcap( obj, (LightcapElement*)&readdata[i*8] ); + for( i = 0; i < 7; i++ ) + { + handle_lightcap( obj, (LightcapElement*)&readdata[i*8] ); + } + break; } - break; - #endif } } } -- cgit v1.2.3 From 23139f5a92d89be80b066e4dc71f27952bd284ca Mon Sep 17 00:00:00 2001 From: CNLohr Date: Thu, 16 Mar 2017 03:58:45 -0400 Subject: Fix lighthouse capture mechanism to match new valve. --- src/survive_vive.c | 69 ++++++++++++++---------------------------------------- 1 file changed, 17 insertions(+), 52 deletions(-) (limited to 'src/survive_vive.c') diff --git a/src/survive_vive.c b/src/survive_vive.c index c3967cd..99d69a3 100755 --- a/src/survive_vive.c +++ b/src/survive_vive.c @@ -480,36 +480,23 @@ int survive_vive_send_magic(struct SurviveContext * ctx, void * drv, int magic_c if( turnon ) { - //Magic from vl_magic.h, originally copywritten under LGPL. - // * Copyright (C) 2013 Fredrik Hultin - // * Copyright (C) 2013 Jakob Bornecrantz -#if 0 - static uint8_t vive_magic_power_on[] = { - 0x04, 0x78, 0x29, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, - 0xa8, 0x0d, 0x76, 0x00, 0x40, 0xfc, 0x01, 0x05, 0xfa, 0xec, 0xd1, 0x6d, 0x00, - 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x0d, 0x76, 0x00, 0x68, 0xfc, - 0x01, 0x05, 0x2c, 0xb0, 0x2e, 0x65, 0x7a, 0x0d, 0x76, 0x00, 0x68, 0x54, 0x72, - 0x00, 0x18, 0x54, 0x72, 0x00, 0x00, 0x6a, 0x72, 0x00, 0x00, 0x00, 0x00, - }; -#else //From actual steam. - static uint8_t vive_magic_power_on[64] = { 0x04, 0x78, 0x29, 0x38, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -#endif if (sv->udev[USB_DEV_HMD]) { + static uint8_t vive_magic_power_on[64] = { 0x04, 0x78, 0x29, 0x38 }; r = update_feature_report( sv->udev[USB_DEV_HMD], 0, vive_magic_power_on, sizeof( vive_magic_power_on ) ); if( r != sizeof( vive_magic_power_on ) ) return 5; } if (sv->udev[USB_DEV_LIGHTHOUSE]) { - static uint8_t vive_magic_enable_lighthouse[64] = { 0x04 }; //[64] wat? Why did that fix it? - r = update_feature_report( sv->udev[USB_DEV_LIGHTHOUSE], 0, vive_magic_enable_lighthouse, sizeof( vive_magic_enable_lighthouse ) ); ///XXX TODO: Shouldn't this be LIGHTHOUSEB for hidapi? + static uint8_t vive_magic_enable_lighthouse[5] = { 0x04 }; + r = update_feature_report( sv->udev[USB_DEV_LIGHTHOUSE], 0, vive_magic_enable_lighthouse, sizeof( vive_magic_enable_lighthouse ) ); if( r != sizeof( vive_magic_enable_lighthouse ) ) return 5; + + static uint8_t vive_magic_enable_lighthouse2[5] = { 0x07, 0x02 }; //Switch to 0x25 mode (able to get more light updates) + r = update_feature_report( sv->udev[USB_DEV_LIGHTHOUSE], 0, vive_magic_enable_lighthouse2, sizeof( vive_magic_enable_lighthouse2 ) ); + if( r != sizeof( vive_magic_enable_lighthouse2 ) ) return 5; } #if 0 @@ -621,16 +608,7 @@ int survive_get_config( char ** config, struct SurviveViveData * sv, int devno, int k; - uint8_t cfgbuff_send[64] = { - 0xff, 0x83, 0x00, 0xb6, 0x5b, 0xb0, 0x78, 0x69, - 0x0f, 0xf8, 0x78, 0x69, 0x0f, 0xa0, 0xf3, 0x18, - 0x00, 0xe8, 0xf2, 0x18, 0x00, 0x27, 0x44, 0x5a, - 0x0f, 0xf8, 0x78, 0x69, 0x0f, 0xf0, 0x77, 0x69, - 0x0f, 0xf0, 0x77, 0x69, 0x0f, 0x50, 0xca, 0x45, - 0x77, 0xa0, 0xf3, 0x18, 0x00, 0xf8, 0x78, 0x69, - 0x0f, 0x00, 0x00, 0xa0, 0x0f, 0xa0, 0x9b, 0x0a, - 0x01, 0x00, 0x00, 0x35, 0x00, 0x34, 0x02, 0x00 - }; + uint8_t cfgbuff_send[64] = { 0xff, 0x83 }; #ifdef HIDAPI //XXX TODO WRITEME @@ -928,7 +906,6 @@ static void handle_watchman( struct SurviveObject * w, uint8_t * readdata ) //Use insertion sort, since we should most of the time, be in order. LightcapElement * le = &les[lese++]; le->sensor_id = led; - le->type = 0xfe; if( (uint32_t)(endtime - starttime) > 65535 ) { fault = 6; goto end; } //Length of pulse dumb. le->length = endtime - starttime; @@ -1082,28 +1059,16 @@ void survive_data_cb( SurviveUSBInterface * si ) case USB_IF_LIGHTCAP: { int i; - - if( si->buffer[0] == 0x25 ) //Once the valve drivers run, they somehow put the HMD into 7-byte-width messages. + for( i = 0; i < 9; i++ ) { - for( i = 0; i < 9; i++ ) - { - LightcapElement le; - le.sensor_id = POP1; - le.type = 0xfe; - le.length = POP2; - le.timestamp = POP4; - if( le.sensor_id == 0xff ) break; - handle_lightcap( obj, &le ); - } - } - else //Otherwise, we're in the old mode. - { - for( i = 0; i < 7; i++ ) - { - handle_lightcap( obj, (LightcapElement*)&readdata[i*8] ); - } - break; - } + LightcapElement le; + le.sensor_id = POP1; + le.length = POP2; + le.timestamp = POP4; + if( le.sensor_id == 0xff ) break; + handle_lightcap( obj, &le ); + } + break; } } } -- cgit v1.2.3 From 7dc4d180e0ce95ad6e9eeb2606a4516b93e872f5 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Thu, 16 Mar 2017 00:23:40 -0400 Subject: Fix compile warning --- src/survive_vive.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/survive_vive.c') diff --git a/src/survive_vive.c b/src/survive_vive.c index 99d69a3..3930a2c 100755 --- a/src/survive_vive.c +++ b/src/survive_vive.c @@ -17,10 +17,9 @@ #include #include #include - +#include #ifdef HIDAPI -#include #if defined(WINDOWS) || defined(WIN32) #include #undef WCHAR_MAX -- cgit v1.2.3 From 6daf2506fcfbfcd26d63a8bddba319d67ecc33e5 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Thu, 16 Mar 2017 00:47:54 -0400 Subject: Fix crashes in Linux without hidapi, and fix buffer overflow bug. --- src/survive_vive.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src/survive_vive.c') diff --git a/src/survive_vive.c b/src/survive_vive.c index 3930a2c..18b2742 100755 --- a/src/survive_vive.c +++ b/src/survive_vive.c @@ -59,9 +59,13 @@ const char * devnames[] = { #define USB_DEV_WATCHMAN1 2 #define USB_DEV_WATCHMAN2 3 #define USB_DEV_TRACKER0 4 + +#ifdef HIDAPI #define USB_DEV_LIGHTHOUSEB 5 #define MAX_USB_DEVS 6 - +#else +#define MAX_USB_DEVS 5 +#endif #define USB_IF_HMD 0 #define USB_IF_LIGHTHOUSE 1 @@ -402,6 +406,7 @@ int survive_usb_init( struct SurviveViveData * sv, struct SurviveObject * hmd, s if( d == 0 ) { + printf( "!!%p %d %04x %04x %d\n", devnames[i], i, vid, pid, which ); SV_INFO( "Did not find device %s (%04x:%04x.%d)", devnames[i], vid, pid, which ); sv->udev[i] = 0; continue; @@ -1199,7 +1204,7 @@ printf( "Loading config: %d\n", len ); return 1; } - char fname[20]; + char fname[64]; sprintf( fname, "calinfo/%s_points.csv", so->codename ); FILE * f = fopen( fname, "w" ); -- cgit v1.2.3