Suppressed conflicting destructor function.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   D7A_1x_TRAINING D7_MLX_AND_BAT D7A_1x_demo_sensors_v3

Fork of X_NUCLEO_IKS01A1 by ST

Components/lsm303c/LSM303C_ACC_driver.c

Committer:
Jeej
Date:
2017-02-07
Revision:
96:8cac3f3245b5

File content as of revision 96:8cac3f3245b5:

/**
 ******************************************************************************
 * @file    LSM303C_ACC_driver.c
 * @author  MEMS Application Team
 * @version V1.1
 * @date    24-February-2016
 * @brief   LSM303C Accelerometer driver file
 ******************************************************************************
 * @attention
 *
 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *   1. Redistributions of source code must retain the above copyright notice,
 *      this list of conditions and the following disclaimer.
 *   2. Redistributions in binary form must reproduce the above copyright notice,
 *      this list of conditions and the following disclaimer in the documentation
 *      and/or other materials provided with the distribution.
 *   3. Neither the name of STMicroelectronics nor the names of its contributors
 *      may be used to endorse or promote products derived from this software
 *      without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 ******************************************************************************
 */

/* Includes ------------------------------------------------------------------*/
#include "LSM303C_ACC_driver.h"

/* Imported function prototypes ----------------------------------------------*/
extern uint8_t LSM303C_ACC_IO_Write(void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite);
extern uint8_t LSM303C_ACC_IO_Read(void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead);

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name     : LSM303C_ACC_ReadReg
* Description       : Generic Reading function. It must be fullfilled with either
*                   : I2C or SPI reading functions                  
* Input             : Register Address
* Output            : Data REad
* Return            : None
*******************************************************************************/
status_t LSM303C_ACC_ReadReg(void *handle, u8_t Reg, u8_t* Data) 
{
  
  if (LSM303C_ACC_IO_Read(handle, Reg, Data, 1))
  {
    return MEMS_ERROR;
  }
  else
  {
    return MEMS_SUCCESS;
  }
}

/*******************************************************************************
* Function Name     : LSM303C_ACC_WriteReg
* Description       : Generic Writing function. It must be fullfilled with either
*                   : I2C or SPI writing function
* Input             : Register Address, Data to be written
* Output            : None
* Return            : None
*******************************************************************************/
status_t LSM303C_ACC_WriteReg(void *handle, u8_t Reg, u8_t Data) 
{
    
  if (LSM303C_ACC_IO_Write(handle, Reg, &Data, 1))
  {
    return MEMS_ERROR;
  }
  else
  {
    return MEMS_SUCCESS;
  }
}

/*******************************************************************************
* Function Name     : SwapHighLowByte
* Description       : Swap High/low byte in multiple byte values 
*                     It works with minimum 2 byte for every dimension.
*                     Example x,y,z with 2 byte for every dimension
*
* Input             : bufferToSwap -> buffer to swap 
*                     numberOfByte -> the buffer length in byte
*                     dimension -> number of dimension 
*
* Output            : bufferToSwap -> buffer swapped 
* Return            : None
*******************************************************************************/
void LSM303C_ACC_SwapHighLowByte(u8_t *bufferToSwap, u8_t numberOfByte, u8_t dimension)
{

  u8_t numberOfByteForDimension, i, j;
  u8_t tempValue[10];
  
  numberOfByteForDimension=numberOfByte/dimension;
  
  for (i=0; i<dimension;i++ )
  {
    for (j=0; j<numberOfByteForDimension;j++ )
        tempValue[j]=bufferToSwap[j+i*numberOfByteForDimension];
    for (j=0; j<numberOfByteForDimension;j++ )
        *(bufferToSwap+i*(numberOfByteForDimension)+j)=*(tempValue+(numberOfByteForDimension-1)-j);
  } 
}

/* Exported functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_WHO_AM_I
* Description    : Read WHO_AM_I
* Input          : Pointer to u8_t
* Output         : Status of WHO_AM_I 
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_WHO_AM_I(void *handle, u8_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_WHO_AM_I_REG_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_WHO_AM_I_MASK; //coerce   
  *value = *value >> LSM303C_ACC_WHO_AM_I_POSITION; //mask    

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_W_XEN
* Description    : Write XEN
* Input          : LSM303C_ACC_XEN_t
* Output         : None
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t  LSM303C_ACC_W_XEN(void *handle, LSM303C_ACC_XEN_t newValue)
{
  u8_t value;

  if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) )
    return MEMS_ERROR;

  value &= ~LSM303C_ACC_XEN_MASK; 
  value |= newValue;
  
  if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) )
    return MEMS_ERROR;

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_XEN
* Description    : Read XEN
* Input          : Pointer to LSM303C_ACC_XEN_t
* Output         : Status of XEN see LSM303C_ACC_XEN_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_XEN(void *handle, LSM303C_ACC_XEN_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_XEN_MASK; //mask

  return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name  : LSM303C_ACC_W_YEN
* Description    : Write YEN
* Input          : LSM303C_ACC_YEN_t
* Output         : None
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t  LSM303C_ACC_W_YEN(void *handle, LSM303C_ACC_YEN_t newValue)
{
  u8_t value;

  if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) )
    return MEMS_ERROR;

  value &= ~LSM303C_ACC_YEN_MASK; 
  value |= newValue;
  
  if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) )
    return MEMS_ERROR;

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_YEN
* Description    : Read YEN
* Input          : Pointer to LSM303C_ACC_YEN_t
* Output         : Status of YEN see LSM303C_ACC_YEN_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_YEN(void *handle, LSM303C_ACC_YEN_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_YEN_MASK; //mask

  return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name  : LSM303C_ACC_W_ZEN
* Description    : Write ZEN
* Input          : LSM303C_ACC_ZEN_t
* Output         : None
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t  LSM303C_ACC_W_ZEN(void *handle, LSM303C_ACC_ZEN_t newValue)
{
  u8_t value;

  if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) )
    return MEMS_ERROR;

  value &= ~LSM303C_ACC_ZEN_MASK; 
  value |= newValue;
  
  if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) )
    return MEMS_ERROR;

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_ZEN
* Description    : Read ZEN
* Input          : Pointer to LSM303C_ACC_ZEN_t
* Output         : Status of ZEN see LSM303C_ACC_ZEN_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_ZEN(void *handle, LSM303C_ACC_ZEN_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_ZEN_MASK; //mask

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_W_ODR
* Description    : Write ODR
* Input          : LSM303C_ACC_ODR_t
* Output         : None
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t  LSM303C_ACC_W_ODR(void *handle, LSM303C_ACC_ODR_t newValue)
{
  u8_t value;

  if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) )
    return MEMS_ERROR;

  value &= ~LSM303C_ACC_ODR_MASK; 
  value |= newValue;
  
  if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) )
    return MEMS_ERROR;

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_ODR
* Description    : Read ODR
* Input          : Pointer to LSM303C_ACC_ODR_t
* Output         : Status of ODR see LSM303C_ACC_ODR_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_ODR(void *handle, LSM303C_ACC_ODR_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_ODR_MASK; //mask

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_W_Data_Filter
* Description    : Write FDS
* Input          : LSM303C_ACC_FDS_t
* Output         : None
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t  LSM303C_ACC_W_Data_Filter(void *handle, LSM303C_ACC_FDS_t newValue)
{
  u8_t value;

  if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, &value) )
    return MEMS_ERROR;

  value &= ~LSM303C_ACC_FDS_MASK; 
  value |= newValue;
  
  if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG2_A, value) )
    return MEMS_ERROR;

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_Data_Filter
* Description    : Read FDS
* Input          : Pointer to LSM303C_ACC_FDS_t
* Output         : Status of FDS see LSM303C_ACC_FDS_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_Data_Filter(void *handle, LSM303C_ACC_FDS_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_FDS_MASK; //mask

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_W_hpf_cutoff_freq
* Description    : Write HPCF
* Input          : LSM303C_ACC_DFC_t
* Output         : None
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t  LSM303C_ACC_W_hpf_cutoff_freq(void *handle, LSM303C_ACC_DFC_t newValue)
{
  u8_t value;

  if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, &value) )
    return MEMS_ERROR;

  value &= ~LSM303C_ACC_DFC_MASK; 
  value |= newValue;
  
  if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG2_A, value) )
    return MEMS_ERROR;

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_hpf_cutoff_freq
* Description    : Read HPCF
* Input          : Pointer to LSM303C_ACC_DFC_t
* Output         : Status of HPCF see LSM303C_ACC_DFC_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_hpf_cutoff_freq(void *handle, LSM303C_ACC_DFC_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_DFC_MASK; //mask

  return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name  : LSM303C_ACC_W_hpf_mode
* Description    : Write HPM
* Input          : LSM303C_ACC_HPM_t
* Output         : None
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t  LSM303C_ACC_W_hpf_mode(void *handle, LSM303C_ACC_HPM_t newValue)
{
  u8_t value;

  if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, &value) )
    return MEMS_ERROR;

  value &= ~LSM303C_ACC_HPM_MASK; 
  value |= newValue;
  
  if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG2_A, value) )
    return MEMS_ERROR;

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_hpf_mode
* Description    : Read HPM
* Input          : Pointer to LSM303C_ACC_HPM_t
* Output         : Status of HPM see LSM303C_ACC_HPM_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_hpf_mode(void *handle, LSM303C_ACC_HPM_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_HPM_MASK; //mask

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_W_HiRes
* Description    : Write HR
* Input          : LSM303C_ACC_HR_t
* Output         : None
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t  LSM303C_ACC_W_HiRes(void *handle, LSM303C_ACC_HR_t newValue)
{
  u8_t value;

  if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) )
    return MEMS_ERROR;

  value &= ~LSM303C_ACC_HR_MASK; 
  value |= newValue;
  
  if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) )
    return MEMS_ERROR;

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_HiRes
* Description    : Read HR
* Input          : Pointer to LSM303C_ACC_HR_t
* Output         : Status of HR see LSM303C_ACC_HR_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_HiRes(void *handle, LSM303C_ACC_HR_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_HR_MASK; //mask

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_W_FullScale
* Description    : Write FS
* Input          : LSM303C_ACC_FS_t
* Output         : None
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t  LSM303C_ACC_W_FullScale(void *handle, LSM303C_ACC_FS_t newValue)
{
  u8_t value;

  if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG4_A, &value) )
    return MEMS_ERROR;

  value &= ~LSM303C_ACC_FS_MASK; 
  value |= newValue;
  
  if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG4_A, value) )
    return MEMS_ERROR;

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_FullScale
* Description    : Read FS
* Input          : Pointer to LSM303C_ACC_FS_t
* Output         : Status of FS see LSM303C_ACC_FS_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_FullScale(void *handle, LSM303C_ACC_FS_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG4_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_FS_MASK; //mask

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_W_BlockDataUpdate
* Description    : Write BDU
* Input          : LSM303C_ACC_BDU_t
* Output         : None
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t  LSM303C_ACC_W_BlockDataUpdate(void *handle, LSM303C_ACC_BDU_t newValue)
{
  u8_t value;

  if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) )
    return MEMS_ERROR;

  value &= ~LSM303C_ACC_BDU_MASK; 
  value |= newValue;
  
  if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) )
    return MEMS_ERROR;

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_BlockDataUpdate
* Description    : Read BDU
* Input          : Pointer to LSM303C_ACC_BDU_t
* Output         : Status of BDU see LSM303C_ACC_BDU_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_BlockDataUpdate(void *handle, LSM303C_ACC_BDU_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_BDU_MASK; //mask

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : LSM303C_ACC_R_XDataAvail
* Description    : Read XDA
* Input          : Pointer to LSM303C_ACC_XDA_t
* Output         : Status of XDA see LSM303C_ACC_XDA_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_XDataAvail(void *handle, LSM303C_ACC_XDA_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_XDA_MASK; //mask

  return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name  : LSM303C_ACC_R_YDataAvail
* Description    : Read YDA
* Input          : Pointer to LSM303C_ACC_YDA_t
* Output         : Status of YDA see LSM303C_ACC_YDA_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_YDataAvail(void *handle, LSM303C_ACC_YDA_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_YDA_MASK; //mask

  return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name  : LSM303C_ACC_R_ZDataAvail
* Description    : Read ZDA
* Input          : Pointer to LSM303C_ACC_ZDA_t
* Output         : Status of ZDA see LSM303C_ACC_ZDA_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_ZDataAvail(void *handle, LSM303C_ACC_ZDA_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_ZDA_MASK; //mask

  return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name  : LSM303C_ACC_R_XYZDataAvail
* Description    : Read ZYXDA
* Input          : Pointer to LSM303C_ACC_ZYXDA_t
* Output         : Status of ZYXDA see LSM303C_ACC_ZYXDA_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_XYZDataAvail(void *handle, LSM303C_ACC_ZYXDA_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_ZYXDA_MASK; //mask

  return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name  : LSM303C_ACC_R_XDataOverrun
* Description    : Read XOR
* Input          : Pointer to LSM303C_ACC_XOR_t
* Output         : Status of XOR see LSM303C_ACC_XOR_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_XDataOverrun(void *handle, LSM303C_ACC_XOR_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_XOR_MASK; //mask

  return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name  : LSM303C_ACC_R_YDataOverrun
* Description    : Read YOR
* Input          : Pointer to LSM303C_ACC_YOR_t
* Output         : Status of YOR see LSM303C_ACC_YOR_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_YDataOverrun(void *handle, LSM303C_ACC_YOR_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_YOR_MASK; //mask

  return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name  : LSM303C_ACC_R_ZDataOverrun
* Description    : Read ZOR
* Input          : Pointer to LSM303C_ACC_ZOR_t
* Output         : Status of ZOR see LSM303C_ACC_ZOR_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_ZDataOverrun(void *handle, LSM303C_ACC_ZOR_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_ZOR_MASK; //mask

  return MEMS_SUCCESS;
}
/*******************************************************************************
* Function Name  : LSM303C_ACC_R_XYZDataOverrun
* Description    : Read ZYXOR
* Input          : Pointer to LSM303C_ACC_ZYXOR_t
* Output         : Status of ZYXOR see LSM303C_ACC_ZYXOR_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/

status_t LSM303C_ACC_R_XYZDataOverrun(void *handle, LSM303C_ACC_ZYXOR_t *value)
{
 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) )
    return MEMS_ERROR;

  *value &= LSM303C_ACC_ZYXOR_MASK; //mask

  return MEMS_SUCCESS;
}

/*******************************************************************************
* Function Name  : status_t LSM303C_ACC_Get_Raw_Acceleration(u8_t *buff)
* Description    : Read Acceleration output register
* Input          : pointer to [u8_t]
* Output         : Acceleration buffer u8_t
* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
*******************************************************************************/
status_t LSM303C_ACC_Get_Raw_Acceleration(void *handle, u8_t *buff) 
{
  u8_t i, j, k;
  u8_t numberOfByteForDimension;
  
  numberOfByteForDimension=6/3;

  k=0;
  for (i=0; i<3;i++ ) 
  {
    for (j=0; j<numberOfByteForDimension;j++ )
    {   
        if( !LSM303C_ACC_ReadReg(handle, LSM303C_OUT_X_L_A+k, &buff[k]))
          return MEMS_ERROR;
        k++;    
    }
  }

  return MEMS_SUCCESS; 
}

/*
 * Following is the table of sensitivity values for each case.
 * Values are espressed in ug/digit.
 */
const long long LSM303C_ACC_Sensitivity_List[3] = {
       980, /* FS @2g */
       1950,    /* FS @4g */
       3900,    /* FS @8g */
};

/*
 * Values returned are espressed in mg.
 */
status_t LSM303C_ACC_Get_Acceleration(void *handle, int *buff)
{
  Type3Axis16bit_U raw_data_tmp;
  u8_t fs_mode = 0, shift = 0;
  LSM303C_ACC_FS_t fs;
 
  /* Determine the Full Scale the acc is set */
  if(!LSM303C_ACC_R_FullScale(handle, &fs)) {
    return MEMS_ERROR;
  }

  switch (fs) {
  case LSM303C_ACC_FS_2G:
    fs_mode = 0;
    break;

  case LSM303C_ACC_FS_4G:
    fs_mode = 1;
    break;

  case LSM303C_ACC_FS_8G:
    fs_mode = 2;
    break;
  }

  /* Read out raw accelerometer samples */
  if(!LSM303C_ACC_Get_Raw_Acceleration(handle, raw_data_tmp.u8bit)) {
    return MEMS_ERROR;
  }

  /* Apply proper shift and sensitivity */
  buff[0] = ((raw_data_tmp.i16bit[0] >> shift) * LSM303C_ACC_Sensitivity_List[fs_mode] + 500) / 1000;
  buff[1] = ((raw_data_tmp.i16bit[1] >> shift) * LSM303C_ACC_Sensitivity_List[fs_mode] + 500) / 1000;
  buff[2] = ((raw_data_tmp.i16bit[2] >> shift) * LSM303C_ACC_Sensitivity_List[fs_mode] + 500) / 1000;

  return MEMS_SUCCESS;
}