#include "fileio.h"
#include <string>
#include <direct.h>
#include <cstdlib>
#include <sys/timeb.h>
using namespace std;
bool FileExist( const char* pFileName )
{
bool lReturn = false;
fopen_s( &lFile, pFileName, "r" );
{
lReturn = true;
fclose(lFile);
}
return lReturn;
}
FileIO::FileIO():
mFilePath(""),
mStatus(eFileIOExport_Stop),
mCurrentIndex(0)
{}
FileIO::~FileIO()
{
delete mFile;
ClearMocapJointsStateArray();
}
const char* gRecordingDir = "//..//recording";
const char* gMocapFile = "//mocap.txt";
bool FileIO::Open(bool pReadOnly)
{
FBString lDir = FBString( FBSystem().TheOne().UserConfigPath ) + gRecordingDir;
if( !FileExist( lDir ) )
{
_mkdir(lDir);
}
lDir = FBString(lDir) + gMocapFile;
mFilePath = lDir;
if( pReadOnly )
fopen_s(&mFile, mFilePath,"r");
else
fopen_s(&mFile, mFilePath,"a+");
return true;
return false;
}
const int gMaxBufferSize = 200;
const int gFixedJointCount = 20;
const char* gEmptyFrameStr = "EMPTY_FRAME\n";
const char* gValidFrameStr = "VALID_FRAME\n";
const char* gValidFrameEndStr = "VALID_FRAME_END\n";
const char* gFloorClipPlaneWStr = "FloorClipPlane\n";
const char* gSkeletonJointsCountStr = "SkeletonJointsCount\n";
const char* gSkeletonPositionStr = "SkeletonPosition\n";
const char* gSkeletonTrackingStateStr = "SkeletonTrackingState\n";
const char* gSkeletonJointsPositionsStr = "SkeletonJointsPositions\n";
const char* gSkeletonJointsGlobalOrientationsStr = "SkeletonJointsGlobalOrientations\n";
const char* gSkeletonJointTrackingStateStr = "SkeletonJointTrackingState\n";
bool FileIO::Export(FBMocapJointsState* pState)
{
if( mStatus != eFileIOExport_Start )
return false;
if( !Open() )
return false;
{
Write("\n");
Write(gEmptyFrameStr);
Close();
return true;
}
Write("\n");
WriteTitle(gValidFrameStr);
WriteTitle(gFloorClipPlaneWStr);
Write(pState->mFloorClipPlaneW);
Write("\n");
WriteTitle(gSkeletonJointsCountStr);
Write(pState->mSkeletonJointsCount);
Write("\n");
WriteTitle(gSkeletonPositionStr);
Write(pState->mSkeletonPosition);
Write("\n");
WriteTitle(gSkeletonTrackingStateStr);
Write((int)(pState->mSkeletonTrackingState));
Write("\n");
WriteTitle(gSkeletonJointsPositionsStr);
for(
int i=0;
i<pState->mSkeletonJointsCount;
i++)
{
Write(pState->mSkeletonJointsPositions[
i]);
Write("\n");
}
WriteTitle(gSkeletonJointsGlobalOrientationsStr);
for(
int i=0;
i<pState->mSkeletonJointsCount;
i++)
{
Write(pState->mSkeletonJointsGlobalOrientations[
i]);
Write("\n");
}
WriteTitle(gSkeletonJointTrackingStateStr);
for(
int i=0;
i<pState->mSkeletonJointsCount;
i++)
{
Write(pState->mSkeletonJointTrackingState[
i]);
Write("\n");
}
Write("\n");
WriteTitle(gValidFrameEndStr);
Write("\n");
Close();
return true;
}
void FileIO::Close()
{
if(mFile)
fclose(mFile);
}
bool FileIO::FetchMocapData(FBMocapJointsState* pKinectMocapJointsState)
{
if( mStatus == eFileIOImport_Start &&
mCurrentIndex < mMocapJointsStateArray.GetCount() )
{
FBMocapJointsState* lTemp = mMocapJointsStateArray.GetAt(mCurrentIndex);
pKinectMocapJointsState->mSkeletonJointsCount = lTemp->mSkeletonJointsCount;
pKinectMocapJointsState->mSkeletonTrackingState = lTemp->mSkeletonTrackingState;
pKinectMocapJointsState->mSkeletonPosition = lTemp->mSkeletonPosition;
pKinectMocapJointsState->mFloorClipPlaneW = lTemp->mFloorClipPlaneW;
for(
int i=0;
i<pKinectMocapJointsState->mSkeletonJointsCount;
i++)
{
pKinectMocapJointsState->mSkeletonJointTrackingState[
i] = lTemp->mSkeletonJointTrackingState[
i];
pKinectMocapJointsState->mSkeletonJointsPositions[
i] = lTemp->mSkeletonJointsPositions[
i];
pKinectMocapJointsState->mSkeletonJointsGlobalOrientations[
i] = lTemp->mSkeletonJointsGlobalOrientations[
i];
}
mCurrentIndex++;
return true;
}
return false;
}
void FileIO::WriteTitle(const char* pS)
{
fputs("\n", mFile);
fputs(pS, mFile);
fputs("\n", mFile);
}
void FileIO::Write(const char* pS)
{
fputs(pS, mFile);
}
void FileIO::Write(const int& pNumber)
{
s = std::to_string( pNumber );
fputs(s.c_str(), mFile);
}
void FileIO::Write(const double& pNumber)
{
s = std::to_string( pNumber );
fputs(s.c_str(), mFile);
}
{
{
s = std::to_string( d );
fputs(s.c_str(), mFile);
fputs("\t", mFile);
}
}
void FileIO::Write(const FBMatrix& pM)
{
{
s = std::to_string( d );
fputs(s.c_str(), mFile);
fputs("\t", mFile);
}
}
bool FileIO::StringToDouble(const char* pString, double& pNumber)
{
try
{
pNumber = atof(pString);
}
catch(const std::invalid_argument&)
{
return false;
}
catch(const std::out_of_range&)
{
return false;
}
return true;
}
{
if(Open(true))
{
char lBuffer[gMaxBufferSize];
while( fgets(lBuffer, gMaxBufferSize, mFile) )
{
if(strcmp(lBuffer, "\n") == 0)
{
continue;
}
else if(strcmp(lBuffer, gEmptyFrameStr) == 0)
{
LoadEmptyFrame();
}
else if(strcmp(lBuffer, gValidFrameStr) == 0)
{
LoadValidFrame();
}
}
Close();
}
return false;
}
bool FileIO::LoadEmptyFrame()
{
return true;
}
bool FileIO::LoadValidFrame()
{
FBMocapJointsState* lState = new FBMocapJointsState(gFixedJointCount);
char lBuffer[gMaxBufferSize];
while( fgets(lBuffer, gMaxBufferSize, mFile) )
{
if(strcmp(lBuffer, "\n") == 0 )
{
continue;
}
else if(strcmp(lBuffer, gSkeletonJointsCountStr) == 0 )
{
fgets(lBuffer, gMaxBufferSize, mFile);
fgets(lBuffer, gMaxBufferSize, mFile);
ReadInt(lBuffer, lState->mSkeletonJointsCount);
}
else if(strcmp(lBuffer, gFloorClipPlaneWStr) == 0 )
{
fgets(lBuffer, gMaxBufferSize, mFile);
fgets(lBuffer, gMaxBufferSize, mFile);
ReadDouble(lBuffer, lState->mFloorClipPlaneW);
}
else if(strcmp(lBuffer, gSkeletonPositionStr) == 0)
{
fgets(lBuffer, gMaxBufferSize, mFile);
fgets(lBuffer, gMaxBufferSize, mFile);
ReadVector(lBuffer, lState->mSkeletonPosition);
}
else if(strcmp(lBuffer, gSkeletonTrackingStateStr) == 0 )
{
fgets(lBuffer, gMaxBufferSize, mFile);
int lTemp;
fgets(lBuffer, gMaxBufferSize, mFile);
ReadInt(lBuffer, lTemp);
}
else if(strcmp(lBuffer, gSkeletonJointsPositionsStr) == 0 )
{
fgets(lBuffer, gMaxBufferSize, mFile);
for(
int i=0;
i<gFixedJointCount;
i++)
{
fgets(lBuffer, gMaxBufferSize, mFile);
ReadVector(lBuffer, lState->mSkeletonJointsPositions[
i]);
}
}
else if(strcmp(lBuffer, gSkeletonJointsGlobalOrientationsStr) == 0 )
{
fgets(lBuffer, gMaxBufferSize, mFile);
for(
int i=0;
i<gFixedJointCount;
i++)
{
fgets(lBuffer, gMaxBufferSize, mFile);
ReadMatrix(lBuffer, lState->mSkeletonJointsGlobalOrientations[
i]);
}
}
else if(strcmp(lBuffer, gSkeletonJointTrackingStateStr) == 0 )
{
fgets(lBuffer, gMaxBufferSize, mFile);
for(
int i=0;
i<gFixedJointCount;
i++)
{
int lTemp;
fgets(lBuffer, gMaxBufferSize, mFile);
ReadInt(lBuffer, lTemp);
}
}
else if(strcmp(lBuffer, gValidFrameEndStr) == 0 )
{
break;
}
}
mMocapJointsStateArray.Add(lState);
return true;
}
bool FileIO::ReadLine(char* pBuffer, double* pData, int pLength)
{
string str2;
size_t lPos = 0;
if(lPos == string::npos)
{
StringToDouble(
str.c_str(), pData[0]);
return true;
}
do
{
str2 =
str.substr(0, lPos);
double lTemp = 0.0;
StringToDouble(str2.c_str(), lTemp);
assert(i<pLength);
i++;
} while (lPos != string::npos);
return true;
}
bool FileIO::ReadInt(char* pBuffer, int& pNumber)
{
double lNumber;
ReadLine(pBuffer, &lNumber, 1);
return true;
}
bool FileIO::ReadDouble(char* pBuffer, double& pNumber)
{
return ReadLine(pBuffer, &pNumber, 1);
}
bool FileIO::ReadVector(
char* pBuffer,
FBTVector& pV)
{
return ReadLine(pBuffer, &(pV.mValue[0]), 3);
}
bool FileIO::ReadMatrix(char* pBuffer, FBMatrix& pM)
{
double lTemp[16];
memset(lTemp, 0.0, sizeof(double) * 16);
ReadLine(pBuffer, lTemp, 16);
pM = FBMatrix(lTemp);
return true;
}
FileIOStatus FileIO::GetStatus()
{
return mStatus;
}
void FileIO::SetStatus( FileIOStatus pState )
{
if( pState == eFileIOImport_Start && mCurrentIndex == mMocapJointsStateArray.GetCount() )
mCurrentIndex = 0;
if( pState == eFileIOImport_Loading )
{
mCurrentIndex = 0;
ClearMocapJointsStateArray();
Close();
pState = eFileIOImport_WaitForCalibration;
}
mStatus = pState;
}
void FileIO::ClearMocapJointsStateArray()
{
for(int i=0; i<mMocapJointsStateArray.GetCount(); i++)
{
FBMocapJointsState* lState = mMocapJointsStateArray[
i];
delete lState;
}
mMocapJointsStateArray.Clear();
}