#pragma once
#include "Status.h"
#include "SysThread.h"
#include "SysSemaphore.h"
#include "SysPerfTimer.h"

class TCPClient;

#pragma pack(1)
class CTDPacketHdr
{
public:
	enum
	{
		// packet Hdr constants
		HDR_TAG						 = 0x3D03,
		HDR_VERSION					 = 0x01,
		HDR_SIZE						 = sizeof(UINT16) + sizeof(UINT8)
	};

	CTDPacketHdr() :
		m_uProjectCode( HDR_TAG ),
		m_uVersion( HDR_VERSION )
	{
	}
	~CTDPacketHdr(void){};

	void *DataStart()     { return &m_uProjectCode; }

	UINT16		m_uProjectCode;
	UINT8			m_uVersion;
};

class CTDPacket
{
public:
	enum
	{
		// packet Hdr constants
		PACKET_DATA_SIZE			 = sizeof(double)*3,
	};

	CTDPacket() :
		waterTemp_C(0.0),
		waterSalinity_psu(0.0),
		waterPressure_dbar(0.0)
		{}
	~CTDPacket(){}

	UINT16 Length()         { return CTDPacketHdr::HDR_SIZE + PACKET_DATA_SIZE; }
	void *HdrStart()        { return m_PacketHdr.DataStart(); }
	void *DataStart()       { return &waterTemp_C; }

	CTDPacketHdr		m_PacketHdr;
   double				waterTemp_C;
   double				waterSalinity_psu;
   double				waterPressure_dbar;
};
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////


class CTD_TCP
{
public:
	CTD_TCP( Status *pStatus );
	~CTD_TCP();

	bool Initialize( char *strIP,  int port );
	void SetState( bool bStartStop ) { m_bState = bStartStop; }
	void GetCTD( float *pWaterTemp_C, float *pWaterSalinity_psu, float *pWaterPressure_dbar )
	{
		m_semCTDdata.Lock();
		* pWaterPressure_dbar	= m_waterPressure_dbar;
		*pWaterSalinity_psu		= m_waterSalinity_psu;
		*pWaterTemp_C				= m_waterTemp_C;
		m_semCTDdata.Unlock();
	}
	void ForceTempC( float fForceTempC ) 
	{ 
		m_bForceTemp = true; 
		m_fForceTemp = fForceTempC; 
	}
  
private:
	static void ThreadEntry( void *pThreadObj );
	void						CommWriteCTDThread();
	SysThread				m_threadWriteCTD;

	Status					*m_pStatus;
	TCPClient				*m_pCTDData;
	CTDPacket				m_CTDPacket;
	bool						m_bInitialized;
	bool						m_bState;
	int						m_port;

	float						m_waterPressure_dbar;
	float						m_waterSalinity_psu;
	float						m_waterTemp_C;
	SysSemaphore			m_semCTDdata;

	bool						m_bForceTemp;
	float						m_fForceTemp;
};

#pragma pack()