/****************************************************************************/
/* Copyright (c) 2003 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : AshtechGps.h                                                  */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 01/17/2003                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#ifndef _AshtechGps_H
#define _AshtechGps_H

#include <unistd.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <fcntl.h>
#include <errno.h>
#include <iostream.h>

#include "GpsOutput.h"
#include "SharedData.h"
#include "StreamSerialDriver.h"
#include "SerialDevice.h"
#include "time.h"
#include "GpsLog.h"
#include "LoggableGps.h"
#include "GpsIF.h"
#include "SerialParameters.h"

/*
CLASS 
AshtechGps

DESCRIPTION
Device Driver for Ashtech GPS 

AUTHOR
Rich Henthorn
*/
class AshtechGps : public StreamSerialDriver, public LoggableGps {

  friend class GpsLog;

public:
  

  ///////////////////////////////////////////////////////////////////////
  // Constructor
  AshtechGps(SerialDevice *interface, SerialParameters *serialParams);

  ///////////////////////////////////////////////////////////////////////
  // Destructor
  ~AshtechGps();

  ///////////////////////////////////////////////////////////////////////
  // Sample time
  virtual long sampleTime();

  ///////////////////////////////////////////////////////////////////////
  // Latitude (degrees)
  virtual double latitude();

  ///////////////////////////////////////////////////////////////////////
  // Latitude hemisphere; 'N' or 'S'
  virtual char nsHemisphere();

  ///////////////////////////////////////////////////////////////////////
  // Longitude (degrees)
  virtual double longitude();

  ///////////////////////////////////////////////////////////////////////
  // Longitude hemisphere; 'E' or 'W'
  virtual char ewHemisphere();

  ///////////////////////////////////////////////////////////////////////
  // GPS Quality
  virtual GpsIF::Quality quality();

  ///////////////////////////////////////////////////////////////////////
  // Number of satellites
  virtual short nSatellites();

  ///////////////////////////////////////////////////////////////////////
  // Horizontal dilution of precision
  virtual double hdop();

  ///////////////////////////////////////////////////////////////////////
  // Altitude above geoid (mean sea level)
  virtual double altitude();

  ///////////////////////////////////////////////////////////////////////
  // Height of geoid above WGS84 ellipsoid
  virtual double geoidHeight();

  ///////////////////////////////////////////////////////////////////////
  // Age of DGPS data (seconds)
  virtual short dgpsDataAge();

  ///////////////////////////////////////////////////////////////////////
  // DGPS reference station ID
  virtual short dgpsStationId();

protected:

  ////////////////////////////////////////////////////////////////////
  // Initialize device
  virtual DeviceIF::Status initialize();

  ////////////////////////////////////////////////////////////////////
  // Process device data
  virtual DeviceIF::Status processRecord(unsigned char *record, 
					 int nRecordBytes);

  GpsIF::Fix _fix;

  GpsOutput *_output;
  GpsLog *_log;
  SerialParameters *_serialParams;
};

#endif
