/*
 * EdgeTechSubsystem.h
 *
 *  Created on: Dec 12, 2012
 *      Author: emartin
 */

#ifndef EDGETECHSUBSYSTEM_H_
#define EDGETECHSUBSYSTEM_H_

#include <unistd.h>
#include <stdio.h>
#include "EdgeTechHeaders.h"

enum subsysId_t {
	SUBSYSID_NONE = -1, SUBSYSID_SB = SUBSYSTEM_OFFSET_SUBBOTTOM,  // 0
	SUBSYSID_SSLF = SUBSYSTEM_OFFSET_SIDESCAN, //20
	SUBSYSID_SSHF							   //21
};
typedef enum subsysId_t subsysId_t;

class EdgeTechSubsystem {
public:

	EdgeTechSubsystem();

	virtual ~EdgeTechSubsystem();

	bool isSSS();
	bool isSBS();
	bool isEnabled();

	subsysId_t getId() const {
		return id;
	}

	void setId(subsysId_t id) {
		if (id == SUBSYSID_SB || id == SUBSYSID_SSHF || id == SUBSYSID_SSLF) {
			this->id = id;
		}
		else {
			this->id = SUBSYSID_NONE;
		}

	}

////
//	const SonarMessageFishType * getAsFishType() const {
//		return m_asFishType;
//	}
//	const SonarMessagePingType * getAsPulseFile() const {
//		return m_asPulseFile;
//	}

	bool isBDataActive() const {
		return m_bDataActive;
	}

	void setBDataActive(bool bDataActive) {
		m_bDataActive = bDataActive;
	}

	long getLAdcagc() const {
		return m_lADCAGC;
	}

	void setLAdcagc(long lAdcagc) {
		m_lADCAGC = lAdcagc;
	}

	long getLAdcGain() const {
		return m_lADCGain;
	}

	void setLAdcGain(long lAdcGain) {
		m_lADCGain = lAdcGain;
	}

	long getLAdcRate() const {
		return m_lADCRate;
	}

	void setLAdcRate(long lAdcRate) {
		m_lADCRate = lAdcRate;
	}

	long getLDirectPathHoldoff() const {
		return m_lDirectPathHoldoff;
	}

	void setLDirectPathHoldoff(long lDirectPathHoldoff) {
		m_lDirectPathHoldoff = lDirectPathHoldoff;
	}

	long getLExternalSoftTriggerDelay() const {
		return m_lExternalSoftTriggerDelay;
	}

	void setLExternalSoftTriggerDelay(long lExternalSoftTriggerDelay) {
		m_lExternalSoftTriggerDelay = lExternalSoftTriggerDelay;
	}

	long getLMaxSamplesPossible() const {
		return m_lMaxSamplesPossible;
	}

	void setLMaxSamplesPossible(long lMaxSamplesPossible) {
		m_lMaxSamplesPossible = lMaxSamplesPossible;
	}

	long getLPingEnable() const {
		return m_lPingEnable;
	}

	void setLPingEnable(long lPingEnable) {
		m_lPingEnable = lPingEnable;
	}

	long getLPingGain() const {
		return m_lPingGain;
	}

	void setLPingGain(long lPingGain) {
		m_lPingGain = lPingGain;
	}

	long getLPingRate() const {
		return m_lPingRate;
	}

	void setLPingRate(long lPingRate) {
		m_lPingRate = lPingRate;
	}

	long getLRangeInMillimeters() const {
		return m_lRangeInMillimeters;
	}

	void setLRangeInMillimeters(long lRangeInMillimeters) {
		m_lRangeInMillimeters = lRangeInMillimeters;
	}

	long getLTestMessageCounter() const {
		return m_lTestMessageCounter;
	}

	void setLTestMessageCounter(long lTestMessageCounter) {
		m_lTestMessageCounter = lTestMessageCounter;
	}

	long getLTriggerMode() const {
		return m_lTriggerMode;
	}

	void setLTriggerMode(long lTriggerMode) {
		m_lTriggerMode = lTriggerMode;
	}

	const SonarMessageCouplingParametersType& getSCouplingParameters() const {
		return m_sCouplingParameters;
	}

	void setSCouplingParameters(
			const SonarMessageCouplingParametersType& sCouplingParameters) {
		m_sCouplingParameters = sCouplingParameters;
	}

	const SonarMessageWindowType& getSDataNetworkWindow() const {
		return m_sDataNetworkWindow;
	}

	void setSDataNetworkWindow(
			const SonarMessageWindowType& sDataNetworkWindow) {
		m_sDataNetworkWindow = sDataNetworkWindow;
	}

	const SonarMessageWindowType& getSEnhanceWindow() const {
		return m_sEnhanceWindow;
	}

	void setSEnhanceWindow(const SonarMessageWindowType& sEnhanceWindow) {
		m_sEnhanceWindow = sEnhanceWindow;
	}

	const char* getSzSelectedPulse() const {
		return m_szSelectedPulse;
	}


	unsigned long getUlNumPulses() const {
		return m_ulNumPulses;
	}

	void setUlNumPulses(unsigned long ulNumPulses) {
		m_ulNumPulses = ulNumPulses;
	}

	unsigned long getUlTimestampOfLastStatusUpdate() const {
		return m_ulTimestampOfLastStatusUpdate;
	}

	void setUlTimestampOfLastStatusUpdate(
			unsigned long ulTimestampOfLastStatusUpdate) {
		m_ulTimestampOfLastStatusUpdate = ulTimestampOfLastStatusUpdate;
	}

	void printStatus(FILE * fid);
	void printPulseList(FILE * fid);
	long getIDataChannels() const {
		return m_iDataChannels;
	}

	void setIDataChannels(long iDataChannels) {
		m_iDataChannels = iDataChannels;
	}

	unsigned long m_ulTimestampOfLastStatusUpdate;
	unsigned long m_ulNumPulses;
	char m_szSelectedPulse[ulMaxPulseFileNameLength_c];

	SonarMessageWindowType m_sDataNetworkWindow;
	SonarMessageWindowType m_sEnhanceWindow;
	SonarMessageCouplingParametersType m_sCouplingParameters;

	SonarMessagePingType m_asPulseFile[ulMaxPulseFiles_c];
	SonarMessageFishType m_asFishType[ulMaxFishTypes_c];

private:

	subsysId_t id;

	bool m_bDataActive;

	long m_lTestMessageCounter;
	long m_lDirectPathHoldoff;
	long m_lPingEnable;
	long m_lPingGain;
	long m_lPingRate;
	long m_lTriggerMode;
	long m_lExternalSoftTriggerDelay;		//Maps to SONAR_MESSAGE_PING_DELAY
	long m_lMaxSamplesPossible; // SONAR_MESSAGE_PING_MAX_SAMPLES
	long m_lRangeInMillimeters; // SONAR_MESSAGE_PING_RANGE
	long m_lADCGain;
	long m_lADCAGC;
	long m_lADCRate;

	long m_iDataChannels;

	void Reset(void);

};

#endif /* EDGETECHSUBSYSTEM_H_ */
