#ifndef _VNSENSORS_REGISTERS_H_
#define _VNSENSORS_REGISTERS_H_

#include "int.h"
#include "vector.h"
#include "matrix.h"
#include "types.h"

namespace vn {
namespace sensors {

/// \defgroup registerStructures Register Structures
/// \brief These structures represent the various registers on a VecotorNav
/// sensor.
///
/// \{

/// \brief Structure representing a Binary Output register.
///
/// The field outputGroup available on the sensor's register is not necessary
/// in this structure since all read/writes operations will automatically
/// determine this from the settings for the individual groups within this
/// structure.
struct BinaryOutputRegister
{
	protocol::uart::AsyncMode asyncMode;			///< The asyncMode field.
	uint16_t rateDivisor;							///< The rateDivisor field.
	protocol::uart::CommonGroup commonField;		///< Group 1 (Common)
	protocol::uart::TimeGroup timeField;			///< Group 2 (Time)
	protocol::uart::ImuGroup imuField;				///< Group 3 (IMU)
	protocol::uart::GpsGroup gpsField;				///< Group 4 (GPS)
	protocol::uart::AttitudeGroup attitudeField;	///< Group 5 (Attitude)
	protocol::uart::InsGroup insField;				///< Group 6 (INS)
  protocol::uart::GpsGroup gps2Field;				///< Group 7 (GPS2)

	BinaryOutputRegister() :
		asyncMode(protocol::uart::ASYNCMODE_NONE),
		rateDivisor(0),
		commonField(protocol::uart::COMMONGROUP_NONE),
		timeField(protocol::uart::TIMEGROUP_NONE),
		imuField(protocol::uart::IMUGROUP_NONE),
		gpsField(protocol::uart::GPSGROUP_NONE),
		attitudeField(protocol::uart::ATTITUDEGROUP_NONE),
		insField(protocol::uart::INSGROUP_NONE),
    gps2Field(protocol::uart::GPSGROUP_NONE)
  { }

	/// \brief Creates an initializes a new BinaryOutputRegister structure.
	///
	/// \param[in] asyncModeIn Value to initialize the asyncMode field with.
	/// \param[in] rateDivisorIn Value to initialize the rateDivisor field with.
	/// \param[in] commonFieldIn Value to initialize field 1 (Common) with.
	/// \param[in] timeFieldIn Value to initialize field 2 (Time) with.
	/// \param[in] imuFieldIn Value to initialize field 3 (IMU) with.
	/// \param[in] gpsFieldIn Value to initialize field 4 (GPS) with.
	/// \param[in] attitudeFieldIn Value to initialize field 5 (Attitude) with.
	/// \param[in] insFieldIn Value to initialize field 6 (INS) with.
  /// \param[in] gps2FieldIn Value to initialize field 7 (GPS2) with.
	BinaryOutputRegister(
		protocol::uart::AsyncMode asyncModeIn,
		uint16_t rateDivisorIn,
		protocol::uart::CommonGroup commonFieldIn,
		protocol::uart::TimeGroup timeFieldIn,
		protocol::uart::ImuGroup imuFieldIn,
		protocol::uart::GpsGroup gpsFieldIn,
		protocol::uart::AttitudeGroup attitudeFieldIn,
		protocol::uart::InsGroup insFieldIn,
    protocol::uart::GpsGroup gps2FieldIn) :
		asyncMode(asyncModeIn),
		rateDivisor(rateDivisorIn),
		commonField(commonFieldIn),
		timeField(timeFieldIn),
		imuField(imuFieldIn),
		gpsField(gpsFieldIn),
		attitudeField(attitudeFieldIn),
		insField(insFieldIn),
    gps2Field(gps2FieldIn)
	{ }

	BinaryOutputRegister(
		uint16_t asyncModeIn,
		uint16_t rateDivisorIn,
		uint16_t commonFieldIn,
		uint16_t timeFieldIn,
		uint16_t imuFieldIn,
		uint16_t gpsFieldIn,
		uint16_t attitudeFieldIn,
		uint16_t insFieldIn,
    uint16_t gps2FieldIn) :
		asyncMode(static_cast<protocol::uart::AsyncMode>(asyncModeIn)),
		rateDivisor(rateDivisorIn),
		commonField(static_cast<protocol::uart::CommonGroup>(commonFieldIn)),
		timeField(static_cast<protocol::uart::TimeGroup>(timeFieldIn)),
		imuField(static_cast<protocol::uart::ImuGroup>(imuFieldIn)),
		gpsField(static_cast<protocol::uart::GpsGroup>(gpsFieldIn)),
		attitudeField(static_cast<protocol::uart::AttitudeGroup>(attitudeFieldIn)),
		insField(static_cast<protocol::uart::InsGroup>(insFieldIn)),
    gps2Field(static_cast<protocol::uart::GpsGroup>(gps2FieldIn))
	{ }
};

/// \brief Structure representing the Quaternion, Magnetic, Acceleration and Angular Rates register.
struct QuaternionMagneticAccelerationAndAngularRatesRegister
{
	vn::math::vec4f quat; ///< The quat field.
	vn::math::vec3f mag; ///< The mag field.
	vn::math::vec3f accel; ///< The accel field.
	vn::math::vec3f gyro; ///< The gyro field.

	QuaternionMagneticAccelerationAndAngularRatesRegister() { }

	/// \brief Creates an initializes a new QuaternionMagneticAccelerationAndAngularRatesRegister structure.
	///
	/// \param[in] quatIn Value to initialize the quat field with.
	/// \param[in] magIn Value to initialize the mag field with.
	/// \param[in] accelIn Value to initialize the accel field with.
	/// \param[in] gyroIn Value to initialize the gyro field with.
	QuaternionMagneticAccelerationAndAngularRatesRegister(
		vn::math::vec4f quatIn,
		vn::math::vec3f magIn,
		vn::math::vec3f accelIn,
		vn::math::vec3f gyroIn) :
		quat(quatIn),
		mag(magIn),
		accel(accelIn),
		gyro(gyroIn)
	{ }

};

/// \brief Structure representing the Magnetic, Acceleration and Angular Rates register.
struct MagneticAccelerationAndAngularRatesRegister
{
	vn::math::vec3f mag; ///< The mag field.
	vn::math::vec3f accel; ///< The accel field.
	vn::math::vec3f gyro; ///< The gyro field.

	MagneticAccelerationAndAngularRatesRegister() { }

	/// \brief Creates an initializes a new MagneticAccelerationAndAngularRatesRegister structure.
	///
	/// \param[in] magIn Value to initialize the mag field with.
	/// \param[in] accelIn Value to initialize the accel field with.
	/// \param[in] gyroIn Value to initialize the gyro field with.
	MagneticAccelerationAndAngularRatesRegister(
		vn::math::vec3f magIn,
		vn::math::vec3f accelIn,
		vn::math::vec3f gyroIn) :
		mag(magIn),
		accel(accelIn),
		gyro(gyroIn)
	{ }

};

/// \brief Structure representing the Magnetic and Gravity Reference Vectors register.
struct MagneticAndGravityReferenceVectorsRegister
{
	vn::math::vec3f magRef; ///< The magRef field.
	vn::math::vec3f accRef; ///< The accRef field.

	MagneticAndGravityReferenceVectorsRegister() { }

	/// \brief Creates an initializes a new MagneticAndGravityReferenceVectorsRegister structure.
	///
	/// \param[in] magRefIn Value to initialize the magRef field with.
	/// \param[in] accRefIn Value to initialize the accRef field with.
	MagneticAndGravityReferenceVectorsRegister(
		vn::math::vec3f magRefIn,
		vn::math::vec3f accRefIn) :
		magRef(magRefIn),
		accRef(accRefIn)
	{ }

};

/// \brief Structure representing the Filter Measurements Variance Parameters register.
struct FilterMeasurementsVarianceParametersRegister
{
	float angularWalkVariance; ///< The angularWalkVariance field.
	vn::math::vec3f angularRateVariance; ///< The angularRateVariance field.
	vn::math::vec3f magneticVariance; ///< The magneticVariance field.
	vn::math::vec3f accelerationVariance; ///< The accelerationVariance field.

	FilterMeasurementsVarianceParametersRegister() { }

	/// \brief Creates an initializes a new FilterMeasurementsVarianceParametersRegister structure.
	///
	/// \param[in] angularWalkVarianceIn Value to initialize the angularWalkVariance field with.
	/// \param[in] angularRateVarianceIn Value to initialize the angularRateVariance field with.
	/// \param[in] magneticVarianceIn Value to initialize the magneticVariance field with.
	/// \param[in] accelerationVarianceIn Value to initialize the accelerationVariance field with.
	FilterMeasurementsVarianceParametersRegister(
		float angularWalkVarianceIn,
		vn::math::vec3f angularRateVarianceIn,
		vn::math::vec3f magneticVarianceIn,
		vn::math::vec3f accelerationVarianceIn) :
		angularWalkVariance(angularWalkVarianceIn),
		angularRateVariance(angularRateVarianceIn),
		magneticVariance(magneticVarianceIn),
		accelerationVariance(accelerationVarianceIn)
	{ }

};

/// \brief Structure representing the Magnetometer Compensation register.
struct MagnetometerCompensationRegister
{
	vn::math::mat3f c; ///< The c field.
	vn::math::vec3f b; ///< The b field.

	MagnetometerCompensationRegister() { }

	/// \brief Creates an initializes a new MagnetometerCompensationRegister structure.
	///
	/// \param[in] cIn Value to initialize the c field with.
	/// \param[in] bIn Value to initialize the b field with.
	MagnetometerCompensationRegister(
		vn::math::mat3f cIn,
		vn::math::vec3f bIn) :
		c(cIn),
		b(bIn)
	{ }

};

/// \brief Structure representing the Filter Active Tuning Parameters register.
struct FilterActiveTuningParametersRegister
{
	float magneticDisturbanceGain; ///< The magneticDisturbanceGain field.
	float accelerationDisturbanceGain; ///< The accelerationDisturbanceGain field.
	float magneticDisturbanceMemory; ///< The magneticDisturbanceMemory field.
	float accelerationDisturbanceMemory; ///< The accelerationDisturbanceMemory field.

	FilterActiveTuningParametersRegister() { }

	/// \brief Creates an initializes a new FilterActiveTuningParametersRegister structure.
	///
	/// \param[in] magneticDisturbanceGainIn Value to initialize the magneticDisturbanceGain field with.
	/// \param[in] accelerationDisturbanceGainIn Value to initialize the accelerationDisturbanceGain field with.
	/// \param[in] magneticDisturbanceMemoryIn Value to initialize the magneticDisturbanceMemory field with.
	/// \param[in] accelerationDisturbanceMemoryIn Value to initialize the accelerationDisturbanceMemory field with.
	FilterActiveTuningParametersRegister(
		float magneticDisturbanceGainIn,
		float accelerationDisturbanceGainIn,
		float magneticDisturbanceMemoryIn,
		float accelerationDisturbanceMemoryIn) :
		magneticDisturbanceGain(magneticDisturbanceGainIn),
		accelerationDisturbanceGain(accelerationDisturbanceGainIn),
		magneticDisturbanceMemory(magneticDisturbanceMemoryIn),
		accelerationDisturbanceMemory(accelerationDisturbanceMemoryIn)
	{ }

};

/// \brief Structure representing the Acceleration Compensation register.
struct AccelerationCompensationRegister
{
	vn::math::mat3f c; ///< The c field.
	vn::math::vec3f b; ///< The b field.

	AccelerationCompensationRegister() { }

	/// \brief Creates an initializes a new AccelerationCompensationRegister structure.
	///
	/// \param[in] cIn Value to initialize the c field with.
	/// \param[in] bIn Value to initialize the b field with.
	AccelerationCompensationRegister(
		vn::math::mat3f cIn,
		vn::math::vec3f bIn) :
		c(cIn),
		b(bIn)
	{ }

};

/// \brief Structure representing the Yaw, Pitch, Roll, Magnetic, Acceleration and Angular Rates register.
struct YawPitchRollMagneticAccelerationAndAngularRatesRegister
{
	vn::math::vec3f yawPitchRoll; ///< The yawPitchRoll field.
	vn::math::vec3f mag; ///< The mag field.
	vn::math::vec3f accel; ///< The accel field.
	vn::math::vec3f gyro; ///< The gyro field.

	YawPitchRollMagneticAccelerationAndAngularRatesRegister() { }

	/// \brief Creates an initializes a new YawPitchRollMagneticAccelerationAndAngularRatesRegister structure.
	///
	/// \param[in] yawPitchRollIn Value to initialize the yawPitchRoll field with.
	/// \param[in] magIn Value to initialize the mag field with.
	/// \param[in] accelIn Value to initialize the accel field with.
	/// \param[in] gyroIn Value to initialize the gyro field with.
	YawPitchRollMagneticAccelerationAndAngularRatesRegister(
		vn::math::vec3f yawPitchRollIn,
		vn::math::vec3f magIn,
		vn::math::vec3f accelIn,
		vn::math::vec3f gyroIn) :
		yawPitchRoll(yawPitchRollIn),
		mag(magIn),
		accel(accelIn),
		gyro(gyroIn)
	{ }

};

/// \brief Structure representing the Communication Protocol Control register.
struct CommunicationProtocolControlRegister
{
	protocol::uart::CountMode serialCount; ///< The serialCount field.
	protocol::uart::StatusMode serialStatus; ///< The serialStatus field.
	protocol::uart::CountMode spiCount; ///< The spiCount field.
	protocol::uart::StatusMode spiStatus; ///< The spiStatus field.
	protocol::uart::ChecksumMode serialChecksum; ///< The serialChecksum field.
	protocol::uart::ChecksumMode spiChecksum; ///< The spiChecksum field.
	protocol::uart::ErrorMode errorMode; ///< The errorMode field.

	CommunicationProtocolControlRegister() { }

	/// \brief Creates an initializes a new CommunicationProtocolControlRegister structure.
	///
	/// \param[in] serialCountIn Value to initialize the serialCount field with.
	/// \param[in] serialStatusIn Value to initialize the serialStatus field with.
	/// \param[in] spiCountIn Value to initialize the spiCount field with.
	/// \param[in] spiStatusIn Value to initialize the spiStatus field with.
	/// \param[in] serialChecksumIn Value to initialize the serialChecksum field with.
	/// \param[in] spiChecksumIn Value to initialize the spiChecksum field with.
	/// \param[in] errorModeIn Value to initialize the errorMode field with.
	CommunicationProtocolControlRegister(
		protocol::uart::CountMode serialCountIn,
		protocol::uart::StatusMode serialStatusIn,
		protocol::uart::CountMode spiCountIn,
		protocol::uart::StatusMode spiStatusIn,
		protocol::uart::ChecksumMode serialChecksumIn,
		protocol::uart::ChecksumMode spiChecksumIn,
		protocol::uart::ErrorMode errorModeIn) :
		serialCount(serialCountIn),
		serialStatus(serialStatusIn),
		spiCount(spiCountIn),
		spiStatus(spiStatusIn),
		serialChecksum(serialChecksumIn),
		spiChecksum(spiChecksumIn),
		errorMode(errorModeIn)
	{ }

};

/// \brief Structure representing the Synchronization Control register.
struct SynchronizationControlRegister
{
	protocol::uart::SyncInMode syncInMode; ///< The syncInMode field.
	protocol::uart::SyncInEdge syncInEdge; ///< The syncInEdge field.
	uint16_t syncInSkipFactor; ///< The syncInSkipFactor field.
	protocol::uart::SyncOutMode syncOutMode; ///< The syncOutMode field.
	protocol::uart::SyncOutPolarity syncOutPolarity; ///< The syncOutPolarity field.
	uint16_t syncOutSkipFactor; ///< The syncOutSkipFactor field.
	uint32_t syncOutPulseWidth; ///< The syncOutPulseWidth field.

	SynchronizationControlRegister() { }

	/// \brief Creates an initializes a new SynchronizationControlRegister structure.
	///
	/// \param[in] syncInModeIn Value to initialize the syncInMode field with.
	/// \param[in] syncInEdgeIn Value to initialize the syncInEdge field with.
	/// \param[in] syncInSkipFactorIn Value to initialize the syncInSkipFactor field with.
	/// \param[in] syncOutModeIn Value to initialize the syncOutMode field with.
	/// \param[in] syncOutPolarityIn Value to initialize the syncOutPolarity field with.
	/// \param[in] syncOutSkipFactorIn Value to initialize the syncOutSkipFactor field with.
	/// \param[in] syncOutPulseWidthIn Value to initialize the syncOutPulseWidth field with.
	SynchronizationControlRegister(
		protocol::uart::SyncInMode syncInModeIn,
		protocol::uart::SyncInEdge syncInEdgeIn,
		uint16_t syncInSkipFactorIn,
		protocol::uart::SyncOutMode syncOutModeIn,
		protocol::uart::SyncOutPolarity syncOutPolarityIn,
		uint16_t syncOutSkipFactorIn,
		uint32_t syncOutPulseWidthIn) :
		syncInMode(syncInModeIn),
		syncInEdge(syncInEdgeIn),
		syncInSkipFactor(syncInSkipFactorIn),
		syncOutMode(syncOutModeIn),
		syncOutPolarity(syncOutPolarityIn),
		syncOutSkipFactor(syncOutSkipFactorIn),
		syncOutPulseWidth(syncOutPulseWidthIn)
	{ }

};

/// \brief Structure representing the Synchronization Status register.
struct SynchronizationStatusRegister
{
	uint32_t syncInCount; ///< The syncInCount field.
	uint32_t syncInTime; ///< The syncInTime field.
	uint32_t syncOutCount; ///< The syncOutCount field.

	SynchronizationStatusRegister() { }

	/// \brief Creates an initializes a new SynchronizationStatusRegister structure.
	///
	/// \param[in] syncInCountIn Value to initialize the syncInCount field with.
	/// \param[in] syncInTimeIn Value to initialize the syncInTime field with.
	/// \param[in] syncOutCountIn Value to initialize the syncOutCount field with.
	SynchronizationStatusRegister(
		uint32_t syncInCountIn,
		uint32_t syncInTimeIn,
		uint32_t syncOutCountIn) :
		syncInCount(syncInCountIn),
		syncInTime(syncInTimeIn),
		syncOutCount(syncOutCountIn)
	{ }

};

/// \brief Structure representing the Filter Basic Control register.
struct FilterBasicControlRegister
{
	protocol::uart::MagneticMode magMode; ///< The magMode field.
	protocol::uart::ExternalSensorMode extMagMode; ///< The extMagMode field.
	protocol::uart::ExternalSensorMode extAccMode; ///< The extAccMode field.
	protocol::uart::ExternalSensorMode extGyroMode; ///< The extGyroMode field.
	vn::math::vec3f gyroLimit; ///< The gyroLimit field.

	FilterBasicControlRegister() { }

	/// \brief Creates an initializes a new FilterBasicControlRegister structure.
	///
	/// \param[in] magModeIn Value to initialize the magMode field with.
	/// \param[in] extMagModeIn Value to initialize the extMagMode field with.
	/// \param[in] extAccModeIn Value to initialize the extAccMode field with.
	/// \param[in] extGyroModeIn Value to initialize the extGyroMode field with.
	/// \param[in] gyroLimitIn Value to initialize the gyroLimit field with.
	FilterBasicControlRegister(
		protocol::uart::MagneticMode magModeIn,
		protocol::uart::ExternalSensorMode extMagModeIn,
		protocol::uart::ExternalSensorMode extAccModeIn,
		protocol::uart::ExternalSensorMode extGyroModeIn,
		vn::math::vec3f gyroLimitIn) :
		magMode(magModeIn),
		extMagMode(extMagModeIn),
		extAccMode(extAccModeIn),
		extGyroMode(extGyroModeIn),
		gyroLimit(gyroLimitIn)
	{ }

};

/// \brief Structure representing the VPE Basic Control register.
struct VpeBasicControlRegister
{
	protocol::uart::VpeEnable enable; ///< The enable field.
	protocol::uart::HeadingMode headingMode; ///< The headingMode field.
	protocol::uart::VpeMode filteringMode; ///< The filteringMode field.
	protocol::uart::VpeMode tuningMode; ///< The tuningMode field.

	VpeBasicControlRegister() { }

	/// \brief Creates an initializes a new VpeBasicControlRegister structure.
	///
	/// \param[in] enableIn Value to initialize the enable field with.
	/// \param[in] headingModeIn Value to initialize the headingMode field with.
	/// \param[in] filteringModeIn Value to initialize the filteringMode field with.
	/// \param[in] tuningModeIn Value to initialize the tuningMode field with.
	VpeBasicControlRegister(
		protocol::uart::VpeEnable enableIn,
		protocol::uart::HeadingMode headingModeIn,
		protocol::uart::VpeMode filteringModeIn,
		protocol::uart::VpeMode tuningModeIn) :
		enable(enableIn),
		headingMode(headingModeIn),
		filteringMode(filteringModeIn),
		tuningMode(tuningModeIn)
	{ }

};

/// \brief Structure representing the Heave Configuration Register
struct HeaveConfigurationRegister
{
	float initialWavePeriod; 
	float initialWaveAmplitude; 
	float maxWavePeriod;
	float minWaveAmplitude;	
	float delayedHeaveCutoffFreq;
	float heaveCutoffFreq;
	float heaveRateCutoffFreq;
	
	HeaveConfigurationRegister() { }

	/// \brief Creates and initializes a new HeaveConfigurationRegister structure.
	///
	/// \param[in] initialWavePeriodIn Value to initialize the initialWavePeriod field with.
	/// \param[in] initialWaveAmplitudeIn Value to initialize the initialWaveAmplitude field with.
	/// \param[in] maxWavePeriodIn Value to initialize the maxWavePeriod field with.
	/// \param[in] minWaveAmplitudeIn Value to initialize the minWaveAmplitude field with.
	/// \param[in] delayedHeaveCutoffFreqIn Value to initialize the delayedHeaveCutoffFreq field with.
	/// \param[in] heaveCutoffFreqIn Value to initialize the heaveCutoffFreq field with.
	/// \param[in] heaveRateCutoffFreqIn Value to initialize the heaveRateCutoffFreq field with.
	HeaveConfigurationRegister(
		float initialWavePeriodIn, 
		float initialWaveAmplitudeIn, 
		float maxWavePeriodIn,
		float minWaveAmplitudeIn,
		float delayedHeaveCutoffFreqIn,
		float heaveCutoffFreqIn,
		float heaveRateCutoffFreqIn
		) :
			initialWavePeriod(initialWavePeriodIn),
			initialWaveAmplitude(initialWaveAmplitudeIn),
			maxWavePeriod(maxWavePeriodIn),
			minWaveAmplitude(minWaveAmplitudeIn),
			delayedHeaveCutoffFreq(delayedHeaveCutoffFreqIn),
			heaveCutoffFreq(heaveCutoffFreqIn),
			heaveRateCutoffFreq(heaveRateCutoffFreqIn)
		{ }
};

/// \brief Structure representing the VPE Magnetometer Basic Tuning register.
struct VpeMagnetometerBasicTuningRegister
{
	vn::math::vec3f baseTuning; ///< The baseTuning field.
	vn::math::vec3f adaptiveTuning; ///< The adaptiveTuning field.
	vn::math::vec3f adaptiveFiltering; ///< The adaptiveFiltering field.

	VpeMagnetometerBasicTuningRegister() { }

	/// \brief Creates an initializes a new VpeMagnetometerBasicTuningRegister structure.
	///
	/// \param[in] baseTuningIn Value to initialize the baseTuning field with.
	/// \param[in] adaptiveTuningIn Value to initialize the adaptiveTuning field with.
	/// \param[in] adaptiveFilteringIn Value to initialize the adaptiveFiltering field with.
	VpeMagnetometerBasicTuningRegister(
		vn::math::vec3f baseTuningIn,
		vn::math::vec3f adaptiveTuningIn,
		vn::math::vec3f adaptiveFilteringIn) :
		baseTuning(baseTuningIn),
		adaptiveTuning(adaptiveTuningIn),
		adaptiveFiltering(adaptiveFilteringIn)
	{ }

};

/// \brief Structure representing the VPE Magnetometer Advanced Tuning register.
struct VpeMagnetometerAdvancedTuningRegister
{
	vn::math::vec3f minFiltering; ///< The minFiltering field.
	vn::math::vec3f maxFiltering; ///< The maxFiltering field.
	float maxAdaptRate; ///< The maxAdaptRate field.
	float disturbanceWindow; ///< The disturbanceWindow field.
	float maxTuning; ///< The maxTuning field.

	VpeMagnetometerAdvancedTuningRegister() { }

	/// \brief Creates an initializes a new VpeMagnetometerAdvancedTuningRegister structure.
	///
	/// \param[in] minFilteringIn Value to initialize the minFiltering field with.
	/// \param[in] maxFilteringIn Value to initialize the maxFiltering field with.
	/// \param[in] maxAdaptRateIn Value to initialize the maxAdaptRate field with.
	/// \param[in] disturbanceWindowIn Value to initialize the disturbanceWindow field with.
	/// \param[in] maxTuningIn Value to initialize the maxTuning field with.
	VpeMagnetometerAdvancedTuningRegister(
		vn::math::vec3f minFilteringIn,
		vn::math::vec3f maxFilteringIn,
		float maxAdaptRateIn,
		float disturbanceWindowIn,
		float maxTuningIn) :
		minFiltering(minFilteringIn),
		maxFiltering(maxFilteringIn),
		maxAdaptRate(maxAdaptRateIn),
		disturbanceWindow(disturbanceWindowIn),
		maxTuning(maxTuningIn)
	{ }

};

/// \brief Structure representing the VPE Accelerometer Basic Tuning register.
struct VpeAccelerometerBasicTuningRegister
{
	vn::math::vec3f baseTuning; ///< The baseTuning field.
	vn::math::vec3f adaptiveTuning; ///< The adaptiveTuning field.
	vn::math::vec3f adaptiveFiltering; ///< The adaptiveFiltering field.

	VpeAccelerometerBasicTuningRegister() { }

	/// \brief Creates an initializes a new VpeAccelerometerBasicTuningRegister structure.
	///
	/// \param[in] baseTuningIn Value to initialize the baseTuning field with.
	/// \param[in] adaptiveTuningIn Value to initialize the adaptiveTuning field with.
	/// \param[in] adaptiveFilteringIn Value to initialize the adaptiveFiltering field with.
	VpeAccelerometerBasicTuningRegister(
		vn::math::vec3f baseTuningIn,
		vn::math::vec3f adaptiveTuningIn,
		vn::math::vec3f adaptiveFilteringIn) :
		baseTuning(baseTuningIn),
		adaptiveTuning(adaptiveTuningIn),
		adaptiveFiltering(adaptiveFilteringIn)
	{ }

};

/// \brief Structure representing the VPE Accelerometer Advanced Tuning register.
struct VpeAccelerometerAdvancedTuningRegister
{
	vn::math::vec3f minFiltering; ///< The minFiltering field.
	vn::math::vec3f maxFiltering; ///< The maxFiltering field.
	float maxAdaptRate; ///< The maxAdaptRate field.
	float disturbanceWindow; ///< The disturbanceWindow field.
	float maxTuning; ///< The maxTuning field.

	VpeAccelerometerAdvancedTuningRegister() { }

	/// \brief Creates an initializes a new VpeAccelerometerAdvancedTuningRegister structure.
	///
	/// \param[in] minFilteringIn Value to initialize the minFiltering field with.
	/// \param[in] maxFilteringIn Value to initialize the maxFiltering field with.
	/// \param[in] maxAdaptRateIn Value to initialize the maxAdaptRate field with.
	/// \param[in] disturbanceWindowIn Value to initialize the disturbanceWindow field with.
	/// \param[in] maxTuningIn Value to initialize the maxTuning field with.
	VpeAccelerometerAdvancedTuningRegister(
		vn::math::vec3f minFilteringIn,
		vn::math::vec3f maxFilteringIn,
		float maxAdaptRateIn,
		float disturbanceWindowIn,
		float maxTuningIn) :
		minFiltering(minFilteringIn),
		maxFiltering(maxFilteringIn),
		maxAdaptRate(maxAdaptRateIn),
		disturbanceWindow(disturbanceWindowIn),
		maxTuning(maxTuningIn)
	{ }

};

/// \brief Structure representing the VPE Gyro Basic Tuning register.
struct VpeGyroBasicTuningRegister
{
	vn::math::vec3f angularWalkVariance; ///< The angularWalkVariance field.
	vn::math::vec3f baseTuning; ///< The baseTuning field.
	vn::math::vec3f adaptiveTuning; ///< The adaptiveTuning field.

	VpeGyroBasicTuningRegister() { }

	/// \brief Creates an initializes a new VpeGyroBasicTuningRegister structure.
	///
	/// \param[in] angularWalkVarianceIn Value to initialize the angularWalkVariance field with.
	/// \param[in] baseTuningIn Value to initialize the baseTuning field with.
	/// \param[in] adaptiveTuningIn Value to initialize the adaptiveTuning field with.
	VpeGyroBasicTuningRegister(
		vn::math::vec3f angularWalkVarianceIn,
		vn::math::vec3f baseTuningIn,
		vn::math::vec3f adaptiveTuningIn) :
		angularWalkVariance(angularWalkVarianceIn),
		baseTuning(baseTuningIn),
		adaptiveTuning(adaptiveTuningIn)
	{ }

};

/// \brief Structure representing the Magnetometer Calibration Control register.
struct MagnetometerCalibrationControlRegister
{
	protocol::uart::HsiMode hsiMode; ///< The hsiMode field.
	protocol::uart::HsiOutput hsiOutput; ///< The hsiOutput field.
	uint8_t convergeRate; ///< The convergeRate field.

	MagnetometerCalibrationControlRegister() { }

	/// \brief Creates an initializes a new MagnetometerCalibrationControlRegister structure.
	///
	/// \param[in] hsiModeIn Value to initialize the hsiMode field with.
	/// \param[in] hsiOutputIn Value to initialize the hsiOutput field with.
	/// \param[in] convergeRateIn Value to initialize the convergeRate field with.
	MagnetometerCalibrationControlRegister(
		protocol::uart::HsiMode hsiModeIn,
		protocol::uart::HsiOutput hsiOutputIn,
		uint8_t convergeRateIn) :
		hsiMode(hsiModeIn),
		hsiOutput(hsiOutputIn),
		convergeRate(convergeRateIn)
	{ }

};

/// \brief Structure representing the Calculated Magnetometer Calibration register.
struct CalculatedMagnetometerCalibrationRegister
{
	vn::math::mat3f c; ///< The c field.
	vn::math::vec3f b; ///< The b field.

	CalculatedMagnetometerCalibrationRegister() { }

	/// \brief Creates an initializes a new CalculatedMagnetometerCalibrationRegister structure.
	///
	/// \param[in] cIn Value to initialize the c field with.
	/// \param[in] bIn Value to initialize the b field with.
	CalculatedMagnetometerCalibrationRegister(
		vn::math::mat3f cIn,
		vn::math::vec3f bIn) :
		c(cIn),
		b(bIn)
	{ }

};

/// \brief Structure representing the Velocity Compensation Control register.
struct VelocityCompensationControlRegister
{
	protocol::uart::VelocityCompensationMode mode; ///< The mode field.
	float velocityTuning; ///< The velocityTuning field.
	float rateTuning; ///< The rateTuning field.

	VelocityCompensationControlRegister() { }

	/// \brief Creates an initializes a new VelocityCompensationControlRegister structure.
	///
	/// \param[in] modeIn Value to initialize the mode field with.
	/// \param[in] velocityTuningIn Value to initialize the velocityTuning field with.
	/// \param[in] rateTuningIn Value to initialize the rateTuning field with.
	VelocityCompensationControlRegister(
		protocol::uart::VelocityCompensationMode modeIn,
		float velocityTuningIn,
		float rateTuningIn) :
		mode(modeIn),
		velocityTuning(velocityTuningIn),
		rateTuning(rateTuningIn)
	{ }

};

/// \brief Structure representing the Velocity Compensation Status register.
struct VelocityCompensationStatusRegister
{
	float x; ///< The x field.
	float xDot; ///< The xDot field.
	vn::math::vec3f accelOffset; ///< The accelOffset field.
	vn::math::vec3f omega; ///< The omega field.

	VelocityCompensationStatusRegister() { }

	/// \brief Creates an initializes a new VelocityCompensationStatusRegister structure.
	///
	/// \param[in] xIn Value to initialize the x field with.
	/// \param[in] xDotIn Value to initialize the xDot field with.
	/// \param[in] accelOffsetIn Value to initialize the accelOffset field with.
	/// \param[in] omegaIn Value to initialize the omega field with.
	VelocityCompensationStatusRegister(
		float xIn,
		float xDotIn,
		vn::math::vec3f accelOffsetIn,
		vn::math::vec3f omegaIn) :
		x(xIn),
		xDot(xDotIn),
		accelOffset(accelOffsetIn),
		omega(omegaIn)
	{ }

};

/// \brief Structure representing the IMU Measurements register.
struct ImuMeasurementsRegister
{
	vn::math::vec3f mag; ///< The mag field.
	vn::math::vec3f accel; ///< The accel field.
	vn::math::vec3f gyro; ///< The gyro field.
	float temp; ///< The temp field.
	float pressure; ///< The pressure field.

	ImuMeasurementsRegister() { }

	/// \brief Creates an initializes a new ImuMeasurementsRegister structure.
	///
	/// \param[in] magIn Value to initialize the mag field with.
	/// \param[in] accelIn Value to initialize the accel field with.
	/// \param[in] gyroIn Value to initialize the gyro field with.
	/// \param[in] tempIn Value to initialize the temp field with.
	/// \param[in] pressureIn Value to initialize the pressure field with.
	ImuMeasurementsRegister(
		vn::math::vec3f magIn,
		vn::math::vec3f accelIn,
		vn::math::vec3f gyroIn,
		float tempIn,
		float pressureIn) :
		mag(magIn),
		accel(accelIn),
		gyro(gyroIn),
		temp(tempIn),
		pressure(pressureIn)
	{ }

};

/// \brief Structure representing the GPS Configuration register.
struct GpsConfigurationRegister
{
	protocol::uart::GpsMode mode; ///< The mode field.
	protocol::uart::PpsSource ppsSource; ///< The ppsSource field.
	protocol::uart::GpsRate rate; ///< The rate field.
	protocol::uart::AntPower antPow; ///< The antPow field.

	GpsConfigurationRegister() : 
		rate(protocol::uart::GPSRATE_5HZ),
		antPow(protocol::uart::ANTPOWER_OFFRESV)
	{ }

	/// \brief Creates an initializes a new GpsConfigurationRegister structure (deprecated).
	///
	/// \param[in] modeIn Value to initialize the mode field with.
	/// \param[in] ppsSourceIn Value to initialize the ppsSource field with.
	GpsConfigurationRegister(
		protocol::uart::GpsMode modeIn,
		protocol::uart::PpsSource ppsSourceIn) :
		mode(modeIn),
		ppsSource(ppsSourceIn),
		rate(protocol::uart::GPSRATE_5HZ),
		antPow(protocol::uart::ANTPOWER_OFFRESV)
	{ }

	/// \brief Creates an initializes a new GpsConfigurationRegister structure.
	///
	/// \param[in] modeIn Value to initialize the mode field with.
	/// \param[in] ppsSourceIn Value to initialize the ppsSource field with.
	/// \param[in] rateIn Value to initialize the rate field with.
	/// \param[in] antPowIn Value to initialize the antPow field with.
	GpsConfigurationRegister(
		protocol::uart::GpsMode modeIn,
		protocol::uart::PpsSource ppsSourceIn,
		protocol::uart::GpsRate rateIn,
		protocol::uart::AntPower antPowIn) :
		mode(modeIn),
		ppsSource(ppsSourceIn),
		rate(rateIn),
		antPow(antPowIn)
	{ }
};

/// \brief Structure representing the GPS Solution - LLA register.
struct GpsSolutionLlaRegister
{
	double time; ///< The time field.
	uint16_t week; ///< The week field.
	protocol::uart::GpsFix gpsFix; ///< The gpsFix field.
	uint8_t numSats; ///< The numSats field.
	vn::math::vec3d lla; ///< The lla field.
	vn::math::vec3f nedVel; ///< The nedVel field.
	vn::math::vec3f nedAcc; ///< The nedAcc field.
	float speedAcc; ///< The speedAcc field.
	float timeAcc; ///< The timeAcc field.

	GpsSolutionLlaRegister() { }

	/// \brief Creates an initializes a new GpsSolutionLlaRegister structure.
	///
	/// \param[in] timeIn Value to initialize the time field with.
	/// \param[in] weekIn Value to initialize the week field with.
	/// \param[in] gpsFixIn Value to initialize the gpsFix field with.
	/// \param[in] numSatsIn Value to initialize the numSats field with.
	/// \param[in] llaIn Value to initialize the lla field with.
	/// \param[in] nedVelIn Value to initialize the nedVel field with.
	/// \param[in] nedAccIn Value to initialize the nedAcc field with.
	/// \param[in] speedAccIn Value to initialize the speedAcc field with.
	/// \param[in] timeAccIn Value to initialize the timeAcc field with.
	GpsSolutionLlaRegister(
		double timeIn,
		uint16_t weekIn,
		protocol::uart::GpsFix gpsFixIn,
		uint8_t numSatsIn,
		vn::math::vec3d llaIn,
		vn::math::vec3f nedVelIn,
		vn::math::vec3f nedAccIn,
		float speedAccIn,
		float timeAccIn) :
		time(timeIn),
		week(weekIn),
		gpsFix(gpsFixIn),
		numSats(numSatsIn),
		lla(llaIn),
		nedVel(nedVelIn),
		nedAcc(nedAccIn),
		speedAcc(speedAccIn),
		timeAcc(timeAccIn)
	{ }

};

/// \brief Structure representing the GPS Solution - ECEF register.
struct GpsSolutionEcefRegister
{
	double tow; ///< The tow field.
	uint16_t week; ///< The week field.
	protocol::uart::GpsFix gpsFix; ///< The gpsFix field.
	uint8_t numSats; ///< The numSats field.
	vn::math::vec3d position; ///< The position field.
	vn::math::vec3f velocity; ///< The velocity field.
	vn::math::vec3f posAcc; ///< The posAcc field.
	float speedAcc; ///< The speedAcc field.
	float timeAcc; ///< The timeAcc field.

	GpsSolutionEcefRegister() { }

	/// \brief Creates an initializes a new GpsSolutionEcefRegister structure.
	///
	/// \param[in] towIn Value to initialize the tow field with.
	/// \param[in] weekIn Value to initialize the week field with.
	/// \param[in] gpsFixIn Value to initialize the gpsFix field with.
	/// \param[in] numSatsIn Value to initialize the numSats field with.
	/// \param[in] positionIn Value to initialize the position field with.
	/// \param[in] velocityIn Value to initialize the velocity field with.
	/// \param[in] posAccIn Value to initialize the posAcc field with.
	/// \param[in] speedAccIn Value to initialize the speedAcc field with.
	/// \param[in] timeAccIn Value to initialize the timeAcc field with.
	GpsSolutionEcefRegister(
		double towIn,
		uint16_t weekIn,
		protocol::uart::GpsFix gpsFixIn,
		uint8_t numSatsIn,
		vn::math::vec3d positionIn,
		vn::math::vec3f velocityIn,
		vn::math::vec3f posAccIn,
		float speedAccIn,
		float timeAccIn) :
		tow(towIn),
		week(weekIn),
		gpsFix(gpsFixIn),
		numSats(numSatsIn),
		position(positionIn),
		velocity(velocityIn),
		posAcc(posAccIn),
		speedAcc(speedAccIn),
		timeAcc(timeAccIn)
	{ }

};

/// \brief Structure representing the INS Solution - LLA register.
struct InsSolutionLlaRegister
{
	double time; ///< The time field.
	uint16_t week; ///< The week field.
	uint16_t status; ///< The status field.
	vn::math::vec3f yawPitchRoll; ///< The yawPitchRoll field.
	vn::math::vec3d position; ///< The position field.
	vn::math::vec3f nedVel; ///< The nedVel field.
	float attUncertainty; ///< The attUncertainty field.
	float posUncertainty; ///< The posUncertainty field.
	float velUncertainty; ///< The velUncertainty field.

	InsSolutionLlaRegister() { }

	/// \brief Creates an initializes a new InsSolutionLlaRegister structure.
	///
	/// \param[in] timeIn Value to initialize the time field with.
	/// \param[in] weekIn Value to initialize the week field with.
	/// \param[in] statusIn Value to initialize the status field with.
	/// \param[in] yawPitchRollIn Value to initialize the yawPitchRoll field with.
	/// \param[in] positionIn Value to initialize the position field with.
	/// \param[in] nedVelIn Value to initialize the nedVel field with.
	/// \param[in] attUncertaintyIn Value to initialize the attUncertainty field with.
	/// \param[in] posUncertaintyIn Value to initialize the posUncertainty field with.
	/// \param[in] velUncertaintyIn Value to initialize the velUncertainty field with.
	InsSolutionLlaRegister(
		double timeIn,
		uint16_t weekIn,
		uint16_t statusIn,
		vn::math::vec3f yawPitchRollIn,
		vn::math::vec3d positionIn,
		vn::math::vec3f nedVelIn,
		float attUncertaintyIn,
		float posUncertaintyIn,
		float velUncertaintyIn) :
		time(timeIn),
		week(weekIn),
		status(statusIn),
		yawPitchRoll(yawPitchRollIn),
		position(positionIn),
		nedVel(nedVelIn),
		attUncertainty(attUncertaintyIn),
		posUncertainty(posUncertaintyIn),
		velUncertainty(velUncertaintyIn)
	{ }

};

/// \brief Structure representing the INS Solution - ECEF register.
struct InsSolutionEcefRegister
{
	double time; ///< The time field.
	uint16_t week; ///< The week field.
	uint16_t status; ///< The status field.
	vn::math::vec3f yawPitchRoll; ///< The yawPitchRoll field.
	vn::math::vec3d position; ///< The position field.
	vn::math::vec3f velocity; ///< The velocity field.
	float attUncertainty; ///< The attUncertainty field.
	float posUncertainty; ///< The posUncertainty field.
	float velUncertainty; ///< The velUncertainty field.

	InsSolutionEcefRegister() { }

	/// \brief Creates an initializes a new InsSolutionEcefRegister structure.
	///
	/// \param[in] timeIn Value to initialize the time field with.
	/// \param[in] weekIn Value to initialize the week field with.
	/// \param[in] statusIn Value to initialize the status field with.
	/// \param[in] yawPitchRollIn Value to initialize the yawPitchRoll field with.
	/// \param[in] positionIn Value to initialize the position field with.
	/// \param[in] velocityIn Value to initialize the velocity field with.
	/// \param[in] attUncertaintyIn Value to initialize the attUncertainty field with.
	/// \param[in] posUncertaintyIn Value to initialize the posUncertainty field with.
	/// \param[in] velUncertaintyIn Value to initialize the velUncertainty field with.
	InsSolutionEcefRegister(
		double timeIn,
		uint16_t weekIn,
		uint16_t statusIn,
		vn::math::vec3f yawPitchRollIn,
		vn::math::vec3d positionIn,
		vn::math::vec3f velocityIn,
		float attUncertaintyIn,
		float posUncertaintyIn,
		float velUncertaintyIn) :
		time(timeIn),
		week(weekIn),
		status(statusIn),
		yawPitchRoll(yawPitchRollIn),
		position(positionIn),
		velocity(velocityIn),
		attUncertainty(attUncertaintyIn),
		posUncertainty(posUncertaintyIn),
		velUncertainty(velUncertaintyIn)
	{ }

};

/// \brief Structure representing the INS Basic Configuration register for a VN-200 sensor.
struct InsBasicConfigurationRegisterVn200
{
	protocol::uart::Scenario scenario; ///< The scenario field.
	bool ahrsAiding; ///< The ahrsAiding field.

	InsBasicConfigurationRegisterVn200() { }

	/// \brief Creates an initializes a new InsBasicConfigurationRegisterVn200 structure.
	///
	/// \param[in] scenarioIn Value to initialize the scenario field with.
	/// \param[in] ahrsAidingIn Value to initialize the ahrsAiding field with.
	InsBasicConfigurationRegisterVn200(
		protocol::uart::Scenario scenarioIn,
		bool ahrsAidingIn) :
		scenario(scenarioIn),
		ahrsAiding(ahrsAidingIn)
	{ }

};

/// \brief Structure representing the INS Basic Configuration register for a VN-300 sensor.
struct InsBasicConfigurationRegisterVn300
{
	protocol::uart::Scenario scenario; ///< The scenario field.
	bool ahrsAiding; ///< The ahrsAiding field.
	bool estBaseline; ///< The estBaseline field.

	InsBasicConfigurationRegisterVn300() { }

	/// \brief Creates an initializes a new InsBasicConfigurationRegisterVn300 structure.
	///
	/// \param[in] scenarioIn Value to initialize the scenario field with.
	/// \param[in] ahrsAidingIn Value to initialize the ahrsAiding field with.
	/// \param[in] estBaselineIn Value to initialize the estBaseline field with.
	InsBasicConfigurationRegisterVn300(
		protocol::uart::Scenario scenarioIn,
		bool ahrsAidingIn,
		bool estBaselineIn) :
		scenario(scenarioIn),
		ahrsAiding(ahrsAidingIn),
		estBaseline(estBaselineIn)
	{ }

};

/// \brief Structure representing the INS Advanced Configuration register.
struct InsAdvancedConfigurationRegister
{
	bool useMag; ///< The useMag field.
	bool usePres; ///< The usePres field.
	bool posAtt; ///< The posAtt field.
	bool velAtt; ///< The velAtt field.
	bool velBias; ///< The velBias field.
	protocol::uart::FoamInit useFoam; ///< The useFoam field.
	uint8_t gpsCovType; ///< The gpsCovType field.
	uint8_t velCount; ///< The velCount field.
	float velInit; ///< The velInit field.
	float moveOrigin; ///< The moveOrigin field.
	float gpsTimeout; ///< The gpsTimeout field.
	float deltaLimitPos; ///< The deltaLimitPos field.
	float deltaLimitVel; ///< The deltaLimitVel field.
	float minPosUncertainty; ///< The minPosUncertainty field.
	float minVelUncertainty; ///< The minVelUncertainty field.

	InsAdvancedConfigurationRegister() { }

	/// \brief Creates an initializes a new InsAdvancedConfigurationRegister structure.
	///
	/// \param[in] useMagIn Value to initialize the useMag field with.
	/// \param[in] usePresIn Value to initialize the usePres field with.
	/// \param[in] posAttIn Value to initialize the posAtt field with.
	/// \param[in] velAttIn Value to initialize the velAtt field with.
	/// \param[in] velBiasIn Value to initialize the velBias field with.
	/// \param[in] useFoamIn Value to initialize the useFoam field with.
	/// \param[in] gpsCovTypeIn Value to initialize the gpsCovType field with.
	/// \param[in] velCountIn Value to initialize the velCount field with.
	/// \param[in] velInitIn Value to initialize the velInit field with.
	/// \param[in] moveOriginIn Value to initialize the moveOrigin field with.
	/// \param[in] gpsTimeoutIn Value to initialize the gpsTimeout field with.
	/// \param[in] deltaLimitPosIn Value to initialize the deltaLimitPos field with.
	/// \param[in] deltaLimitVelIn Value to initialize the deltaLimitVel field with.
	/// \param[in] minPosUncertaintyIn Value to initialize the minPosUncertainty field with.
	/// \param[in] minVelUncertaintyIn Value to initialize the minVelUncertainty field with.
	InsAdvancedConfigurationRegister(
		bool useMagIn,
		bool usePresIn,
		bool posAttIn,
		bool velAttIn,
		bool velBiasIn,
		protocol::uart::FoamInit useFoamIn,
		uint8_t gpsCovTypeIn,
		uint8_t velCountIn,
		float velInitIn,
		float moveOriginIn,
		float gpsTimeoutIn,
		float deltaLimitPosIn,
		float deltaLimitVelIn,
		float minPosUncertaintyIn,
		float minVelUncertaintyIn) :
		useMag(useMagIn),
		usePres(usePresIn),
		posAtt(posAttIn),
		velAtt(velAttIn),
		velBias(velBiasIn),
		useFoam(useFoamIn),
		gpsCovType(gpsCovTypeIn),
		velCount(velCountIn),
		velInit(velInitIn),
		moveOrigin(moveOriginIn),
		gpsTimeout(gpsTimeoutIn),
		deltaLimitPos(deltaLimitPosIn),
		deltaLimitVel(deltaLimitVelIn),
		minPosUncertainty(minPosUncertaintyIn),
		minVelUncertainty(minVelUncertaintyIn)
	{ }

};

/// \brief Structure representing the INS State - LLA register.
struct InsStateLlaRegister
{
	vn::math::vec3f yawPitchRoll; ///< The yawPitchRoll field.
	vn::math::vec3d position; ///< The position field.
	vn::math::vec3f velocity; ///< The velocity field.
	vn::math::vec3f accel; ///< The accel field.
	vn::math::vec3f angularRate; ///< The angularRate field.

	InsStateLlaRegister() { }

	/// \brief Creates an initializes a new InsStateLlaRegister structure.
	///
	/// \param[in] yawPitchRollIn Value to initialize the yawPitchRoll field with.
	/// \param[in] positionIn Value to initialize the position field with.
	/// \param[in] velocityIn Value to initialize the velocity field with.
	/// \param[in] accelIn Value to initialize the accel field with.
	/// \param[in] angularRateIn Value to initialize the angularRate field with.
	InsStateLlaRegister(
		vn::math::vec3f yawPitchRollIn,
		vn::math::vec3d positionIn,
		vn::math::vec3f velocityIn,
		vn::math::vec3f accelIn,
		vn::math::vec3f angularRateIn) :
		yawPitchRoll(yawPitchRollIn),
		position(positionIn),
		velocity(velocityIn),
		accel(accelIn),
		angularRate(angularRateIn)
	{ }

};

/// \brief Structure representing the INS State - ECEF register.
struct InsStateEcefRegister
{
	vn::math::vec3f yawPitchRoll; ///< The yawPitchRoll field.
	vn::math::vec3d position; ///< The position field.
	vn::math::vec3f velocity; ///< The velocity field.
	vn::math::vec3f accel; ///< The accel field.
	vn::math::vec3f angularRate; ///< The angularRate field.

	InsStateEcefRegister() { }

	/// \brief Creates an initializes a new InsStateEcefRegister structure.
	///
	/// \param[in] yawPitchRollIn Value to initialize the yawPitchRoll field with.
	/// \param[in] positionIn Value to initialize the position field with.
	/// \param[in] velocityIn Value to initialize the velocity field with.
	/// \param[in] accelIn Value to initialize the accel field with.
	/// \param[in] angularRateIn Value to initialize the angularRate field with.
	InsStateEcefRegister(
		vn::math::vec3f yawPitchRollIn,
		vn::math::vec3d positionIn,
		vn::math::vec3f velocityIn,
		vn::math::vec3f accelIn,
		vn::math::vec3f angularRateIn) :
		yawPitchRoll(yawPitchRollIn),
		position(positionIn),
		velocity(velocityIn),
		accel(accelIn),
		angularRate(angularRateIn)
	{ }

};

/// \brief Structure representing the Startup Filter Bias Estimate register.
struct StartupFilterBiasEstimateRegister
{
	vn::math::vec3f gyroBias; ///< The gyroBias field.
	vn::math::vec3f accelBias; ///< The accelBias field.
	float pressureBias; ///< The pressureBias field.

	StartupFilterBiasEstimateRegister() { }

	/// \brief Creates an initializes a new StartupFilterBiasEstimateRegister structure.
	///
	/// \param[in] gyroBiasIn Value to initialize the gyroBias field with.
	/// \param[in] accelBiasIn Value to initialize the accelBias field with.
	/// \param[in] pressureBiasIn Value to initialize the pressureBias field with.
	StartupFilterBiasEstimateRegister(
		vn::math::vec3f gyroBiasIn,
		vn::math::vec3f accelBiasIn,
		float pressureBiasIn) :
		gyroBias(gyroBiasIn),
		accelBias(accelBiasIn),
		pressureBias(pressureBiasIn)
	{ }

};

/// \brief Structure representing the Delta Theta and Delta Velocity register.
struct DeltaThetaAndDeltaVelocityRegister
{
	float deltaTime; ///< The deltaTime field.
	vn::math::vec3f deltaTheta; ///< The deltaTheta field.
	vn::math::vec3f deltaVelocity; ///< The deltaVelocity field.

	DeltaThetaAndDeltaVelocityRegister() { }

	/// \brief Creates an initializes a new DeltaThetaAndDeltaVelocityRegister structure.
	///
	/// \param[in] deltaTimeIn Value to initialize the deltaTime field with.
	/// \param[in] deltaThetaIn Value to initialize the deltaTheta field with.
	/// \param[in] deltaVelocityIn Value to initialize the deltaVelocity field with.
	DeltaThetaAndDeltaVelocityRegister(
		float deltaTimeIn,
		vn::math::vec3f deltaThetaIn,
		vn::math::vec3f deltaVelocityIn) :
		deltaTime(deltaTimeIn),
		deltaTheta(deltaThetaIn),
		deltaVelocity(deltaVelocityIn)
	{ }

};

/// \brief Structure representing the Delta Theta and Delta Velocity Configuration register.
struct DeltaThetaAndDeltaVelocityConfigurationRegister
{
	protocol::uart::IntegrationFrame integrationFrame; ///< The integrationFrame field.
	protocol::uart::CompensationMode gyroCompensation; ///< The gyroCompensation field.
	protocol::uart::AccCompensationMode accelCompensation; ///< The accelCompensation field.
	protocol::uart::EarthRateCorrection earthRateCorrection; ///< The earthRateCorrection field.

	DeltaThetaAndDeltaVelocityConfigurationRegister() :
		earthRateCorrection(protocol::uart::EARTHRATECORR_NONE)
	{ }

	/// \brief Creates an initializes a new DeltaThetaAndDeltaVelocityConfigurationRegister structure (deprecated).
	///
	/// \param[in] integrationFrameIn Value to initialize the integrationFrame field with.
	/// \param[in] gyroCompensationIn Value to initialize the gyroCompensation field with.
	/// \param[in] accelCompensationIn Value to initialize the accelCompensation field with.
	DeltaThetaAndDeltaVelocityConfigurationRegister(
		protocol::uart::IntegrationFrame integrationFrameIn,
		protocol::uart::CompensationMode gyroCompensationIn,
		protocol::uart::AccCompensationMode accelCompensationIn) :
		integrationFrame(integrationFrameIn),
		gyroCompensation(gyroCompensationIn),
		accelCompensation(accelCompensationIn),
		earthRateCorrection(protocol::uart::EARTHRATECORR_NONE)
	{ }

	/// \brief Creates an initializes a new DeltaThetaAndDeltaVelocityConfigurationRegister structure.
	///
	/// \param[in] integrationFrameIn Value to initialize the integrationFrame field with.
	/// \param[in] gyroCompensationIn Value to initialize the gyroCompensation field with.
	/// \param[in] accelCompensationIn Value to initialize the accelCompensation field with.
	/// \param[in] earthRateCorrection Value to initialize the earthRateCorrection field with.
	DeltaThetaAndDeltaVelocityConfigurationRegister(
		protocol::uart::IntegrationFrame integrationFrameIn,
		protocol::uart::CompensationMode gyroCompensationIn,
		protocol::uart::AccCompensationMode accelCompensationIn,
		protocol::uart::EarthRateCorrection earthRateCorrectionIn) :
		integrationFrame(integrationFrameIn),
		gyroCompensation(gyroCompensationIn),
		accelCompensation(accelCompensationIn),
		earthRateCorrection(earthRateCorrectionIn)
	{ }

};

/// \brief Structure representing the Reference Vector Configuration register.
struct ReferenceVectorConfigurationRegister
{
	bool useMagModel; ///< The useMagModel field.
	bool useGravityModel; ///< The useGravityModel field.
	uint32_t recalcThreshold; ///< The recalcThreshold field.
	float year; ///< The year field.
	vn::math::vec3d position; ///< The position field.

	ReferenceVectorConfigurationRegister() { }

	/// \brief Creates an initializes a new ReferenceVectorConfigurationRegister structure.
	///
	/// \param[in] useMagModelIn Value to initialize the useMagModel field with.
	/// \param[in] useGravityModelIn Value to initialize the useGravityModel field with.
	/// \param[in] recalcThresholdIn Value to initialize the recalcThreshold field with.
	/// \param[in] yearIn Value to initialize the year field with.
	/// \param[in] positionIn Value to initialize the position field with.
	ReferenceVectorConfigurationRegister(
		bool useMagModelIn,
		bool useGravityModelIn,
		uint32_t recalcThresholdIn,
		float yearIn,
		vn::math::vec3d positionIn) :
		useMagModel(useMagModelIn),
		useGravityModel(useGravityModelIn),
		recalcThreshold(recalcThresholdIn),
		year(yearIn),
		position(positionIn)
	{ }

};

/// \brief Structure representing the Gyro Compensation register.
struct GyroCompensationRegister
{
	vn::math::mat3f c; ///< The c field.
	vn::math::vec3f b; ///< The b field.

	GyroCompensationRegister() { }

	/// \brief Creates an initializes a new GyroCompensationRegister structure.
	///
	/// \param[in] cIn Value to initialize the c field with.
	/// \param[in] bIn Value to initialize the b field with.
	GyroCompensationRegister(
		vn::math::mat3f cIn,
		vn::math::vec3f bIn) :
		c(cIn),
		b(bIn)
	{ }

};

/// \brief Structure representing the IMU Filtering Configuration register.
struct ImuFilteringConfigurationRegister
{
	uint16_t magWindowSize; ///< The magWindowSize field.
	uint16_t accelWindowSize; ///< The accelWindowSize field.
	uint16_t gyroWindowSize; ///< The gyroWindowSize field.
	uint16_t tempWindowSize; ///< The tempWindowSize field.
	uint16_t presWindowSize; ///< The presWindowSize field.
	protocol::uart::FilterMode magFilterMode; ///< The magFilterMode field.
	protocol::uart::FilterMode accelFilterMode; ///< The accelFilterMode field.
	protocol::uart::FilterMode gyroFilterMode; ///< The gyroFilterMode field.
	protocol::uart::FilterMode tempFilterMode; ///< The tempFilterMode field.
	protocol::uart::FilterMode presFilterMode; ///< The presFilterMode field.

	ImuFilteringConfigurationRegister() { }

	/// \brief Creates an initializes a new ImuFilteringConfigurationRegister structure.
	///
	/// \param[in] magWindowSizeIn Value to initialize the magWindowSize field with.
	/// \param[in] accelWindowSizeIn Value to initialize the accelWindowSize field with.
	/// \param[in] gyroWindowSizeIn Value to initialize the gyroWindowSize field with.
	/// \param[in] tempWindowSizeIn Value to initialize the tempWindowSize field with.
	/// \param[in] presWindowSizeIn Value to initialize the presWindowSize field with.
	/// \param[in] magFilterModeIn Value to initialize the magFilterMode field with.
	/// \param[in] accelFilterModeIn Value to initialize the accelFilterMode field with.
	/// \param[in] gyroFilterModeIn Value to initialize the gyroFilterMode field with.
	/// \param[in] tempFilterModeIn Value to initialize the tempFilterMode field with.
	/// \param[in] presFilterModeIn Value to initialize the presFilterMode field with.
	ImuFilteringConfigurationRegister(
		uint16_t magWindowSizeIn,
		uint16_t accelWindowSizeIn,
		uint16_t gyroWindowSizeIn,
		uint16_t tempWindowSizeIn,
		uint16_t presWindowSizeIn,
		protocol::uart::FilterMode magFilterModeIn,
		protocol::uart::FilterMode accelFilterModeIn,
		protocol::uart::FilterMode gyroFilterModeIn,
		protocol::uart::FilterMode tempFilterModeIn,
		protocol::uart::FilterMode presFilterModeIn) :
		magWindowSize(magWindowSizeIn),
		accelWindowSize(accelWindowSizeIn),
		gyroWindowSize(gyroWindowSizeIn),
		tempWindowSize(tempWindowSizeIn),
		presWindowSize(presWindowSizeIn),
		magFilterMode(magFilterModeIn),
		accelFilterMode(accelFilterModeIn),
		gyroFilterMode(gyroFilterModeIn),
		tempFilterMode(tempFilterModeIn),
		presFilterMode(presFilterModeIn)
	{ }

};

/// \brief Structure representing the GPS Compass Baseline register.
struct GpsCompassBaselineRegister
{
	vn::math::vec3f position; ///< The position field.
	vn::math::vec3f uncertainty; ///< The uncertainty field.

	GpsCompassBaselineRegister() { }

	/// \brief Creates an initializes a new GpsCompassBaselineRegister structure.
	///
	/// \param[in] positionIn Value to initialize the position field with.
	/// \param[in] uncertaintyIn Value to initialize the uncertainty field with.
	GpsCompassBaselineRegister(
		vn::math::vec3f positionIn,
		vn::math::vec3f uncertaintyIn) :
		position(positionIn),
		uncertainty(uncertaintyIn)
	{ }

};

/// \brief Structure representing the GPS Compass Estimated Baseline register.
struct GpsCompassEstimatedBaselineRegister
{
	bool estBaselineUsed; ///< The estBaselineUsed field.
	uint16_t numMeas; ///< The numMeas field.
	vn::math::vec3f position; ///< The position field.
	vn::math::vec3f uncertainty; ///< The uncertainty field.

	GpsCompassEstimatedBaselineRegister() { }

	/// \brief Creates an initializes a new GpsCompassEstimatedBaselineRegister structure.
	///
	/// \param[in] estBaselineUsedIn Value to initialize the estBaselineUsed field with.
	/// \param[in] numMeasIn Value to initialize the numMeas field with.
	/// \param[in] positionIn Value to initialize the position field with.
	/// \param[in] uncertaintyIn Value to initialize the uncertainty field with.
	GpsCompassEstimatedBaselineRegister(
		bool estBaselineUsedIn,
		uint16_t numMeasIn,
		vn::math::vec3f positionIn,
		vn::math::vec3f uncertaintyIn) :
		estBaselineUsed(estBaselineUsedIn),
		numMeas(numMeasIn),
		position(positionIn),
		uncertainty(uncertaintyIn)
	{ }

};

/// \brief Structure representing the IMU Rate Configuration register.
struct ImuRateConfigurationRegister
{
	uint16_t imuRate; ///< The imuRate field.
	uint16_t navDivisor; ///< The navDivisor field.
	float filterTargetRate; ///< The filterTargetRate field.
	float filterMinRate; ///< The filterMinRate field.

	ImuRateConfigurationRegister() { }

	/// \brief Creates an initializes a new ImuRateConfigurationRegister structure.
	///
	/// \param[in] imuRateIn Value to initialize the imuRate field with.
	/// \param[in] navDivisorIn Value to initialize the navDivisor field with.
	/// \param[in] filterTargetRateIn Value to initialize the filterTargetRate field with.
	/// \param[in] filterMinRateIn Value to initialize the filterMinRate field with.
	ImuRateConfigurationRegister(
		uint16_t imuRateIn,
		uint16_t navDivisorIn,
		float filterTargetRateIn,
		float filterMinRateIn) :
		imuRate(imuRateIn),
		navDivisor(navDivisorIn),
		filterTargetRate(filterTargetRateIn),
		filterMinRate(filterMinRateIn)
	{ }

};

/// \brief Structure representing the Yaw, Pitch, Roll, True Body Acceleration and Angular Rates register.
struct YawPitchRollTrueBodyAccelerationAndAngularRatesRegister
{
	vn::math::vec3f yawPitchRoll; ///< The yawPitchRoll field.
	vn::math::vec3f bodyAccel; ///< The bodyAccel field.
	vn::math::vec3f gyro; ///< The gyro field.

	YawPitchRollTrueBodyAccelerationAndAngularRatesRegister() { }

	/// \brief Creates an initializes a new YawPitchRollTrueBodyAccelerationAndAngularRatesRegister structure.
	///
	/// \param[in] yawPitchRollIn Value to initialize the yawPitchRoll field with.
	/// \param[in] bodyAccelIn Value to initialize the bodyAccel field with.
	/// \param[in] gyroIn Value to initialize the gyro field with.
	YawPitchRollTrueBodyAccelerationAndAngularRatesRegister(
		vn::math::vec3f yawPitchRollIn,
		vn::math::vec3f bodyAccelIn,
		vn::math::vec3f gyroIn) :
		yawPitchRoll(yawPitchRollIn),
		bodyAccel(bodyAccelIn),
		gyro(gyroIn)
	{ }

};

/// \brief Structure representing the Yaw, Pitch, Roll, True Inertial Acceleration and Angular Rates register.
struct YawPitchRollTrueInertialAccelerationAndAngularRatesRegister
{
	vn::math::vec3f yawPitchRoll; ///< The yawPitchRoll field.
	vn::math::vec3f inertialAccel; ///< The inertialAccel field.
	vn::math::vec3f gyro; ///< The gyro field.

	YawPitchRollTrueInertialAccelerationAndAngularRatesRegister() { }

	/// \brief Creates an initializes a new YawPitchRollTrueInertialAccelerationAndAngularRatesRegister structure.
	///
	/// \param[in] yawPitchRollIn Value to initialize the yawPitchRoll field with.
	/// \param[in] inertialAccelIn Value to initialize the inertialAccel field with.
	/// \param[in] gyroIn Value to initialize the gyro field with.
	YawPitchRollTrueInertialAccelerationAndAngularRatesRegister(
		vn::math::vec3f yawPitchRollIn,
		vn::math::vec3f inertialAccelIn,
		vn::math::vec3f gyroIn) :
		yawPitchRoll(yawPitchRollIn),
		inertialAccel(inertialAccelIn),
		gyro(gyroIn)
	{ }

};

/// \}

}
}

#endif
