#ifndef VNENUM_H_INCLUDED
#define VNENUM_H_INCLUDED

/** \brief The different types of UART packets. */
typedef enum
{
	PACKETTYPE_BINARY,		/**< Binary packet. */
	PACKETTYPE_ASCII,		/**< ASCII packet. */
	PACKETTYPE_UNKNOWN		/**< Unknown packet type. */
} PacketType;

/** \brief The available binary output groups. */
typedef enum
{
	BINARYGROUPTYPE_COMMON = 0x01,		/**< Common group. */
	BINARYGROUPTYPE_TIME = 0x02,		/**< Time group. */
	BINARYGROUPTYPE_IMU = 0x04,			/**< IMU group. */
	BINARYGROUPTYPE_GPS = 0x08,			/**< GPS group. */
	BINARYGROUPTYPE_ATTITUDE = 0x10,	/**< Attitude group. */
	BINARYGROUPTYPE_INS = 0x20,			/**< INS group. */
	BINARYGROUPTYPE_GPS2 = 0x40			/**< GPS2 group. */
} BinaryGroupType;

/** \brief Async modes for the Binary Output registers. */
typedef enum
{
	ASYNCMODE_NONE	= 0,	/**< None. */
	ASYNCMODE_PORT1	= 1,	/**< Serial port 1. */
	ASYNCMODE_PORT2	= 2,	/**< Serial port 2. */
	ASYNCMODE_BOTH	= 3		/**< Both serial ports. */
} AsyncMode;

/** \brief Flags for the binary group 1 'Common' in the binary output registers. */
typedef enum
{
	COMMONGROUP_NONE				= 0x0000,	/**< None. */
	COMMONGROUP_TIMESTARTUP = 0x0001,	/**< TimeStartup. */
	COMMONGROUP_TIMEGPS				= 0x0002,	/**< TimeGps. */
	COMMONGROUP_TIMESYNCIN			= 0x0004,	/**< TimeSyncIn. */
	COMMONGROUP_YAWPITCHROLL		= 0x0008,	/**< YawPitchRoll. */
	COMMONGROUP_QUATERNION			= 0x0010,	/**< Quaternion. */
	COMMONGROUP_ANGULARRATE			= 0x0020,	/**< AngularRate. */
	COMMONGROUP_POSITION			= 0x0040,	/**< Position. */
	COMMONGROUP_VELOCITY			= 0x0080,	/**< Velocity. */
	COMMONGROUP_ACCEL				= 0x0100,	/**< Accel. */
	COMMONGROUP_IMU					= 0x0200,	/**< Imu. */
	COMMONGROUP_MAGPRES				= 0x0400,	/**< MagPres. */
	COMMONGROUP_DELTATHETA			= 0x0800,	/**< DeltaTheta. */
	COMMONGROUP_INSSTATUS			= 0x1000,	/**< InsStatus. */
	COMMONGROUP_SYNCINCNT			= 0x2000,	/**< SyncInCnt. */
	COMMONGROUP_TIMEGPSPPS			= 0x4000	/**< TimeGpsPps. */
} CommonGroup;

/** \brief Flags for the binary group 2 'Time' in the binary output registers. */
typedef enum
{
	TIMEGROUP_NONE					= 0x0000,	/**< None. */
	TIMEGROUP_TIMESTARTUP			= 0x0001,	/**< TimeStartup. */
	TIMEGROUP_TIMEGPS				= 0x0002,	/**< TimeGps. */
	TIMEGROUP_GPSTOW				= 0x0004,	/**< GpsTow. */
	TIMEGROUP_GPSWEEK				= 0x0008,	/**< GpsWeek. */
	TIMEGROUP_TIMESYNCIN			= 0x0010,	/**< TimeSyncIn. */
	TIMEGROUP_TIMEGPSPPS			= 0x0020,	/**< TimeGpsPps. */
	TIMEGROUP_TIMEUTC				= 0x0040,	/**< TimeUTC. */
	TIMEGROUP_SYNCINCNT				= 0x0080,	/**< SyncInCnt. */
	TIMEGROUP_SYNCOUTCNT				= 0x0100,	/**< SyncOutCnt. */
	TIMEGROUP_TIMESTATUS				= 0x0200	/**< TimeStatus. */
} TimeGroup;

/** \brief Flags for the binary group 3 'IMU' in the binary output registers. */
typedef enum
{
	IMUGROUP_NONE					= 0x0000,	/**< None. */
	IMUGROUP_IMUSTATUS				= 0x0001,	/**< ImuStatus. */
	IMUGROUP_UNCOMPMAG				= 0x0002,	/**< UncompMag. */
	IMUGROUP_UNCOMPACCEL			= 0x0004,	/**< UncompAccel. */
	IMUGROUP_UNCOMPGYRO				= 0x0008,	/**< UncompGyro. */
	IMUGROUP_TEMP					= 0x0010,	/**< Temp. */
	IMUGROUP_PRES					= 0x0020,	/**< Pres. */
	IMUGROUP_DELTATHETA				= 0x0040,	/**< DeltaTheta. */
	IMUGROUP_DELTAVEL				= 0x0080,	/**< DeltaVel. */
	IMUGROUP_MAG					= 0x0100,	/**< Mag. */
	IMUGROUP_ACCEL					= 0x0200,	/**< Accel. */
	IMUGROUP_ANGULARRATE			= 0x0400,	/**< AngularRate. */
	IMUGROUP_SENSSAT				= 0x0800	/**< SensSat. */
	#ifdef EXTRA
	,
	IMUGROUP_RAW					= 0x1000	/**< Raw. */
	#endif
} ImuGroup;

/** \brief Flags for the binary group 4 'GPS' in the binary output registers. */
typedef enum
{
	GPSGROUP_NONE					= 0x0000,	/**< None. */
	GPSGROUP_UTC					= 0x0001,	/**< UTC. */
	GPSGROUP_TOW					= 0x0002,	/**< Tow. */
	GPSGROUP_WEEK					= 0x0004,	/**< Week. */
	GPSGROUP_NUMSATS				= 0x0008,	/**< NumSats. */
	GPSGROUP_FIX					= 0x0010,	/**< Fix. */
	GPSGROUP_POSLLA					= 0x0020,	/**< PosLla. */
	GPSGROUP_POSECEF				= 0x0040,	/**< PosEcef. */
	GPSGROUP_VELNED					= 0x0080,	/**< VelNed. */
	GPSGROUP_VELECEF				= 0x0100,	/**< VelEcef. */
	GPSGROUP_POSU					= 0x0200,	/**< PosU. */
	GPSGROUP_VELU					= 0x0400,	/**< VelU. */
	GPSGROUP_TIMEU					= 0x0800,	/**< TimeU. */
  GPSGROUP_TIMEINFO       = 0x1000,	/**< TimeInfo. */
  GPSGROUP_DOP            = 0x2000	/**< DOP. */

	#ifdef EXTRA
	,
	GPSGROUP_SVSTAT					= 0x1000	/**< SvStat. */
	#endif
} GpsGroup;

/** \brief Flags for the binary group 5 'Attitude' in the binary output registers. */
typedef enum
{
	ATTITUDEGROUP_NONE				= 0x0000,	/**< None. */
	ATTITUDEGROUP_VPESTATUS			= 0x0001,	/**< VpeStatus. */
	ATTITUDEGROUP_YAWPITCHROLL		= 0x0002,	/**< YawPitchRoll. */
	ATTITUDEGROUP_QUATERNION		= 0x0004,	/**< Quaternion. */
	ATTITUDEGROUP_DCM				= 0x0008,	/**< DCM. */
	ATTITUDEGROUP_MAGNED			= 0x0010,	/**< MagNed. */
	ATTITUDEGROUP_ACCELNED			= 0x0020,	/**< AccelNed. */
	ATTITUDEGROUP_LINEARACCELBODY	= 0x0040,	/**< LinearAccelBody. */
	ATTITUDEGROUP_LINEARACCELNED	= 0x0080,	/**< LinearAccelNed. */
	ATTITUDEGROUP_YPRU				= 0x0100	/**< YprU. */
	#ifdef EXTRA
	,
	ATTITUDEGROUP_YPRRATE			= 0x0200,	/**< YprRate. */
	ATTITUDEGROUP_STATEAHRS			= 0x0400,	/**< StateAhrs. */
	ATTITUDEGROUP_COVAHRS			= 0x0800	/**< CovAhrs. */
	#endif
} AttitudeGroup;

/** \brief Flags for the binary group 6 'INS' in the binary output registers. */
typedef enum
{
	INSGROUP_NONE					= 0x0000,	/**< None. */
	INSGROUP_INSSTATUS				= 0x0001,	/**< InsStatus. */
	INSGROUP_POSLLA					= 0x0002,	/**< PosLla. */
	INSGROUP_POSECEF				= 0x0004,	/**< PosEcef. */
	INSGROUP_VELBODY				= 0x0008,	/**< VelBody. */
	INSGROUP_VELNED					= 0x0010,	/**< VelNed. */
	INSGROUP_VELECEF				= 0x0020,	/**< VelEcef. */
	INSGROUP_MAGECEF				= 0x0040,	/**< MagEcef. */
	INSGROUP_ACCELECEF				= 0x0080,	/**< AccelEcef. */
	INSGROUP_LINEARACCELECEF		= 0x0100,	/**< LinearAccelEcef. */
	INSGROUP_POSU					= 0x0200,	/**< PosU. */
	INSGROUP_VELU					= 0x0400	/**< VelU. */
	#ifdef EXTRA
	,
	INSGROUP_STATEINS				= 0x0800,	/**< StateIns. */
	INSGROUP_COVINS					= 0x1000	/**< CovIns. */
	#endif
} InsGroup;

/** \brief Enumeration of the velocity types */
typedef enum
{
	CDVEL_None,
	CDVEL_GpsNed,
	CDVEL_GpsEcef,
	CDVEL_EstimatedNed,
	CDVEL_EstimatedEcef,
	CDVEL_EstimatedBody
} VelocityType;

/** \brief Errors that the VectorNav sensor can report. */
typedef enum
{
	ERR_HARD_FAULT				= 1,	/**< Hard fault. */
	ERR_SERIAL_BUFFER_OVERFLOW	= 2,	/**< Serial buffer overflow. */
	ERR_INVALID_CHECKSUM		= 3,	/**< Invalid checksum. */
	ERR_INVALID_COMMAND			= 4,	/**< Invalid command. */
	ERR_NOT_ENOUGH_PARAMETERS	= 5,	/**< Not enough parameters. */
	ERR_TOO_MANY_PARAMETERS		= 6,	/**< Too many parameters. */
	ERR_INVALID_PARAMETER		= 7,	/**< Invalid parameter. */
	ERR_INVALID_REGISTER		= 8,	/**< Invalid register. */
	ERR_UNAUTHORIZED_ACCESS		= 9,	/**< Unauthorized access. */
	ERR_WATCHDOG_RESET			= 10,	/**< Watchdog reset. */
	ERR_OUTPUT_BUFFER_OVERFLOW	= 11,	/**< Output buffer overflow. */
	ERR_INSUFFICIENT_BAUD_RATE	= 12,	/**< Insufficient baud rate. */
	ERR_ERROR_BUFFER_OVERFLOW	= 255	/**< Error buffer overflow. */
} SensorError;

/** \brief Enumeration of the various error messages used by the library. */
typedef enum
{
	/** Indicates there were no errors encountered. */
	E_NONE,

	/** Indicates an unknown error occurred. */
	E_UNKNOWN,

	/** Indicates a provided buffer was too small to complete the action. */
	E_BUFFER_TOO_SMALL,

	/** Indicates a provided value is not valid. */
	E_INVALID_VALUE,

	/** Indicates the requested functionality is currently not implemented. */
	E_NOT_IMPLEMENTED,

	/** Indicates the requested functionality is not supported. */
	E_NOT_SUPPORTED,

	/** Indicates the requested item was not found. */
	E_NOT_FOUND,

	/** Indicates the operation timed out. */
	E_TIMEOUT,

	/** Indicates insufficient permission to perform the operation. */
	E_PERMISSION_DENIED,

	/** Indicates an invalid operation was attempted. */
	E_INVALID_OPERATION,

	/** Indicates an event was signaled. */
	E_SIGNALED,

    /** Indicates either not enough memory is available or no memory was allocated */
    E_MEMORY_NOT_ALLOCATED,

	/** VectorNav sensor hard fault (Code 1). */
	E_SENSOR_HARD_FAULT = 1001,

	/** VectorNav sensor serial buffer overflow (Code 2). */
	E_SENSOR_SERIAL_BUFFER_OVERFLOW = 1002,

	/** VectorNav sensor invalid checksum (Code 3). */
	E_SENSOR_INVALID_CHECKSUM = 1003,

	/** VectorNav sensor invalid command (Code 4). */
	E_SENSOR_INVALID_COMMAND = 1004,

	/** VectorNav sensor not enough parameters (Code 5). */
	E_SENSOR_NOT_ENOUGH_PARAMETERS = 1005,

	/** VectorNav sensor too many parameters (Code 6). */
	E_SENSOR_TOO_MANY_PARAMETERS = 1006,

	/** VectorNav sensor invalid parameter (Code 7). */
	E_SENSOR_INVALID_PARAMETER = 1007,

	/** VectorNav sensor invalid register (Code 8). */
	E_SENSOR_INVALID_REGISTER = 1008,

	/** VectorNav sensor unauthorized access (Code 9). */
	E_SENSOR_UNAUTHORIZED_ACCESS = 1009,

	/** VectorNav sensor watchdog reset (Code 10). */
	E_SENSOR_WATCHDOG_RESET = 1010,

	/** VectorNav sensor output buffer overflow (Code 11). */
	E_SENSOR_OUTPUT_BUFFER_OVERFLOW = 1011,

	/** VectorNav sensor insufficient baud rate (Code 12). */
	E_SENSOR_INSUFFICIENT_BAUD_RATE = 1012,

	/** VectorNav sensor error buffer overflow (Code 13). */
	E_SENSOR_ERROR_BUFFER_OVERFLOW = 1013,

	E_DATA_NOT_ELLIPTICAL		= 2001,	/**< \brief Data set not elliptical. */
	E_ILL_CONDITIONED			= 2002,	/**< \brief Algorithm had a bad condition. */
	E_EXCEEDED_MAX_ITERATIONS	= 2003,	/**< \brief Algorithm exceeded the number of interations it is allowed. */
	E_BAD_FINAL_INTERATION		= 2004,	/**< \brief Algorithm's last interation changed exceeded threshold. */
	E_INSUFFICIENT_DATA			= 2005,	/**< \brief Not enough data points were provided. */

	/** \brief Errors that the VectorNav bootload can report. */
	E_BOOTLOADER_NONE					= 3000,	/**< No Error, send next record*/
	E_BOOTLOADER_INVALID_COMMAND		= 3001,	/**< Problem with VNX record, abort */
	E_BOOTLOADER_INVALID_RECORD_TYPE	= 3002,	/**< Problem with VNX record, abort */
	E_BOOTLOADER_INVALID_BYTE_COUNT		= 3003,	/**< Problem with VNX record, abort */
	E_BOOTLOADER_INVALID_MEMORY_ADDRESS	= 3004,	/**< Problem with VNX record, abort */
	E_BOOTLOADER_COMM_ERROR				= 3005,	/**< Checksum error, resend record */
	E_BOOTLOADER_INVALID_HEX_FILE		= 3006,	/**< Problem with VNX record, abort */
	E_BOOTLOADER_DECRYPTION_ERROR		= 3007,	/**< Invalid VNX file or record sent out of order, abort */
	E_BOOTLOADER_INVALID_BLOCK_CRC		= 3008,	/**< Data verification failed, abort */
	E_BOOTLOADER_INVALID_PROGRAM_CRC	= 3009,	/**< Problemw ith firmware on device */
	E_BOOTLOADER_INVALID_PROGRAM_SIZE	= 3010,	/**< Problemw ith firmware on device */
	E_BOOTLOADER_MAX_RETRY_COUNT		= 3011,	/**< Too many errors, abort */
	E_BOOTLOADER_TIMEOUT				= 3012,	/**< Timeout expired, reset */
	E_BOOTLOADER_RESERVED				= 3013	/**< Contact VectorNav, abort */

} VnError;

/** \brief Enumeration of the various error-detection algorithms used by the
 * library. */
typedef enum
{
	/** Signifies no error-detection should be performed. */
	VNERRORDETECTIONMODE_NONE,

	/** Signifies to use 8-bit XOR checksum. */
	VNERRORDETECTIONMODE_CHECKSUM,

	/** Signifies to use CRC16-CCITT algorithm. */
	VNERRORDETECTIONMODE_CRC

} VnErrorDetectionMode;

/** \brief Different modes for the SyncInMode field of the Synchronization Control register. */
typedef enum
{
	#ifdef EXTRA
	/** \brief Count the number of trigger events on SYNC_IN_2 pin.
	/ * \deprecated This option is obsolete for VN-100 firmware version 2.0 and greater and VN-200 firmware version 1.0 and greater.
	 */
	VNSYNCINMODE_COUNT2 = 0,
	/** \brief Start ADC sampling on trigger of SYNC_IN_2 pin.
	/ * \deprecated This option is obsolete for VN-100 firmware version 2.0 and greater and VN-200 firmware version 1.0 and greater.
	 */
	VNSYNCINMODE_ADC2 = 1,
	/** \brief Output asynchronous message on trigger of SYNC_IN_2 pin.
	/ * \deprecated This option is obsolete for VN-100 firmware version 2.0 and greater and VN-200 firmware version 1.0 and greater.
	 */
	VNSYNCINMODE_ASYNC2 = 2,
	#endif
	/** \brief Count number of trigger events on SYNC_IN pin.
	 */
	VNSYNCINMODE_COUNT = 3,
	/** \brief Start IMU sampling on trigger of SYNC_IN pin.
	 */
	VNSYNCINMODE_IMU = 4,
	/** \brief Output asynchronous message on trigger of SYNC_IN pin.
	 */
	VNSYNCINMODE_ASYNC = 5
} VnSyncInMode;

/** \brief Different modes for the SyncInEdge field of the Synchronization Control register. */
typedef enum
{
	/** \brief Trigger on the rising edge on the SYNC_IN pin.
	 */
	VNSYNCINEDGE_RISING = 0,
	/** \brief Trigger on the falling edge on the SYNC_IN pin.
	 */
	VNSYNCINEDGE_FALLING = 1
} VnSyncInEdge;

/** \brief Different modes for the SyncOutMode field of the Synchronization Control register. */
typedef enum
{
	/** \brief None.
	 */
	VNSYNCOUTMODE_NONE = 0,
	/** \brief Trigger at start of IMU sampling.
	 */
	VNSYNCOUTMODE_ITEMSTART = 1,
	/** \brief Trigger when IMU measurements are available.
	 */
	VNSYNCOUTMODE_IMUREADY = 2,
	/** \brief Trigger when attitude measurements are available.
	 */
	VNSYNCOUTMODE_INS = 3,
	/** \brief Trigger on GPS PPS event when a 3D fix is valid.
	 */
	VNSYNCOUTMODE_GPSPPS = 6
} VnSyncOutMode;

/** \brief Different modes for the SyncOutPolarity field of the Synchronization Control register. */
typedef enum
{
	/** \brief Negative pulse.
	 */
	VNSYNCOUTPOLARITY_NEGATIVE = 0,
	/** \brief Positive pulse.
	 */
	VNSYNCOUTPOLARITY_POSITIVE = 1
} VnSyncOutPolarity;

/** \brief Counting modes for the Communication Protocol Control register. */
typedef enum
{
	/** \brief Off.
	 */
	VNCOUNTMODE_NONE = 0,
	/** \brief SyncIn counter.
	 */
	VNCOUNTMODE_SYNCINCOUNT = 1,
	/** \brief SyncIn time.
	 */
	VNCOUNTMODE_SYNCINTIME = 2,
	/** \brief SyncOut counter.
	 */
	VNCOUNTMODE_SYNCOUTCOUNTER = 3,
	/** \brief GPS PPS time.
	 */
	VNCOUNTMODE_GPSPPS = 4
} VnCountMode;

/** \brief Status modes for the Communication Protocol Control register. */
typedef enum
{
	/** \brief Off.
	 */
	VNSTATUSMODE_OFF = 0,
	/** \brief VPE status.
	 */
	VNSTATUSMODE_VPESTATUS = 1,
	/** \brief INS status.
	 */
	VNSTATUSMODE_INSSTATUS = 2
} VnStatusMode;

/** \brief Checksum modes for the Communication Protocol Control register. */
typedef enum
{
	/** \brief Off.
	 */
	VNCHECKSUMMODE_OFF = 0,
	/** \brief 8-bit checksum.
	 */
	VNCHECKSUMMODE_CHECKSUM = 1,
	/** \brief 16-bit CRC.
	 */
	VNCHECKSUMMODE_CRC = 2
} VnChecksumMode;

/** \brief Error modes for the Communication Protocol Control register. */
typedef enum
{
	/** \brief Ignore error.
	 */
	VNERRORMODE_IGNORE = 0,
	/** \brief Send error.
	 */
	VNERRORMODE_SEND = 1,
	/** \brief Send error and set ADOR register to off.
	 */
	VNERRORMODE_SENDANDOFF = 2
} VnErrorMode;

/** \brief Filter modes for the IMU Filtering Configuration register. */
typedef enum
{
	/** \brief No filtering.
	 */
	VNFILTERMODE_NOFILTERING = 0,
	/** \brief Filtering performed only on raw uncompensated IMU measurements.
	 */
	VNFILTERMODE_ONLYRAW = 1,
	/** \brief Filtering performed only on compensated IMU measurements.
	 */
	VNFILTERMODE_ONLYCOMPENSATED = 2,
	/** \brief Filtering performed on both uncompensated and compensated IMU measurements.
	 */
	VNFILTERMODE_BOTH = 3
} VnFilterMode;

/** \brief Integration frames for the Delta Theta and Delta Velocity Configuration register. */
typedef enum
{
	/** \brief Body frame.
	 */
	VNINTEGRATIONFRAME_BODY = 0,
	/** \brief NED frame.
	 */
	VNINTEGRATIONFRAME_NED = 1
} VnIntegrationFrame;

/** \brief Compensation modes for the Delta Theta and Delta Velocity configuration register. */
typedef enum
{
	/** \brief None.
	 */
	VNCOMPENSATIONMODE_NONE = 0,
	/** \brief Bias.
	 */
	VNCOMPENSATIONMODE_BIAS = 1
} VnCompensationMode;

/** \brief GPS fix modes for the GPS Solution - LLA register. */
typedef enum
{
	/** \brief No fix.
	 */
	VNGPSFIX_NOFIX = 0,
	/** \brief Time only.
	 */
	VNGPSFIX_TIMEONLY = 1,
	/** \brief 2D.
	 */
	VNGPSFIX_2D = 2,
	/** \brief 3D.
	 */
	VNGPSFIX_3D = 3
} VnGpsFix;

/** \brief GPS modes for the GPS Configuration register. */
typedef enum
{
	/** \brief Use onboard GPS.
	 */
	VNGPSMODE_ONBOARDGPS = 0,
	/** \brief Use external GPS.
	 */
	VNGPSMODE_EXTERNALGPS = 1,
	/** \brief Use external VN-200 as GPS.
	 */
	VNGPSMODE_EXTERNALVN200GPS = 2
} VnGpsMode;

/** \brief GPS PPS mode for the GPS Configuration register. */
typedef enum
{
	/** \brief GPS PPS signal on GPS_PPS pin and triggered on rising edge.
	 */
	VNPPSSOURCE_GPSPPSRISING = 0,
	/** \brief GPS PPS signal on GPS_PPS pin and triggered on falling edge.
	 */
	VNPPSSOURCE_GPSPPSFALLING = 1,
	/** \brief GPS PPS signal on SyncIn pin and triggered on rising edge.
	 */
	VNPPSSOURCE_SYNCINRISING = 2,
	/** \brief GPS PPS signal on SyncIn pin and triggered on falling edge.
	 */
	VNPPSSOURCE_SYNCINFALLING = 3
} VnPpsSource;

/** \brief VPE Enable mode for the VPE Basic Control register. */
typedef enum
{
	/** \brief Disable
	 */
	VNVPEENABLE_DISABLE = 0,
	/** \brief Enable
	 */
	VNVPEENABLE_ENABLE = 1
} VnVpeEnable;

/** \brief VPE Heading modes used by the VPE Basic Control register. */
typedef enum
{
	/** \brief Absolute heading.
	 */
	VNHEADINGMODE_ABSOLUTE = 0,
	/** \brief Relative heading.
	 */
	VNHEADINGMODE_RELATIVE = 1,
	/** \brief Indoor heading.
	 */
	VNHEADINGMODE_INDOOR = 2
} VnHeadingMode;

/** \brief VPE modes for the VPE Basic Control register. */
typedef enum
{
	/** \brief Off.
	 */
	VNVPEMODE_OFF = 0,
	/** \brief Mode 1.
	 */
	VNVPEMODE_MODE1 = 1
} VnVpeMode;

/** \brief Different scenario modes for the INS Basic Configuration register. */
typedef enum
{
	/** \brief AHRS.
	 */
	VNSCENARIO_AHRS = 0,
	/** \brief General purpose INS with barometric pressure sensor.
	 */
	VNSCENARIO_INSWITHPRESSURE = 1,
	/** \brief General purpose INS without barometric pressure sensor.
	 */
	VNSCENARIO_INSWITHOUTPRESSURE = 2,
	/** \brief GPS moving baseline for dynamic applications.
	 */
	VNSCENARIO_GPSMOVINGBASELINEDYNAMIC = 3,
	/** \brief GPS moving baseline for static applications.
	 */
	VNSCENARIO_GPSMOVINGBASELINESTATIC = 4
} VnScenario;

/** \brief HSI modes used for the Magnetometer Calibration Control register. */
typedef enum
{
	/** \brief Real-time hard/soft iron calibration algorithm is turned off.
	 */
	VNHSIMODE_OFF = 0,
	/** \brief Runs the real-time hard/soft iron calibration algorithm.
	 */
	VNHSIMODE_RUN = 1,
	/** \brief Resets the real-time hard/soft iron solution.
	 */
	VNHSIMODE_RESET = 2
} VnHsiMode;

/** \brief HSI output types for the Magnetometer Calibration Control register. */
typedef enum
{
	/** \brief Onboard HSI is not applied to the magnetic measurements.
	 */
	VNHSIOUTPUT_NOONBOARD = 1,
	/** \brief Onboard HSI is applied to the magnetic measurements.
	 */
	VNHSIOUTPUT_USEONBOARD = 3
} VnHsiOutput;

/** \brief Type of velocity compensation performed by the VPE. */
typedef enum
{
	/** \brief Disabled
	 */
	VNVELOCITYCOMPENSATIONMODE_DISABLED = 0,
	/** \brief Body Measurement
	 */
	VNVELOCITYCOMPENSATIONMODE_BODYMEASUREMENT = 1
} VnVelocityCompensationMode;

/** \brief How the magnetometer is used by the filter. */
typedef enum
{
	/** \brief Magnetometer will only affect heading.
	 */
	VNMAGNETICMODE_2D = 0,
	/** \brief Magnetometer will affect heading, pitch, and roll.
	 */
	VNMAGNETICMODE_3D = 1
} VnMagneticMode;

/** \brief Source for magnetometer used by the filter. */
typedef enum
{
	/** \brief Use internal magnetometer.
	 */
	VNEXTERNALSENSORMODE_INTERNAL = 0,
	/** \brief Use external magnetometer. Will use measurement at every new time step.
	 */
	VNEXTERNALSENSORMODE_EXTERNAL200HZ = 1,
	/** \brief Use external magnetometer. Will only use when the measurement is updated.
	 */
	VNEXTERNALSENSORMODE_EXTERNALONUPDATE = 2
} VnExternalSensorMode;

/** \brief Options for the use of FOAM. */
typedef enum
{
	/** \brief FOAM is not used.
	 */
	VNFOAMINIT_NOFOAMINIT = 0,
	/** \brief FOAM is used to initialize only pitch and roll.
	 */
	VNFOAMINIT_FOAMINITPITCHROLL = 1,
	/** \brief FOAM is used to initialize heading, pitch and roll.
	 */
	VNFOAMINIT_FOAMINITHEADINGPITCHROLL = 2,
	/** \brief FOAM is used to initialize pitch, roll and covariance.
	 */
	VNFOAMINIT_FOAMINITPITCHROLLCOVARIANCE = 3,
	/** \brief FOAM is used to initialize heading, pitch, roll and covariance
	 */
	VNFOAMINIT_FOAMINITHEADINGPITCHROLLCOVARIANCE = 4
} VnFoamInit;

/** \brief The different types of processors. */
typedef enum
{
	VNPROCESSOR_NAV,	/**< Navigation Processor. */
	VNPROCESSOR_GPS,	/**< GPS Processor. */
	VNPROCESSOR_IMU   /**< IMU Processor. */
} VnProcessorType;

#endif