well heres a lua implementation:
--use alien to import functions
require("alien")
--handle dll name and pathing
local ftLibPath = "C:\Program Files (x86)\FreeTrack\"
local ftLibName = "FreeTrackClient"
local ftLibExt = "dll"
--get a handle on the dll
local ftLib = alien.load(ftLibPath..ftLibName.."."..ftLibExt)
--export functions
ftLib.FTGetData:types{ ret = "byte", "pointer" }
ftLib.FTGetDllVersion:types{ ret = "string" }
ftLib.FTReportName:types{ ret = "void", "int" }
ftLib.FTProvider:types{ ret = "string" }
--output struct
local FreeTrackData = alien.defstruct{
{"dataID", "ulong"},
{"camWidth", "long"},
{"camHeight", "long"},
{"yaw", "float"},
{"pitch", "float"},
{"roll", "float"},
{"x", "float"},
{"y", "float"},
{"z", "float"},
{"rawYaw", "float"},
{"rawPitch", "float"},
{"rawRoll", "float"},
{"rawX", "float"},
{"rawY", "float"},
{"rawZ", "float"},
{"x1", "float"},
{"y1", "float"},
{"x2", "float"},
{"y2", "float"},
{"x3", "float"},
{"y3", "float"},
{"x4", "float"},
{"y4", "float"}
}
--create a structure
local ftData = FreeTrackData:new()
--loop forever
while true do
--some strings
print(ftLib.FTProvider())
print(ftLib.FTGetDllVersion())
--not sure what this does at all
ftLib.FTReportName(453)
--update the struct
ftLib.FTGetData(ftData())
--use values
print(" Pitch: "..ftData.pitch)
print(" Yaw: "..ftData.yaw)
print(" Roll: "..ftData.roll)
print(" X: "..ftData.x)
print(" Y: "..ftData.y)
print(" Z: "..ftData.z)
print("")
end
i did get a c version to work but im having trouble finding it.
found it. this is the version that comes with freetrack, except its been fixed up so it works instead of crashing.
/************************************************************************
* freetrack_c_interface.c
*
* A simple command line application which reads the data from FreeTrack
* using the FreeTrackClient.dll interface.
*
* Assumes that a copy of the FreeTrackClient.dll is in the same folder,
* thought this does not necessarily have to be the same folder as the
* FreeTrack application itself.
*
* Based on code from http://en.wikipedia.org/wiki/Dynamic-link_library
*
* Alastair Moore, December 2007
*
************************************************************************/
//#include <iostream>
//#include <tchar.h>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
typedef struct
{
unsigned long int dataID;
long int camWidth;
long int camHeight;
float yaw;
float pitch;
float roll;
float x;
float y;
float z;
float rawyaw;
float rawpitch;
float rawroll;
float rawx;
float rawy;
float rawz;
float x1;
float y1;
float x2;
float y2;
float x3;
float y3;
float x4;
float y4;
}FreeTrackData;
// DLL function signatures
// These match those given in FTTypes.pas
// WINAPI is macro for __stdcall defined somewhere in the depths of windows.h
typedef bool (WINAPI *importGetData)(FreeTrackData * data);
typedef char *(WINAPI *importGetDllVersion)(void);
typedef void (WINAPI *importReportID)(int name);
typedef char *(WINAPI *importProvider)(void);
int main(int argc, char **argv)
{
//declare imported function pointers
importGetData getData;
importGetDllVersion getDllVersion;
importReportID reportID;
importProvider provider;
// create variables for exchanging data with the dll
FreeTrackData data;
FreeTrackData *pData;
pData = &data;
char *pDllVersion;
int name = 453;
char *pProvider;
// Load DLL file
HINSTANCE hinstLib = LoadLibrary("FreeTrackClient.dll");
if (hinstLib == NULL) {
printf("ERROR: unable to load DLL\n");
return 1;
}
else
{
printf("dll loaded\n");
}
// Get function pointers
getData = (importGetData)GetProcAddress(hinstLib, "FTGetData");
getDllVersion = (importGetDllVersion)GetProcAddress(hinstLib, "FTGetDllVersion");
reportID = (importReportID)GetProcAddress(hinstLib, "FTReportName");
provider = (importProvider)GetProcAddress(hinstLib, "FTProvider");
// Check they are valid
if (getData == NULL) {
printf("ERROR: unable to find 'FTGetData' function\n");
FreeLibrary(hinstLib);
return 1;
}
if (getDllVersion == NULL){
printf("ERROR: unable to find 'FTGetDllVersion' function\n");
FreeLibrary(hinstLib);
return 1;
}
if (reportID == NULL){
printf("ERROR: unable to find 'FTReportID' function\n");
FreeLibrary(hinstLib);
return 1;
}
if (reportID == NULL){
printf("ERROR: unable to find 'FTProvider' function\n");
FreeLibrary(hinstLib);
return 1;
}
// Print the address of each function
printf("FTGetData is at address: 0x%x\n",getData);
printf("FTGetDllVersion is at address: 0x%x\n",getDllVersion);
printf("FTReportID is at address: 0x%x\n",reportID);
printf("FTProvider is at address: 0x%x\n",provider);
// Call each function and display result
pDllVersion = getDllVersion();
printf("Dll Version: %s\n", pDllVersion);
pProvider = provider();
printf("Provider: %s\n", pProvider);
reportID(name); //not sure what this does - I guess it tells the dll that I am using it.
system("pause"); //wait till keyboard is pressed before entering main loop
while( kbhit() != 1)
{
system("cls"); //clear screen
if (getData(pData))
{
printf("Record ID: %d\n" , data.dataID);
printf("Yaw: %5.2f\n" , data.yaw );
printf("Pitch: %5.2f\n" , data.pitch );
printf("Roll: %5.2f\n" , data.roll );
printf("X: %5.2f\n" , data.x );
printf("Y: %5.2f\n" , data.y );
printf("Z: %5.2f\n" , data.z );
}
else
{
printf("Nothing returned from getData\n");
//break;
}
}
// Unload DLL file
FreeLibrary(hinstLib);
return 0;
}