aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile7
-rw-r--r--calibrate.c2
-rw-r--r--calibrate_client.c216
-rw-r--r--data_recorder.c4
-rw-r--r--include/survive.h2
-rw-r--r--src/survive.c3
-rw-r--r--src/survive_config.c174
-rw-r--r--src/survive_config.h45
-rw-r--r--test.c2
-rw-r--r--tools/data_server/data_server.c15
10 files changed, 459 insertions, 11 deletions
diff --git a/Makefile b/Makefile
index cf237f2..ffe4c77 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
-all : lib data_recorder test calibrate
+all : lib data_recorder test calibrate calibrate_client
-CFLAGS:=-Iinclude -I. -fPIC -g -O0 -Iredist -flto -DUSE_DOUBLE
+CFLAGS:=-Iinclude -I. -fPIC -g -O0 -Iredist -flto -DUSE_DOUBLE -std=gnu99
LDFLAGS:=-lpthread -lusb-1.0 -lz -lX11 -lm -flto -g
@@ -17,6 +17,9 @@ data_recorder : data_recorder.c lib/libsurvive.so redist/os_generic.o redist/Dra
calibrate : calibrate.c lib/libsurvive.so redist/os_generic.c redist/DrawFunctions.c redist/XDriver.c
gcc -o $@ $^ $(LDFLAGS) $(CFLAGS)
+calibrate_client : calibrate_client.c lib/libsurvive.so redist/os_generic.c redist/DrawFunctions.c redist/XDriver.c
+ gcc -o $@ $^ $(LDFLAGS) $(CFLAGS)
+
lib:
mkdir lib
diff --git a/calibrate.c b/calibrate.c
index f50bad3..a1e150b 100644
--- a/calibrate.c
+++ b/calibrate.c
@@ -145,7 +145,7 @@ void * GuiThread( void * v )
int main()
{
- ctx = survive_init( );
+ ctx = survive_init( 0 );
survive_install_light_fn( ctx, my_light_process );
survive_install_imu_fn( ctx, my_imu_process );
diff --git a/calibrate_client.c b/calibrate_client.c
new file mode 100644
index 0000000..4c59261
--- /dev/null
+++ b/calibrate_client.c
@@ -0,0 +1,216 @@
+//Totally hacky "client" for absorbing data from a network source of the vive data.
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <survive.h>
+#include <string.h>
+#include <os_generic.h>
+#include "src/survive_cal.h"
+#include <DrawFunctions.h>
+
+struct SurviveContext * ctx;
+
+void HandleKey( int keycode, int bDown )
+{
+ if( !bDown ) return;
+
+ if( keycode == 'O' || keycode == 'o' )
+ {
+ survive_send_magic(ctx,1,0,0);
+ }
+ if( keycode == 'F' || keycode == 'f' )
+ {
+ survive_send_magic(ctx,0,0,0);
+ }
+}
+
+void HandleButton( int x, int y, int button, int bDown )
+{
+}
+
+void HandleMotion( int x, int y, int mask )
+{
+}
+
+int bufferpts[32*2*3];
+char buffermts[32*128*3];
+int buffertimeto[32*3];
+
+void my_light_process( struct SurviveObject * so, int sensor_id, int acode, int timeinsweep, uint32_t timecode, uint32_t length )
+{
+ survive_default_light_process( so, sensor_id, acode, timeinsweep, timecode, length );
+
+ if( acode == -1 ) return;
+//return;
+ int jumpoffset = sensor_id;
+ if( strcmp( so->codename, "WM0" ) == 0 ) jumpoffset += 32;
+ else if( strcmp( so->codename, "WM1" ) == 0 ) jumpoffset += 64;
+
+
+ if( acode == 0 || acode == 2 ) //data = 0
+ {
+ bufferpts[jumpoffset*2+0] = (timeinsweep-100000)/500;
+ buffertimeto[jumpoffset] = 0;
+ }
+ if( acode == 1 || acode == 3 ) //data = 1
+ {
+ bufferpts[jumpoffset*2+1] = (timeinsweep-100000)/500;
+ buffertimeto[jumpoffset] = 0;
+ }
+
+
+ if( acode == 4 || acode == 6 ) //data = 0
+ {
+ bufferpts[jumpoffset*2+0] = (timeinsweep-100000)/500;
+ buffertimeto[jumpoffset] = 0;
+ }
+ if( acode == 5 || acode == 7 ) //data = 1
+ {
+ bufferpts[jumpoffset*2+1] = (timeinsweep-100000)/500;
+ buffertimeto[jumpoffset] = 0;
+ }
+}
+
+void my_imu_process( struct SurviveObject * so, int16_t * accelgyro, uint32_t timecode, int id )
+{
+ survive_default_imu_process( so, accelgyro, timecode, id );
+
+return;
+ //if( so->codename[0] == 'H' )
+ if( 1 )
+ {
+ printf( "I %s %d %d %d %d %d %d %d %d\n", so->codename, timecode, accelgyro[0], accelgyro[1], accelgyro[2], accelgyro[3], accelgyro[4], accelgyro[5], id );
+ }
+}
+
+
+void my_angle_process( struct SurviveObject * so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle )
+{
+ survive_default_angle_process( so, sensor_id, acode, timecode, length, angle );
+}
+
+
+void * GuiThread( void * v )
+{
+ short screenx, screeny;
+ while(1)
+ {
+ CNFGHandleInput();
+ CNFGClearFrame();
+ CNFGColor( 0xFFFFFF );
+ CNFGGetDimensions( &screenx, &screeny );
+
+ int i;
+ for( i = 0; i < 32*3; i++ )
+ {
+ if( buffertimeto[i] < 50 )
+ {
+ uint32_t color = i * 3231349;
+ uint8_t r = color & 0xff;
+ uint8_t g = (color>>8) & 0xff;
+ uint8_t b = (color>>16) & 0xff;
+ r = (r * (5-buffertimeto[i])) / 5 ;
+ g = (g * (5-buffertimeto[i])) / 5 ;
+ b = (b * (5-buffertimeto[i])) / 5 ;
+ CNFGColor( (b<<16) | (g<<8) | r );
+ CNFGTackRectangle( bufferpts[i*2+0], bufferpts[i*2+1], bufferpts[i*2+0] + 5, bufferpts[i*2+1] + 5 );
+ CNFGPenX = bufferpts[i*2+0]; CNFGPenY = bufferpts[i*2+1];
+ CNFGDrawText( buffermts, 2 );
+ buffertimeto[i]++;
+ }
+ }
+
+ CNFGColor( 0xffffff );
+ char caldesc[256];
+ survive_cal_get_status( ctx, caldesc, sizeof( caldesc ) );
+ CNFGPenX = 3;
+ CNFGPenY = 3;
+ CNFGDrawText( caldesc, 4 );
+
+
+ CNFGSwapBuffers();
+ OGUSleep( 10000 );
+ }
+}
+
+
+
+
+int main()
+{
+ ctx = survive_init( 1 );
+
+ survive_install_light_fn( ctx, my_light_process );
+ survive_install_imu_fn( ctx, my_imu_process );
+ survive_install_angle_fn( ctx, my_angle_process );
+
+ survive_cal_install( ctx );
+
+ struct SurviveObject * hmd = survive_get_so_by_name( ctx, "HMD" );
+ struct SurviveObject * wm0 = survive_get_so_by_name( ctx, "WM0" );
+ struct SurviveObject * wm1 = survive_get_so_by_name( ctx, "WM1" );
+
+ CNFGBGColor = 0x000000;
+ CNFGDialogColor = 0x444444;
+ CNFGSetup( "Survive GUI Debug", 640, 480 );
+ OGCreateThread( GuiThread, 0 );
+
+
+ if( !ctx )
+ {
+ fprintf( stderr, "Fatal. Could not start\n" );
+ return 1;
+ }
+
+ while(survive_poll(ctx) == 0)
+ {
+ char * lineptr;
+ size_t n;
+ lineptr = 0;
+ n = 0;
+ ssize_t gl = getline( &lineptr, &n, stdin );
+// printf( "%d %s\n", gl, lineptr );
+
+ switch( lineptr[0] )
+ {
+ case 'I':
+ //IMU data
+ //I WM0 -695533550 -321 1357 -3928 -16 -2 -2 0
+ break;
+ case 'R':
+ case 'L':
+ {
+ //Light data
+ //R X HMD -878577652 -1 6 380498 6004
+ char lhn[10];
+ char beam[10];
+ char dev[10];
+ int timecode, sensor_id, acode, timeinsweep, length;
+
+ sscanf( lineptr, "%9s %9s %9s %d %d %d %d %d\n",
+ lhn, beam, dev, &timecode, &sensor_id, &acode, &timeinsweep, &length );
+
+ struct SurviveObject * so = 0;
+ if( strcmp( dev, "HMD" ) == 0 )
+ so = hmd;
+ if( strcmp( dev, "WM0" ) == 0 )
+ so = wm0;
+ if( strcmp( dev, "WM1" ) == 0 )
+ so = wm1;
+
+ if( so )
+ my_light_process( so, sensor_id, acode, timeinsweep, timecode, length );
+
+ break;
+ }
+ }
+
+ free( lineptr );
+
+ //printf( "!!!\n" );
+ //Do stuff.
+ }
+}
+
diff --git a/data_recorder.c b/data_recorder.c
index 516ac6c..951f234 100644
--- a/data_recorder.c
+++ b/data_recorder.c
@@ -81,7 +81,7 @@ void my_imu_process( struct SurviveObject * so, int16_t * accelgyro, uint32_t ti
{
survive_default_imu_process( so, accelgyro, timecode, id );
-return;
+//return;
//if( so->codename[0] == 'H' )
if( 1 )
{
@@ -132,7 +132,7 @@ void * GuiThread( void * v )
int main()
{
- ctx = survive_init( );
+ ctx = survive_init( 0 );
survive_install_light_fn( ctx, my_light_process );
survive_install_imu_fn( ctx, my_imu_process );
diff --git a/include/survive.h b/include/survive.h
index 44f9926..51910a6 100644
--- a/include/survive.h
+++ b/include/survive.h
@@ -69,7 +69,7 @@ typedef void (*light_process_func)( struct SurviveObject * so, int sensor_id, in
typedef void (*imu_process_func)( struct SurviveObject * so, int16_t * accelgyro, uint32_t timecode, int id );
typedef void (*angle_process_func)( struct SurviveObject * so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle );
-struct SurviveContext * survive_init();
+struct SurviveContext * survive_init( int headless );
//For any of these, you may pass in 0 for the function pointer to use default behavior.
void survive_install_info_fn( struct SurviveContext * ctx, text_feedback_func fbp );
diff --git a/src/survive.c b/src/survive.c
index b472ccc..306dbe1 100644
--- a/src/survive.c
+++ b/src/survive.c
@@ -21,7 +21,7 @@ static void survivenote( struct SurviveContext * ctx, const char * fault )
}
-struct SurviveContext * survive_init()
+struct SurviveContext * survive_init( int headless )
{
int r = 0;
int i = 0;
@@ -36,6 +36,7 @@ struct SurviveContext * survive_init()
const char * DriverName;
while( ( DriverName = GetDriverNameMatching( "DriverReg", i++ ) ) )
+
{
DeviceDriver dd = GetDriver( DriverName );
printf( "Loading driver %s (%p) (%d)\n", DriverName, dd, i );
diff --git a/src/survive_config.c b/src/survive_config.c
new file mode 100644
index 0000000..ed3f6cd
--- /dev/null
+++ b/src/survive_config.c
@@ -0,0 +1,174 @@
+#include <string.h>
+#include <assert.h>
+#include "survive_config.h"
+
+#define MAX_CONFIG_ENTRIES 100
+
+config_val config_values[MAX_CONFIG_ENTRIES];
+static uint16_t used_entries = 0;
+
+static FILE *config_file = NULL;
+
+void config_init() {
+ uint16_t i = 0;
+ for (i=0;i<MAX_CONFIG_ENTRIES;++i) {
+ config_values[i].str = NULL;
+ config_values[i].tag = NULL;
+ }
+
+ used_entries = 0;
+}
+
+void write_float(char* tag, FLT x) {
+ fprintf(config_file, "\"%s\":\"%f\"\n", tag, x);
+}
+
+void write_float_a(char* tag, FLT *x, uint8_t count) {
+ uint8_t i = 0;
+ char idx[4];
+ for (i=0;i<count;++i) {
+ sprintf(idx,"%d",i);
+ fprintf(config_file, "\"%s%s\":\"%f\"\n", tag,idx, x);
+ }
+ fprintf(config_file, "\"%s\":\"%f\"\n", tag, x);
+}
+
+void write_uint32(char* tag, uint32_t x) {
+ fprintf(config_file, "\"%s\":\"%d\"\n", tag, x);
+}
+
+void config_open(const char* path, const char* mode) {
+ config_file = fopen(path, mode);
+}
+
+void config_close() {
+ fclose(config_file);
+}
+
+void config_write_lighthouse(struct BaseStationData* bsd, uint8_t length) {
+ uint8_t i = 0;
+
+ for (i=0;i<length; ++i) {
+ write_uint32("id", bsd[i].BaseStationID);
+ write_float_a("position", bsd[i].Position, 3);
+ write_float_a("quaternion", bsd[i].Quaternion, 4);
+ write_float_a("quaternion", bsd[i].Quaternion, 4);
+ write_float_a("fcalphase", bsd[i].fcalphase, 2);
+ write_float_a("fcaltilt", bsd[i].fcaltilt,2);
+ write_float_a("fcalcurve", bsd[i].fcalcurve,2);
+ write_float_a("fcalgibpha", bsd[i].fcalgibpha,2);
+ write_float_a("fcalgibmag", bsd[i].fcalgibmag,2);
+ }
+}
+
+void sstrcpy(char* dest, const char *src) {
+ uint32_t len = strlen(src)+1;
+ if (dest == NULL) {
+ dest = (char*)malloc(len);
+ } else {
+ dest = (char*)realloc(dest, len);
+ }
+ strcpy(dest,src);
+}
+
+const char* config_read_str(const char *tag, const char *value, const char *def_str) {
+ uint16_t i = 0;
+ for (i=0;i<used_entries;++i) {
+ if ( strcmp(config_values[i].tag, tag) == 0 ) {
+ return config_values[i].str;
+ }
+ }
+ assert(used_entries<MAX_CONFIG_ENTRIES);
+
+ i = used_entries++;
+ sstrcpy(config_values[i].tag, tag);
+ sstrcpy(config_values[i].str, def_str);
+
+ return config_values[i].str;
+}
+
+uint32_t config_read_uint32(const char *tag, const uint32_t value, const uint32_t def) {
+ uint16_t i = 0;
+ for (i=0;i<used_entries;++i) {
+ if ( strcmp(config_values[i].tag, tag) == 0 ) {
+ return config_values[i].numeric.i;
+ }
+ }
+ assert(used_entries<MAX_CONFIG_ENTRIES);
+
+ i = used_entries++;
+ sstrcpy(config_values[i].tag, tag);
+ config_values[i].numeric.i = def;
+
+ return config_values[i].numeric.i;
+}
+
+FLT config_read_float(const char *tag, const FLT value, const FLT def) {
+ uint16_t i = 0;
+ for (i=0;i<used_entries;++i) {
+ if ( strcmp(config_values[i].tag, tag) == 0 ) {
+ return config_values[i].numeric.f;
+ }
+ }
+ assert(used_entries<MAX_CONFIG_ENTRIES);
+
+ i = used_entries++;
+ sstrcpy(config_values[i].tag, tag);
+ config_values[i].numeric.f = def;
+
+ return config_values[i].numeric.f;
+}
+
+const char* config_set_str(const char *tag, const char* value) {
+ uint16_t i = 0;
+
+ assert(used_entries<MAX_CONFIG_ENTRIES);
+
+ i = used_entries++;
+ sstrcpy(config_values[i].tag, tag);
+ sstrcpy(config_values[i].str, value);
+
+ return value;
+}
+
+const uint32_t config_set_uint32(const char *tag, const uint32_t value) {
+ uint16_t i = 0;
+
+ assert(used_entries<MAX_CONFIG_ENTRIES);
+
+ i = used_entries++;
+ sstrcpy(config_values[i].tag, tag);
+ config_values[i].numeric.i = value;
+
+ return value;
+}
+
+const FLT config_set_float(const char *tag, const FLT value) {
+ uint16_t i = 0;
+
+ assert(used_entries<MAX_CONFIG_ENTRIES);
+
+ i = used_entries++;
+ sstrcpy(config_values[i].tag, tag);
+ config_values[i].numeric.f = value;
+
+ return value;
+}
+void config_save(const char* path) {
+ uint16_t i = 0;
+
+ FILE* f = fopen(path, "w");
+
+ for (i=0;i<=used_entries;++i) {
+ if (config_values[i].type == CONFIG_FLOAT) {
+ fprintf(f, "\"%s\":\"%F\"\n", config_values[i].tag, config_values[i].numeric.f);
+ } else if (config_values[i].type == CONFIG_UINT32) {
+ fprintf(f, "\"%s\":\"%d\"\n", config_values[i].tag, config_values[i].numeric.i);
+ } else if (config_values[i].type == CONFIG_STRING) {
+ fprintf(f, "\"%s\":\"%s\"\n", config_values[i].tag, config_values[i].str);
+ }
+ };
+
+ fclose(f);
+}
+
diff --git a/src/survive_config.h b/src/survive_config.h
new file mode 100644
index 0000000..24762cd
--- /dev/null
+++ b/src/survive_config.h
@@ -0,0 +1,45 @@
+// (C) 2017 <>< Joshua Allen, Under MIT/x11 License.
+
+
+#ifndef _SURVIVE_CONFIG_H
+#define _SURVIVE_CONFIG_H
+
+#include "survive_internal.h"
+
+typedef enum {
+ CONFIG_UNKNOWN = 0,
+ CONFIG_FLOAT = 1,
+ CONFIG_UINT32 = 2,
+ CONFIG_STRING = 3
+} cval_type;
+/*
+typedef union {
+ uint32_t i;
+ FLT f;
+ } Numeric;
+*/
+typedef struct {
+ char *tag;
+ cval_type type;
+ union {
+ uint32_t i;
+ FLT f;
+ } numeric;
+ char *str;
+} config_val;
+
+
+void config_open(const char* path, const char* mode);
+void config_close();
+void config_write_lighthouse(struct BaseStationData* bsd, uint8_t length);
+
+void config_save(const char* path);
+const FLT config_set_float(const char *tag, const FLT value);
+const uint32_t config_set_uint32(const char *tag, const uint32_t value);
+const char* config_set_str(const char *tag, const char* value);
+FLT config_read_float(const char *tag, const FLT value, const FLT def);
+
+uint32_t config_read_uint32(const char *tag, const uint32_t value, const uint32_t def);
+const char* config_read_str(const char *tag, const char *value, const char *def_str);
+
+#endif \ No newline at end of file
diff --git a/test.c b/test.c
index d5845d3..9dc3631 100644
--- a/test.c
+++ b/test.c
@@ -42,7 +42,7 @@ int main()
int magicon = 0;
double Start = OGGetAbsoluteTime();
- ctx = survive_init( );
+ ctx = survive_init( 0 );
if( !ctx )
{
diff --git a/tools/data_server/data_server.c b/tools/data_server/data_server.c
index 29f5ead..5147d97 100644
--- a/tools/data_server/data_server.c
+++ b/tools/data_server/data_server.c
@@ -19,6 +19,7 @@
#define MAX_CONNS 32
int SocketList[MAX_CONNS];
+int droppedct[MAX_CONNS];
void error(char *msg) {
perror(msg);
@@ -44,10 +45,17 @@ void * SendThread( void * v )
int ss = send( sockc, buff, rd, MSG_DONTWAIT | MSG_NOSIGNAL );
if( ss < rd )
{
- fprintf( stderr, "Dropped %d\n", i );
- close( SocketList[i] );
- SocketList[i] = 0;
+ if( droppedct[i]++ > 20 )
+ {
+ fprintf( stderr, "Dropped %d\n", i );
+ close( SocketList[i] );
+ SocketList[i] = 0;
+ }
}
+ else
+ {
+ droppedct[i] = 0;
+ }
}
}
}
@@ -142,6 +150,7 @@ int main( int argc, char ** argv )
if( SocketList[il] == 0 )
{
SocketList[il] = childfd;
+ droppedct[il] = 0;
printf("Conn %s At %d\n",
hostaddrp, il);
break;