#!/usr/bin/python
__author__ = "D.Qendri"
__copyright__ = "Copyright 2015 Sensorian"
__license__ = "GPL V3"
__version__ = "1.0"
import math
import sys
import time
from ctypes import *
FXO = CDLL("./libFXO.so")
#########################################################################################################
FXOS8700CQR1_ADDRESS	=0x1E
FXOS8700CQ_WHOAMI_VAL 	=0xC7		# FXOS8700CQ WHOAMI production register value
FXOS8700CQ_READ_LEN 	=12			# 6 channels of two bytes = 12 bytes 
UINT14_MAX 				=16383		# For processing the accelerometer data to right-justified 2's complement
#######################################Memory Map########################################################
STATUS	= 0x00
OUT_X_MSB	= 0x01
OUT_X_LSB	= 0x02
OUT_Y_MSB	= 0x03
OUT_Y_LSB	= 0x04
OUT_Z_MSB 		= 0x05
OUT_Z_LSB 		= 0x05
F_SETUP 		= 0x09
TRIG_CFG 		= 0x0A
SYSMOD 			= 0x0B
INT_SOURCE 		= 0x0C
WHO_AM_I 		= 0x0D
XYZ_DATA_CFG 	= 0x0E
HP_FILTER_CUTOFF = 0x0F
PL_STATUS 		= 0x10
PL_CFG 			= 0x11
PL_COUNT 		= 0x12
PL_BF_ZCOMP 	= 0x13
PL_THS_REG 		= 0x14
A_FFMT_CFG		= 0x15
A_FFMT_SRC 		= 0x16
A_FFMT_THS 		= 0x17
A_FFMT_COUNT 	= 0x18
TRANSIENT_CFG 	= 0x1D
TRANSIENT_SRC 	= 0x1E
TRANSIENT_THS 	= 0x1F
TRANSIENT_COUNT = 0x20
PULSE_CFG 		= 0x21
PULSE_SRC 		= 0x22
PULSE_THSX 		= 0x23
PULSE_THSY 		= 0x24
PULSE_THSZ 		= 0x25
PULSE_TMLT 		= 0x26
PULSE_LTCY 		= 0x27
PULSE_WIND 		= 0x28
ASLP_COUNT 		= 0x29
CTRL_REG1 		= 0x2A
CTRL_REG2 		= 0x2B
CTRL_REG3 		= 0x2C
CTRL_REG4 		= 0x2D
CTRL_REG5 		= 0x2E
OFF_X 			= 0x2F
OFF_Y 			= 0x30
OFF_Z 			= 0x31
M_DR_STATUS 	= 0x32
M_OUT_X_MSB 	= 0x33
M_OUT_X_LSB 	= 0x34
M_OUT_Y_MSB 	= 0x35
M_OUT_Y_LSB 	= 0x36
M_OUT_Z_MSB	 	= 0x37
M_OUT_Z_LSB 	= 0x38
CMP_X_MSB 		= 0x39
CMP_X_LSB 		= 0x3A
CMP_Y_MSB 		= 0x3B
CMP_Y_LSB 		= 0x3C
CMP_Z_MSB 		= 0x3D
CMP_Z_LSB 		= 0x3E
M_OFF_X_MSB 	= 0x3F
M_OFF_X_LSB 	= 0x40
M_OFF_Y_MSB 	= 0x41
M_OFF_Y_LSB 	= 0x42
M_OFF_Z_MSB 	= 0x43
M_OFF_Z_LSB 	= 0x44
MAX_X_MSB 		= 0x45
MAX_X_LSB 		= 0x46
MAX_Y_MSB 		= 0x47
MAX_Y_LSB 		= 0x48
MAX_Z_MSB 		= 0x49
MAX_Z_LSB 		= 0x4A
MIN_X_MSB 		= 0x4B
MIN_X_LSB 		= 0x4C
MIN_Y_MSB		= 0x4D
MIN_Y_LSB 		= 0x4E
MIN_Z_MSB 		= 0x4F
MIN_Z_LSB 		= 0x50
TEMP 			= 0x51
M_THS_CFG 		= 0x52
M_THS_SRC 		= 0x53
M_THS_X_MSB 	= 0x54
M_THS_X_LSB 	= 0x55
M_THS_Y_MSB 	= 0x56
M_THS_Y_LSB 	= 0x57
M_THS_Z_MSB 	= 0x58
M_THS_Z_LSB	 	= 0x59
M_THS_COUNT 	= 0x5A
M_CTRL_REG1 	= 0x5B
M_CTRL_REG2 	= 0x5C
M_CTRL_REG3 	= 0x5D
M_INT_SRC 		= 0x5E
A_VECM_CFG 		= 0x5F
A_VECM_THS_MSB 	= 0x60
A_VECM_THS_LSB 	= 0x61
A_VECM_CNT 		= 0x62
A_VECM_INITX_MSB = 0x63
A_VECM_INITX_LSB = 0x64
A_VECM_INITY_MSB = 0x65
A_VECM_INITY_LSB = 0x66
A_VECM_INITZ_MSB = 0x67
A_VECM_INITZ_LSB = 0x68
M_VECM_CFG 		= 0x69
M_VECM_THS_MSB 	= 0x6A
M_VECM_THS_LSB 	= 0x6B
M_VECM_CNT 		= 0x6C
M_VECM_INITX_MSB = 0x6D
M_VECM_INITX_LSB = 0x6E
M_VECM_INITY_MSB = 0x6F
M_VECM_INITY_LSB = 0x70
M_VECM_INITZ_MSB = 0x71
M_VECM_INITZ_LSB = 0x72
A_FFMT_THS_X_MSB = 0x73
A_FFMT_THS_X_LSB = 0x74
A_FFMT_THS_Y_MSB = 0x75
A_FFMT_THS_Y_LSB = 0x76
A_FFMT_THS_Z_MSB = 0x77
A_FFMT_THS_Z_LSB = 0x78
######################################################################################################################
FXOS8700CQ_ADDRESS  = 0x1E
#############*STATUS Register################/
ZYXOW_MASK     	=   0x80
ZOW_MASK       	=   0x40
YOW_MASK        =   0x20
XOW_MASK        =   0x10
ZYXDR_MASK      =   0x08
ZDR_MASK        =   0x04
YDR_MASK        =   0x02
XDR_MASK        =   0x01
##############STATUS Register#################
F_OVF_MASK          =  0x80
F_WMRK_FLAG_MASK    =   0x40
F_CNT5_MASK         =   0x20
F_CNT4_MASK         =   0x10
F_CNT3_MASK         =   0x08
F_CNT2_MASK         =   0x04
F_CNT1_MASK         =   0x02
F_CNT0_MASK         =   0x01
F_CNT_MASK          =   0x3F
##############STATUS Register################/
OUT_X_MSB_REG    =    0x01
OUT_X_LSB_REG    =    0x02
OUT_Y_MSB_REG    =    0x03
OUT_Y_LSB_REG    =    0x04
OUT_Z_MSB_REG    =    0x05
OUT_Z_LSB_REG    =    0x06
#############*FIFO Register################/
F_MODE1_MASK     =    0x80
F_MODE0_MASK     =    0x40
F_WMRK5_MASK     =    0x20
F_WMRK4_MASK     =    0x10
F_WMRK3_MASK     =    0x08
F_WMRK2_MASK     =    0x04
F_WMRK1_MASK     =    0x02
F_WMRK0_MASK     =    0x01
F_MODE_MASK      =    0xC0
F_WMRK_MASK      =    0x3F
F_MODE_DISABLED    =  0x00
F_MODE_CIRCULAR    =  (F_MODE0_MASK)
F_MODE_FILL        =  (F_MODE1_MASK)
F_MODE_TRIGGER     =  (F_MODE1_MASK+F_MODE0_MASK)
#############*TRIG_CFG Register################/
TRIG_TRANS_MASK    =   0x20
TRIG_LNDPRT_MASK   =   0x10
TRIG_PULSE_MASK    =   0x08
TRIG_FF_MT_MASK    =   0x04
#############*SYSMOD Register################/
FGERR_MASK       =    0x80    
FGT_4_MASK       =    0x40    
FGT_3_MASK       =    0x20    
FGT_2_MASK       =    0x10    
FGT_1_MASK       =    0x08    
FGT_0_MASK       =    0x04    
FGT_MASK         =    0x7C    
SYSMOD1_MASK     =    0x02
SYSMOD0_MASK     =    0x01
SYSMOD_MASK      =    0x03
SYSMOD_STANDBY    =   0x00
SYSMOD_WAKE       =   (SYSMOD0_MASK)
SYSMOD_SLEEP      =   (SYSMOD1_MASK)
#############*INT_SOURCE Register################/
SRC_ASLP_MASK      =  0x80
SRC_FIFO_MASK      =  0x40    
SRC_TRANS_MASK     =  0x20
SRC_LNDPRT_MASK    =  0x10
SRC_PULSE_MASK     =  0x08
SRC_FF_MT_MASK     =  0x04
SRC_DRDY_MASK      =  0x01
############WHO_AM_I Device ID Register##############/
FXOS8700CQ       =    0xC7
MXOS8700CQ       =    0xC4
########*XYZ_DATA_CFG Sensor Data Configuration Register########
HPF_OUT_MASK      =   0x10    # MMA8451 and MMA8452 only
FS1_MASK          =   0x02
FS0_MASK          =   0x01
FS_MASK            =  0x03
FULL_SCALE_2G     =    0x00
FULL_SCALE_4G     =    (FS0_MASK)
FULL_SCALE_8G     =    (FS1_MASK)
######*HP_FILTER_CUTOFF High Pass Filter Register ###########/
PULSE_HPF_BYP_MASK   =  0x20
PULSE_LPF_EN_MASK    =  0x10
SEL1_MASK           =   0x02
SEL0_MASK           =   0x01
SEL_MASK            =   0x03
#######PL_STATUS Portrait/Landscape Status Register ##########
NEWLP_MASK         =   0x80
LO_MASK           =    0x40
LAPO1_MASK         =   0x04
LAPO0_MASK         =   0x02
BAFRO_MASK         =   0x01
LAPO_MASK           =  0x06
#######* PL_CFG Portrait/Landscape Configuration Register########
DBCNTM_MASK         =  0x80
PL_EN_MASK          =  0x40
###PL_BF_ZCOMP Back/Front and Z Compensation Register############
BKFR1_MASK         =   0x80
BKFR0_MASK         =   0x40
ZLOCK2_MASK        =   0x04
ZLOCK1_MASK        =   0x02
ZLOCK0_MASK        =   0x01
BKFR_MASK          =   0xC0
ZLOCK_MASK         =   0x07
######*PL_P_L_THS Portrait to Landscape Threshold Register########
PL_P_L_THS_REG      =  0x14
P_L_THS4_MASK       =  0x80
P_L_THS3_MASK       =  0x40
P_L_THS2_MASK       =  0x20
P_L_THS1_MASK       =  0x10
P_L_THS0_MASK       =  0x08
HYS2_MASK           =  0x04
HYS1_MASK           =  0x02
HYS0_MASK           =  0x01
P_L_THS_MASK        =  0xF8
HYS_MASK            =  0x07
##########*FF_MT_CFG Freefall and Motion Configuration Register###/
FF_MT_CFG_REG       =  0x15
ELE_MASK            =  0x80
OAE_MASK            =  0x40
ZEFE_MASK           =  0x20
YEFE_MASK           =  0x10
XEFE_MASK           =  0x08
#####*FF_MT_SRC Freefall and Motion Source Registers###########/
FF_MT_SRC_REG       =  0x16
EA_MASK            =   0x80
ZHE_MASK           =   0x20
ZHP_MASK           =   0x10
YHE_MASK           =   0x08
YHP_MASK           =   0x04
XHE_MASK           =   0x02
XHP_MASK           =   0x01
###FF_MT_THS Freefall and Motion Threshold Registers###########
FT_MT_THS_REG        = 0x17
TRANSIENT_THS_REG    = 0x1F
DBCNTM_MASK          = 0x80
THS6_MASK            = 0x40
THS5_MASK            = 0x20
THS4_MASK            = 0x10
THS3_MASK            = 0x08
THS2_MASK            = 0x04
TXS1_MASK            = 0x02
THS0_MASK            = 0x01
THS_MASK             = 0x7F
####*FF_MT_COUNT Freefall Motion Count Registers############/
FF_MT_COUNT_REG     =  0x18
########*TRANSIENT_CFG Transient Configuration Register########/
TELE_MASK       =	   0x10
ZTEFE_MASK      =      0x08
YTEFE_MASK      =      0x04
XTEFE_MASK      =      0x02
HPF_BYP_MASK    =      0x01
######TRANSIENT_SRC Transient Source Register##############/
TEA_MASK           =   0x40
ZTRANSE_MASK       =   0x20
Z_TRANS_POL_MASK   =   0x10
YTRANSE_MASK       =   0x08
Y_TRANS_POL_MASK   =   0x04
XTRANSE_MASK       =   0x02
X_TRANS_POL_MASK   =   0x01
#############*PULSE_CFG Register##############/
DPA_MASK           =  0x80
PELE_MASK          =   0x40
ZDPEFE_MASK        =   0x20
ZSPEFE_MASK        =   0x10
YDPEFE_MASK        =   0x08
YSPEFE_MASK        =   0x04
XDPEFE_MASK        =   0x02
XSPEFE_MASK        =   0x01
#############*PULSE_SRC Register################/
PEA_MASK           =   0x80
AXZ_MASK           =   0x40
AXY_MASK           =   0x20
AXX_MASK           =   0x10
DPE_MASK           =   0x08
POLZ_MASK          =   0x04
POLY_MASK          =   0x02
POLX_MASK          =   0x01
PTHS_MASK          =   0x7F
########CTRL_REG1 System Control 1 Register##############/
ASLP_RATE1_MASK    =   0x80
ASLP_RATE0_MASK    =   0x40
DR2_MASK           =   0x20
DR1_MASK           =   0x10
DR0_MASK           =   0x08
LNOISE_MASK        =   0x04
FREAD_MASK         =   0x02
ACTIVE_MASK        =   0x01
ASLP_RATE_MASK     =   0xC0
DR_MASK            =   0x38
ASLP_RATE_20MS      =  0x00
ASLP_RATE_80MS      =  (ASLP_RATE0_MASK)
ASLP_RATE_160MS     =  (ASLP_RATE1_MASK)
ASLP_RATE_640MS     =  (ASLP_RATE1_MASK+ASLP_RATE0_MASK)
ASLP_RATE_50HZ       = (ASLP_RATE_20MS)
ASLP_RATE_12_5HZ     = (ASLP_RATE_80MS)
ASLP_RATE_6_25HZ     = (ASLP_RATE_160MS)
ASLP_RATE_1_56HZ     = (ASLP_RATE_640MS)
HYB_ASLP_RATE_25HZ      =  (ASLP_RATE_20MS)
HYB_ASLP_RATE_6_25HZ    =  (ASLP_RATE_80MS)
HYB_ASLP_RATE_1_56HZ    =  (ASLP_RATE_160MS)
HYB_ASLP_RATE_0_8HZ     = (ASLP_RATE_640MS)
DATA_RATE_1250US    =  0x00
DATA_RATE_2500US    =  (DR0_MASK)
DATA_RATE_5MS       =  (DR1_MASK)
DATA_RATE_10MS      =  (DR1_MASK+DR0_MASK)
DATA_RATE_20MS      =  (DR2_MASK)
DATA_RATE_80MS      =  (DR2_MASK+DR0_MASK)
DATA_RATE_160MS     =  (DR2_MASK+DR1_MASK)
DATA_RATE_640MS     =  (DR2_MASK+DR1_MASK+DR0_MASK)
DATA_RATE_800HZ     =  (DATA_RATE_1250US)
DATA_RATE_400HZ     =  (DATA_RATE_2500US)
DATA_RATE_200HZ     =  (DATA_RATE_5MS)
DATA_RATE_100HZ     =  (DATA_RATE_10MS)
DATA_RATE_50HZ      =  (DATA_RATE_20MS)
DATA_RATE_12_5HZ    =  (DATA_RATE_80MS)
DATA_RATE_6_25HZ    =  (DATA_RATE_160MS)
DATA_RATE_1_56HZ    =  (DATA_RATE_640MS)
HYB_DATA_RATE_400HZ   =(DATA_RATE_1250US)
HYB_DATA_RATE_200HZ   =(DATA_RATE_2500US)
HYB_DATA_RATE_100HZ   =(DATA_RATE_5MS)
HYB_DATA_RATE_50HZ    =(DATA_RATE_10MS)
HYB_DATA_RATE_25HZ    =(DATA_RATE_20MS)
HYB_DATA_RATE_6_25HZ  =(DATA_RATE_80MS)
HYB_DATA_RATE_3_15HZ  =(DATA_RATE_160MS)
HYB_DATA_RATE_0_8HZ   =(DATA_RATE_640MS)
ACTIVE              =  (ACTIVE_MASK)
STANDBY             =  0x00
########CTRL_REG2 System Control 2 Register##############/
CTRL_REG2        	=  0x2B
ST_MASK             =  0x80
RST_MASK            =  0x40
SMODS1_MASK         =  0x10
SMODS0_MASK         =  0x08
SLPE_MASK           =  0x04
MODS1_MASK          =  0x02
MODS0_MASK          =  0x01
SMODS_MASK          =  0x18
MODS_MASK           =  0x03
SMOD_NORMAL         =  0x00
SMOD_LOW_NOISE      =  (SMODS0_MASK)
SMOD_HIGH_RES       =  (SMODS1_MASK)
SMOD_LOW_POWER      =  (SMODS1_MASK+SMODS0_MASK)
MOD_NORMAL          =  0x00
MOD_LOW_NOISE       =  (MODS0_MASK)
MOD_HIGH_RES        =  (MODS1_MASK)
MOD_LOW_POWER       =  (MODS1_MASK+MODS0_MASK)
########CTRL_REG3 System Control 3 Register##############/
FIFO_GATE_MASK       = 0x80    
WAKE_TRANS_MASK      = 0x40
WAKE_LNDPRT_MASK     = 0x20
WAKE_PULSE_MASK      = 0x10
WAKE_FF_MT_MASK      = 0x08
IPOL_MASK            = 0x02
PP_OD_MASK           = 0x01
########CTRL_REG4 System Control 4 Register##############/
INT_EN_ASLP_MASK      =0x80
INT_EN_FIFO_MASK      =0x40  
INT_EN_TRANS_MASK     =0x20
INT_EN_LNDPRT_MASK    =0x10
INT_EN_PULSE_MASK     =0x08
INT_EN_FF_MT_MASK     =0x04
INT_EN_DRDY_MASK      =0x01
########CTRL_REG5 System Control 5 Register##############/
INT_CFG_ASLP_MASK     =0x80
INT_CFG_FIFO_MASK     =0x40
INT_CFG_TRANS_MASK    =0x20
INT_CFG_LNDPRT_MASK   =0x10
INT_CFG_PULSE_MASK    =0x08
INT_CFG_FF_MT_MASK    =0x04
INT_CFG_DRDY_MASK     =0x01
#
#  XYZ Offset Correction Registers
#
OFF_X_REG           =  0x2F
OFF_Y_REG           =  0x30
OFF_Z_REG           =  0x31
#
#  MAG CTRL_REG1 System Control 1 Register
#
M_ACAL_MASK          = 0x80
M_RST_MASK           = 0x40
M_OST_MASK           = 0x20
M_OSR2_MASK          = 0x10
M_OSR1_MASK          = 0x08
M_OSR0_MASK          = 0x04
M_HMS1_MASK          = 0x02
M_HMS0_MASK          = 0x01
M_OSR_MASK           = 0x1C
M_HMS_MASK           = 0x03
#OSR Selections
M_OSR_1_56_HZ      =   0x00
M_OSR_6_25_HZ      =   M_OSR0_MASK
M_OSR_12_5_HZ      =   M_OSR1_MASK
M_OSR_50_HZ        =   M_OSR1_MASK+M_OSR0_MASK
M_OSR_100_HZ       =   M_OSR2_MASK
M_OSR_200_HZ       =   M_OSR2_MASK+M_OSR0_MASK
M_OSR_400_HZ       =   M_OSR2_MASK+M_OSR1_MASK
M_OSR_800_HZ       =   M_OSR2_MASK+M_OSR1_MASK+M_OSR0_MASK
#Hybrid Mode Selection
ACCEL_ACTIVE       =   0x00
MAG_ACTIVE         =   M_HMS0_MASK
HYBRID_ACTIVE      =   (M_HMS1_MASK | M_HMS0_MASK)
#
#  MAG CTRL_REG2 System Control 2 Register
#
M_HYB_AUTOINC_MASK   	= 0x20
M_MAXMIN_DIS_MASK     	= 0x10
M_MAXMIN_DIS_THS_MASK  	= 0x08
M_MAXMIN_RST_MASK    	= 0x04
M_RST_CNT1_MASK      	= 0x02
M_RST_CNT0_MASK      	= 0x01
#Mag Auto-Reset De-Gauss Frequency
RST_ODR_CYCLE        = 0x00
RST_16_ODR_CYCLE     = M_RST_CNT0_MASK
RST_512_ODR_CYCLE    = M_RST_CNT1_MASK
RST_DISABLED         = M_RST_CNT1_MASK+M_RST_CNT0_MASK
#
#  MAG CTRL_REG3 System Control 3 Register
#
M_RAW_MASK          =  0x80
M_ASLP_OS_2_MASK    =  0x40
M_ASLP_OS_1_MASK    =  0x20
M_ASLP_OS_0_MASK    =  0x10
M_THS_XYZ_MASK      =  0x08
M_ST_Z_MASK         =  0x04
M_ST_XY1_MASK       =  0x02
M_ST_XY0_MASK       =  0x01
M_ASLP_OSR_MASK     =  0x70
M_ST_XY_MASK        =  0x03
#OSR Selections
M_ASLP_OSR_1_56_HZ   = 0x00
M_ASLP_OSR_6_25_HZ   = M_ASLP_OS_0_MASK
M_ASLP_OSR_12_5_HZ   = M_ASLP_OS_1_MASK
M_ASLP_OSR_50_HZ     = M_ASLP_OS_1_MASK+M_ASLP_OS_0_MASK
M_ASLP_OSR_100_HZ    = M_ASLP_OS_2_MASK
M_ASLP_OSR_200_HZ    = M_ASLP_OS_2_MASK+M_ASLP_OS_0_MASK
M_ASLP_OSR_400_HZ    = M_ASLP_OS_2_MASK+M_ASLP_OS_1_MASK
M_ASLP_OSR_800_HZ    = M_ASLP_OS_2_MASK+M_ASLP_OS_1_MASK+M_ASLP_OS_0_MASK
#
#  MAG INT SOURCE Register
#
M_INT_SOURCE       =   0x5E
SRC_M_DRDY_MASK     =  0x04
SRC_M_VECM_MASK     =  0x02
SRC_M_THS_MASK     =   0x01
#  ACCEL VECTOR CONFIG Register
A_VECM_INIT_CFG_MASK = 0x40
A_VECM_INIT_EN_MASK  = 0x20
A_VECM_WAKE_EN_MASK  = 0x10
A_VECM_EN_MASK       = 0x08
A_VECM_UPDM_MASK     = 0x04
A_VECM_INITM_MASK    = 0x02
A_VECM_ELE_MASK      = 0x01
#  ACCEL VECTOR THS MSB AND LSB Register
A_VECM_DBCNTM_MASK  =  0x80
#  MAG VECTOR CONFIG Register
M_VECM_INIT_CFG_MASK = 0x40
M_VECM_INIT_EN_MASK  = 0x20
M_VECM_WAKE_EN_MASK  = 0x10
M_VECM_EN_MASK       = 0x08
M_VECM_UPDM_MASK     = 0x04
M_VECM_INITM_MASK    = 0x02
M_VECM_ELE_MASK      = 0x01
#  MAG VECTOR THS MSB AND LSB Register
M_VECM_DBCNTM_MASK   = 0x80
#  ACCEL FFMT THS X MSB AND LSB Register
A_FFMT_THS_XYZ_EN_MASK = 	0x80
A_FFMT_THS_X_LSB_MASK  =	0xFC
#  ACCEL FFMT THS Y MSB AND LSB Register
A_FFMT_THS_Y_EN_MASK 	= 0x80
A_FFMT_THS_Y_LSB_MASK 	= 0xFC
#  ACCEL FFMT THS Z MSB AND LSB Register
A_FFMT_THS_Z_EN_MASK    =    0x80
A_FFMT_THS_Z_LSB_MASK   =    0xFC
#########################################################################################################
[docs]class FXOS8700CQR1(object):
	"""Representation of an FXOS8700CQ accelerometer/ magnetometer object."""
	def __init__(self):
		"""
		Initializes the accelerometer and magnetometer chip in hybrid mode. Both Accel and mangnetometer functionality are available.
		
		
		:param none: 
		:returns: none
		"""
		self._address = FXOS8700CQR1_ADDRESS
		FXO.I2C_Initialize()
		FXO.FXOS8700CQ_WriteByte(self._address,CTRL_REG2, RST_MASK)					#Reset sensor, and wait for reboot to complete
		FXO.bcm2835_delay(2)											#Wait at least 1ms after issuing a reset before attempting communications.
		FXO.FXOS8700CQ_StandbyMode()
		while ((FXO.FXOS8700CQ_ReadByte(self._address,CTRL_REG2) & RST_MASK) == True):
			pass
		FXO.FXOS8700CQ_WriteByte(self._address,M_CTRL_REG1, (HYBRID_ACTIVE|M_OSR2_MASK|M_OSR1_MASK|M_OSR0_MASK))	#OSR=max, Hybrid Mode 
		FXO.FXOS8700CQ_WriteByte(self._address,M_CTRL_REG2, M_HYB_AUTOINC_MASK)							#Enable Hyb Mode Auto Increments  in order to read all data
		FXO.FXOS8700CQ_WriteByte(self._address,CTRL_REG4, INT_EN_DRDY_MASK )								#Enable interrupts for DRDY (TO, Aug 2012)
		FXO.FXOS8700CQ_WriteByte(self._address,XYZ_DATA_CFG, FULL_SCALE_2G)								#Full Scale of +/-2g
		FXO.FXOS8700CQ_WriteByte(self._address,CTRL_REG1,(HYB_ASLP_RATE_25HZ|HYB_DATA_RATE_50HZ))			#System Output Data Rate of 200Hz (5ms), Sleep Mode Poll Rate of 50Hz (20ms)
		
[docs]	def	getID (self):
		"""
		Read the chip ID.
		
		
		:param none: 
		:returns: chip id
		"""
		id = FXO.FXOS8700CQ_ReadByte(self._address,WHO_AM_I)
		return id
	 
	def	readStatusReg(self):
		""" 
		Read the Status register.
		
		
		:param none: 
		:returns: status register
		"""
		return FXO.FXOS8700CQ_ReadByte(self._address,STATUS)
		
[docs]	def activeMode(self):
		"""
		Put the chip in Active mode.
		
		
		:param none: 
		:returns: none
		"""
		reg1 = FXO.FXOS8700CQ_ReadByte(self._address,CTRL_REG1);
		FXO.FXOS8700CQ_WriteByte(self._address,CTRL_REG1, (reg1 | ACTIVE_MASK))			#Set the Active bit in System Control 1 Register.
		 
[docs]	def	standbyMode(self):
		""" 
		Put the chip in Standby mode.
		
		
		:param none: 
		:returns: none
		"""
		n = FXO.FXOS8700CQ_ReadByte(self._address,CTRL_REG1)
		FXO.FXOS8700CQ_WriteByte(self._address,CTRL_REG1, n & (~ACTIVE_MASK))
		return (n & ~ACTIVE_MASK)
	   
[docs]	def hybridMode(self):
		"""
		Configure the chip in hybrid mode with default settigs 50 Hz ouput data rate.
		
		
		:param none: 
		:returns: none
		"""
		FXO.FXOS8700CQ_StandbyMode()
		FXO.FXOS8700CQ_WriteByte(self._address,M_CTRL_REG1, (HYBRID_ACTIVE|M_OSR2_MASK|M_OSR1_MASK|M_OSR0_MASK))     #OSR=max, hybrid mode (TO, Aug 2012)
		FXO.FXOS8700CQ_WriteByte(self._address,M_CTRL_REG2, M_HYB_AUTOINC_MASK)       				# enable hybrid autoinc
		FXO.FXOS8700CQ_WriteByte(self._address,CTRL_REG4, INT_EN_DRDY_MASK )           				# Enable interrupts for DRDY (TO, Aug 2012)
		FXO.FXOS8700CQ_WriteByte(self._address,XYZ_DATA_CFG, FULL_SCALE_2G)            				 # Set FSR of accel to +/-2g
		FXO.FXOS8700CQ_WriteByte(self._address,CTRL_REG1, (HYB_ASLP_RATE_25HZ|HYB_DATA_RATE_50HZ))     			#Set ODRs
		FXO.FXOS8700CQ_ActiveMode()
 
[docs]	def pollAccelerometer (self):
		"""
		Get accelerometer data , these are left justified.
		
		
		:param none: 
		:returns: acceleration data (ax, ay, az)
		"""
		raw0 = FXO.FXOS8700CQ_ReadByte(self._address,OUT_X_MSB)   
		raw1 = FXO.FXOS8700CQ_ReadByte(self._address,OUT_X_LSB)
		raw2 = FXO.FXOS8700CQ_ReadByte(self._address,OUT_Y_MSB)
		raw3 = FXO.FXOS8700CQ_ReadByte(self._address,OUT_Y_LSB)
		raw4 = FXO.FXOS8700CQ_ReadByte(self._address,OUT_Z_MSB)
		raw5 = FXO.FXOS8700CQ_ReadByte(self._address,OUT_Z_LSB)
		ax = (raw0 << 8) | raw1 		# Pull out 16-bit, 2's complement magnetometer data
		ay = (raw2 << 8) | raw3 
		az = (raw4 << 8) | raw5 
		
		if(ax > UINT14_MAX/2):	 
			ax -= UINT14_MAX 
		if(ay > UINT14_MAX/2):	 
			ay -= UINT14_MAX 
		if(az > UINT14_MAX/2):	 
			az -= UINT14_MAX 
			
		return (ax, ay, az)
 
[docs]	def	FIFOMode(self,mode):
		"""
		Put the sensor in FIFO mode.
		
		
		:param none: 
		:returns: none
		"""
		FXO.FXOS8700CQ_WriteByte(self._address,F_SETUP,6<<mode)
		  
[docs]	def	highPassFilter(self,status):
		"""
		Enable the highpass filter.
		
		
		:param none: 
		:returns: none
		"""
		FXO.FXOS8700CQ_WriteByte(self._address,XYZ_DATA_CFG,status)
		 
[docs]	def	fullScaleRange(self,range):
		"""
		Configure full scale range.
		
		
		:param none: 
		:returns: none
		"""
		FXO.FXOS8700CQ_WriteByte(self._address,XYZ_DATA_CFG,range)
		 
[docs]	def	setAccelerometerDynamicRange(self,range):
		"""
		Configure the sensor accelerometer dynamic range.
		
		
		:param range:  Accelerometer dynamic range
		:returns: none
		"""
		FXO.FXOS8700CQ_StandbyMode() 	
		if range == SCALE2G:
				FXO.FXOS8700CQ_WriteByte(self._address,XYZ_DATA_CFG, (FXOS8700CQ_ReadByte(XYZ_DATA_CFG) & ~FS_MASK))		#Write the 2g dynamic range value into register = 0x0E		 
		elif range == SCALE4G:
				FXO.FXOS8700CQ_WriteByte(self._address,XYZ_DATA_CFG, (FXOS8700CQ_ReadByte(XYZ_DATA_CFG) & ~FS_MASK)) 		#Write the 4g dynamic range value into register = 0x0E
				FXO.FXOS8700CQ_WriteByte(self._address,XYZ_DATA_CFG, (FXOS8700CQ_ReadByte(XYZ_DATA_CFG) | FULL_SCALE_4G)) 		 
		elif range ==SCALE8G:
				FXO.FXOS8700CQ_WriteByte(self._address,XYZ_DATA_CFG, (FXOS8700CQ_ReadByte(XYZ_DATA_CFG) & ~FS_MASK)) 		#Write the 8g dynamic range value into register = 0x0E
				FXO.FXOS8700CQ_WriteByte(self._address,XYZ_DATA_CFG, (FXOS8700CQ_ReadByte(XYZ_DATA_CFG) | FULL_SCALE_8G)) 
		FXO.FXOS8700CQ_ActiveMode() 
 
[docs]	def	magnetometerStatus(self):
		"""
		Configure the accelerometer status.
		
		
		:param none: 
		:returns: none
		"""
		stat = FXO.FXOS8700CQ_ReadByte(self._address,M_DR_STATUS)
		return stat
 
[docs]	def	pollMagnetometer (self):
		"""
		Reads the magnetometer data.
		
		
		:param none: 
		:returns: magnetometer data (mx, my, mz)
		"""
		raw0 = FXO.FXOS8700CQ_ReadByte(self._address,M_OUT_X_MSB)
		raw1 = FXO.FXOS8700CQ_ReadByte(self._address,M_OUT_X_LSB)
		raw2 = FXO.FXOS8700CQ_ReadByte(self._address,M_OUT_Y_MSB)
		raw3 = FXO.FXOS8700CQ_ReadByte(self._address,M_OUT_Y_MSB)
		raw4 = FXO.FXOS8700CQ_ReadByte(self._address,M_OUT_Z_MSB)
		raw5 = FXO.FXOS8700CQ_ReadByte(self._address,M_OUT_Z_MSB)	
		mx = (raw0 << 8) | raw1			# Pull out 16-bit, 2's complement magnetometer data
		my = (raw2 << 8) | raw3
		mz = (raw4 << 8) | raw5
		return (mx, my, mz)
		 
[docs]	def getHeading(self):
		"""
		Get magnetometer heading .
		
		
		:param none: 
		:returns: magnetometer heading
		"""
		(x, y, z) = self.pollAccelerometer()		
		heading = (math.atan2((y), (x)) * 180)/math.pi
  		return heading
		 
[docs]	def	setODR (self,DataRateValue):
		"""
		Set the output data rate.
		
		
		:param DataRateValue:  Output data rate 
		:returns: none
		"""
		FXO.FXOS8700CQ_SetODR(DataRateValue)
		 
[docs]	def	getODR (self):
		"""
		Get the output data rate .
		
		
		:param none: 
		:returns: none
		"""
		FXO.FXOS8700CQ_GetODR()
		 
[docs]	def getOrientation(self):
		"""
		Returns current orientation of the sensor.
		
		
		:param none: 
		:returns: current orientation of the Sensorian
		"""
		orientation = FXO.FXOS8700CQ_ReadByte(self._address,PL_STATUS)
		return orientation
		 
[docs]	def getChipMode(self):
		"""
		Get the current mode of the chip.
		
		
		:param none: 
		:returns: none
		"""
		mode = FXO.FXOS8700CQ_ReadByte(self._address,SYSMOD)
		return mode
	 
[docs]	def	getTemperature(self):
		"""
		Reads the sensor temperature.
		
		
		:param none: 
		:returns: none
		"""
		temp = FXO.FXOS8700CQ_ReadByte(self._address,TEMP)    
		return temp
		 
[docs]	def readStatusReg(self):
		"""
		Read contents of status register.
		
		
		:param none: 
		:returns: none
		"""
		return FXO.FXOS8700CQ_ReadByte(self._address,STATUS)
 
[docs]	def writeByte(self,address,reg, value):
		"""
		Write a data byte on the given register.
		
		:param address: Sensor address
		:param reg: Register address 
		:param value: Register value 
		:returns: none
		"""
		FXO.I2C_WriteByteRegister(address,reg,value)		#Write value to register
 
[docs]	def readByte(self,address,reg):
		"""
		Read a data byte from the given register.
		
		
		:param address: Sensor address
		:param reg: Register address
		:returns: none
		"""
		return FXO.I2C_ReadByteRegister(address,reg)	#Read register current value