diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/survive.c | 8 | ||||
-rwxr-xr-x | src/survive_cal.c | 2 | ||||
-rw-r--r-- | src/survive_data.c | 47 | ||||
-rwxr-xr-x | src/survive_vive.c | 62 |
4 files changed, 50 insertions, 69 deletions
diff --git a/src/survive.c b/src/survive.c index 9d0ef01..81c45c3 100755 --- a/src/survive.c +++ b/src/survive.c @@ -66,7 +66,8 @@ SurviveContext * survive_init( int headless ) ctx->lh_config = malloc( sizeof(config_group) * NUM_LIGHTHOUSES); init_config_group(ctx->global_config_values,10); - init_config_group(ctx->lh_config,10); + init_config_group(&ctx->lh_config[0],10); + init_config_group(&ctx->lh_config[1],10); config_read(ctx, "config.json"); @@ -263,9 +264,10 @@ struct SurviveObject * survive_get_so_by_name( struct SurviveContext * ctx, cons int survive_simple_inflate( struct SurviveContext * ctx, const char * input, int inlen, char * output, int outlen ) { + //Tricky: we actually get 2 bytes of data on the front. I don't know what it's for. 0x78 0x9c - puff doesn't deal with it well. unsigned long ol = outlen; - unsigned long il = inlen; - int ret = puff( output, &ol, input, &il ); + unsigned long il = inlen-2; + int ret = puff( output, &ol, input+2, &il ); if( ret == 0 ) return ol; else diff --git a/src/survive_cal.c b/src/survive_cal.c index 0ea9337..985ab24 100755 --- a/src/survive_cal.c +++ b/src/survive_cal.c @@ -267,7 +267,7 @@ void survive_cal_angle( struct SurviveObject * so, int sensor_id, int acode, uin } if( sensors_visible < MIN_SENSORS_VISIBLE_PER_LH_FOR_CAL ) { - printf( "Dev %d, LH %d not enough visible points found.\n", i, j ); + //printf( "Dev %d, LH %d not enough visible points found.\n", i, j ); cd->found_common = 0; return; } diff --git a/src/survive_data.c b/src/survive_data.c index f87c69d..60849e2 100644 --- a/src/survive_data.c +++ b/src/survive_data.c @@ -25,10 +25,10 @@ void handle_lightcap( SurviveObject * so, LightcapElement * le ) //The sync pulse finder is taking Charles's old disambiguator code and mixing it with a more linear //version of Julian Picht's disambiguator, available in 488c5e9. Removed afterwards into this //unified driver. - int ssn = so->sync_set_number; + int ssn = so->sync_set_number; //lighthouse number if( ssn < 0 ) ssn = 0; - int last_sync_time = so->last_time [ssn]; - int last_sync_length = so->last_length[ssn]; + int last_sync_time = so->last_sync_time [ssn]; + int last_sync_length = so->last_sync_length[ssn]; int32_t delta = le->timestamp - last_sync_time; //Handle time wrapping (be sure to be int32) if( delta < -so->pulsedist_max_ticks || delta > so->pulsedist_max_ticks ) @@ -36,6 +36,7 @@ void handle_lightcap( SurviveObject * so, LightcapElement * le ) //Reset pulse, etc. so->sync_set_number = -1; delta = so->pulsedist_max_ticks; +// return; //if we don't know what lighthouse this is we don't care to do much else } @@ -43,6 +44,8 @@ void handle_lightcap( SurviveObject * so, LightcapElement * le ) { int is_new_pulse = delta > so->pulselength_min_sync /*1500*/ + last_sync_length; + printf("m sync %d %d %d %d\n", le->sensor_id, so->last_sync_time[ssn], le->timestamp, delta); + so->did_handle_ootx = 0; if( is_new_pulse ) @@ -52,8 +55,8 @@ void handle_lightcap( SurviveObject * so, LightcapElement * le ) if( is_master_sync_pulse ) { ssn = so->sync_set_number = 0; - so->last_time[ssn] = le->timestamp; - so->last_length[ssn] = le->length; + so->last_sync_time[ssn] = le->timestamp; + so->last_sync_length[ssn] = le->length; } else if( so->sync_set_number == -1 ) { @@ -69,8 +72,8 @@ void handle_lightcap( SurviveObject * so, LightcapElement * le ) } else { - so->last_time[ssn] = le->timestamp; - so->last_length[ssn] = le->length; + so->last_sync_time[ssn] = le->timestamp; + so->last_sync_length[ssn] = le->length; } } } @@ -79,10 +82,10 @@ void handle_lightcap( SurviveObject * so, LightcapElement * le ) //Find the longest pulse. if( le->length > last_sync_length ) { - if( so->last_time[ssn] > le->timestamp ) + if( so->last_sync_time[ssn] > le->timestamp ) { - so->last_time[ssn] = le->timestamp; - so->last_length[ssn] = le->length; + so->last_sync_time[ssn] = le->timestamp; + so->last_sync_length[ssn] = le->length; } } } @@ -93,8 +96,8 @@ void handle_lightcap( SurviveObject * so, LightcapElement * le ) //See if this is a valid actual pulse. else if( le->length < so->pulse_max_for_sweep && delta > so->pulse_in_clear_time && ssn >= 0 ) { - int32_t dl = so->last_time[0]; - int32_t tpco = so->last_length[0]; + int32_t dl = so->last_sync_time[0]; + int32_t tpco = so->last_sync_length[0]; #if NUM_LIGHTHOUSES != 2 @@ -109,8 +112,8 @@ void handle_lightcap( SurviveObject * so, LightcapElement * le ) int32_t acode_array[2] = { - (so->last_length[0]+main_divisor+50)/(main_divisor*2), //+50 adds a small offset and seems to help always get it right. - (so->last_length[1]+main_divisor+50)/(main_divisor*2), //Check the +50 in the future to see how well this works on a variety of hardware. + (so->last_sync_length[0]+main_divisor+50)/(main_divisor*2), //+50 adds a small offset and seems to help always get it right. + (so->last_sync_length[1]+main_divisor+50)/(main_divisor*2), //Check the +50 in the future to see how well this works on a variety of hardware. }; //XXX: TODO: Capture error count here. @@ -125,11 +128,13 @@ void handle_lightcap( SurviveObject * so, LightcapElement * le ) if( !so->did_handle_ootx ) { - int32_t delta1 = so->last_time[0] - so->recent_sync_time; - int32_t delta2 = so->last_time[1] - so->last_time[0]; - ctx->lightproc( so, -1, acode_array[0], delta1, so->last_time[0], so->last_length[0] ); - ctx->lightproc( so, -2, acode_array[1], delta2, so->last_time[1], so->last_length[1] ); - so->recent_sync_time = so->last_time[1]; + int32_t delta1 = so->last_sync_time[0] - so->recent_sync_time; + int32_t delta2 = so->last_sync_time[1] - so->last_sync_time[0]; + + ctx->lightproc( so, -1, acode_array[0], delta1, so->last_sync_time[0], so->last_sync_length[0] ); + ctx->lightproc( so, -2, acode_array[1], delta2, so->last_sync_time[1], so->last_sync_length[1] ); + + so->recent_sync_time = so->last_sync_time[1]; //Throw out everything if our sync pulses look like they're bad. @@ -161,8 +166,8 @@ void handle_lightcap( SurviveObject * so, LightcapElement * le ) //SV_INFO( "Warning: got a slave marker but only got a master sync." ); //This happens too frequently. Consider further examination. } - dl = so->last_time[1]; - tpco = so->last_length[1]; + dl = so->last_sync_time[1]; + tpco = so->last_sync_length[1]; } int32_t offset_from = le->timestamp - dl + le->length/2; diff --git a/src/survive_vive.c b/src/survive_vive.c index 116d18b..728c3c9 100755 --- a/src/survive_vive.c +++ b/src/survive_vive.c @@ -17,10 +17,10 @@ #include <errno.h> #include <string.h> #include <sys/stat.h> +#include <os_generic.h> #include <malloc.h> // for alloca #ifdef HIDAPI -#include <os_generic.h> #if defined(WINDOWS) || defined(WIN32) || defined (_WIN32) #include <windows.h> #undef WCHAR_MAX @@ -60,9 +60,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 @@ -401,6 +405,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; @@ -478,36 +483,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 @@ -619,16 +611,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 @@ -709,7 +692,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; } @@ -924,7 +907,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; @@ -1078,24 +1060,16 @@ void survive_data_cb( SurviveUSBInterface * si ) case USB_IF_LIGHTCAP: { int i; - #ifdef HIDAPI - 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 - for( i = 0; i < 7; i++ ) - { - handle_lightcap( obj, (LightcapElement*)&readdata[i*8] ); - } break; - #endif } } } @@ -1226,7 +1200,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" ); |