aboutsummaryrefslogtreecommitdiff
path: root/calibrate_client.c
diff options
context:
space:
mode:
authorcnlohr <lohr85@gmail.com>2017-02-26 00:14:48 -0500
committercnlohr <lohr85@gmail.com>2017-02-26 00:14:48 -0500
commitf4ab8c084c1e23e850f436c2c0bb6777da3d942a (patch)
treee5b92a7f19ddb69320610aec46b1b6c8d05dcef0 /calibrate_client.c
parent55cedfc6a6b035d6eb54457782818fef61cae500 (diff)
parentfe31e600d890004f0f255a20fe056e0e8a54209b (diff)
downloadlibsurvive-f4ab8c084c1e23e850f436c2c0bb6777da3d942a.tar.gz
libsurvive-f4ab8c084c1e23e850f436c2c0bb6777da3d942a.tar.bz2
Merge branch 'master' of https://github.com/cnlohr/libsurvive
Diffstat (limited to 'calibrate_client.c')
-rw-r--r--calibrate_client.c216
1 files changed, 216 insertions, 0 deletions
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.
+ }
+}
+