#ifndef _MULTIBEAM_H
#define _MULTIBEAM_H

#include "NavSensor.h"
#include "DeltaTIF.h"
#include "NavigationIF.h"
#include <time.h>

/*
CLASS 
Multibeam

DESCRIPTION
Multibeam NavSensor

AUTHOR
Rob McEwen, based on Tom O'Reilly's code.
*/
class Multibeam : public NavSensor {

public:

  Multibeam(const char *name, NavSensors *sensors, int maxBad = 3);

  ///////////////////////////////////////////////////////////////////
  // Mounting angle in x-z plane in radians.
  double xzMountAngle();

  ///////////////////////////////////////////////////////////////////
  // Maximum range measurable with this sensor
  double maxRange();

  ///////////////////////////////////////////////////////////////////
  // Latest range
  double range();

  ///////////////////////////////////////////////////////////////////
  // True if echo received on latest reading
  Boolean echoReceived();

  void compute(NavigationIF::Attitude *attitude,
	       NavigationIF::Position *position,
	       double avoidRange,
	       double *altitude, 
	       int    *nadirCnts,
	       int *nGood, int *median,
	       double *obstacleAltitude,
	       double *obstacleRange,
               int    *obstacleCnts);

  DeltaTIF::Data _data;

protected:

  virtual TaskInterface *createTaskIF(int timeout);

  virtual DeviceIF::Status readTaskIF(Boolean *valid, 
				      TimeIF::TimeSpec *sampleTime);

   int _xzMountAngleCnts, _nadirCnts;

  double _maxRange;
  
  DeltaTIF *_deltatIF;

  double _rangeEng;

  Boolean _echoReceived, _first;

  double _depth, _depthLast, _xLast, _yLast;

  unsigned long _time, _timeLast;
  //TimeIF::TimeSpec _timeLast;

  double _dtrainArray[DeltaTIF::MaxBeams];
  double _altitudeArray[DeltaTIF::MaxBeams];
  double _hRangeArray[DeltaTIF::MaxBeams];
  double _minAltitude;
  TimeIF::TimeSpec _lastSampleTime;

  timespec _localEpoch;
  long _epochOffset;

  short _tindxMinAltitude, _tindxLast, _numberOfPings;

  unsigned short _nbeams;

  long _nNoResponse;
};


#endif

