/*
 $License:
    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
 $
 */

/*******************************************************************************
 *
 * $Id: helper-customer.h 5770 2011-07-14 01:34:10Z mcaramello $
 *
 *******************************************************************************/

#ifndef HELPER_C_H
#define HELPER_C_H

#ifdef __cplusplus
extern "C" {
#endif

#include "mltypes.h"
#include "mlerrorcode.h"

/*
    Defines 
*/

#define CALL_N_CHECK(f) {                                                   \
    unsigned int r35uLt = f;                                                \
    if(INV_SUCCESS != r35uLt) {                                              \
        printf("Error in file %s, line %d : %s returned code %s (#%d)\n",   \
                __FILE__, __LINE__, #f, MLErrorCode(r35uLt), r35uLt);       \
    }                                                                       \
}

#define CALL_CHECK_N_RETURN_ERROR(f) {                                      \
    unsigned int r35uLt = f;                                                \
    if(INV_SUCCESS != r35uLt) {                                              \
        printf("Error in file %s, line %d : %s returned code %s (#%d)\n",   \
                __FILE__, __LINE__, #f, MLErrorCode(r35uLt), r35uLt);       \
        return r35uLt;                                                      \
    }                                                                       \
}

// for functions returning void
#define CALL_CHECK_N_RETURN(f) {                                            \
    unsigned int r35uLt = f;                                                \
    if(INV_SUCCESS != r35uLt) {                                              \
        printf("Error in file %s, line %d : %s returned code %s (#%d)\n",   \
                __FILE__, __LINE__, #f, MLErrorCode(r35uLt), r35uLt);       \
        return;                                                             \
    }                                                                       \
}

#define CALL_CHECK_N_EXIT(f) {                                              \
    unsigned int r35uLt = f;                                                \
    if(INV_SUCCESS != r35uLt) {                                              \
        printf("Error in file %s, line %d : %s returned code %s (#%d)\n",   \
                __FILE__, __LINE__, #f, MLErrorCode(r35uLt), r35uLt);       \
        exit (r35uLt);                                                      \
    }                                                                       \
}

    
#define CALL_CHECK_N_CALLBACK(f, cb) {                                      \
    unsigned int r35uLt = f;                                                \
    if(INV_SUCCESS != r35uLt) {                                              \
        printf("Error in file %s, line %d : %s returned code %s (#%d)\n",   \
                __FILE__, __LINE__, #f, MLErrorCode(r35uLt), r35uLt);       \
        cb;                                                                 \
    }                                                                       \
}

#define CALL_CHECK_N_GOTO(f, label) {                                       \
    unsigned int r35uLt = f;                                                \
    if(INV_SUCCESS != r35uLt) {                                              \
        printf("Error in file %s, line %d : %s returned code %s (#%d)\n",   \
                __FILE__, __LINE__, #f, MLErrorCode(r35uLt), r35uLt);       \
        goto label;                                                         \
    }                                                                       \
}

#define DEFAULT_PLATFORM        PLATFORM_ID_MSB_V2
#define DEFAULT_ACCEL_ID        ACCEL_ID_KXTF9
#define DEFAULT_COMPASS_ID      COMPASS_ID_AK8975

#define DataLogger(x)           NULL
#define DataLoggerSelector(x)   //
#define DataLoggerCb(x)         NULL
#define findComm()              (9)
#define MenuHwChoice(p,a,c)     (*p = DEFAULT_PLATFORM, *a = DEFAULT_ACCEL_ID, \
                                 *c = DEFAULT_COMPASS_ID, INV_ERROR)

    char ConsoleGetChar(void);
    int ConsoleKbhit(void);
    struct mpuirq_data **InterruptPoll(
        int *handles, int numHandles, long tv_sec, long tv_usec);
    void InterruptPollDone(struct mpuirq_data ** data);

#ifdef __cplusplus
}
#endif

#endif // HELPER_C_H
