/*
 $License:
    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
 $
 */
/*******************************************************************************
 *
 * $Id: mldl.h 5648 2011-06-15 18:27:07Z phickey $
 *
 *******************************************************************************/

#ifndef MLDL_H
#define MLDL_H

#include "mltypes.h"
#include "mlsl.h"
#include <linux/mpu.h>
#include "mldl_cfg.h"
#ifdef INV_INCLUDE_LEGACY_HEADERS
#include "mldl_legacy.h"
#endif

    /* ------------ */
    /* - Defines. - */
    /* ------------ */

typedef enum _DEVICE_CONFIG {
    DEVICE_MPU_ACCEL = 0,
    DEVICE_MPU,
    NUM_OF_DEVICES
} DEVICE_CONFIG;

#define SERIAL_I2C                  0
#define SERIAL_SPI                  1

#define DATAMODE_MANUAL             0   // Manual data mode
#define DATAMODE_AUTO               1   // Auto data mode

#define DATASRC_IMMEDIATE           0   // Return data immediately
#define DATASRC_WHENREADY           1   // Only return data when new data is available
#define DATASRC_FIFO                2   // Use FIFO for data

#define SENSOR_DATA_GYROX           0x0001
#define SENSOR_DATA_GYROY           0x0002
#define SENSOR_DATA_GYROZ           0x0004
#define SENSOR_DATA_ACCELX          0x0008
#define SENSOR_DATA_ACCELY          0x0010
#define SENSOR_DATA_ACCELZ          0x0020
#define SENSOR_DATA_AUX1            0x0040
#define SENSOR_DATA_AUX2            0x0080
#define SENSOR_DATA_AUX3            0x0100
#define SENSOR_DATA_TEMP            0x0200

#define INTPIN_MPU                  0

#define INTLOGIC_HIGH               0
#define INTLOGIC_LOW                1

#define INTTYPE_PUSHPULL            0
#define INTTYPE_OPENDRAIN           1

#define INTLATCH_DISABLE            0
#define INTLATCH_ENABLE             1

#define MPUINT_MPU_READY            0x04
#define MPUINT_DMP_DONE             0x02
#define MPUINT_DATA_READY           0x01

#define INTLATCHCLEAR_READSTATUS    0
#define INTLATCHCLEAR_ANYREAD       1

#define DMP_DONTRUN                 0
#define DMP_RUN                     1

    /*---- defines for external interrupt status (via external call into library) ----*/
#define INT_CLEAR                   0
#define INT_TRIGGERED               1

typedef enum {
    INTSRC_MPU = 0,
    INTSRC_AUX1,
    INTSRC_AUX2,
    INTSRC_AUX3,
    INTSRC_TIMER,
    INTSRC_UNKNOWN,
    INTSRC_MPU_FIFO,
    INTSRC_MPU_MOTION,
    NUM_OF_INTSOURCES,
} INT_SOURCE;

    /* --------------- */
    /* - Structures. - */
    /* --------------- */

    /* --------------- */
    /* - Variables.  - */
    /* --------------- */

    /* --------------------- */
    /* - Function p-types. - */
    /* --------------------- */
#ifdef __cplusplus
extern "C" {
#endif

    inv_error_t inv_dl_open(void *mlslHandle);
    inv_error_t inv_dl_close(void);

    inv_error_t inv_dl_start(unsigned long sensors);
    inv_error_t inv_dl_stop(unsigned long sensors);

    struct mldl_cfg *inv_get_dl_config(void);

    inv_error_t inv_init_requested_sensors(unsigned long sensors);
    unsigned char inv_get_mpu_slave_addr(void);
    inv_error_t inv_get_dl_ctrl_dmp(unsigned char enableRun,
                                    unsigned char enableFIFO);
    inv_error_t inv_get_dl_cfg_int(unsigned char triggers);
    inv_error_t inv_dl_cfg_sampling(unsigned char lpf, unsigned char divider);
    inv_error_t inv_set_full_scale(float fullScale);
    inv_error_t inv_set_external_sync(unsigned char extSync);
    inv_error_t inv_set_ignore_system_suspend(unsigned char ignore);
    inv_error_t inv_clock_source(unsigned char clkSource);
    inv_error_t inv_get_mpu_memory(unsigned short key,
                                   unsigned short length,
                                   unsigned char *buffer);
    inv_error_t inv_set_mpu_memory(unsigned short key,
                                   unsigned short length,
                                   const unsigned char *buffer);
    inv_error_t inv_load_dmp(const unsigned char *buffer,
                             unsigned short length,
                             unsigned short startAddress);

    unsigned char inv_get_slicon_rev(void);
    inv_error_t inv_set_offsetTC(const unsigned char *tc);
    inv_error_t inv_set_offset(const short *offset);

    /* Functions for setting and retrieving the DMP memory */
    inv_error_t inv_get_mpu_memory_original(unsigned short key,
                                            unsigned short length,
                                            unsigned char *buffer);
    void inv_set_get_address(unsigned short (*func) (unsigned short key));
    unsigned short inv_dl_get_address(unsigned short key);
    uint_fast8_t inv_dmpkey_supported(unsigned short key);

    inv_error_t inv_get_interrupt_status(unsigned char intPin,
                                         unsigned char *value);
    unsigned char inv_get_interrupt_trigger(unsigned char index);
    void inv_clear_interrupt_trigger(unsigned char index);
    inv_error_t inv_interrupt_handler(unsigned char intSource);

    /** Only exposed for testing purposes */
    inv_error_t inv_set_mpu_memory_one_bank(unsigned char bank,
                                            unsigned short memAddr,
                                            unsigned short length,
                                            const unsigned char *buffer);
    inv_error_t inv_get_mpu_memory_one_bank(unsigned char bank,
                                            unsigned char memAddr,
                                            unsigned short length,
                                            unsigned char *buffer);
	inv_error_t inv_set_accel_low_power( struct mldl_cfg *pdata,
								      void *mlsl_handle );
											
#ifdef __cplusplus
}
#endif
#endif                          // MLDL_H
