#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#ifdef WIN32
#include <windows.h>
#include <stdio.h>
#else
#include <unistd.h>
#endif
#include <freespace/freespace.h>
struct freespace_BodyFrame cachedBodyFrame;
static void receiveMessageCallback(FreespaceDeviceId id,
struct freespace_message* message,
void* cookie,
int result) {
if (result == FREESPACE_SUCCESS && message != NULL && message->messageType == FREESPACE_MESSAGE_BODYFRAME) {
cachedBodyFrame = message->bodyFrame;
}
}
static FreespaceDeviceId initializeFreespace() {
struct freespace_message message;
FreespaceDeviceId device;
int numIds;
int rc;
// Initialize the freespace library
rc = freespace_init();
if (rc != FREESPACE_SUCCESS) {
printf("Initialization error. rc=%d\n", rc);
return 1;
}
/** --- START EXAMPLE INITIALIZATION OF DEVICE -- **/
rc = freespace_getDeviceList(&device, 1, &numIds);
if (numIds == 0) {
printf("freespaceInputThread: Didn't find any devices.\n");
exit(1);
}
rc = freespace_openDevice(device);
if (rc != FREESPACE_SUCCESS) {
printf("freespaceInputThread: Error opening device: %d\n", rc);
exit(1);
}
freespace_setReceiveMessageCallback(device, receiveMessageCallback, NULL);
rc = freespace_flush(device);
if (rc != FREESPACE_SUCCESS) {
printf("freespaceInputThread: Error flushing device: %d\n", rc);
exit(1);
}
memset(&cachedBodyFrame, 0, sizeof(cachedBodyFrame));
memset(&message, 0, sizeof(message));
if (FREESPACE_SUCCESS == freespace_isNewDevice(device)) {
message.messageType = FREESPACE_MESSAGE_DATAMODECONTROLV2REQUEST;
message.dataModeControlV2Request.packetSelect = 2;
message.dataModeControlV2Request.modeAndStatus |= 0 << 1;
} else {
message.messageType = FREESPACE_MESSAGE_DATAMODEREQUEST;
message.dataModeRequest.enableBodyMotion = 1;
message.dataModeRequest.inhibitPowerManager = 1;
}
rc = freespace_sendMessage(device, &message);
if (rc != FREESPACE_SUCCESS) {
printf("freespaceInputThread: Could not send message: %d.\n", rc);
}
/** --- END EXAMPLE INITIALIZATION OF DEVICE -- **/
return device;
}
static void finalizeFreespace(FreespaceDeviceId device) {
struct freespace_message message;
int rc;
/** --- START EXAMPLE FINALIZATION OF DEVICE --- **/
printf("\n\nfreespaceInputThread: Cleaning up...\n");
memset(&message, 0, sizeof(message));
if (FREESPACE_SUCCESS == freespace_isNewDevice(device)) {
message.messageType = FREESPACE_MESSAGE_DATAMODECONTROLV2REQUEST;
message.dataModeControlV2Request.packetSelect = 1;
} else {
message.messageType = FREESPACE_MESSAGE_DATAMODEREQUEST;
message.dataModeRequest.enableMouseMovement = 1;
}
rc = freespace_sendMessage(device, &message);
if (rc != FREESPACE_SUCCESS) {
printf("freespaceInputThread: Could not send message: %d.\n", rc);
}
freespace_closeDevice(device);
/** --- END EXAMPLE FINALIZATION OF DEVICE --- **/
freespace_exit();
}
int main(int argc, char* argv[]) {
struct freespace_BodyFrame body;
FreespaceDeviceId device;
//printVersionInfo(argv[0]);
memset(&body, 0, sizeof(struct freespace_BodyFrame));
//addControlHandler();
device = initializeFreespace();
// Run the game loop
while (true) {
// Get input.
freespace_perform();
body = cachedBodyFrame;
// Run game logic.
// Render.
printf("\r%d: Current accel = %d, %d, %d ",
body.sequenceNumber,
body.linearAccelX,
body.linearAccelY,
body.linearAccelZ);
fflush(stdout);
// Wait for "vsync"
#ifdef WIN32
Sleep(1);
#else
usleep(16000);
#endif
}
finalizeFreespace(device);
return 0;
}