#include "StdAfx.h"
#include "CTD_TCP.h"
#include "TCPClient.h"


CTD_TCP::CTD_TCP( Status *pStatus ) :
	  m_pStatus					( pStatus )
	, m_pCTDData				( NULL )
	, m_bInitialized			( false )
	, m_bState					( false )
	, m_bForceTemp				( false )
	, m_waterPressure_dbar	( 0.0f )
	, m_waterSalinity_psu	( 0.0f )
	, m_waterTemp_C			( 0.0f )
	, m_fForceTemp				( 0.0f )
	, m_port						( 0 )
	, m_threadWriteCTD		( "Write CTD",  SysThread::PRI_ACQUIRE )
{
}

CTD_TCP::~CTD_TCP()
{
}

bool CTD_TCP::Initialize( char *strIP,  int port )
{
	bool bRtn = false;
	m_port = port;

	m_pCTDData = new TCPClient( strIP /*EC_IP_Address*/, m_port, m_pStatus, "CTD" );

	if( m_pCTDData )
	{
		m_threadWriteCTD.Start ( ThreadEntry,  (void*) this );
		bRtn = true;
	}
	return bRtn;
}



// static thread entry function
void CTD_TCP::ThreadEntry( void *pThreadObj )
{
	((CTD_TCP*) pThreadObj)->CommWriteCTDThread();
}

// Thread function to read packets from the EC
void CTD_TCP::CommWriteCTDThread()
{
	SysPerfTimer			ckSumTimer;

	ckSumTimer.StartTimer();

	while( true )
	{
		// Initialize comm, and wait for the initial status packet from the EC
		while( !m_bInitialized )
		{
			m_pStatus->PrintStatus( "CTD: Waiting for connection, port %d...\n", m_port );
			m_bInitialized = m_pCTDData->Initialize( TCP_WAITFOREVER );
			if( m_bInitialized )
			{
				m_pStatus->PrintStatus( "CTD: Connected, port %d\n", m_port );
				break;
			}
		}

		if( m_bState )
		{
			if( m_bForceTemp )
			{
				m_CTDPacket.waterPressure_dbar = 0.0;
				m_CTDPacket.waterSalinity_psu  = 0.0; 
				m_CTDPacket.waterTemp_C        = (double)m_fForceTemp;
			}
			else
			{
				m_CTDPacket.waterPressure_dbar = (double)( rand() % 3 ) + 500.0;
				m_CTDPacket.waterSalinity_psu  = (double)( rand() % 3 ) + 30.0;
				m_CTDPacket.waterTemp_C        = (double)( rand() % 3 ) + 10.0;
			}

			m_semCTDdata.Lock();
			m_waterPressure_dbar		= (float)m_CTDPacket.waterPressure_dbar;
			m_waterSalinity_psu		= (float)m_CTDPacket.waterSalinity_psu;;
			m_waterTemp_C				= (float)m_CTDPacket.waterTemp_C;;
			m_semCTDdata.Unlock();
  
//			double elapsedTime_s = ckSumTimer.GetElapsedTime();
//			if( elapsedTime_s > 50.0 )
//			{
//				ckSumTimer.StartTimer();
//				m_pStatus->PrintStatus( "TCP CTD - sending invalid project code ...timer: %.3ff\n", (float)elapsedTime_s );
//
//				// occasionally, clear the project code - verify EC responds correctly
//				UINT16 uProjectCode                    = m_CTDPacket.m_PacketHdr.m_uProjectCode;
//				m_CTDPacket.m_PacketHdr.m_uProjectCode = 0;
//				m_pCTDData->SendPacket( &m_CTDPacket );
//				m_CTDPacket.m_PacketHdr.m_uProjectCode = uProjectCode;
//			}
//			else
			{
				if( !m_pCTDData->SendPacket( &m_CTDPacket ) )
				{
					m_pStatus->PrintStatus( "CTD: Lost Connection" );
					m_pCTDData->Kill();
					m_bInitialized = false;
				}
			}
		}

		Sleep( 500 );
	}
}


