aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormwturvey <michael.w.turvey@intel.com>2017-03-16 10:52:13 -0700
committermwturvey <michael.w.turvey@intel.com>2017-03-16 10:52:13 -0700
commitccaa625c6161e14f5c2281cc43134d1928094620 (patch)
treec339acbb982d1f2d67977be98a4ae7cac85f8057 /src
parentd9c9ebe6de1e6f255d645dd6e641f2c288238bc2 (diff)
parent6daf2506fcfbfcd26d63a8bddba319d67ecc33e5 (diff)
downloadlibsurvive-ccaa625c6161e14f5c2281cc43134d1928094620.tar.gz
libsurvive-ccaa625c6161e14f5c2281cc43134d1928094620.tar.bz2
Merge branch 'master' into WinSupport2
# Conflicts: # src/survive_vive.c
Diffstat (limited to 'src')
-rwxr-xr-xsrc/survive.c8
-rwxr-xr-xsrc/survive_cal.c2
-rw-r--r--src/survive_data.c47
-rwxr-xr-xsrc/survive_vive.c62
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" );