//=========================================================================
// Summary  : Reson 6046 Output
// Filename : Reson6046Output.h
// Author   : Reed Christenson reed@bluefinrobotics.com
// Project  : Reson 6046 Driver
// Revision : 0.0
// Created  : 2002.03.21
// Modified : 2002.03.21
//=========================================================================
// Description : Reson 6046 Output
//=========================================================================

#ifndef _RESON6046OUTPUT_H
#define _RESON6046OUTPUT_H

#include "TimeIF.h"
#include "Syslog.h"
#include "DriverOutput.h"
#include "SimpleSocket.h" // for max size of IP address string
#include "DeviceIF.h"


#include <string.h> // strcpy

#define Reson6046OutputName "reson6046Output"

/// CLASS Reson6046
class Reson6046Output : public DriverOutput {

 public:
    debug_t debug;

    /// Data Skeleton.
    struct Data: Data_Skel {

	// Indicates that device is initialized and ready
	Boolean deviceReady;
      
	DeviceIF::Status status;
	debug_t debug;
	unsigned long errorCountLimit;
	unsigned long errorCount;
	unsigned long initErrorCountLimit;
	unsigned long initErrorCount;

	/// Broadcaster Call Back Period in milliseconds
	unsigned long callbackPeriod;

	/// Reson 6046 IP Address String i.e. "192.168.0.86"
	char *reson6046IpAddressString; //[MaxIpAddressStringSize];
	//char *reson6046IpAddressPtr;
	unsigned short reson6046CommandPort;
	unsigned short reson6046ShutdownPort;


	Boolean edgetechVisibleOnNetwork;
	char *edgetechIpAddressString; //[MaxIpAddressStringSize];
	//char *edgetechIpAddressPtr;
	unsigned short edgetechCommandPort;
	unsigned short edgetechDataPort;
	unsigned short edgetechShutdownPort;

	// Sub-Bottom Profiler Settings
	char *sbpPulseFilename;
	double sbpPingRate;
	double sbpPulsePower;

	// Sidescan Low Settings
	char *sslPulseFilename;
	double sslPingRange;
	double sslPulsePower;

	// Sidescan High Settings
	char *sshPulseFilename;
	double sshPingRange;
	double sshPulsePower;

	Data() {
	    deviceReady = False;

	    errorCountLimit = 10;
	    errorCount = 0;
	    initErrorCountLimit = 10;
	    initErrorCount = 10;

	    callbackPeriod = 40; // ms
	    //ipAddressPtr = "127.000.000.1";
	    //port = 6046;

	    // Reson 6046 Network Parameters
	    reson6046IpAddressString = "127.000.000.001";
	    //reson6046IpAddressPtr = "127.000.000.1";
	    reson6046CommandPort = 6046;
	    reson6046ShutdownPort = 8123;

	    // Edgetech Network Parameters
	    edgetechVisibleOnNetwork = False;
	    edgetechIpAddressString = "127.000.000.001";
	    //edgetechIpAddressPtr = "127.000.000.1";
	    edgetechCommandPort = 1800;
	    edgetechDataPort = 1801;
	    edgetechShutdownPort = 8123;

	    // SBP settings
	    sbpPulseFilename = "216Pulse_9k_14k_20ms.spf";
	    sbpPingRate = 4.0;
	    sbpPulsePower = 0.0;

	    // SSL Settings
	    sslPulseFilename = "ss75_5k_9k_20ms.spf";
	    sslPingRange = 100.0;
	    sslPulsePower = 0.0;

	    // SSH Settings
	    sshPulseFilename = "ss75_5k_9k_20ms.spf";
	    sshPingRange = 100.0;
	    sslPulsePower = 0.0;

	    status = DeviceIF::Offline;
	    debug = 1;
	};
    } data;

  Reson6046Output( Boolean serverSide = False, 
		   Access access = NoAccess, 
		   Boolean init = False);

  ~Reson6046Output();


  ////////////////////////////////////////////////////////////////////
  // Read from shared memory to this object's Data::data element
  //void read();

  ////////////////////////////////////////////////////////////////////
  // Write from this object's Data::data element to shared memory
  //void write();

  //Data data;

  virtual void clear( void );

 protected:


 private:

};

#endif
