#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,
	       double *minBeamRange, int *minBeamCnts,
	       double *thetaB, double *lsAlt,
               double *obstacleSlopeAlt,
	       double *obstacleSlopeRange,
	       int    *obstacleSlopeCnts);

  DeltaTIF::Data _data, _dataFwd;

protected:

  virtual TaskInterface *createTaskIF(int timeout);

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

  int _xzMountAngleCnts, _nadirCnts;

  int _sectorOffset;

  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], _altitudeSlopeArray[240];
  double _hRangeArray[DeltaTIF::MaxBeams], _hRangeSlopeArray[240];;
  double _minAltitude, _minSlopeAlt;

  double _altitudeArrayLast[DeltaTIF::MaxBeams];
  double _altitudeArrayLastLast[DeltaTIF::MaxBeams];

  TimeIF::TimeSpec _lastSampleTime, _lastSampleTimeFwd;

  timespec _localEpoch;
  long _epochOffset;

  short _tindxMinAltitude, _tindxLast, _numberOfPings;
  short _tindxMinSlopeAlt;

  unsigned short _nbeams;

  const Boolean _useFwd;

  float _BeamRanges[240];

  long _nNoResponseAft, _nNoResponseFwd;

  Boolean _firstSurfaceDetect;

  double _minBeamRange;
  int    _minBeamCnts;
  double _thetaB, _lsAlt;

  short _beamOverlap, _fwdCutover;
  
};


#endif

