#include "ordevicesync_device.h"
#include <math.h>
#define ORDEVICESYNCTEMPLATE__CLASS ORDEVICESYNCTEMPLATE__CLASSNAME
#define ORDEVICESYNCTEMPLATE__NAME ORDEVICESYNCTEMPLATE__CLASSSTR
#define ORDEVICESYNCTEMPLATE__LABEL "OR - Sync Device Template"
#define ORDEVICESYNCTEMPLATE__DESC "OR - Synchronized Device Template Description"
#define ORDEVICESYNCTEMPLATE__PREFIX "SyncDevice"
ORDEVICESYNCTEMPLATE__CLASS,
ORDEVICESYNCTEMPLATE__LABEL,
ORDEVICESYNCTEMPLATE__DESC,
bool ORDeviceSync_Template::FBCreate()
{
PacketBufferSize = 100;
if( FBDeviceSync::FBCreate() )
{
mFirstPacket = true;
FBTime lPeriod(0);
SamplingPeriod = lPeriod;
for(
int i=0;
i<PacketBufferSize;
i++ )
{
FBDeviceSync::PacketRegister( new ORDeviceSync_Template_Packet );
}
return true;
}
return false;
}
void ORDeviceSync_Template::FBDestroy()
{
while( FBDeviceSync::PacketGetCount() > 0 )
{
ORDeviceSync_Template_Packet* lPacket = (ORDeviceSync_Template_Packet*)FBDeviceSync::PacketRemove(0);
delete lPacket;
}
FBDevice::FBDestroy();
}
bool ORDeviceSync_Template::DeviceOperation( kDeviceOperations pOperation )
{
switch (pOperation)
{
case kOpInit: return Init();
case kOpStart: return Start();
case kOpStop: return Stop();
case kOpReset: Stop(); return Start();
case kOpDone: return Done();
}
return FBDevice::DeviceOperation( pOperation );
}
bool ORDeviceSync_Template::Init()
{
FBProgress lProgress;
lProgress.Caption = "Initializing Device";
lProgress.Text = "Initializing device...";
Status = "Initializing device...";
if(!mHardware.Init())
{
lProgress.Text = "Could not open device!";
Status = "Could not open device!";
return false;
}
lProgress.Text = "Device Initialized.";
Status = "Device Initialized.";
return true;
}
bool ORDeviceSync_Template::Start()
{
FBProgress lProgress;
lProgress.Caption = "Starting Up Device";
lProgress.Text = "Opening device communications...";
Status = "Opening device communications...";
if(!mHardware.Open())
{
lProgress.Text = "Opening device communications";
Status = "Opening device communications";
return false;
}
lProgress.Text = "Getting Setup Info...";
Status = "Getting Setup Info...";
if(!mHardware.GetSetupInfo())
{
lProgress.Text = "Could not get setup info!";
Status = "Could not get setup info!";
return false;
}
lProgress.Text = "Starting Streaming Mode...";
Status = "Starting Streaming Mode...";
if(!mHardware.StartDataStream())
{
lProgress.Text = "Could not start streaming!";
Status = "Could not start streaming!";
return false;
}
lProgress.Text = "Device Started.";
Status = "OK";
mFirstPacket = true;
mRecordStartTime.Set( 0 );
mFirstPacketTime.Set( 0 );
return true;
}
bool ORDeviceSync_Template::Stop()
{
FBProgress lProgress;
lProgress.Caption = "Shutting down device";
lProgress.Text = "Sending STOP STREAM command";
Status = "Stopping device streaming";
if(!mHardware.StopDataStream())
{
Status = "Could not stop streaming";
return false;
}
lProgress.Text = "Stopping device communications";
Status = "Stopping device communications";
if(!mHardware.Close())
{
Status = "Could not close device";
return false;
}
Status = "?";
return false;
}
bool ORDeviceSync_Template::Done()
{
FBProgress lProgress;
lProgress.Caption = "Shutting Down Device";
lProgress.Text = "Stopping device...";
Status = "Stopping device...";
if(!mHardware.Close())
{
lProgress.Text = "Could not stop device!";
Status = "Could not stop device!";
return true;
}
return false;
}
bool ORDeviceSync_Template::DeviceSyncAnimationNodeNotify(FBAnimationNode* pAnimationNode, FBEvaluateInfo* pEvaluateInfo, int pCorrectedSync)
{
ORDeviceSync_Template_Packet* lPacket;
lPacket = (ORDeviceSync_Template_Packet*)FBDeviceSync::PacketFetch( pCorrectedSync );
if( lPacket )
{
mNodeCamera_InData->WriteData( &(lPacket->Data), pEvaluateInfo );
}
FBDeviceSync::PacketRelease( lPacket );
return true;
}
void ORDeviceSync_Template::DeviceIONotify( kDeviceIOs pAction,FBDeviceNotifyInfo &pDeviceNotifyInfo)
{
int lSyncCount = pDeviceNotifyInfo.GetSyncCount();
int lPacketCount = 0;
FBTime lRecordTime;
switch (pAction)
{
case kIOPlayModeWrite:
case kIOStopModeWrite:
break;
case kIOStopModeRead:
case kIOPlayModeRead:
{
ORDeviceSync_Template_Packet* lPacket = (ORDeviceSync_Template_Packet*)FBDeviceSync::PacketLock();
{
while( lPacket && mHardware.FetchDataPacket() )
{
lPacket->OriginalSync = lSyncCount;
lPacket->DeviceSync = mHardware.GetSync();
lPacket->Data = mHardware.GetData();
lPacket->Time = mHardware.GetTime();
if( mNodeCamera_InData->GetAnimationToRecord() )
{
if( mFirstPacket )
{
mFirstPacket = false;
mRecordStartTime = pDeviceNotifyInfo.GetLocalTime();
mFirstPacketTime = lPacket->Time;
}
}
lRecordTime = (lPacket->Time-mFirstPacketTime) + mRecordStartTime;
DeviceRecordFrame( lRecordTime, lPacket );
AckOneSampleReceived();
lPacketCount++;
FBDeviceSync::PacketUnlock( lPacket, true );
lPacket = (ORDeviceSync_Template_Packet*)FBDeviceSync::PacketLock();
}
}
if( lPacket )
{
FBDeviceSync::PacketUnlock(lPacket, false);
}
}
break;
}
}
void ORDeviceSync_Template::RecordingDoneAnimation( FBAnimationNode* pAnimationNode )
{
FBDeviceSync::RecordingDoneAnimation( pAnimationNode );
mFirstPacket = true;
}
void ORDeviceSync_Template::DeviceRecordFrame(FBTime &pRecordTime, ORDeviceSync_Template_Packet* pPacket)
{
{
FBAnimationNode* lData;
lData = mNodeCamera_InData->GetAnimationToRecord();
if( lData )
{
lData->KeyAdd( pRecordTime, &(pPacket->Data) );
}
}
}
bool ORDeviceSync_Template::FbxStore(FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat)
{
{
}
return true;
}
bool ORDeviceSync_Template::FbxRetrieve(FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat)
{
{
}
return true;
}