//=========================================================================
// Summary  : 
// Filename : CsiGpsIF.idl
// Author   : Marsh
// Project  : 
// Version  : $Revision: #1 $
// Created  : 04/12/00
// Modified : 
// Archived : 
//=========================================================================
// Modification History:
//========================================================================= 


/*
CLASS 
CsiDgpsIF

DESCRIPTION
Task interface to GBX DGPS system from Communications Systems Int'l (CSI).
System uses NMEA format.

AUTHOR
Marsh

*/

#include "DeviceIF.idl"
#include "GpsIF.idl"


interface CsiDgpsIF : GpsIF {

     enum MskBitRate {
	  MskAuto = 0,
	  Msk100bps = 100,
	  Msk200bps = 200
     };

     enum NmeaMessage {
	  AllNmeaMessages,
	  GPGGA,
	  GPVTG,
	  GPRMC,
	  GPGSA,
	  GPGST,
	  GPZDA,
	  POS,
	  RIO,
	  RTC
     };
     
     struct SupplementalData {
     	  float AltitudeWGS84;    // meters
     	  float TrueTrack;        // degrees from North
     	  float TrackVelocity;    // knots
     	  float VerticalVelocity; // meters per second
     	  float LatStd;           // meters
     	  float LongStd;          // meters
     	  float VertStd;          // meters
     	  short UTCOffset;	  // minutes
     	  boolean isValid;
     };

     struct DgpsInfo {
	  float frequency;
	  boolean autoTune;
	  MskBitRate bitRate;
	  boolean autoBitRate;
	  short signalStrength;
	  short signalToNoise;
     };

     struct Options {
	  short positionUpdateRate;
	  short rawUpdateRate;
	  boolean rawOutput;
	  boolean carrierPhase;
	  boolean dgpsRemote;
	  boolean dgpsBase;
	  boolean raimAvail;
	  boolean ppsAvail;
	  boolean photogram;
	  boolean geoidalHeight;
	  boolean magVariation;
	  boolean codeCorrelator;
     };

     ///////////////////////////////////////////////////////
     // Set system to full manual diff mode
     DeviceIF::Status setFullManual( in float freq,
				     in MskBitRate bitRate );

     ///////////////////////////////////////////////////////
     // Set system to partial manual diff. mode
     DeviceIF::Status setPartialManual( in float freq );

     ///////////////////////////////////////////////////////
     // Set system to full auto diff. mode
     DeviceIF::Status setAuto();

     ///////////////////////////////////////////////////////
     // Query DGPS state
     DeviceIF::Status requestDgpsInfo();
     DeviceIF::Status getDgpsInfo( out DgpsInfo info );
     
     ///////////////////////////////////////////////////////
     // Get Supplemental Data (and the GPS fix, for atomicity)
     DeviceIF::Status getSuppData( out GpsIF::Fix fix,
     				   out SupplementalData data );
     

     ///////////////////////////////////////////////////////
     // Start/stop various NMEA strings
     DeviceIF::Status startNMEAString( in NmeaMessage nmeaMessage );
     DeviceIF::Status stopNMEAString( in NmeaMessage nmeaMessage );
     DeviceIF::Status stopAllNMEAStrings();
     DeviceIF::Status startSupplementalData();
     DeviceIF::Status stopSupplementalData();

     ///////////////////////////////////////////////////////
     // Set the period of the NMEA string
     DeviceIF::Status setNMEAPeriod( in float period );

     ///////////////////////////////////////////////////////
     // Get various strings from the unit
     DeviceIF::Status firmwareVersion( out DeviceIF::Name firmware );
     DeviceIF::Status getOptions( out Options options );

     ///////////////////////////////////////////////////////
     // Get the magnetic variation from the unit (radians, +W, -E)
     DeviceIF::Status magVariation( out float variation );

     ///////////////////////////////////////////////////////
     // 
     DeviceIF::Status groundSpeed( out double groundSpeed );

};
