#include <inttypes.h>

#define TRACKD_MAX_SENSORS 8

#define CAVE_TRACKER_FRAME 84
#define CAVE_MAX_BUTTONS	32
#define CAVE_MAX_VALUATORS	32

typedef struct
	{
	float 		x, y, z;
	float 		azim, elev, roll;
	uint32_t	timestamp[2];
	int32_t		calibrated;
	int		frame;		/* CAVE_TRACKER_FRAME or CAVE_NAV_FRAME */
	} CAVE_SENSOR_ST;

typedef struct
	{
	uint32_t	num_buttons,num_valuators;
	int32_t		button[CAVE_MAX_BUTTONS];
	float		valuator[CAVE_MAX_VALUATORS];
	} CAVE_CONTROLLER_ST;

typedef struct
	{
	uint32_t version;		/* CAVElib version (see constants below) */
	uint32_t numSensors;		/* Total number of sensors */
	uint32_t sensorOffset;		/* Byte offset from of header to start of sensor array */
	uint32_t sensorSize;		/* sizeof() of a sensor struct */
	uint32_t timestamp[2];		/* NB: *Not* a struct timeval - that changes */
					/*	size between 32 & 64 bit mode */
	uint32_t command;		/* For sending commands (such as 'reset') to daemon */
	} CAVE_TRACKDTRACKER_HEADER;


/* Command values for header.command */
/*   header.command should be 0 when no command is pending */
#define CAVE_TRACKD_NO_COMMAND		0
#define CAVE_TRACKD_RESET_COMMAND	1


typedef struct
	{
	uint32_t version;		/* CAVElib version (see constants below) */
	uint32_t buttonOffset;	/* Byte offset from start of header to start of button data */
	uint32_t valuatorOffset; /* Byte offset from start of header to start of valuator data */
	uint32_t numButtons;
	uint32_t numValuators;
	uint32_t timestamp[2];
	uint32_t command;		/* For sending commands (such as 'reset') to daemon */
	} CAVE_TRACKDCONTROLLER_HEADER;


/* ID Numbers for CAVElib version */
/*  Increasing values should be assigned for newer library versions whenever
    either the header, sensor, or controller struct definition changes */

#define CAVELIB_2_6	1


struct TRACKD_TRACKING
	{
	CAVE_TRACKDTRACKER_HEADER	header;
	CAVE_SENSOR_ST			sensor[TRACKD_MAX_SENSORS];
	};

struct TRACKD_CONTROLLER
	{
	CAVE_TRACKDCONTROLLER_HEADER	header;
	CAVE_CONTROLLER_ST		controller;
	};
