#ifndef _MW_ACC_H
#define _MW_ACC_H

#define KIONIX_DEVICE_ADDRESS ( 0x0F )

/* KIONIX accelerometer register addresses */
#define KIONIX_XOUT_HPF_L        ( 0x00 )
#define KIONIX_XOUT_HPF_H        ( 0x01 )
#define KIONIX_YOUT_HPF_L        ( 0x02 )
#define KIONIX_YOUT_HPF_H        ( 0x03 )
#define KIONIX_ZOUT_HPF_L        ( 0x04 )
#define KIONIX_ZOUT_HPF_H        ( 0x05 )
#define KIONIX_XOUT_L            ( 0x06 )
#define KIONIX_XOUT_H            ( 0x07 )
#define KIONIX_YOUT_L            ( 0x08 )
#define KIONIX_YOUT_H            ( 0x09 )
#define KIONIX_ZOUT_L            ( 0x0A )
#define KIONIX_ZOUT_H            ( 0x0B )
#define KIONIX_DCST_RESP         ( 0x0C )
#define KIONIX_WHO_AM_I          ( 0x0F )
#define KIONIX_TILT_POS_CUR      ( 0x10 )
#define KIONIX_TILT_POS_PRE      ( 0x11 )
#define KIONIX_INT_SRC_REG1      ( 0x15 )
#define KIONIX_INT_SRC_REG2      ( 0x16 )
#define KIONIX_STATUS_REG        ( 0x18 )
#define KIONIX_INT_REL           ( 0x1A )
#define KIONIX_CTRL_REG1         ( 0x1B )
#define KIONIX_CTRL_REG2         ( 0x1C )
#define KIONIX_CTRL_REG3         ( 0x1D )
#define KIONIX_INT_CTRL_REG1     ( 0x1E )
#define KIONIX_INT_CTRL_REG2     ( 0x1F )
#define KIONIX_INT_CTRL_REG3     ( 0x20 )
#define KIONIX_DATA_CTRL_REG     ( 0x21 )
#define KIONIX_TILT_TIMER        ( 0x28 )
#define KIONIX_WUF_TIMER         ( 0x29 )
#define KIONIX_TDT_TIMER         ( 0x2B )
#define KIONIX_TDT_H_THRESH      ( 0x2C )
#define KIONIX_TDT_L_THRESH      ( 0x2D )
#define KIONIX_TDT_TAP_TIMER     ( 0x2E )
#define KIONIX_TDT_TOTAL_TIMER   ( 0x2F )
#define KIONIX_TDT_LATENCY_TIMER ( 0x30 )
#define KIONIX_TDT_WINDOW_TIMER  ( 0x31 )
#define KIONIX_SELF_TEST         ( 0x3A )
#define KIONIX_WUF_THRESH        ( 0x5A )
#define KIONIX_TILT_ANGLE        ( 0x5C )
#define KIONIX_HYST_SET          ( 0x5F )

/* CTRL_REG1 */
#define PC1_STANDBY_MODE     ( 0 << 7 )
#define PC1_OPERATING_MODE   ( 1 << 7 )
#define RESOLUTION_8BIT      ( 0 << 6 )
#define RESOLUTION_12BIT     ( 1 << 6 )
#define DRDYE_DATA_AVAILABLE ( 1 << 5 )
#define WUF_ENABLE           ( 1 << 1 )
#define TAP_ENABLE_TDTE      ( 1 << 2 ) 
#define TILT_ENABLE_TPE      ( 1 << 0 )

/* CTRL_REG2 */
#define TILT_LEM (1 << 5 )
#define TILT_RIM (1 << 4 )
#define TILT_DOM (1 << 3 )
#define TILT_UPM (1 << 2 )
#define TILT_FDM (1 << 1 )
#define TILT_FUM (1 << 0 )

/* CTRL_REG3 */
#define SRST               ( 1 << 7 )
#define TILT_ODR_1_6HZ     ( 0 << 5 )
#define TILT_ODR_6_3HZ     ( 1 << 5 )
#define TILT_ODR_12_5HZ    ( 2 << 5 )
#define TILT_ODR_50HZ      ( 3 << 5 )
#define DCST               ( 1 << 4 )
#define TAP_ODR_50HZ       ( 0 << 2 )
#define TAP_ODR_100HZ      ( 1 << 2 )
#define TAP_ODR_200HZ      ( 2 << 2 )
#define TAP_ODR_400HZ      ( 3 << 2 )
#define WUF_ODR_25HZ       ( 0 << 0 )
#define WUF_ODR_50HZ       ( 1 << 0 )
#define WUF_ODR_100HZ      ( 2 << 0 )
#define WUF_ODR_200HZ      ( 3 << 0 )

/* INT_CTRL_REG1 */
#define IEN ( 1 << 5 ) 
#define IEA ( 1 << 4 )
#define IEL ( 1 << 3 )
#define IEU ( 1 << 2 )

/* INT_CTRL_REG2 */
#define XBW ( 1 << 7 ) 
#define YBW ( 1 << 6 )
#define ZBW ( 1 << 5 )

/* INT_CTRL_REG3 */
#define TLEM (1 << 5)
#define TRIM (1 << 4)
#define TDOM (1 << 3)
#define TUPM (1 << 2)
#define TFDM (1 << 1)
#define TFUM (1 << 0)

/* INT_SRC_REG2 */
#define INT_TPS		0x01
#define INT_WUFS	0x02
#define INT_TAP_SINGLE	0x04
#define INT_TAP_DOUBLE	0x08
#define INT_DRDY	0x10


void mw_acc_init_i2c(void);
void mw_acc_disable_i2c(void);
void mw_acc_i2c_read(const uint8_t RegisterAddress, uint8_t *pData, const uint8_t Length);
void mw_acc_i2c_write(uint8_t RegisterAddress, uint8_t *pData, uint8_t Length);

void mw_acc_init(void);
void mw_acc_enable(void);
void mw_acc_disable(void);
void mw_acc_read(int16_t *x, int16_t *y, int16_t *z);
void mw_acc_handle_irq(void);

#endif