#include "ordevice_template_hardware.h"
#include <math.h>
ORDevice_Template_Hardware::ORDevice_Template_Hardware()
{
mSerialPort = 1;
mSerialBaudRate = 19200;
mNetworkAddress = "127.0.0.1";
mNetworkPort = 3001;
mStreaming = true;
mReadState = eORReadStateHeader;
mDataCount = 0;
mAmplitude = 1.0;
mFrequency = 1.0;
mRequest[0] = BYTE_HEADER;
mRequest[1] = BYTE_DATA_PACKET;
mRequest[2] = 0;
mRequest[3] = BYTE_TRAILER;
mPosition[0] = 0;
mPosition[1] = 0;
mPosition[2] = 0;
mRotation[0] = 0;
mRotation[1] = 0;
mRotation[2] = 0;
}
ORDevice_Template_Hardware::~ORDevice_Template_Hardware()
{
}
void ORDevice_Template_Hardware::SetParent(FBDevice* pParent)
{
mParent = pParent;
}
bool ORDevice_Template_Hardware::Open()
{
bool lSuccess = false;
switch( GetCommunicationType() )
{
{
mCommPort.PortNumber = mSerialPort;
mCommPort.BaudRate = mSerialBaudRate;
mCommPort.ByteSize = 8;
mCommPort.StopBits = 1;
mCommPort.UseHardwareFC = false;
mCommPort.Active = true;
lSuccess = (
bool) mCommPort.Active;
}
break;
{
{
lSuccess = mTCPIP.Connect( mNetworkSocket, mNetworkAddress, mNetworkPort );
if( !lSuccess )
{
mTCPIP.CloseSocket( mNetworkSocket );
}
}
}
break;
{
lSuccess = false;
}
break;
{
lSuccess = true;
}
break;
}
mReadState = eORReadStateHeader;
mDataCount = 0;
return lSuccess;
}
bool ORDevice_Template_Hardware::Close()
{
bool lSuccess = false;
switch( GetCommunicationType() )
{
{
mCommPort.Active = false;
lSuccess = (mCommPort.Active == false);
}
break;
{
lSuccess = mTCPIP.CloseSocket( mNetworkSocket );
}
break;
{
lSuccess = true;
}
break;
}
return lSuccess;
}
bool ORDevice_Template_Hardware::PollData()
{
bool lSuccess = false;
int lBytesWritten = 0;
lSuccess = WriteData( mRequest, MAX_REQUEST_SIZE, &lBytesWritten );
return lSuccess;
}
int ORDevice_Template_Hardware::FetchData()
{
bool lSuccess = false;
int lBytesRead = 0;
int lPacketsRead= 0;
unsigned char lByte = 0;
unsigned char lCheckSum = 0;
lSuccess = ReadData( mBuffer, MAX_BUFFER_SIZE, &lBytesRead );
for( i=0; i<lBytesRead; i++ )
{
switch( mReadState )
{
case eORReadStateHeader:
{
if( lByte == BYTE_HEADER )
{
mReadState = eORReadStateType;
}
}
break;
case eORReadStateType:
{
if( lByte == BYTE_DATA_PACKET )
{
mDataCount = 0;
mReadState = eORReadStateData;
}
else
{
mReadState = eORReadStateHeader;
}
}
break;
case eORReadStateData:
{
mData[mDataCount] = lByte;
mDataCount++;
if( mDataCount >= MAX_DATA_SIZE )
{
mReadState = eORReadStateCRC;
}
}
break;
case eORReadStateCRC:
{
lCheckSum = 0;
for( j=0; j<MAX_DATA_SIZE; j++ )
{
lCheckSum += mData[j];
}
if( lByte == lCheckSum )
{
mPosition[0] = (short) (mData[0] << 8 | mData[1] << 0);
mPosition[1] = (short) (mData[2] << 8 | mData[3] << 0);
mPosition[2] = (short) (mData[4] << 8 | mData[5] << 0);
mRotation[0] = (short) (mData[6] << 8 | mData[7] << 0);
mRotation[1] = (short) (mData[8] << 8 | mData[9] << 0);
mRotation[2] = (short) (mData[10] << 8 | mData[11] << 0);
mReadState = eORReadStateTrailer;
}
else
{
mReadState = eORReadStateHeader;
}
}
break;
case eORReadStateTrailer:
{
if( lByte == BYTE_TRAILER )
{
lPacketsRead++;
mReadState = eORReadStateHeader;
}
}
break;
}
}
return lPacketsRead;
}
bool ORDevice_Template_Hardware::GetSetupInfo()
{
unsigned char lPacket[ MAX_REQUEST_SIZE ];
bool lSuccess = false;;
int lBytesWritten, lBytesRead;
bool lStatus[8];
bool lStreaming;
lStreaming = GetStreaming();
if( lStreaming )
{
StopStream();
}
EmptyBuffer();
lPacket[0] = BYTE_HEADER;
lPacket[1] = BYTE_INFO_PACKET;
lPacket[2] = 0;
lPacket[3] = BYTE_TRAILER;
lSuccess = WriteData( lPacket, MAX_REQUEST_SIZE, &lBytesWritten );
if( lSuccess )
{
lSuccess = ReadData( lPacket, MAX_REQUEST_SIZE, &lBytesRead );
if( lSuccess )
{
lStatus[0] = (lPacket[2] & 0x01) == 0x01;
lStatus[1] = (lPacket[2] & 0x02) == 0x02;
lStatus[2] = (lPacket[2] & 0x04) == 0x04;
lStatus[3] = (lPacket[2] & 0x08) == 0x08;
lStatus[4] = (lPacket[2] & 0x10) == 0x01;
lStatus[5] = (lPacket[2] & 0x20) == 0x02;
lStatus[6] = (lPacket[2] & 0x40) == 0x04;
lStatus[7] = (lPacket[2] & 0x80) == 0x08;
}
}
if( lStreaming )
{
StartStream();
}
return lSuccess;
}
bool ORDevice_Template_Hardware::StartStream()
{
unsigned char lPacket[ MAX_REQUEST_SIZE ];
bool lSuccess = false;
int lBytesWritten;
lPacket[0] = BYTE_HEADER;
lPacket[1] = BYTE_STREAM_START;
lPacket[2] = 0;
lPacket[3] = BYTE_TRAILER;
lSuccess = WriteData( lPacket, MAX_REQUEST_SIZE, &lBytesWritten );
return lSuccess;
}
bool ORDevice_Template_Hardware::StopStream()
{
unsigned char lPacket[ MAX_REQUEST_SIZE ];
bool lSuccess = false;
int lBytesWritten;
lPacket[0] = BYTE_HEADER;
lPacket[1] = BYTE_STREAM_STOP;
lPacket[2] = 0;
lPacket[3] = BYTE_TRAILER;
lSuccess = WriteData( lPacket, MAX_REQUEST_SIZE, &lBytesWritten );
return lSuccess;
}
bool ORDevice_Template_Hardware::ReadData( unsigned char* pBuffer, int pSize, int* pNumberOfBytesRead )
{
bool lSuccess = false;
switch( GetCommunicationType() )
{
{
lSuccess = mCommPort.Read( pBuffer, pSize, pNumberOfBytesRead);
}
break;
{
lSuccess = mTCPIP.Read( mNetworkSocket, pBuffer, pSize, pNumberOfBytesRead);
}
break;
{
lSuccess = false;
}
break;
{
lSuccess = true;
if( pSize == MAX_BUFFER_SIZE )
{
short lPos[3], lRot[3];
unsigned char lCheckSum;
FBTime lTime;
lTime = mSystem.SystemTime;
lPos[0] = (short) 100*mAmplitude*sin(mFrequency*lTime.GetSecondDouble());
lPos[1] = (short) 100*mAmplitude*sin(mFrequency*lTime.GetSecondDouble());
lPos[2] = (short) 100*mAmplitude*sin(mFrequency*lTime.GetSecondDouble());
lRot[0] = 0;
lRot[1] = 0;
lRot[2] = 0;
pBuffer[0] = BYTE_HEADER;
pBuffer[1] = BYTE_DATA_PACKET;
pBuffer[2] = (unsigned char) (lPos[0] >> 8 );
pBuffer[3] = (unsigned char) (lPos[0] >> 0 );
pBuffer[4] = (unsigned char) (lPos[1] >> 8 );
pBuffer[5] = (unsigned char) (lPos[1] >> 0 );
pBuffer[6] = (unsigned char) (lPos[2] >> 8 );
pBuffer[7] = (unsigned char) (lPos[2] >> 0 );
pBuffer[8] = (unsigned char) (lRot[0] >> 8 );
pBuffer[9] = (unsigned char) (lRot[0] >> 0 );
pBuffer[10] = (unsigned char) (lRot[1] >> 8 );
pBuffer[11] = (unsigned char) (lRot[1] >> 0 );
pBuffer[12] = (unsigned char) (lRot[2] >> 8 );
pBuffer[13] = (unsigned char) (lRot[2] >> 0 );
lCheckSum = 0;
for( i=0; i<MAX_DATA_SIZE; i++ )
{
lCheckSum += pBuffer[2+
i];
}
pBuffer[14] = lCheckSum;
pBuffer[15] = BYTE_TRAILER;
if( pNumberOfBytesRead )
{
(*pNumberOfBytesRead) = 2 + MAX_DATA_SIZE + 2;
}
}
}
break;
}
return lSuccess;
}
bool ORDevice_Template_Hardware::WriteData( unsigned char* pBuffer, int pSize, int* pNumberOfBytesWritten )
{
bool lSuccess = false;
switch( GetCommunicationType() )
{
{
lSuccess = mCommPort.Write( mRequest, MAX_REQUEST_SIZE, pNumberOfBytesWritten );
}
break;
{
lSuccess = mTCPIP.Write( mNetworkSocket, mRequest, MAX_REQUEST_SIZE, pNumberOfBytesWritten );
}
break;
{
lSuccess = false;
}
break;
{
lSuccess = true;
}
break;
}
return lSuccess;
}
void ORDevice_Template_Hardware::EmptyBuffer()
{
unsigned char lBuffer[4096];
switch( GetCommunicationType() )
{
{
mCommPort.EmptyBuffer();
}
break;
{
mTCPIP.ReadBlocking(mNetworkSocket, lBuffer, 4096 );
}
break;
{
mTCPIP.Read( mNetworkSocket, lBuffer, 4096 );
}
break;
{
}
break;
}
}
void ORDevice_Template_Hardware::GetPosition(double* pPos)
{
pPos[0] = mPosition[0];
pPos[1] = mPosition[1];
pPos[2] = mPosition[2];
}
void ORDevice_Template_Hardware::GetRotation(double* pRot)
{
pRot[0] = mRotation[0];
pRot[1] = mRotation[1];
pRot[2] = mRotation[2];
}
void ORDevice_Template_Hardware::SetCommunicationType(
FBCommType pType)
{
mParent->CommType = pType;
}
int ORDevice_Template_Hardware::GetCommunicationType()
{
return mParent->CommType;
}