//  Copyright (c) 2001, Reson, Inc. All Rights Reserved.
//
//  Filename:   EdgeTechMessage.h
//
//  Project:    6046
//
//  Author(s):  W. Arcus
//
//  Purpose:    Provides the edgetech system definitions to interface to the FS-AU sonar
//              and the message handler helper class CEdgeTechMessage.
//
//  Notes:      Nil.
/**
 *  2012-10-24  EJM : Modified for use in MBARI linux code
 *
 */

#ifndef EDGETECHMESSAGE_H_
#define EDGETECHMESSAGE_H_

#include "EdgeTechHeaders.h"
#ifdef _QNX
#include <mem.h>
#endif
#ifndef _QNX
#include <memory>
#endif
#include <string.h>
#include <assert.h>
#include <stdio.h>
#include <time.h>

class EdgeTechMessage {
public:

	///////////////
	// Services.

	// Encoding

	EdgeTechMessage(unsigned short unMessage = SONAR_MESSAGE_NONE, unsigned char ucCommand = SONAR_COMMAND_GET, unsigned char ucSessionID = 0, unsigned char ucSubSystem = 0, unsigned char ucChannel = 0);

	bool SetHeader(unsigned short unMessage = SONAR_MESSAGE_NONE, unsigned char ucCommand = SONAR_COMMAND_GET, unsigned char ucSessionID = 0, unsigned char ucSubSystem = 0, unsigned char ucChannel = 0);

	bool SetMessage(unsigned short unMessage = SONAR_MESSAGE_NONE, unsigned char ucCommand = SONAR_COMMAND_GET, unsigned char *pbyMessage = NULL, unsigned long ulBytesInMessage = 0, unsigned char ucSessionID = 0, unsigned char ucSubSystem = 0, unsigned char ucChannel = 0);

	bool SetDevMessage(unsigned short unMessage = SONAR_MESSAGE_NONE, unsigned char ucCommand = SONAR_COMMAND_GET, unsigned char *pbyMessage = NULL, unsigned long ulBytesInMessage = 0, unsigned char ucSessionID = 0, unsigned char ucSubSystem = 0, unsigned char ucChannel = 0);

	// Decoding

	EdgeTechMessage(SonarMessageHeaderType *pHeader);

	bool SetHeader(SonarMessageHeaderType *pHeader);

	// Destruction.

	virtual ~EdgeTechMessage(void);

	// Copy and assignment.

	EdgeTechMessage(const EdgeTechMessage &rRhs);
	EdgeTechMessage &
	operator =(const EdgeTechMessage &rRhs);

	static unsigned long HeaderSize(void);

	// Conversion operators for the message data itself.

	unsigned long MessageSize(void) const;
	unsigned char * Message(void) const;

	unsigned short SonarMessage(void) const;
	unsigned char SonarCommand(void) const;
	unsigned char Subsystem(void) const;

	operator SonarMessageHeaderType *(void) const;
	operator SonarMessageStatusType *(void) const;
	operator TimestampType *(void) const;
	operator SonarMessagePingType *(void) const;
	operator SonarMessageWindowType *(void) const;
	operator SonarMessageFishType *(void) const;
	operator SegyDataType *(void) const;
	operator SidescanHeaderType *(void) const;
	operator SonarMessageCouplingParametersType *(void) const;
	operator DEVPressureType *(void) const;
	operator DEVDataType *(void) const;
	operator DataLoggingStatusType *(void) const;

	operator char *(void) const;

	operator long(void) const;
	operator unsigned long(void) const;

private:

	///////////////
	// Definitions.

	class CBufferManager {
	public:

		CBufferManager(void);
		CBufferManager(const CBufferManager &rRhs);

		virtual ~CBufferManager(void);

		CBufferManager & operator =(const CBufferManager &rRhs);

		bool SetBuffer(unsigned char *pbyBuffer, const unsigned long &rulMaxSize, const bool &rbAllocate = false);

		unsigned char * GetMessage(void);

		unsigned long MessageSize(void) const;

	private:

		void Release(void);

		unsigned char *m_pbyBuffer;
		unsigned long m_ulBufferSize;
		bool m_bIsOwner;
	};

	///////////////
	// Attributes.

	const unsigned long m_ulMessageHeaderSize;
	const unsigned long m_ulMaxMessageLength;
	const unsigned long m_ulDevHeaderSize;

	//std::auto_ptr<CBufferManager> m_pMessageBuffer;
	CBufferManager * m_pMessageBuffer;
	unsigned char * OptionalData(void) const;
	unsigned char * OptionalDEVData(void) const;

};

#endif // !defined(AFX_EDGETECHMESSAGE_H__7E09BC72_0D48_4C00_93FA_2810FD7481F8__INCLUDED_)
