/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : SimulatedDeltaT.h                                        */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
//////////////////////////////////////////////////////////////////////
//
// PURPOSE:  Simulate the DeltaT multibeam.
// AUTHOR:   McEwen
// DATE:     2013/1/18
//
//////////////////////////////////////////////////////////////////////
//
#ifndef _SimulatedDeltaT_H
#define _SimulatedDeltaT_H
#include "DeltaTIF_SK.h"
#include "SimulatorIF.h"
#include "Attributes.h"
#include "AttributeParser.h"
#include "DeltaTLog.h"
#include "TimeP.h"

#define NBEAMS 120

class SimulatedDeltaT : public DeltaTIF_SK {

   friend class DeltaTLog;

public:

  SimulatedDeltaT();
  ~SimulatedDeltaT();

protected:

  ///////////////////////////////////////////////////////////////////
  // Called when the simulator says new data is ready
//  void compute(TaskInterface *taskInterface, EventCode code);
  void compute(void);

  virtual double range(DeltaTIF::Sonar sonar);
  virtual unsigned short nbeams(DeltaTIF::Sonar sonar);
  virtual unsigned short interval(DeltaTIF::Sonar sonar);
  virtual Boolean enabled(DeltaTIF::Sonar sonar);
  virtual void update_time(DeltaTIF::Sonar sonar, TimeIF::TimeSpec *timestamp);
  virtual void get(DeltaTIF::Sonar sonar, DeltaTIF::Data *data);
  virtual void start(DeltaTIF::Sonar sonar);
  virtual void stop(DeltaTIF::Sonar sonar);
  virtual void get_mounting_angles(DeltaTIF::Sonar sonar, double *phi, double *theta, double *psi);
  
  virtual DeviceIF::Status set_profile_point_filter(DeltaTIF::Sonar sonar, short ppf) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_trigger_delay(DeltaTIF::Sonar sonar, long delay) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_trigger_edge(DeltaTIF::Sonar sonar, short edge) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_trigger_enable(DeltaTIF::Sonar sonar, short trig)
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_profile_min_range(DeltaTIF::Sonar sonar, short pmr)
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_averaging(DeltaTIF::Sonar sonar, short avg) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_beam_width(DeltaTIF::Sonar sonar, short width) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_sector_size(DeltaTIF::Sonar sonar, short size) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_nbeams(DeltaTIF::Sonar sonar, short nb) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_sos(DeltaTIF::Sonar sonar, float sos) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_auto_sos(Boolean automatic) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status update_sos(float *sos) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_range(DeltaTIF::Sonar sonar, short range) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_gain_eq(DeltaTIF::Sonar sonar, Boolean on) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_idt_logging(DeltaTIF::Sonar sonar, Boolean on) 
  {return DeviceIF::Ok; }
  virtual DeviceIF::Status set_gain(DeltaTIF::Sonar sonar, short gain) 
  {return DeviceIF::Ok; }

  virtual int spawnAuxTasks();

  SimulatorIF *_simulator;
  //
  // Class variables:
  //

  double _phi[2], _theta[2], _psi[2];
  // Maximum measurable range
  long  _maxRange;
  double  _noReturnRange;
  long  _startGain;
  long  _absorption;
  double _absorpEng;
  long  _pulseLen;
  long  _minRange;
  long  _triggerCtrl;
  Boolean _profile;
  long  _delay;
  char  _serialStatus;
  double _trainRef;
  short  _train;
  double _sectorEng;
  unsigned char _sector;
  double _stepSizeEng;
  long   _stepSize;
  long _acousticFreqEng;
  long _acousticFreq;
  double _pingPeriod;
  long _pulseLenEng;
  long  _minRangeEng;

  //double _grazing[DeltaTIF::MaxBeams];
  double _grazing[2*NBEAMS];
  int _nbeams, _tbeams, _fwdBeams;
  float _range;
  float _interval;
  Boolean _enabled, _fwdEnabled, _fwd60Enabled, _verticalMount;
  float _beam_ranges[2*NBEAMS];
  int _intensities[2*NBEAMS];
  int _nlog;

  long  _time;

  int _xzMountAngleCnts, _sectorOffset;
  
  double zMax;


  double _los_B[2*NBEAMS][3];
  double _minGrazing;

  //long _bisectCnt[DeltaTIF::MaxBeams];
  long _bisectCnt[2*NBEAMS];

  TimeIF::TimeSpec _sampleTime, _lastSideSampleTime;

  timespec _epoch;

  int _k;

  Boolean _echoReceived;
  Boolean _sideReady, _fwdReady;
  const Boolean _runEveryOtherTime;

  Boolean _firstSurfaceDetect;

  //PSA916Log *_log;

  DeltaTLog *_log[2];
  //char _echoData[DeltaTIF::MaxBeams];
  char _echoData[2*NBEAMS];

  long _askTime, _ansTime;

  int _beamOverlap;

  long _noReturnTime, _noReturnDuration;
  long _inoperativeTime, _inoperativeDuration;
  

//  Attributes _attributes;
};

#endif
