og-libsurvive/simple_pose_test.c
2018-09-25 12:13:43 -06:00

234 lines
5.3 KiB
C

#ifdef __linux__
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <survive.h>
#include "src/survive_cal.h"
#include <CNFG3D.h>
#include <os_generic.h>
#include <CNFGFunctions.h>
#include <string.h>
#include <linmath.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);
}
}
float viewX = 0.7853975;
float viewY = 0.7853975;
int down, downx, downy;
void HandleButton( int x, int y, int button, int bDown )
{
if (button == 1) {
if (bDown) {
down = 1;
downx = x;
downy = y;
} else {
down = 0;
}
}
}
void HandleMotion( int x, int y, int mask )
{
if (down) {
viewX += (x - downx) / 100.0;
viewY -= (y - downy) / 100.0;
if (viewY < 0.01)
viewY = 0.01;
if (viewY > 3.14)
viewY = 3.14;
downx = x;
downy = y;
}
}
void HandleDestroy()
{
}
FLT hpos[3];
FLT hpos2[3];
FLT hposx[3];
void testprog_raw_pose_process(SurviveObject *so, uint32_t timecode, SurvivePose *pose) {
survive_default_raw_pose_process(so, timecode, pose);
// if (strcmp(so->codename, "WW0") != 0)
// return;
// print the pose;
/* double qw = quat[0];
double qx = quat[1];
double qy = quat[2];
double qz = quat[3];
hra = 2 * acos(qw);
hrx = qx / sqrt(1-qw*qw);
hry = qy / sqrt(1-qw*qw);
hrz = qz / sqrt(1-qw*qw);
hra *= 180/3.14159;
hx = pos[0];
hy = pos[1];
hz = pos[2];*/
printf("Pose: [%u][%s][% 08.8f,% 08.8f,% 08.8f] [ang:%08.2f %08.2f %08.2f %08.2f]\n", timecode, so->codename,
pose->Pos[0], pose->Pos[1], pose->Pos[2], pose->Rot[0], pose->Rot[1], pose->Rot[2], pose->Rot[3]);
hpos[0] = pose->Pos[0];
hpos[1] = pose->Pos[1];
hpos[2] = pose->Pos[2];
FLT hposin[3] = { 0, 0, 1 };
ApplyPoseToPoint(hpos2, pose, hposin);
FLT hposinx[3] = {.1, 0, 0};
ApplyPoseToPoint(hposx, pose, hposinx);
fflush(stdout);
}
void testprog_angle_process( SurviveObject * so, int sensor_id, int acode, uint32_t timecode, FLT length, FLT angle, uint32_t lh )
{
// printf( "%d: %d %d\n", sensor_id, acode, timecode );
}
void DrawLineSegment( float x, float y, float z, float x2, float y2, float z2 )
{
//float pti[6] = { 1, sin(TimeSinceStart), cos(TimeSinceStart ), 1, 0, 0};
float pa[3] = { x, y, z };
float pb[3] = { x2, y2, z2 };
tdFinalPoint( pa, pa );
tdFinalPoint( pb, pb );
if( pa[2] >= 1.0 ) return;
if( pb[2] >= 1.0 ) return;
if( pa[2] < 0 ) return;
if( pb[2] < 0 ) return;
int dx, dy;
for( dx = 0; dx < 2; dx++ )
for( dy = 0; dy < 2; dy++ )
{
CNFGTackPixel( pa[0]+dx, pa[1]+dy );
CNFGTackSegment( pa[0]+dx, pa[1]+dy, pb[0]+dx, pb[1]+dy );
}
}
void *GUIThread(void*v)
{
CNFGSetup( "Orientation test", 640, 480 );
double fLast = 0;
short screenx, screeny;
double TimeSinceStart = 0;
while(1)
{
double Now = OGGetAbsoluteTime();
double dt = Now - fLast;
fLast = Now;
TimeSinceStart += dt;
CNFGClearFrame();
CNFGHandleInput();
CNFGColor( 0xFFFFFF );
CNFGGetDimensions( &screenx, &screeny );
int x, y;
float eye[3] = {3 * sin(viewX) * sin(viewY), 3 * cos(viewX) * sin(viewY),
3 * cos(viewY)}; // Create a 2-rotation with Z primarily up.
// float up[3] = { 0, cos(viewY), sin(viewY)}; //Create a 2-rotation with Z primarily up.
float at[3] = { 0,0, 0 };
float up[3] = {0, 0, 1.0};
float right[3];
tdCross(up, eye, right);
tdCross(eye, right, up); // Have to make sure we're making a coordinate frame for lookat.
tdNormalizeSelf(right);
tdSetViewport( -1, -1, 1, 1, screenx, screeny );
tdMode( tdPROJECTION );
tdIdentity( gSMatrix );
tdPerspective( 40, ((float)screenx)/((float)screeny), .1, 200., gSMatrix );
tdMode( tdMODELVIEW );
tdIdentity( gSMatrix );
tdLookAt( gSMatrix, eye, at, up );
CNFGColor( 0x00ffff ); DrawLineSegment( hpos[0], hpos[1], hpos[2], hpos2[0], hpos2[1], hpos2[2] );
CNFGColor( 0xff00ff ); DrawLineSegment( hpos[0], hpos[1], hpos[2], hpos[0], hpos[1], hpos[2] );
CNFGColor(0xffff00);
DrawLineSegment(hpos[0], hpos[1], hpos[2], hposx[0], hposx[1], hposx[2]);
CNFGColor( 0x0000ff ); DrawLineSegment( 0, 0, 0, 1, 0, 0 );
CNFGColor( 0xff0000 ); DrawLineSegment( 0, 0, 0, 0, 1, 0 );
CNFGColor( 0x00ff00 ); DrawLineSegment( 0, 0, 0, 0, 0, 1 );
CNFGColor( 0xffffff ); DrawLineSegment( 0, 0, 0, 0, 0, 0 );
CNFGSwapBuffers();
OGUSleep(10000);
}
}
int main( int argc, char ** argv )
{
int magicon = 0;
double Start = OGGetAbsoluteTime();
ctx = survive_init( argc, argv );
if (ctx == 0) { // Implies --help or similiar
return -1;
}
//survive_install_button_fn(ctx, testprog_button_process);
survive_install_pose_fn(ctx, testprog_raw_pose_process);
//survive_install_imu_fn(ctx, testprog_imu_process);
survive_install_pose_fn(ctx, testprog_raw_pose_process);
//survive_install_angle_fn(ctx, testprog_angle_process );
#if 0 // Don't reset poses
ctx->bsd[0].PositionSet = ctx->bsd[1].PositionSet = 1;
int i;
for( i = 0; i < 2; i++ )
{
SurvivePose * p = &ctx->bsd[i].Pose;
p->Pos[0] = 0;
p->Pos[1] = 0;
p->Pos[2] = 0;
p->Rot[0] = 1;
p->Rot[1] = 0;
p->Rot[2] = 0;
p->Rot[3] = 0;
}
#endif
OGCreateThread( GUIThread, 0 );
if( !ctx )
{
fprintf( stderr, "Fatal. Could not start\n" );
return 1;
}
//survive_cal_install(ctx);
while(survive_poll(ctx) == 0)
{
//Do Stuff
}
}