//*****************************************************************************
//
// magneto.h - Prototypes for the functions that manipulate magnetometer
//             readings.
//
// Copyright (c) 2013-2020 Texas Instruments Incorporated.  All rights reserved.
// Software License Agreement
// 
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
// 
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
// 
// This is part of revision 2.2.0.295 of the Tiva Firmware Development Package.
//
//*****************************************************************************

#ifndef __SENSORLIB_MAGNETO_H__
#define __SENSORLIB_MAGNETO_H__

//*****************************************************************************
//
// The structure that defines the internal state of the magnetometer hard and
// soft iron compensation.
//
//*****************************************************************************
typedef struct
{
    //
    // The hard iron induced offset in the X axis of the magnetometer.
    //
    float fXOffset;

    //
    // The hard iron induced offset in the Y axis of the magnetometer.
    //
    float fYOffset;

    //
    // The hard iron induced offset in the Z axis of the magnetometer.
    //
    float fZOffset;

    //
    // The Z axis rotation required to align the major/minor axes of the
    // ellipse in the X-Y plane with the X-Y axes, specified in radians.
    //
    float fXYAngle;

    //
    // The amount to scale the Y axis in order to turn the X-Y ellipse into a
    // circle.
    //
    float fYRatio;

    //
    // The Y axis rotation required to align the major/minor axes of the
    // ellipse in the X-Z plane with X-Z axes, specified in radians.
    //
    float fXZAngle;

    //
    // The amount to scale the Z axis in order to turn the X-Z ellipse into a
    // circle.
    //
    float fZRatio;
}
tMagnetoCompensation;

//*****************************************************************************
//
// Prototypes.
//
//*****************************************************************************
extern void MagnetoCompensateInit(tMagnetoCompensation *psInst, float fXOffset,
                                  float fYOffset, float fZOffset,
                                  float fXYAngle, float fYRatio,
                                  float fXZAngle, float fZRatio);
extern void MagnetoCompensate(tMagnetoCompensation *psInst, float *pfMagnetoX,
                              float *pfMagnetoY, float *pfMagnetoZ);
extern float MagnetoHeadingCompute(float fMagnetoX, float fMagnetoY,
                                   float fMagnetoZ, float fRoll, float fPitch);

#endif // __SENSORLIB_MAGNETO_H__
