summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRamanan Rajeswaran <ramanan@google.com>2012-09-26 14:24:48 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-09-26 14:24:48 -0700
commit64ca18f95225d0a86f7ccfd1d21c23971b9f77ae (patch)
treed00916dda47dd39f3d625c834e2f2e04782559f1
parent6a4d9a48ffde124c498496f6dae1e77c2cae6864 (diff)
downloadandroid_hardware_invensense-64ca18f95225d0a86f7ccfd1d21c23971b9f77ae.tar.gz
android_hardware_invensense-64ca18f95225d0a86f7ccfd1d21c23971b9f77ae.tar.bz2
android_hardware_invensense-64ca18f95225d0a86f7ccfd1d21c23971b9f77ae.zip
Revert "Official MA 5.1.2 - RC11 Release"
This reverts commit 6a4d9a48ffde124c498496f6dae1e77c2cae6864 Change-Id: I85c4b326a2adf930fcd4a64e4c4f36e99f4fa4cb
-rw-r--r--Android.mk2
-rw-r--r--libsensors_iio/Android.mk100
-rw-r--r--libsensors_iio/CompassSensor.IIO.9150.cpp70
-rw-r--r--libsensors_iio/CompassSensor.IIO.primary.cpp630
-rw-r--r--libsensors_iio/CompassSensor.IIO.primary.h117
-rw-r--r--libsensors_iio/InputEventReader.cpp209
-rw-r--r--libsensors_iio/InputEventReader.h2
-rw-r--r--libsensors_iio/MPLSensor.cpp1231
-rw-r--r--libsensors_iio/MPLSensor.h633
-rw-r--r--libsensors_iio/MPLSupport.cpp109
-rw-r--r--libsensors_iio/MPLSupport.h15
-rw-r--r--libsensors_iio/SensorBase.cpp285
-rw-r--r--libsensors_iio/SensorBase.h33
-rw-r--r--libsensors_iio/libmllite.sobin161340 -> 151456 bytes
-rw-r--r--libsensors_iio/libmplmpu.sobin349560 -> 310092 bytes
-rw-r--r--libsensors_iio/local_log_def.h46
-rw-r--r--libsensors_iio/sensor_params.h356
-rw-r--r--libsensors_iio/sensors.h201
-rw-r--r--libsensors_iio/sensors_mpl.cpp496
-rw-r--r--libsensors_iio/software/build/android/common.mk27
-rw-r--r--libsensors_iio/software/build/android/shared.mk4
-rw-r--r--libsensors_iio/software/core/HAL/include/inv_sysfs_utils.h83
-rw-r--r--libsensors_iio/software/core/HAL/include/mlos.h104
-rw-r--r--libsensors_iio/software/core/HAL/linux/inv_sysfs_utils.c317
-rw-r--r--libsensors_iio/software/core/HAL/linux/mlos_linux.c194
-rw-r--r--libsensors_iio/software/core/driver/include/linux/mpu.h249
-rw-r--r--libsensors_iio/software/core/driver/include/log.h8
-rw-r--r--libsensors_iio/software/core/mllite/CMakeLists.txt39
-rw-r--r--libsensors_iio/software/core/mllite/Engineering.cmake150
-rw-r--r--libsensors_iio/software/core/mllite/build/android/libmllite.sobin88472 -> 0 bytes
-rw-r--r--libsensors_iio/software/core/mllite/build/android/shared.mk8
-rw-r--r--libsensors_iio/software/core/mllite/build/android/static.mk110
-rw-r--r--libsensors_iio/software/core/mllite/data_builder.c199
-rw-r--r--libsensors_iio/software/core/mllite/data_builder.h9
-rw-r--r--libsensors_iio/software/core/mllite/dmpconfig.txt3
-rw-r--r--libsensors_iio/software/core/mllite/hal_outputs.c234
-rw-r--r--libsensors_iio/software/core/mllite/hal_outputs.h2
-rw-r--r--libsensors_iio/software/core/mllite/linux/ml_load_dmp.c66
-rw-r--r--libsensors_iio/software/core/mllite/linux/ml_stored_data.c58
-rw-r--r--libsensors_iio/software/core/mllite/linux/ml_stored_data.h2
-rw-r--r--libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.c17
-rw-r--r--libsensors_iio/software/core/mllite/linux/mlos.h3
-rw-r--r--libsensors_iio/software/core/mllite/linux/mlos_linux.c54
-rw-r--r--libsensors_iio/software/core/mllite/message_layer.c118
-rw-r--r--libsensors_iio/software/core/mllite/message_layer.h70
-rw-r--r--libsensors_iio/software/core/mllite/ml_math_func.c46
-rw-r--r--libsensors_iio/software/core/mllite/ml_math_func.h12
-rw-r--r--libsensors_iio/software/core/mllite/mlmath.c68
-rw-r--r--libsensors_iio/software/core/mllite/mpl.c144
-rw-r--r--libsensors_iio/software/core/mllite/results_holder.c24
-rw-r--r--libsensors_iio/software/core/mllite/results_holder.h4
-rw-r--r--libsensors_iio/software/core/mllite/start_manager.c210
-rw-r--r--libsensors_iio/software/core/mllite/storage_manager.c4
-rw-r--r--libsensors_iio/software/core/mpl/accel_auto_cal.h76
-rw-r--r--libsensors_iio/software/core/mpl/adv_func.h30
-rw-r--r--libsensors_iio/software/core/mpl/auto_calibration.h33
-rw-r--r--libsensors_iio/software/core/mpl/build/android/libmplmpu.sobin170544 -> 130934 bytes
-rw-r--r--libsensors_iio/software/core/mpl/build/android/shared.mk6
-rw-r--r--libsensors_iio/software/core/mpl/build/android/static.mk110
-rw-r--r--libsensors_iio/software/core/mpl/fast_no_motion.h14
-rw-r--r--libsensors_iio/software/core/mpl/fusion_9axis.h2
-rw-r--r--libsensors_iio/software/core/mpl/interpolator.h103
-rw-r--r--libsensors_iio/software/core/mpl/inv_log.h7
-rw-r--r--libsensors_iio/software/core/mpl/inv_math.h16
-rw-r--r--libsensors_iio/software/core/mpl/invensense_adv.h1
-rw-r--r--libsensors_iio/software/core/mpl/mlsetinterrupts.h23
-rw-r--r--libsensors_iio/software/core/mpl/mlsupervisor_9axis.h57
-rw-r--r--libsensors_iio/software/core/mpl/motion_no_motion.h54
-rw-r--r--libsensors_iio/software/core/mpl/orientation.h42
-rw-r--r--libsensors_iio/software/core/mpl/progressive_no_motion.h39
-rw-r--r--libsensors_iio/software/core/mpl/quat_accuracy_monitor.h141
-rw-r--r--libsensors_iio/software/core/mpl/quaternion_supervisor.h53
-rw-r--r--libsensors_iio/software/core/mpl/sensor_moments.h42
-rw-r--r--libsensors_iio/software/core/mpl/shake.h94
-rw-r--r--libsensors_iio/software/core/mpl/state_storage.h25
-rw-r--r--libsensors_iio/software/simple_apps/common/external_hardware.h156
-rw-r--r--libsensors_iio/software/simple_apps/common/fopenCMake.c56
-rw-r--r--libsensors_iio/software/simple_apps/common/fopenCMake.h21
-rw-r--r--libsensors_iio/software/simple_apps/common/gestureMenu.c725
-rw-r--r--libsensors_iio/software/simple_apps/common/gestureMenu.h75
-rw-r--r--libsensors_iio/software/simple_apps/common/helper.c110
-rw-r--r--libsensors_iio/software/simple_apps/common/helper.h103
-rw-r--r--libsensors_iio/software/simple_apps/common/mlerrorcode.c96
-rw-r--r--libsensors_iio/software/simple_apps/common/mlerrorcode.h86
-rw-r--r--libsensors_iio/software/simple_apps/common/mlsetup.c1722
-rw-r--r--libsensors_iio/software/simple_apps/common/mlsetup.h52
-rw-r--r--libsensors_iio/software/simple_apps/common/slave.h176
-rw-r--r--libsensors_iio/software/simple_apps/console/linux/build/android/consoledmp-sharedbin0 -> 23672 bytes
-rw-r--r--libsensors_iio/software/simple_apps/console/linux/build/android/shared.mk (renamed from libsensors_iio/software/simple_apps/mpu_iio/build/android/shared.mk)23
-rw-r--r--libsensors_iio/software/simple_apps/console/linux/build/filelist.mk23
-rw-r--r--libsensors_iio/software/simple_apps/console/linux/console_test.c742
-rw-r--r--libsensors_iio/software/simple_apps/gesture_test/build/android/inv_gesture_test-sharedbin13952 -> 0 bytes
-rw-r--r--libsensors_iio/software/simple_apps/gesture_test/build/filelist.mk11
-rw-r--r--libsensors_iio/software/simple_apps/gesture_test/inv_gesture_test.c535
-rw-r--r--libsensors_iio/software/simple_apps/input_sub/build/android/input_gyro-sharedbin0 -> 16548 bytes
-rw-r--r--libsensors_iio/software/simple_apps/input_sub/build/android/shared.mk (renamed from libsensors_iio/software/simple_apps/gesture_test/build/android/shared.mk)20
-rw-r--r--libsensors_iio/software/simple_apps/input_sub/build/filelist.mk13
-rw-r--r--libsensors_iio/software/simple_apps/input_sub/test_input_gyro.c485
-rw-r--r--libsensors_iio/software/simple_apps/mpu_iio/build/android/inv_mpu_iio-sharedbin25516 -> 0 bytes
-rw-r--r--libsensors_iio/software/simple_apps/mpu_iio/build/filelist.mk12
-rw-r--r--libsensors_iio/software/simple_apps/mpu_iio/iio_utils.h643
-rw-r--r--libsensors_iio/software/simple_apps/mpu_iio/mpu_iio.c685
-rw-r--r--libsensors_iio/software/simple_apps/self_test/build/android/inv_self_test-sharedbin11860 -> 11688 bytes
-rw-r--r--libsensors_iio/software/simple_apps/self_test/build/android/shared.mk17
-rw-r--r--libsensors_iio/software/simple_apps/self_test/inv_self_test.c332
105 files changed, 8921 insertions, 6141 deletions
diff --git a/Android.mk b/Android.mk
index c42f281..427bbb4 100644
--- a/Android.mk
+++ b/Android.mk
@@ -1,5 +1,5 @@
# Can't have both manta and non-manta libsensors.
-ifneq ($(filter manta grouper tilapia, $(TARGET_DEVICE)),)
+ifneq ($(filter manta, $(TARGET_DEVICE)),)
# libsensors_iio expects IIO drivers for an MPU6050+AK8963 which are only available on manta.
include $(call all-named-subdir-makefiles,libsensors_iio)
else
diff --git a/libsensors_iio/Android.mk b/libsensors_iio/Android.mk
index d05ec7b..c3b2003 100644
--- a/libsensors_iio/Android.mk
+++ b/libsensors_iio/Android.mk
@@ -15,28 +15,26 @@
LOCAL_PATH := $(call my-dir)
+ifneq ($(TARGET_SIMULATOR),true)
+
# InvenSense fragment of the HAL
include $(CLEAR_VARS)
LOCAL_MODULE := libinvensense_hal
LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_OWNER := invensense
+
LOCAL_CFLAGS := -DLOG_TAG=\"Sensors\"
-VERSION_JB := true
-ifeq ($(VERSION_JB),true)
-LOCAL_CFLAGS += -DANDROID_JELLYBEAN
-endif
-ifeq ($(TARGET_BUILD_VARIANT),userdebug)
+ifeq ($(ENG_BUILD),1)
ifeq ($(COMPILE_INVENSENSE_COMPASS_CAL),1)
LOCAL_CFLAGS += -DINVENSENSE_COMPASS_CAL
endif
ifeq ($(COMPILE_THIRD_PARTY_ACCEL),1)
LOCAL_CFLAGS += -DTHIRD_PARTY_ACCEL
endif
-ifeq ($(COMPILE_COMPASS_YAS53x),1)
-LOCAL_CFLAGS += -DCOMPASS_YAS53x
+ifeq ($(COMPILE_COMPASS_YAS530),1)
+LOCAL_CFLAGS += -DCOMPASS_YAS530
endif
ifeq ($(COMPILE_COMPASS_AK8975),1)
LOCAL_CFLAGS += -DCOMPASS_AK8975
@@ -48,31 +46,13 @@ else # release builds, default
LOCAL_CFLAGS += -DINVENSENSE_COMPASS_CAL
endif
-
-LOCAL_SRC_FILES += SensorBase.cpp
+LOCAL_SRC_FILES := SensorBase.cpp
LOCAL_SRC_FILES += MPLSensor.cpp
LOCAL_SRC_FILES += MPLSupport.cpp
LOCAL_SRC_FILES += InputEventReader.cpp
-
-
-ifeq ($(TARGET_BUILD_VARIANT),userdebug)
-ifeq ($(COMPILE_INVENSENSE_COMPASS_CAL),1)
-ifeq ($(COMPILE_COMPASS_AMI306),1)
-LOCAL_SRC_FILES += CompassSensor.IIO.primary.cpp
-else ifeq ($(COMPILE_COMPASS_YAS53x),1)
-LOCAL_SRC_FILES += CompassSensor.IIO.primary.cpp
-else
LOCAL_SRC_FILES += CompassSensor.IIO.9150.cpp
-endif
-else # COMPILE_INVENSENSE_COMPASS_CAL = 0
-# choose corresponding 3rd-party compass sensor file
-LOCAL_SRC_FILES += AkmSensor.cpp
-LOCAL_SRC_FILES += CompassSensor.AKM.cpp
-endif
-else # release builds, default
-LOCAL_SRC_FILES += CompassSensor.IIO.9150.cpp
-endif #userdebug
+LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mllite
LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mllite/linux
LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/driver/include
@@ -83,6 +63,7 @@ LOCAL_SHARED_LIBRARIES += libcutils
LOCAL_SHARED_LIBRARIES += libutils
LOCAL_SHARED_LIBRARIES += libdl
LOCAL_SHARED_LIBRARIES += libmllite
+
#Additions for SysPed
LOCAL_SHARED_LIBRARIES += libmplmpu
LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mpl
@@ -91,70 +72,10 @@ LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
-# Build a temporary HAL that links the InvenSense .so
-include $(CLEAR_VARS)
-ifneq ($(filter manta grouper tilapia, $(TARGET_DEVICE)),)
-LOCAL_MODULE := sensors.invensense
-else
-LOCAL_MODULE := sensors.${TARGET_PRODUCT}
-endif
-LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
-
-LOCAL_SHARED_LIBRARIES += libmplmpu
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mllite
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mllite/linux
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mpl
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/driver/include
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/driver/include/linux
-
-LOCAL_PRELINK_MODULE := false
-LOCAL_MODULE_TAGS := optional
-LOCAL_CFLAGS := -DLOG_TAG=\"Sensors\"
-
-ifeq ($(VERSION_JB),true)
-LOCAL_CFLAGS += -DANDROID_JELLYBEAN
-endif
-
-ifeq ($(TARGET_BUILD_VARIANT),userdebug)
-ifeq ($(COMPILE_INVENSENSE_COMPASS_CAL),1)
-LOCAL_CFLAGS += -DINVENSENSE_COMPASS_CAL
-endif
-ifeq ($(COMPILE_THIRD_PARTY_ACCEL),1)
-LOCAL_CFLAGS += -DTHIRD_PARTY_ACCEL
-endif
-ifeq ($(COMPILE_COMPASS_YAS53x),1)
-LOCAL_CFLAGS += -DCOMPASS_YAS53x
-endif
-ifeq ($(COMPILE_COMPASS_AK8975),1)
-LOCAL_CFLAGS += -DCOMPASS_AK8975
-endif
-ifeq ($(COMPILE_COMPASS_AMI306),1)
-LOCAL_CFLAGS += -DCOMPASS_AMI306
-endif
-else # release builds, default
-LOCAL_CFLAGS += -DINVENSENSE_COMPASS_CAL
-endif # userdebug
-
-ifneq ($(filter manta grouper tilapia, $(TARGET_DEVICE)),)
-#LOCAL_SRC_FILES := sensors_mpl.cpp
-else
-LOCAL_SRC_FILES := sensors_mpl.cpp
-endif
-
-
-LOCAL_SHARED_LIBRARIES := libinvensense_hal
-LOCAL_SHARED_LIBRARIES += libcutils
-LOCAL_SHARED_LIBRARIES += libutils
-LOCAL_SHARED_LIBRARIES += libdl
-LOCAL_SHARED_LIBRARIES += liblog
-LOCAL_SHARED_LIBRARIES += libmllite
-include $(BUILD_SHARED_LIBRARY)
-
include $(CLEAR_VARS)
LOCAL_MODULE := libmplmpu
LOCAL_SRC_FILES := libmplmpu.so
LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_OWNER := invensense
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
@@ -165,9 +86,10 @@ include $(CLEAR_VARS)
LOCAL_MODULE := libmllite
LOCAL_SRC_FILES := libmllite.so
LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_OWNER := invensense
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
OVERRIDE_BUILT_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
include $(BUILD_PREBUILT)
+
+endif # !TARGET_SIMULATOR
diff --git a/libsensors_iio/CompassSensor.IIO.9150.cpp b/libsensors_iio/CompassSensor.IIO.9150.cpp
index b11d5cb..d9f2e0c 100644
--- a/libsensors_iio/CompassSensor.IIO.9150.cpp
+++ b/libsensors_iio/CompassSensor.IIO.9150.cpp
@@ -31,11 +31,12 @@
#include "MPLSupport.h"
#include "sensor_params.h"
#include "ml_sysfs_helper.h"
+#include "local_log_def.h"
#define COMPASS_MAX_SYSFS_ATTRB sizeof(compassSysFs) / sizeof(char*)
-#if defined COMPASS_YAS53x
-# warning "Invensense compass cal with YAS53x IIO on secondary bus"
+#if defined COMPASS_YAS530
+# warning "Invensense compass cal with YAS530 on primary bus"
# define USE_MPL_COMPASS_HAL (1)
# define COMPASS_NAME "INV_YAS530"
#elif defined COMPASS_AK8975
@@ -43,7 +44,7 @@
# define USE_MPL_COMPASS_HAL (1)
# define COMPASS_NAME "INV_AK8975"
#elif defined INVENSENSE_COMPASS_CAL
-# warning "Invensense compass cal with compass IIO on secondary bus"
+# warning "Invensense compass cal with compass on secondary bus"
# define USE_MPL_COMPASS_HAL (1)
# define COMPASS_NAME "INV_COMPASS"
#else
@@ -56,11 +57,11 @@
/*****************************************************************************/
-CompassSensor::CompassSensor()
+CompassSensor::CompassSensor()
: SensorBase(NULL, NULL),
- compass_fd(-1),
mCompassTimestamp(0),
- mCompassInputReader(8)
+ mCompassInputReader(8),
+ compass_fd(-1)
{
VFUNC_LOG;
@@ -77,13 +78,13 @@ CompassSensor::CompassSensor()
memset(mCachedCompassData, 0, sizeof(mCachedCompassData));
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
compassSysFs.compass_orient, getTimestamp());
FILE *fptr;
fptr = fopen(compassSysFs.compass_orient, "r");
if (fptr != NULL) {
int om[9];
- fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
+ fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
&om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
&om[6], &om[7], &om[8]);
fclose(fptr);
@@ -106,9 +107,7 @@ CompassSensor::CompassSensor()
LOGE("HAL:Couldn't read compass mounting matrix");
}
- if (!isIntegrated()) {
- enable(ID_M, 0);
- }
+ enable(ID_M, 0);
}
CompassSensor::~CompassSensor()
@@ -131,11 +130,11 @@ int CompassSensor::getFd() const
* @param[in] handle
* which sensor to enable/disable.
* @param[in] en
- * en=1, enable;
+ * en=1, enable;
* en=0, disable
* @return if the operation is successful.
*/
-int CompassSensor::enable(int32_t handle, int en)
+int CompassSensor::enable(int32_t handle, int en)
{
VFUNC_LOG;
@@ -143,7 +142,7 @@ int CompassSensor::enable(int32_t handle, int en)
int tempFd;
int res;
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, compassSysFs.compass_enable, getTimestamp());
tempFd = open(compassSysFs.compass_enable, O_RDWR);
res = errno;
@@ -157,7 +156,7 @@ int CompassSensor::enable(int32_t handle, int en)
close(tempFd);
if (en) {
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, compassSysFs.compass_x_fifo_enable, getTimestamp());
tempFd = open(compassSysFs.compass_x_fifo_enable, O_RDWR);
res = errno;
@@ -169,7 +168,7 @@ int CompassSensor::enable(int32_t handle, int en)
compassSysFs.compass_x_fifo_enable, strerror(res), res);
}
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, compassSysFs.compass_y_fifo_enable, getTimestamp());
tempFd = open(compassSysFs.compass_y_fifo_enable, O_RDWR);
res = errno;
@@ -181,7 +180,7 @@ int CompassSensor::enable(int32_t handle, int en)
compassSysFs.compass_y_fifo_enable, strerror(res), res);
}
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, compassSysFs.compass_z_fifo_enable, getTimestamp());
tempFd = open(compassSysFs.compass_z_fifo_enable, O_RDWR);
res = errno;
@@ -197,13 +196,13 @@ int CompassSensor::enable(int32_t handle, int en)
return res;
}
-int CompassSensor::setDelay(int32_t handle, int64_t ns)
+int CompassSensor::setDelay(int32_t handle, int64_t ns)
{
VFUNC_LOG;
int tempFd;
int res;
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
1000000000.f / ns, compassSysFs.compass_rate, getTimestamp());
mDelay = ns;
if (ns == 0)
@@ -247,8 +246,8 @@ void CompassSensor::processCompassEvent(const input_event *event)
mCachedCompassData[2] = event->value;
break;
}
-
- mCompassTimestamp =
+
+ mCompassTimestamp =
(int64_t)event->time.tv_sec * 1000000000L + event->time.tv_usec * 1000L;
}
@@ -263,7 +262,7 @@ long CompassSensor::getSensitivity()
VFUNC_LOG;
long sensitivity;
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
compassSysFs.compass_scale, getTimestamp());
inv_read_data(compassSysFs.compass_scale, &sensitivity);
return sensitivity;
@@ -311,7 +310,7 @@ int CompassSensor::readSample(long *data, int64_t *timestamp)
/**
* @brief This function will return the current delay for this sensor.
- * @return delay in nanoseconds.
+ * @return delay in nanoseconds.
*/
int64_t CompassSensor::getDelay(int32_t handle)
{
@@ -334,20 +333,14 @@ void CompassSensor::fillList(struct sensor_t *list)
return;
}
if(!strcmp(compass, "compass")
- || !strcmp(compass, "INV_AK8975") ) {
+ || !strcmp(compass, "INV_AK8975")
+ || !strcmp(compass, "INV_YAS530")) {
list->maxRange = COMPASS_AKM8975_RANGE;
list->resolution = COMPASS_AKM8975_RESOLUTION;
list->power = COMPASS_AKM8975_POWER;
list->minDelay = COMPASS_AKM8975_MINDELAY;
return;
}
- if(!strcmp(compass, "INV_YAS530")) {
- list->maxRange = COMPASS_YAS53x_RANGE;
- list->resolution = COMPASS_YAS53x_RESOLUTION;
- list->power = COMPASS_YAS53x_POWER;
- list->minDelay = COMPASS_YAS53x_MINDELAY;
- return;
- }
if(!strcmp(compass, "INV_AMI306")) {
list->maxRange = COMPASS_AMI306_RANGE;
list->resolution = COMPASS_AMI306_RESOLUTION;
@@ -390,16 +383,23 @@ int CompassSensor::inv_init_sysfs_attributes(void)
// get proper (in absolute/relative) IIO path & build MPU's sysfs paths
// inv_get_sysfs_abs_path(sysfs_path);
- inv_get_sysfs_path(sysfs_path);
+ if(INV_SUCCESS != inv_get_sysfs_path(sysfs_path)) {
+ ALOGE("CompassSensor failed get sysfs path");
+ return -1;
+ }
+
inv_get_iio_trigger_path(iio_trigger_path);
-#if defined COMPASS_AK8975
+#if defined COMPASS_YAS530 || defined COMPASS_AK8975
inv_get_input_number(COMPASS_NAME, &num);
tbuf[0] = num + 0x30;
tbuf[1] = 0;
sprintf(sysfs_path, "%s%s", "sys/class/input/input", tbuf);
+#if defined COMPASS_YAS530
+ strcat(sysfs_path, "/yas530");
+#else
strcat(sysfs_path, "/ak8975");
-
+#endif
sprintf(compassSysFs.compass_enable, "%s%s", sysfs_path, "/enable");
sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/rate");
sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/scale");
@@ -415,7 +415,7 @@ int CompassSensor::inv_init_sysfs_attributes(void)
#endif
#if 0
- // test print sysfs paths
+ // test print sysfs paths
dptr = (char**)&compassSysFs;
for (i = 0; i < COMPASS_MAX_SYSFS_ATTRB; i++) {
LOGE("HAL:sysfs path: %s", *dptr++);
diff --git a/libsensors_iio/CompassSensor.IIO.primary.cpp b/libsensors_iio/CompassSensor.IIO.primary.cpp
deleted file mode 100644
index 8b78338..0000000
--- a/libsensors_iio/CompassSensor.IIO.primary.cpp
+++ /dev/null
@@ -1,630 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_NDEBUG 0
-
-#include <fcntl.h>
-#include <errno.h>
-#include <math.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <sys/select.h>
-#include <cutils/log.h>
-#include <linux/input.h>
-#include <string.h>
-
-#include "CompassSensor.IIO.primary.h"
-#include "sensors.h"
-#include "MPLSupport.h"
-#include "sensor_params.h"
-#include "ml_sysfs_helper.h"
-//#include "log.h"
-
-#define COMPASS_MAX_SYSFS_ATTRB sizeof(compassSysFs) / sizeof(char*)
-
-#if defined COMPASS_AK8975
-# warning "Invensense compass cal with AK8975 on primary bus"
-# define USE_MPL_COMPASS_HAL (1)
-# define COMPASS_NAME "INV_AK8975"
-#elif defined INVENSENSE_COMPASS_CAL
-
-#if defined COMPASS_YAS53x
-# warning "Invensense compass cal with YAS53x IIO on primary bus"
-# define USE_MPL_COMPASS_HAL (1)
-# define COMPASS_NAME "yas53" // prefix for YAS53[023]
-#elif defined COMPASS_AMI306
-# warning "Invensense compass cal with AMI306 IIO on primary bus"
-# define USE_MPL_COMPASS_HAL (1)
-# define COMPASS_NAME "ami306"
-#else
-# warning "Invensense compass cal with compass on secondary bus"
-# define USE_MPL_COMPASS_HAL (1)
-# define COMPASS_NAME "INV_COMPASS"
-#endif
-
-#else
-# warning "third party compass cal HAL"
-# define USE_MPL_COMPASS_HAL (0)
-// TODO: change to vendor's name
-# define COMPASS_NAME "AKM8975"
-#endif
-
-/******************************************************************************/
-
-CompassSensor::CompassSensor()
- : SensorBase(COMPASS_NAME, NULL),
- mCompassTimestamp(0),
- mCompassInputReader(8)
-#ifdef COMPASS_YAS53x
- , mCoilsResetFd(0)
-#endif
-{
- FILE *fptr;
-
- VFUNC_LOG;
-
- /*
- char temp_sysfs_path[30];
- inv_get_sysfs_path(temp_sysfs_path);
- LOGI("sysfs: %s", temp_sysfs_path);
- */
-
-#ifdef COMPASS_YAS53x
- /* for YAS53x compasses, dev_name is just a prefix,
- we need to find the actual name */
- if (fill_dev_full_name_by_prefix(dev_name,
- dev_full_name, sizeof(dev_full_name) / sizeof(dev_full_name[0]))) {
- LOGE("Cannot find Yamaha device with prefix name '%s' - "
- "magnetometer will likely not work.", dev_name);
- }
-#else
- strncpy(dev_full_name, dev_name,
- sizeof(dev_full_name) / sizeof(dev_full_name[0]));
-#endif
-
- if (inv_init_sysfs_attributes()) {
- LOGE("Error Instantiating Compass\n");
- return;
- }
-
- if (!strcmp(dev_full_name, "INV_COMPASS")) {
- mI2CBus = COMPASS_BUS_SECONDARY;
- } else {
- mI2CBus = COMPASS_BUS_PRIMARY;
- }
-
- memset(mCachedCompassData, 0, sizeof(mCachedCompassData));
-
- if (!isIntegrated()) {
- enable(ID_M, 0);
- }
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:compass name: %s", dev_full_name);
- enable_iio_sysfs();
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
- compassSysFs.compass_orient, getTimestamp());
- fptr = fopen(compassSysFs.compass_orient, "r");
- if (fptr != NULL) {
- int om[9];
- fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
- &om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
- &om[6], &om[7], &om[8]);
- fclose(fptr);
-
- LOGV_IF(EXTRA_VERBOSE,
- "HAL:compass mounting matrix: "
- "%+d %+d %+d %+d %+d %+d %+d %+d %+d",
- om[0], om[1], om[2], om[3], om[4], om[5], om[6], om[7], om[8]);
-
- mCompassOrientation[0] = om[0];
- mCompassOrientation[1] = om[1];
- mCompassOrientation[2] = om[2];
- mCompassOrientation[3] = om[3];
- mCompassOrientation[4] = om[4];
- mCompassOrientation[5] = om[5];
- mCompassOrientation[6] = om[6];
- mCompassOrientation[7] = om[7];
- mCompassOrientation[8] = om[8];
- } else {
- LOGE("HAL:Couldn't read compass mounting matrix");
- }
-
-#ifdef COMPASS_YAS53x
- mCoilsResetFd = fopen(compassSysFs.compass_attr_1, "r+");
- if (fptr == NULL) {
- LOGE("HAL:Couldn't read compass overunderflow");
- }
-#endif
-}
-
-void CompassSensor::enable_iio_sysfs()
-{
- VFUNC_LOG;
-
- int tempFd = 0;
- char iio_trigger_name[MAX_CHIP_ID_LEN], iio_device_node[MAX_CHIP_ID_LEN];
- FILE *tempFp = NULL;
- const char* compass = dev_full_name;
-
- LOGV_IF(SYSFS_VERBOSE,
- "HAL:sysfs:echo 1 > %s (%lld)",
- compassSysFs.in_timestamp_en, getTimestamp());
- tempFd = open(compassSysFs.in_timestamp_en, O_RDWR);
- if(tempFd < 0) {
- LOGE("HAL:could not open %s timestamp enable", compass);
- } else if(enable_sysfs_sensor(tempFd, 1) < 0) {
- LOGE("HAL:could not enable timestamp");
- }
-
- LOGV_IF(SYSFS_VERBOSE,
- "HAL:sysfs:cat %s (%lld)",
- compassSysFs.trigger_name, getTimestamp());
- tempFp = fopen(compassSysFs.trigger_name, "r");
- if (tempFp == NULL) {
- LOGE("HAL:could not open %s trigger name", compass);
- } else {
- if (fscanf(tempFp, "%s", iio_trigger_name) < 0) {
- LOGE("HAL:could not read trigger name");
- }
- fclose(tempFp);
- }
-
- LOGV_IF(SYSFS_VERBOSE,
- "HAL:sysfs:echo %s > %s (%lld)",
- iio_trigger_name, compassSysFs.current_trigger, getTimestamp());
- tempFp = fopen(compassSysFs.current_trigger, "w");
- if (tempFp == NULL) {
- LOGE("HAL:could not open current trigger");
- } else {
- if (fprintf(tempFp, "%s", iio_trigger_name) < 0) {
- LOGE("HAL:could not write current trigger");
- }
- fclose(tempFp);
- }
-
- LOGV_IF(SYSFS_VERBOSE,
- "HAL:sysfs:echo %d > %s (%lld)",
- IIO_BUFFER_LENGTH, compassSysFs.buffer_length, getTimestamp());
- tempFp = fopen(compassSysFs.buffer_length, "w");
- if (tempFp == NULL) {
- LOGE("HAL:could not open buffer length");
- } else {
- if (fprintf(tempFp, "%d", IIO_BUFFER_LENGTH) < 0) {
- LOGE("HAL:could not write buffer length");
- }
- fclose(tempFp);
- }
-
- sprintf(iio_device_node, "%s%d", "/dev/iio:device",
- find_type_by_name(compass, "iio:device"));
- compass_fd = open(iio_device_node, O_RDONLY);
- int res = errno;
- if (compass_fd < 0) {
- LOGE("HAL:could not open '%s' iio device node in path '%s' - "
- "error '%s' (%d)",
- compass, iio_device_node, strerror(res), res);
- } else {
- LOGV_IF(EXTRA_VERBOSE,
- "HAL:iio %s, compass_fd opened : %d", compass, compass_fd);
- }
-
- /* TODO: need further tests for optimization to reduce context-switch
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo 1 > %s (%lld)",
- compassSysFs.compass_x_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_x_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, 1);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_x_fifo_enable, strerror(res), res);
- }
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo 1 > %s (%lld)",
- compassSysFs.compass_y_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_y_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, 1);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_y_fifo_enable, strerror(res), res);
- }
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo 1 > %s (%lld)",
- compassSysFs.compass_z_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_z_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, 1);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_z_fifo_enable, strerror(res), res);
- }
- */
-}
-
-CompassSensor::~CompassSensor()
-{
- VFUNC_LOG;
-
- free(pathP);
- if( compass_fd > 0)
- close(compass_fd);
-#ifdef COMPASS_YAS53x
- if( mCoilsResetFd != NULL )
- fclose(mCoilsResetFd);
-#endif
-}
-
-int CompassSensor::getFd() const
-{
- VHANDLER_LOG;
- return compass_fd;
-}
-
-/**
- * @brief This function will enable/disable sensor.
- * @param[in] handle
- * which sensor to enable/disable.
- * @param[in] en
- * en=1, enable;
- * en=0, disable
- * @return if the operation is successful.
- */
-int CompassSensor::enable(int32_t handle, int en)
-{
- VFUNC_LOG;
-
- mEnable = en;
- int tempFd;
- int res;
-
- /* reset master enable */
- res = masterEnable(0);
- if (res < 0) {
- return res;
- }
-
- if (en) {
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, compassSysFs.compass_x_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_x_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, en);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_x_fifo_enable, strerror(res), res);
- }
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, compassSysFs.compass_y_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_y_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, en);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_y_fifo_enable, strerror(res), res);
- }
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, compassSysFs.compass_z_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_z_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, en);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_z_fifo_enable, strerror(res), res);
- }
-
- res = masterEnable(en);
- if (res < en) {
- return res;
- }
- }
-
- return res;
-}
-
-int CompassSensor::masterEnable(int en) {
- VFUNC_LOG;
-
- int res = 0;
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, compassSysFs.chip_enable, getTimestamp());
- int tempFd = open(compassSysFs.chip_enable, O_RDWR);
- res = errno;
- if(tempFd < 0){
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.chip_enable, strerror(res), res);
- return res;
- }
- res = enable_sysfs_sensor(tempFd, en);
- return res;
-}
-
-int CompassSensor::setDelay(int32_t handle, int64_t ns)
-{
- VFUNC_LOG;
- int tempFd;
- int res;
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
- 1000000000.f / ns, compassSysFs.compass_rate, getTimestamp());
- mDelay = ns;
- if (ns == 0)
- return -1;
- tempFd = open(compassSysFs.compass_rate, O_RDWR);
- res = write_attribute_sensor(tempFd, 1000000000.f / ns);
- if(res < 0) {
- LOGE("HAL:Compass update delay error");
- }
- return res;
-}
-
-/**
- @brief This function will return the state of the sensor.
- @return 1=enabled; 0=disabled
-**/
-int CompassSensor::getEnable(int32_t handle)
-{
- VFUNC_LOG;
- return mEnable;
-}
-
-/* use for Invensense compass calibration */
-#define COMPASS_EVENT_DEBUG (0)
-void CompassSensor::processCompassEvent(const input_event *event)
-{
- VHANDLER_LOG;
-
- switch (event->code) {
- case EVENT_TYPE_ICOMPASS_X:
- LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_X\n");
- mCachedCompassData[0] = event->value;
- break;
- case EVENT_TYPE_ICOMPASS_Y:
- LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_Y\n");
- mCachedCompassData[1] = event->value;
- break;
- case EVENT_TYPE_ICOMPASS_Z:
- LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_Z\n");
- mCachedCompassData[2] = event->value;
- break;
- }
-
- mCompassTimestamp =
- (int64_t)event->time.tv_sec * 1000000000L + event->time.tv_usec * 1000L;
-}
-
-void CompassSensor::getOrientationMatrix(signed char *orient)
-{
- VFUNC_LOG;
- memcpy(orient, mCompassOrientation, sizeof(mCompassOrientation));
-}
-
-long CompassSensor::getSensitivity()
-{
- VFUNC_LOG;
-
- long sensitivity;
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
- compassSysFs.compass_scale, getTimestamp());
- inv_read_data(compassSysFs.compass_scale, &sensitivity);
- return sensitivity;
-}
-
-/**
- @brief This function is called by sensors_mpl.cpp
- to read sensor data from the driver.
- @param[out] data sensor data is stored in this variable. Scaled such that
- 1 uT = 2^16
- @para[in] timestamp data's timestamp
- @return 1, if 1 sample read, 0, if not, negative if error
- */
-int CompassSensor::readSample(long *data, int64_t *timestamp) {
- VFUNC_LOG;
-
- int i;
- char *rdata = mIIOBuffer;
-
- size_t rsize = read(compass_fd, rdata, (8 * mEnable + 8) * 1);
-
- if (!mEnable) {
- rsize = read(compass_fd, rdata, (8 + 8) * IIO_BUFFER_LENGTH);
- // LOGI("clear buffer with size: %d", rsize);
- }
-/*
- LOGI("get one sample of AMI IIO data with size: %d", rsize);
- LOGI_IF(mEnable, "compass x/y/z: %d/%d/%d", *((short *) (rdata + 0)),
- *((short *) (rdata + 2)), *((short *) (rdata + 4)));
-*/
- if (mEnable) {
- for (i = 0; i < 3; i++) {
- data[i] = *((short *) (rdata + i * 2));
- }
- *timestamp = *((long long *) (rdata + 8 * mEnable));
- }
-
- return mEnable;
-}
-
-/**
- * @brief This function will return the current delay for this sensor.
- * @return delay in nanoseconds.
- */
-int64_t CompassSensor::getDelay(int32_t handle)
-{
- VFUNC_LOG;
- return mDelay;
-}
-
-void CompassSensor::fillList(struct sensor_t *list)
-{
- VFUNC_LOG;
-
- const char *compass = dev_full_name;
-
- if (compass) {
- if(!strcmp(compass, "INV_COMPASS")) {
- list->maxRange = COMPASS_MPU9150_RANGE;
- list->resolution = COMPASS_MPU9150_RESOLUTION;
- list->power = COMPASS_MPU9150_POWER;
- list->minDelay = COMPASS_MPU9150_MINDELAY;
- return;
- }
- if(!strcmp(compass, "compass")
- || !strcmp(compass, "INV_AK8975")) {
- list->maxRange = COMPASS_AKM8975_RANGE;
- list->resolution = COMPASS_AKM8975_RESOLUTION;
- list->power = COMPASS_AKM8975_POWER;
- list->minDelay = COMPASS_AKM8975_MINDELAY;
- return;
- }
- if(!strcmp(compass, "ami306")) {
- list->maxRange = COMPASS_AMI306_RANGE;
- list->resolution = COMPASS_AMI306_RESOLUTION;
- list->power = COMPASS_AMI306_POWER;
- list->minDelay = COMPASS_AMI306_MINDELAY;
- return;
- }
- if(!strcmp(compass, "yas530")
- || !strcmp(compass, "yas532")
- || !strcmp(compass, "yas533")) {
- list->maxRange = COMPASS_YAS53x_RANGE;
- list->resolution = COMPASS_YAS53x_RESOLUTION;
- list->power = COMPASS_YAS53x_POWER;
- list->minDelay = COMPASS_YAS53x_MINDELAY;
- return;
- }
- }
-
- LOGE("HAL:unknown compass id %s -- "
- "params default to ak8975 and might be wrong.",
- compass);
- list->maxRange = COMPASS_AKM8975_RANGE;
- list->resolution = COMPASS_AKM8975_RESOLUTION;
- list->power = COMPASS_AKM8975_POWER;
- list->minDelay = COMPASS_AKM8975_MINDELAY;
-}
-
-#ifdef COMPASS_YAS53x
-/* Read sysfs entry to determine whether overflow had happend
- then write to sysfs to reset to zero */
-int CompassSensor::checkCoilsReset()
-{
- int result=-1;
- VFUNC_LOG;
-
- if(mCoilsResetFd != NULL) {
- int attr;
- rewind(mCoilsResetFd);
- fscanf(mCoilsResetFd, "%d", &attr);
- if(attr == 0)
- return 0;
- else {
- LOGV_IF(SYSFS_VERBOSE, "HAL:overflow detected");
- rewind(mCoilsResetFd);
- if( fprintf(mCoilsResetFd, "%d", 0) < 0) {
- LOGE("HAL:could not write overunderflow");
- }
- else
- return 1;
- }
- }
- else {
- LOGE("HAL:could not read overunderflow");
- }
- return result;
-}
-#endif
-
-int CompassSensor::inv_init_sysfs_attributes(void)
-{
- VFUNC_LOG;
-
- unsigned char i = 0;
- char sysfs_path[MAX_SYSFS_NAME_LEN],
- iio_trigger_path[MAX_SYSFS_NAME_LEN], tbuf[2];
- char *sptr;
- char **dptr;
- int num;
- const char* compass = dev_full_name;
-
- pathP = (char*)malloc(
- sizeof(char[COMPASS_MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN]));
- sptr = pathP;
- dptr = (char**)&compassSysFs;
- if (sptr == NULL)
- return -1;
-
- do {
- *dptr++ = sptr;
- sptr += sizeof(char[MAX_SYSFS_NAME_LEN]);
- } while (++i < COMPASS_MAX_SYSFS_ATTRB);
-
- // get proper (in absolute/relative) IIO path & build sysfs paths
- sprintf(sysfs_path, "%s%d", "/sys/bus/iio/devices/iio:device",
- find_type_by_name(compass, "iio:device"));
- sprintf(iio_trigger_path, "%s%d", "/sys/bus/iio/devices/trigger",
- find_type_by_name(compass, "iio:device"));
-
-#if defined COMPASS_AK8975
- inv_get_input_number(compass, &num);
- tbuf[0] = num + 0x30;
- tbuf[1] = 0;
- sprintf(sysfs_path, "%s%s", "sys/class/input/input", tbuf);
- strcat(sysfs_path, "/ak8975");
-
- sprintf(compassSysFs.compass_enable, "%s%s", sysfs_path, "/enable");
- sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/rate");
- sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/scale");
- sprintf(compassSysFs.compass_orient, "%s%s", sysfs_path, "/compass_matrix");
-#else /* IIO */
- sprintf(compassSysFs.chip_enable, "%s%s", sysfs_path, "/buffer/enable");
- sprintf(compassSysFs.in_timestamp_en, "%s%s", sysfs_path, "/scan_elements/in_timestamp_en");
- sprintf(compassSysFs.trigger_name, "%s%s", iio_trigger_path, "/name");
- sprintf(compassSysFs.current_trigger, "%s%s", sysfs_path, "/trigger/current_trigger");
- sprintf(compassSysFs.buffer_length, "%s%s", sysfs_path, "/buffer/length");
-
- sprintf(compassSysFs.compass_x_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_x_en");
- sprintf(compassSysFs.compass_y_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_y_en");
- sprintf(compassSysFs.compass_z_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_z_en");
- sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/sampling_frequency");
- sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/in_magn_scale");
- sprintf(compassSysFs.compass_orient, "%s%s", sysfs_path, "/compass_matrix");
-
-#if defined COMPASS_YAS53x
- sprintf(compassSysFs.compass_attr_1, "%s%s", sysfs_path, "/overunderflow");
-#endif
-#endif
-
-#if 0
- // test print sysfs paths
- dptr = (char**)&compassSysFs;
- LOGI("sysfs path base: %s", sysfs_path);
- LOGI("trigger sysfs path base: %s", iio_trigger_path);
- for (i = 0; i < COMPASS_MAX_SYSFS_ATTRB; i++) {
- LOGE("HAL:sysfs path: %s", *dptr++);
- }
-#endif
- return 0;
-}
diff --git a/libsensors_iio/CompassSensor.IIO.primary.h b/libsensors_iio/CompassSensor.IIO.primary.h
deleted file mode 100644
index 844615c..0000000
--- a/libsensors_iio/CompassSensor.IIO.primary.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef COMPASS_SENSOR_H
-#define COMPASS_SENSOR_H
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-// TODO fixme, need input_event
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <poll.h>
-#include <utils/Vector.h>
-#include <utils/KeyedVector.h>
-
-#include "sensors.h"
-#include "SensorBase.h"
-#include "InputEventReader.h"
-
-#define MAX_CHIP_ID_LEN (20)
-
-class CompassSensor : public SensorBase {
-
-public:
- CompassSensor();
- virtual ~CompassSensor();
-
- virtual int getFd() const;
- virtual int enable(int32_t handle, int enabled);
- virtual int setDelay(int32_t handle, int64_t ns);
- virtual int getEnable(int32_t handle);
- virtual int64_t getDelay(int32_t handle);
-
- // unnecessary for MPL
- virtual int readEvents(sensors_event_t *data, int count) { return 0; }
-
- int readSample(long *data, int64_t *timestamp);
- int providesCalibration() { return 0; }
- void getOrientationMatrix(signed char *orient);
- long getSensitivity();
- int getAccuracy() { return 0; }
- void fillList(struct sensor_t *list);
- int isIntegrated() { return (mI2CBus == COMPASS_BUS_SECONDARY); }
-#ifdef COMPASS_YAS53x
- int checkCoilsReset(void);
-#endif
-
-private:
- enum CompassBus {
- COMPASS_BUS_PRIMARY = 0,
- COMPASS_BUS_SECONDARY = 1
- } mI2CBus;
-
- struct sysfs_attrbs {
- char *chip_enable;
- char *in_timestamp_en;
- char *trigger_name;
- char *current_trigger;
- char *buffer_length;
-
- char *compass_enable;
- char *compass_x_fifo_enable;
- char *compass_y_fifo_enable;
- char *compass_z_fifo_enable;
- char *compass_rate;
- char *compass_scale;
- char *compass_orient;
-#ifdef COMPASS_YAS53x
- char *compass_attr_1;
-#endif
- } compassSysFs;
-
- char dev_full_name[20];
-
- // implementation specific
- signed char mCompassOrientation[9];
- long mCachedCompassData[3];
- int64_t mCompassTimestamp;
- InputEventCircularReader mCompassInputReader;
- int compass_fd;
- int64_t mDelay;
- int mEnable;
- char *pathP;
-
- char mIIOBuffer[(8 + 8) * IIO_BUFFER_LENGTH];
-
- int masterEnable(int en);
- void enable_iio_sysfs(void);
- void processCompassEvent(const input_event *event);
- int inv_init_sysfs_attributes(void);
-
-#ifdef COMPASS_YAS53x
- FILE *mCoilsResetFd;
-#endif
-};
-
-/*****************************************************************************/
-
-#endif // COMPASS_SENSOR_H
diff --git a/libsensors_iio/InputEventReader.cpp b/libsensors_iio/InputEventReader.cpp
index d3e0fe6..ca0a61a 100644
--- a/libsensors_iio/InputEventReader.cpp
+++ b/libsensors_iio/InputEventReader.cpp
@@ -1,104 +1,105 @@
-/*
-* Copyright (C) 2012 Invensense, Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#define LOG_NDEBUG 0
-
-#include <stdint.h>
-#include <errno.h>
-#include <unistd.h>
-#include <poll.h>
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include <linux/input.h>
-
-#include <cutils/log.h>
-
-#include "InputEventReader.h"
-
-/*****************************************************************************/
-
-struct input_event;
-
-InputEventCircularReader::InputEventCircularReader(size_t numEvents)
- : mBuffer(new input_event[numEvents * 2]),
- mBufferEnd(mBuffer + numEvents),
- mHead(mBuffer),
- mCurr(mBuffer),
- mFreeSpace(numEvents)
-{
-}
-
-InputEventCircularReader::~InputEventCircularReader()
-{
- delete [] mBuffer;
-}
-
-#define INPUT_EVENT_DEBUG (0)
-ssize_t InputEventCircularReader::fill(int fd)
-{
- size_t numEventsRead = 0;
- LOGV_IF(INPUT_EVENT_DEBUG,
- "DEBUG:%s enter, fd=%d\n", __PRETTY_FUNCTION__, fd);
- if (mFreeSpace) {
- const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event));
- if (nread < 0 || nread % sizeof(input_event)) {
- //LOGE("Partial event received nread=%d, required=%d",
- // nread, sizeof(input_event));
- //LOGE("FD trying to read is: %d");
- // we got a partial event!!
- if (INPUT_EVENT_DEBUG) {
- LOGV_IF(nread < 0, "DEBUG:%s exit nread < 0\n",
- __PRETTY_FUNCTION__);
- LOGV_IF(nread % sizeof(input_event),
- "DEBUG:%s exit nread %% sizeof(input_event)\n",
- __PRETTY_FUNCTION__);
- }
- return (nread < 0 ? -errno : -EINVAL);
- }
-
- numEventsRead = nread / sizeof(input_event);
- if (numEventsRead) {
- mHead += numEventsRead;
- mFreeSpace -= numEventsRead;
- if (mHead > mBufferEnd) {
- size_t s = mHead - mBufferEnd;
- memcpy(mBuffer, mBufferEnd, s * sizeof(input_event));
- mHead = mBuffer + s;
- }
- }
- }
-
- LOGV_IF(INPUT_EVENT_DEBUG, "DEBUG:%s exit\n", __PRETTY_FUNCTION__);
- return numEventsRead;
-}
-
-ssize_t InputEventCircularReader::readEvent(input_event const** events)
-{
- *events = mCurr;
- ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace;
- return available ? 1 : 0;
-}
-
-void InputEventCircularReader::next()
-{
- mCurr++;
- mFreeSpace++;
- if (mCurr >= mBufferEnd) {
- mCurr = mBuffer;
- }
-}
+/*
+* Copyright (C) 2012 Invensense, Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#define LOG_NDEBUG 0
+
+#include <stdint.h>
+#include <errno.h>
+#include <unistd.h>
+#include <poll.h>
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+#include <linux/input.h>
+
+#include <cutils/log.h>
+
+#include "InputEventReader.h"
+#include "local_log_def.h"
+
+/*****************************************************************************/
+
+struct input_event;
+
+InputEventCircularReader::InputEventCircularReader(size_t numEvents)
+ : mBuffer(new input_event[numEvents * 2]),
+ mBufferEnd(mBuffer + numEvents),
+ mHead(mBuffer),
+ mCurr(mBuffer),
+ mFreeSpace(numEvents)
+{
+}
+
+InputEventCircularReader::~InputEventCircularReader()
+{
+ delete [] mBuffer;
+}
+
+#define INPUT_EVENT_DEBUG (0)
+ssize_t InputEventCircularReader::fill(int fd)
+{
+ size_t numEventsRead = 0;
+ LOGV_IF(INPUT_EVENT_DEBUG,
+ "DEBUG:%s enter, fd=%d\n", __PRETTY_FUNCTION__, fd);
+ if (mFreeSpace) {
+ const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event));
+ if (nread < 0 || nread % sizeof(input_event)) {
+ //LOGE("Partial event received nread=%d, required=%d",
+ // nread, sizeof(input_event));
+ //LOGE("FD trying to read is: %d");
+ // we got a partial event!!
+ if (INPUT_EVENT_DEBUG) {
+ LOGV_IF(nread < 0, "DEBUG:%s exit nread < 0\n",
+ __PRETTY_FUNCTION__);
+ LOGV_IF(nread % sizeof(input_event),
+ "DEBUG:%s exit nread %% sizeof(input_event)\n",
+ __PRETTY_FUNCTION__);
+ }
+ return (nread < 0 ? -errno : -EINVAL);
+ }
+
+ numEventsRead = nread / sizeof(input_event);
+ if (numEventsRead) {
+ mHead += numEventsRead;
+ mFreeSpace -= numEventsRead;
+ if (mHead > mBufferEnd) {
+ size_t s = mHead - mBufferEnd;
+ memcpy(mBuffer, mBufferEnd, s * sizeof(input_event));
+ mHead = mBuffer + s;
+ }
+ }
+ }
+
+ LOGV_IF(INPUT_EVENT_DEBUG, "DEBUG:%s exit\n", __PRETTY_FUNCTION__);
+ return numEventsRead;
+}
+
+ssize_t InputEventCircularReader::readEvent(input_event const** events)
+{
+ *events = mCurr;
+ ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace;
+ return available ? 1 : 0;
+}
+
+void InputEventCircularReader::next()
+{
+ mCurr++;
+ mFreeSpace++;
+ if (mCurr >= mBufferEnd) {
+ mCurr = mBuffer;
+ }
+}
diff --git a/libsensors_iio/InputEventReader.h b/libsensors_iio/InputEventReader.h
index 7cd2ee2..11c4e73 100644
--- a/libsensors_iio/InputEventReader.h
+++ b/libsensors_iio/InputEventReader.h
@@ -22,8 +22,6 @@
#include <sys/cdefs.h>
#include <sys/types.h>
-#include "SensorBase.h"
-
/*****************************************************************************/
struct input_event;
diff --git a/libsensors_iio/MPLSensor.cpp b/libsensors_iio/MPLSensor.cpp
index 7c750c1..e23ecc9 100644
--- a/libsensors_iio/MPLSensor.cpp
+++ b/libsensors_iio/MPLSensor.cpp
@@ -34,7 +34,6 @@
#include <utils/String8.h>
#include <string.h>
#include <linux/input.h>
-#include <utils/Atomic.h>
#include "MPLSensor.h"
#include "MPLSupport.h"
@@ -47,6 +46,7 @@
#include "ml_sysfs_helper.h"
// #define TESTING
+// #define ENABLE_LP_QUAT_FEAT /* Uncomment to enable Low Power Quaternion */
#ifdef THIRD_PARTY_ACCEL
# warning "Third party accel"
@@ -80,18 +80,11 @@ static int hertz_request = 200;
#define HW_ACCEL_RATE_HZ (1000 / hertz_request)
#define HW_COMPASS_RATE_HZ (1000000000LL / hertz_request)
-#define RATE_200HZ 5000000LL
-#define RATE_15HZ 66667000LL
-#define RATE_5HZ 200000000LL
-
static struct sensor_t sSensorList[] =
{
{"MPL Gyroscope", "Invensense", 1,
SENSORS_GYROSCOPE_HANDLE,
SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, {}},
- {"MPL Raw Gyroscope", "Invensense", 1,
- SENSORS_RAW_GYROSCOPE_HANDLE,
- SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, {}},
{"MPL Accelerometer", "Invensense", 1,
SENSORS_ACCELERATION_HANDLE,
SENSOR_TYPE_ACCELEROMETER, 10240.0f, 1.0f, 0.5f, 10000, {}},
@@ -110,12 +103,6 @@ static struct sensor_t sSensorList[] =
{"MPL Gravity", "Invensense", 1,
SENSORS_GRAVITY_HANDLE,
SENSOR_TYPE_GRAVITY, 10240.0f, 1.0f, 0.5f, 10000, {}},
-
-#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
- {"MPL Screen Orientation", "Invensense ", 1,
- SENSORS_SCREEN_ORIENTATION_HANDLE,
- SENSOR_TYPE_SCREEN_ORIENTATION, 100.0f, 1.0f, 1.1f, 0, {}},
-#endif
};
MPLSensor *MPLSensor::gMPLSensor = NULL;
@@ -147,20 +134,17 @@ static FILE *logfile = NULL;
* MPLSensor class implementation
******************************************************************************/
-// following extended initializer list would only be available with -std=c++11 or -std=gnu+11
-MPLSensor::MPLSensor(CompassSensor *compass, int (*m_pt2AccelCalLoadFunc)(long *))
+MPLSensor::MPLSensor(CompassSensor *compass)
: SensorBase(NULL, NULL),
+ mMplSensorInitialized(false),
mNewData(0),
mMasterSensorMask(INV_ALL_SENSORS),
- mLocalSensorMask(0),
+ mLocalSensorMask(ALL_MPL_SENSORS_NP),
mPollTime(-1),
mHaveGoodMpuCal(0),
mGyroAccuracy(0),
mAccelAccuracy(0),
- mCompassAccuracy(0),
mSampleCount(0),
- dmp_orient_fd(-1),
- mDmpOrientationEnabled(0),
mEnabled(0),
mOldEnabledMask(0),
mAccelInputReader(4),
@@ -171,6 +155,8 @@ MPLSensor::MPLSensor(CompassSensor *compass, int (*m_pt2AccelCalLoadFunc)(long *
mAccelScale(2),
mPendingMask(0),
mSensorMask(0),
+ mGyroOrientation{0},
+ mAccelOrientation{0},
mFeatureActiveMask(0) {
VFUNC_LOG;
@@ -185,7 +171,7 @@ MPLSensor::MPLSensor(CompassSensor *compass, int (*m_pt2AccelCalLoadFunc)(long *
mCompassSensor = compass;
LOGV_IF(EXTRA_VERBOSE,
- "HAL:MPLSensor constructor : NUMSENSORS = %d", NUMSENSORS);
+ "HAL:MPLSensor constructor : numSensors = %d", numSensors);
pthread_mutex_init(&mMplMutex, NULL);
pthread_mutex_init(&mHALMutex, NULL);
@@ -198,7 +184,10 @@ MPLSensor::MPLSensor(CompassSensor *compass, int (*m_pt2AccelCalLoadFunc)(long *
#endif
/* setup sysfs paths */
- inv_init_sysfs_attributes();
+ if(inv_init_sysfs_attributes()) {
+ ALOGE("MPLSensor failed to init sysfs attributes");
+ return;
+ }
/* get chip name */
if (inv_get_chip_name(chip_ID) != INV_SUCCESS) {
@@ -215,10 +204,11 @@ MPLSensor::MPLSensor(CompassSensor *compass, int (*m_pt2AccelCalLoadFunc)(long *
/* reset driver master enable */
masterEnable(0);
- if (isLowPowerQuatEnabled() || isDmpDisplayOrientationOn()) {
- /* Load DMP image if capable, ie. MPU6xxx/9xxx */
- loadDMP();
- }
+ /* Load DMP image if capable, ie. MPU6xxx/9xxx */
+ // TODO: disabled for GED tablet
+#ifdef ENABLE_LP_QUAT_FEAT
+ loadDMP();
+#endif
/* open temperature fd for temp comp */
LOGV_IF(EXTRA_VERBOSE, "HAL:gyro temperature path: %s", mpu.temperature);
@@ -279,11 +269,6 @@ MPLSensor::MPLSensor(CompassSensor *compass, int (*m_pt2AccelCalLoadFunc)(long *
mPendingEvents[Gyro].type = SENSOR_TYPE_GYROSCOPE;
mPendingEvents[Gyro].gyro.status = SENSOR_STATUS_ACCURACY_HIGH;
- mPendingEvents[RawGyro].version = sizeof(sensors_event_t);
- mPendingEvents[RawGyro].sensor = ID_RG;
- mPendingEvents[RawGyro].type = SENSOR_TYPE_GYROSCOPE;
- mPendingEvents[RawGyro].gyro.status = SENSOR_STATUS_ACCURACY_HIGH;
-
mPendingEvents[Accelerometer].version = sizeof(sensors_event_t);
mPendingEvents[Accelerometer].sensor = ID_A;
mPendingEvents[Accelerometer].type = SENSOR_TYPE_ACCELEROMETER;
@@ -307,12 +292,11 @@ MPLSensor::MPLSensor(CompassSensor *compass, int (*m_pt2AccelCalLoadFunc)(long *
mHandlers[LinearAccel] = &MPLSensor::laHandler;
mHandlers[Gravity] = &MPLSensor::gravHandler;
mHandlers[Gyro] = &MPLSensor::gyroHandler;
- mHandlers[RawGyro] = &MPLSensor::rawGyroHandler;
mHandlers[Accelerometer] = &MPLSensor::accelHandler;
mHandlers[MagneticField] = &MPLSensor::compassHandler;
mHandlers[Orientation] = &MPLSensor::orienHandler;
- for (int i = 0; i < NUMSENSORS; i++) {
+ for (int i = 0; i < numSensors; i++) {
mDelays[i] = 0;
}
@@ -322,35 +306,13 @@ MPLSensor::MPLSensor(CompassSensor *compass, int (*m_pt2AccelCalLoadFunc)(long *
/* setup MPL */
inv_constructor_init();
- /* load calibration file from /data/inv_cal_data.bin */
+ /* load calibration file from /data/cal.bin */
rv = inv_load_calibration();
if(rv == INV_SUCCESS)
LOGV_IF(PROCESS_VERBOSE, "HAL:Calibration file successfully loaded");
else
LOGE("HAL:Could not open or load MPL calibration file (%d)", rv);
- /* Takes external Accel Calibration Load Method */
- if( m_pt2AccelCalLoadFunc != NULL)
- {
- long accel_offset[3];
- long tmp_offset[3];
- int result = m_pt2AccelCalLoadFunc(accel_offset);
- if(result)
- LOGW("HAL:Vendor accelerometer calibration file load failed %d\n", result);
- else
- {
- LOGW("HAL:Vendor accelerometer calibration file successfully loaded");
- inv_get_accel_bias(tmp_offset, NULL);
- LOGV_IF(PROCESS_VERBOSE, "HAL:Original accel offset, %ld, %ld, %ld\n",
- tmp_offset[0], tmp_offset[1], tmp_offset[2]);
- inv_set_accel_bias(accel_offset, mAccelAccuracy);
- inv_get_accel_bias(tmp_offset, NULL);
- LOGV_IF(PROCESS_VERBOSE, "HAL:Set accel offset, %ld, %ld, %ld\n",
- tmp_offset[0], tmp_offset[1], tmp_offset[2]);
- }
- }
- /* End of Accel Calibration Load Method */
-
inv_set_device_properties();
/* disable driver master enable the first sensor goes on */
@@ -358,84 +320,67 @@ MPLSensor::MPLSensor(CompassSensor *compass, int (*m_pt2AccelCalLoadFunc)(long *
enableGyro(0);
enableAccel(0);
enableCompass(0);
-
- if ( isLowPowerQuatEnabled() ) {
- enableLPQuaternion(0);
- }
-
onPower(0);
- if (isDmpDisplayOrientationOn()) {
- enableDmpOrientation(isDmpDisplayOrientationOn());
- enableDmpOrientation(!isDmpScreenAutoRotationEnabled()
- && isDmpDisplayOrientationOn());
- }
-
#ifdef INV_PLAYBACK_DBG
logfile = fopen("/data/playback.bin", "wb");
if (logfile)
inv_turn_on_data_logging(logfile);
#endif
+
+ mMplSensorInitialized = true;
}
-void MPLSensor::enable_iio_sysfs()
-{
+
+void MPLSensor::enable_iio_sysfs() {
VFUNC_LOG;
+ int tempFd = 0;
char iio_trigger_name[MAX_CHIP_ID_LEN], iio_device_node[MAX_CHIP_ID_LEN];
FILE *tempFp = NULL;
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo 1 > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE,
+ "HAL:sysfs:echo 1 > %s (%lld)",
mpu.in_timestamp_en, getTimestamp());
- // fopen()/open() would both be okay for sysfs access
- // developers could choose what they want
- // with fopen(), benefits from fprintf()/fscanf() would be available
- tempFp = fopen(mpu.in_timestamp_en, "w");
- if (tempFp == NULL) {
+ tempFd = open(mpu.in_timestamp_en, O_RDWR);
+ if(tempFd < 0) {
LOGE("HAL:could not open timestamp enable");
- } else {
- if(fprintf(tempFp, "%d", 1) < 0) {
- LOGE("HAL:could not enable timestamp");
- }
- fclose(tempFp);
+ } else if(enable_sysfs_sensor(tempFd, 1) < 0) {
+ LOGE("HAL:could not enable timestamp");
}
- LOGV_IF(SYSFS_VERBOSE,
- "HAL:sysfs:cat %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE,
+ "HAL:sysfs:cat %s (%lld)",
mpu.trigger_name, getTimestamp());
tempFp = fopen(mpu.trigger_name, "r");
if (tempFp == NULL) {
LOGE("HAL:could not open trigger name");
- } else {
- if (fscanf(tempFp, "%s", iio_trigger_name) < 0) {
- LOGE("HAL:could not read trigger name");
- }
- fclose(tempFp);
+ } else if (fscanf(tempFp, "%s", iio_trigger_name) < 0) {
+ LOGE("HAL:could not read trigger name");
}
+ fclose(tempFp);
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %s > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE,
+ "HAL:sysfs:echo %s > %s (%lld)",
iio_trigger_name, mpu.current_trigger, getTimestamp());
tempFp = fopen(mpu.current_trigger, "w");
if (tempFp == NULL) {
LOGE("HAL:could not open current trigger");
- } else {
- if (fprintf(tempFp, "%s", iio_trigger_name) < 0) {
- LOGE("HAL:could not write current trigger");
- }
- fclose(tempFp);
+ } else if (fprintf(tempFp, "%s", iio_trigger_name) < 0) {
+ LOGE("HAL:could not write current trigger");
}
+ fclose(tempFp);
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE,
+ "HAL:sysfs:echo %d > %s (%lld)",
IIO_BUFFER_LENGTH, mpu.buffer_length, getTimestamp());
tempFp = fopen(mpu.buffer_length, "w");
if (tempFp == NULL) {
LOGE("HAL:could not open buffer length");
- } else {
- if (fprintf(tempFp, "%d", IIO_BUFFER_LENGTH) < 0) {
- LOGE("HAL:could not write buffer length");
- }
- fclose(tempFp);
+ } else if (fprintf(tempFp, "%d", IIO_BUFFER_LENGTH) < 0) {
+ LOGE("HAL:could not write buffer length");
}
+ fclose(tempFp);
inv_get_iio_device_node(iio_device_node);
iio_fd = open(iio_device_node, O_RDONLY);
@@ -483,6 +428,7 @@ int MPLSensor::inv_constructor_default_enable()
return result;
}
+ // TODO: double-check for GED tablet
// result = inv_enable_motion_no_motion();
result = inv_enable_fast_nomot();
if (result) {
@@ -506,13 +452,8 @@ int MPLSensor::inv_constructor_default_enable()
if (result) {
LOG_RESULT_LOCATION(result);
return result;
- } else {
- mFeatureActiveMask |= INV_COMPASS_CAL;
}
- // specify MPL's trust weight, used by compass algorithms
- inv_vector_compass_cal_sensitivity(3);
-
result = inv_enable_compass_bias_w_gyro();
if (result) {
LOG_RESULT_LOCATION(result);
@@ -536,9 +477,6 @@ int MPLSensor::inv_constructor_default_enable()
if (result) {
LOG_RESULT_LOCATION(result);
return result;
- } else {
- // 9x sensor fusion enables Compass fit
- mFeatureActiveMask |= INV_COMPASS_FIT;
}
result = inv_enable_no_gyro_fusion();
@@ -547,6 +485,7 @@ int MPLSensor::inv_constructor_default_enable()
return result;
}
+ // TODO: double-check for GED tablet
result = inv_enable_quat_accuracy_monitor();
if (result) {
LOG_RESULT_LOCATION(result);
@@ -574,15 +513,15 @@ void MPLSensor::inv_set_device_properties()
/* accel setup */
orient = inv_orientation_matrix_to_scalar(mAccelOrientation);
- /* use for third party accel input subsystem driver
- inv_set_accel_orientation_and_scale(orient, 1LL << 22);
- */
+ // BMA250
+ //inv_set_accel_orientation_and_scale(orient, 1LL << 22);
+ // MPU6050
inv_set_accel_orientation_and_scale(orient, mAccelScale << 15);
/* compass setup */
signed char orientMtx[9];
mCompassSensor->getOrientationMatrix(orientMtx);
- orient =
+ orient =
inv_orientation_matrix_to_scalar(orientMtx);
long sensitivity;
sensitivity = mCompassSensor->getSensitivity();
@@ -594,13 +533,13 @@ void MPLSensor::loadDMP()
int res, fd;
FILE *fptr;
- if (isMpu3050() == true) {
+ if (!strcmp(chip_ID, "mpu3050") || !strcmp(chip_ID, "MPU3050")) {
//DMP support only for MPU6xxx/9xxx currently
return;
}
/* load DMP firmware */
- LOGV_IF(SYSFS_VERBOSE,
+ LOGV_IF(SYSFS_VERBOSE,
"HAL:sysfs:cat %s (%lld)", mpu.firmware_loaded, getTimestamp());
fd = open(mpu.firmware_loaded, O_RDONLY);
if(fd < 0) {
@@ -633,13 +572,13 @@ void MPLSensor::inv_get_sensors_orientation()
FILE *fptr;
// get gyro orientation
- LOGV_IF(SYSFS_VERBOSE,
+ LOGV_IF(SYSFS_VERBOSE,
"HAL:sysfs:cat %s (%lld)", mpu.gyro_orient, getTimestamp());
fptr = fopen(mpu.gyro_orient, "r");
if (fptr != NULL) {
int om[9];
fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
- &om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
+ &om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
&om[6], &om[7], &om[8]);
fclose(fptr);
@@ -662,13 +601,13 @@ void MPLSensor::inv_get_sensors_orientation()
}
// get accel orientation
- LOGV_IF(SYSFS_VERBOSE,
+ LOGV_IF(SYSFS_VERBOSE,
"HAL:sysfs:cat %s (%lld)", mpu.accel_orient, getTimestamp());
fptr = fopen(mpu.accel_orient, "r");
if (fptr != NULL) {
int om[9];
- fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
- &om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
+ fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
+ &om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
&om[6], &om[7], &om[8]);
fclose(fptr);
@@ -698,6 +637,7 @@ MPLSensor::~MPLSensor()
/* Close open fds */
if (iio_fd > 0)
close(iio_fd);
+
if( accel_fd > 0 )
close(accel_fd );
if (gyro_temperature_fd > 0)
@@ -705,10 +645,6 @@ MPLSensor::~MPLSensor()
if (sysfs_names_ptr)
free(sysfs_names_ptr);
- if (isDmpDisplayOrientationOn()) {
- closeDmpOrientFd();
- }
-
/* Turn off Gyro master enable */
/* A workaround until driver handles it */
/* TODO: Turn off and close all sensors */
@@ -729,13 +665,18 @@ MPLSensor::~MPLSensor()
#endif
}
-#define GY_ENABLED (((1 << ID_GY) | (1 << ID_RG)) & enabled_sensors)
-#define A_ENABLED ((1 << ID_A) & enabled_sensors)
+#define GY_ENABLED ((1 << ID_GY) & enabled_sensors) // ID_GY = 0
+#define A_ENABLED ((1 << ID_A) & enabled_sensors) // ID_A = 1
+#ifdef INVENSENSE_COMPASS_CAL // ID_M = 2
+#define M_ENABLED ((1 << ID_M) & enabled_sensors)
+#else
+// TODO: ID_M = 2 even for 3rd-party solution
#define M_ENABLED ((1 << ID_M) & enabled_sensors)
-#define O_ENABLED ((1 << ID_O) & enabled_sensors)
-#define LA_ENABLED ((1 << ID_LA) & enabled_sensors)
-#define GR_ENABLED ((1 << ID_GR) & enabled_sensors)
-#define RV_ENABLED ((1 << ID_RV) & enabled_sensors)
+#endif
+#define O_ENABLED ((1 << ID_O) & enabled_sensors) // ID_O = 3
+#define LA_ENABLED ((1 << ID_LA) & enabled_sensors) // ID_RV = 4
+#define GR_ENABLED ((1 << ID_GR) & enabled_sensors) // ID_LA = 5
+#define RV_ENABLED ((1 << ID_RV) & enabled_sensors) // ID_GR = 6
/* TODO: this step is optional, remove? */
int MPLSensor::setGyroInitialState()
@@ -744,7 +685,7 @@ int MPLSensor::setGyroInitialState()
int res = 0;
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
HW_GYRO_RATE_HZ, mpu.gyro_fifo_rate, getTimestamp());
int fd = open(mpu.gyro_fifo_rate, O_RDWR);
res = errno;
@@ -765,7 +706,7 @@ int MPLSensor::setGyroInitialState()
return 0;
}
-/* this applies to BMA250 Input Subsystem Driver only */
+/* this applies to BMA250 only */
int MPLSensor::setAccelInitialState()
{
VFUNC_LOG;
@@ -796,7 +737,7 @@ int MPLSensor::onPower(int en)
char buf[sizeof(int)+1];
int count, curr_power_state;
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, mpu.power_state, getTimestamp());
int tempFd = open(mpu.power_state, O_RDWR);
res = errno;
@@ -813,16 +754,16 @@ int MPLSensor::onPower(int en)
} else {
sscanf(buf, "%d", &curr_power_state);
}
-
- if (en!=curr_power_state) {
+
+ if (en!=curr_power_state) {
if((res=enable_sysfs_sensor(tempFd, en)) < 0) {
LOGE("HAL:Couldn't write power state");
}
} else {
LOGV_IF(EXTRA_VERBOSE,
- "HAL:Power state already enable/disable curr=%d new=%d",
+ "HAL:Power state already enable/disable curr=%d new=%d",
curr_power_state, en);
- close(tempFd);
+ close(tempFd);
}
}
return res;
@@ -841,32 +782,24 @@ int MPLSensor::onDMP(int en)
//3. Either Gyro or Accel must be enabled/configured before next step
//4. Enable DMP
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
- mpu.firmware_loaded, getTimestamp());
if(read_sysfs_int(mpu.firmware_loaded, &status) < 0){
LOGE("HAL:ERR can't get firmware_loaded status");
} else if (status == 1) {
//Write only if curr DMP state <> request
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
- mpu.dmp_on, getTimestamp());
if (read_sysfs_int(mpu.dmp_on, &status) < 0) {
LOGE("HAL:ERR can't read DMP state");
} else if (status != en) {
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, mpu.dmp_on, getTimestamp());
if (write_sysfs_int(mpu.dmp_on, en) < 0) {
- LOGE("HAL:ERR can't write dmp_on");
+ LOGE("HAL:ERR can't write dmp_on");
} else {
- res = 0; //Indicate write successful
+ res= 0; //Indicate write successful
}
//Enable DMP interrupt
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, mpu.dmp_int_on, getTimestamp());
if (write_sysfs_int(mpu.dmp_int_on, en) < 0) {
- LOGE("HAL:ERR can't en/dis DMP interrupt");
+ LOGE("HAL:ERR can't en/dis DMP interrupt");
}
} else {
- res= 0; //DMP already set as requested
+ res= 0; //DMP already set as requested
}
} else {
LOGE("HAL:ERR No DMP image");
@@ -891,7 +824,7 @@ int MPLSensor::enableLPQuaternion(int en)
mFeatureActiveMask &= ~INV_DMP_QUATERNION;
LOGV_IF(PROCESS_VERBOSE, "HAL:LP Quat disabled");
} else {
- if (enableQuaternionData(1) < 0 || onDMP(1) < 0) {
+ if (enableQuaternionData(1) < 0 || onDMP(1) < 0) {
LOGE("HAL:ERR can't enable LP Quaternion");
} else {
mFeatureActiveMask |= INV_DMP_QUATERNION;
@@ -906,65 +839,33 @@ int MPLSensor::enableQuaternionData(int en)
int res= 0;
VFUNC_LOG;
- // Enable DMP quaternion
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, mpu.quaternion_on, getTimestamp());
+ //Enable DMP quaternion
if (write_sysfs_int(mpu.quaternion_on, en) < 0) {
LOGE("HAL:ERR can't write DMP quaternion_on");
- res = -1; //Indicate an err
- }
+ res= -1; //Indicate an err
+ }
if (!en) {
- LOGV_IF(PROCESS_VERBOSE, "HAL:Disabling quat scan elems");
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 0, mpu.in_quat_r_en, getTimestamp());
- if (write_sysfs_int(mpu.in_quat_r_en, 0) < 0) {
- LOGE("HAL:ERR write in_quat_r_en");
- }
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 0, mpu.in_quat_x_en, getTimestamp());
- if (write_sysfs_int(mpu.in_quat_x_en, 0) < 0) {
- LOGE("HAL:ERR write in_quat_x_en");
- }
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 0, mpu.in_quat_y_en, getTimestamp());
- if (write_sysfs_int(mpu.in_quat_y_en, 0) < 0) {
- LOGE("HAL:ERR write in_quat_y_en");
- }
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 0, mpu.in_quat_z_en, getTimestamp());
-
- if (write_sysfs_int(mpu.in_quat_z_en, 0) < 0) {
- LOGE("HAL:ERR write in_quat_z_en");
- }
-
LOGV_IF(EXTRA_VERBOSE, "HAL:DMP quaternion data was turned off");
inv_quaternion_sensor_was_turned_off();
} else {
LOGV_IF(PROCESS_VERBOSE, "HAL:Enabling quat scan elems");
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 1, mpu.in_quat_r_en, getTimestamp());
if (write_sysfs_int(mpu.in_quat_r_en, 1) < 0) {
LOGE("HAL:ERR write in_quat_r_en");
}
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 1, mpu.in_quat_x_en, getTimestamp());
if (write_sysfs_int(mpu.in_quat_x_en, 1) < 0) {
LOGE("HAL:ERR write in_quat_x_en");
}
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 1, mpu.in_quat_y_en, getTimestamp());
if (write_sysfs_int(mpu.in_quat_y_en, 1) < 0) {
LOGE("HAL:ERR write in_quat_y_en");
}
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 1, mpu.in_quat_z_en, getTimestamp());
if (write_sysfs_int(mpu.in_quat_z_en, 1) < 0) {
- LOGE("HAL:ERR write in_quat_z_en");
+ LOGE("HAL:ERR write in_quat_z_en");
}
}
return res;
+
}
int MPLSensor::enableTap(int en)
@@ -994,7 +895,7 @@ int MPLSensor::masterEnable(int en)
int res = 0;
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, mpu.chip_enable, getTimestamp());
int tempFd = open(mpu.chip_enable, O_RDWR);
res = errno;
@@ -1014,7 +915,7 @@ int MPLSensor::enableGyro(int en)
int res = 0;
/* need to also turn on/off the master enable */
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, mpu.gyro_enable, getTimestamp());
int tempFd = open(mpu.gyro_enable, O_RDWR);
res = errno;
@@ -1029,7 +930,7 @@ int MPLSensor::enableGyro(int en)
LOGV_IF(EXTRA_VERBOSE, "HAL:MPL:inv_gyro_was_turned_off");
inv_gyro_was_turned_off();
} else {
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, mpu.gyro_x_fifo_enable, getTimestamp());
tempFd = open(mpu.gyro_x_fifo_enable, O_RDWR);
res = errno;
@@ -1040,7 +941,7 @@ int MPLSensor::enableGyro(int en)
mpu.gyro_x_fifo_enable, strerror(res), res);
}
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, mpu.gyro_y_fifo_enable, getTimestamp());
tempFd = open(mpu.gyro_y_fifo_enable, O_RDWR);
res = errno;
@@ -1051,7 +952,7 @@ int MPLSensor::enableGyro(int en)
mpu.gyro_y_fifo_enable, strerror(res), res);
}
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, mpu.gyro_z_fifo_enable, getTimestamp());
tempFd = open(mpu.gyro_z_fifo_enable, O_RDWR);
res = errno;
@@ -1072,23 +973,23 @@ int MPLSensor::enableAccel(int en)
int res;
- /* need to also turn on/off the master enable */
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, mpu.accel_enable, getTimestamp());
- int tempFd = open(mpu.accel_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, en);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- mpu.accel_enable, strerror(res), res);
- }
+ /* need to also turn on/off the master enable */
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ en, mpu.accel_enable, getTimestamp());
+ int tempFd = open(mpu.accel_enable, O_RDWR);
+ res = errno;
+ if (tempFd > 0) {
+ res = enable_sysfs_sensor(tempFd, en);
+ } else {
+ LOGE("HAL:open of %s failed with '%s' (%d)",
+ mpu.accel_enable, strerror(res), res);
+ }
if (!en) {
LOGV_IF(EXTRA_VERBOSE, "HAL:MPL:inv_accel_was_turned_off");
inv_accel_was_turned_off();
} else {
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, mpu.accel_x_fifo_enable, getTimestamp());
tempFd = open(mpu.accel_x_fifo_enable, O_RDWR);
res = errno;
@@ -1099,7 +1000,7 @@ int MPLSensor::enableAccel(int en)
mpu.accel_x_fifo_enable, strerror(res), res);
}
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, mpu.accel_y_fifo_enable, getTimestamp());
tempFd = open(mpu.accel_y_fifo_enable, O_RDWR);
res = errno;
@@ -1110,7 +1011,7 @@ int MPLSensor::enableAccel(int en)
mpu.accel_y_fifo_enable, strerror(res), res);
}
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
+ LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
en, mpu.accel_z_fifo_enable, getTimestamp());
tempFd = open(mpu.accel_z_fifo_enable, O_RDWR);
res = errno;
@@ -1123,10 +1024,10 @@ int MPLSensor::enableAccel(int en)
}
if (!en && USE_THIRD_PARTY_ACCEL == 0) {
- }
+ }
if(USE_THIRD_PARTY_ACCEL == 1 && en) {
- //setAccelInitialState();// BMA250
+ setAccelInitialState(); // BMA250
}
return res;
}
@@ -1139,7 +1040,7 @@ int MPLSensor::enableCompass(int en)
if (en == 0) {
LOGV_IF(EXTRA_VERBOSE, "HAL:MPL:inv_compass_was_turned_off");
inv_compass_was_turned_off();
- }
+ }
return res;
}
@@ -1194,20 +1095,18 @@ int MPLSensor::enableSensors(unsigned long sensors, int en, uint32_t changed) {
inv_error_t res = -1;
int on = 1;
int off = 0;
- int cal_stored = 0;
// Sequence to enable or disable a sensor
- // 1. enable Power state
+ // 1. enable Power state
// 2. reset master enable (=0)
// 3. enable or disable a sensor
// 4. set master enable (=1)
- if (isLowPowerQuatEnabled() ||
- changed & ((1 << Gyro) | (1 << RawGyro) | (1 << Accelerometer) |
- (mCompassSensor->isIntegrated() << MagneticField))) {
+ if (changed & ((1 << Gyro) | (1 << Accelerometer) |
+ (mCompassSensor->isIntegrated() << MagneticField))) {
/* ensure power state is on */
onPower(1);
-
+
/* reset master enable */
res = masterEnable(0);
if(res < 0) {
@@ -1217,45 +1116,35 @@ int MPLSensor::enableSensors(unsigned long sensors, int en, uint32_t changed) {
LOGV_IF(PROCESS_VERBOSE, "HAL:enableSensors - sensors: 0x%0x", (unsigned int)sensors);
- if (changed & ((1 << Gyro) | (1 << RawGyro))) {
- if (sensors & INV_THREE_AXIS_GYRO) {
+ if (changed & (1 << Gyro)) {
+ if(sensors & INV_THREE_AXIS_GYRO) {
LOGV_IF(PROCESS_VERBOSE, "HAL:enableSensors - enable gyro");
res = enableGyro(on);
if(res < 0) {
return res;
}
- } else if ((sensors & INV_THREE_AXIS_GYRO) == 0) {
+ } else if((sensors & INV_THREE_AXIS_GYRO) == 0) {
LOGV_IF(PROCESS_VERBOSE, "HAL:enableSensors - disable gyro");
res = enableGyro(off);
if(res < 0) {
return res;
}
-
- if (!cal_stored) {
- storeCalibration();
- cal_stored = 1;
- }
}
}
if (changed & (1 << Accelerometer)) {
- if (sensors & INV_THREE_AXIS_ACCEL) {
+ if(sensors & INV_THREE_AXIS_ACCEL) {
LOGV_IF(PROCESS_VERBOSE, "HAL:enableSensors - enable accel");
res = enableAccel(on);
if(res < 0) {
return res;
}
- } else if ((sensors & INV_THREE_AXIS_ACCEL) == 0) {
+ } else if((sensors & INV_THREE_AXIS_ACCEL) == 0) {
LOGV_IF(PROCESS_VERBOSE, "HAL:enableSensors - disable accel");
res = enableAccel(off);
if(res < 0) {
return res;
}
-
- if (!cal_stored) {
- storeCalibration();
- cal_stored = 1;
- }
}
}
@@ -1273,121 +1162,51 @@ int MPLSensor::enableSensors(unsigned long sensors, int en, uint32_t changed) {
if(res < 0) {
return res;
}
-
- if (!cal_stored) {
- storeCalibration();
- cal_stored = 1;
- }
}
}
- if ( isLowPowerQuatEnabled() ) {
- // Enable LP Quat
- if ((mEnabled & ((1 << Orientation) | (1 << RotationVector) |
- (1 << LinearAccel) | (1 << Gravity)))) {
- if (!(changed & ((1 << Gyro) | (1 << RawGyro) | (1 << Accelerometer) |
- (mCompassSensor->isIntegrated() << MagneticField)))) {
- /* ensure power state is on */
- onPower(1);
- /* reset master enable */
- res = masterEnable(0);
- if(res < 0) {
- return res;
- }
- }
- if (!checkLPQuaternion()) {
- enableLPQuaternion(1);
- } else {
- LOGV_IF(PROCESS_VERBOSE, "HAL:LP Quat already enabled");
- }
- } else if (checkLPQuaternion()) {
- enableLPQuaternion(0);
+// TODO: disabled for GED tablet
+#ifdef ENABLE_LP_QUAT_FEAT
+ // Enable LP Quat
+ if ((mEnabled & ((1 << Orientation) | (1 << RotationVector) |
+ (1 << LinearAccel) | (1 << Gravity)))) {
+ if (!checkLPQuaternion()) {
+ enableLPQuaternion(1);
+ } else {
+ LOGV_IF(PROCESS_VERBOSE, "HAL:LP Quat already enabled");
}
+ } else if (checkLPQuaternion()) {
+ enableLPQuaternion(0);
}
+#endif
- if (changed & ((1 << Gyro) | (1 << RawGyro) | (1 << Accelerometer) |
+ /*
+ if sensor & THREE_AXIS_GYRO
+ enable = 1
+ if sensor & THREE_AXIS_ACCEL
+ enable = 1
+ if compass_on_secondary
+ if sensor & THREE_AXIS_COMPASS
+ enable = 1
+ else
+ enable = 0
+ */
+ if (changed & ((1 << Gyro) | (1 << Accelerometer) |
(mCompassSensor->isIntegrated() << MagneticField))) {
- if (sensors &
- (INV_THREE_AXIS_GYRO
- | INV_THREE_AXIS_ACCEL
+ if (sensors &
+ (INV_THREE_AXIS_GYRO
+ | INV_THREE_AXIS_ACCEL
| (INV_THREE_AXIS_COMPASS * mCompassSensor->isIntegrated()))) {
- if ( isLowPowerQuatEnabled() ||
- (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) ) {
- // disable DMP event interrupt only (w/ data interrupt)
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 0, mpu.dmp_event_int_on, getTimestamp());
- if (write_sysfs_int(mpu.dmp_event_int_on, 0) < 0) {
- res = -1;
- LOGE("HAL:ERR can't disable DMP event interrupt");
- return res;
- }
- }
-
- if (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) {
- // enable DMP
- onDMP(1);
-
- res = enableAccel(on);
- if(res < 0) {
- return res;
- }
-
- if ((sensors & INV_THREE_AXIS_ACCEL) == 0) {
- res = turnOffAccelFifo();
- }
- if(res < 0) {
- return res;
- }
- }
-
res = masterEnable(1);
if(res < 0) {
return res;
}
} else { // all sensors idle -> reduce power
- if (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) {
- // enable DMP
- onDMP(1);
- // enable DMP event interrupt only (no data interrupt)
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 1, mpu.dmp_event_int_on, getTimestamp());
- if (write_sysfs_int(mpu.dmp_event_int_on, 1) < 0) {
- res = -1;
- LOGE("HAL:ERR can't enable DMP event interrupt");
- }
- res = enableAccel(on);
- if(res < 0) {
- return res;
- }
- if ((sensors & INV_THREE_AXIS_ACCEL) == 0) {
- res = turnOffAccelFifo();
- }
- if(res < 0) {
- return res;
- }
- res = masterEnable(1);
- if(res < 0) {
- return res;
- }
- }
- else {
- res = onPower(0);
- if(res < 0) {
- return res;
- }
- }
-
- if (!cal_stored) {
- storeCalibration();
- cal_stored = 1;
+ res = onPower(0);
+ if(res < 0) {
+ return res;
}
- }
- } else if ((changed & ((!mCompassSensor->isIntegrated()) << MagneticField)) &&
- !(sensors & (INV_THREE_AXIS_GYRO | INV_THREE_AXIS_ACCEL
- | (INV_THREE_AXIS_COMPASS * (!mCompassSensor->isIntegrated()))))) {
- if (!cal_stored) {
storeCalibration();
- cal_stored = 1;
}
}
@@ -1397,7 +1216,7 @@ int MPLSensor::enableSensors(unsigned long sensors, int en, uint32_t changed) {
/* Store calibration file */
void MPLSensor::storeCalibration()
{
- if(mHaveGoodMpuCal == true || mAccelAccuracy >= 2 || mCompassAccuracy >= 3) {
+ if(mHaveGoodMpuCal == true || mAccelAccuracy >= 2) {
int res = inv_store_calibration();
if (res) {
LOGE("HAL:Cannot store calibration on file");
@@ -1425,16 +1244,6 @@ int MPLSensor::gyroHandler(sensors_event_t* s)
return update;
}
-int MPLSensor::rawGyroHandler(sensors_event_t* s)
-{
- VHANDLER_LOG;
- int update;
- update = inv_get_sensor_type_gyroscope_raw(s->gyro.v, &s->gyro.status, &s->timestamp);
- LOGV_IF(HANDLER_DATA, "HAL:raw gyro data : %+f %+f %+f -- %lld - %d",
- s->gyro.v[0], s->gyro.v[1], s->gyro.v[2], s->timestamp, update);
- return update;
-}
-
int MPLSensor::accelHandler(sensors_event_t* s)
{
VHANDLER_LOG;
@@ -1442,7 +1251,7 @@ int MPLSensor::accelHandler(sensors_event_t* s)
update = inv_get_sensor_type_accelerometer(
s->acceleration.v, &s->acceleration.status, &s->timestamp);
LOGV_IF(HANDLER_DATA, "HAL:accel data : %+f %+f %+f -- %lld - %d",
- s->acceleration.v[0], s->acceleration.v[1], s->acceleration.v[2],
+ s->acceleration.v[0], s->acceleration.v[1], s->acceleration.v[2],
s->timestamp, update);
mAccelAccuracy = s->acceleration.status;
return update;
@@ -1456,7 +1265,6 @@ int MPLSensor::compassHandler(sensors_event_t* s)
s->magnetic.v, &s->magnetic.status, &s->timestamp);
LOGV_IF(HANDLER_DATA, "HAL:compass data: %+f %+f %+f -- %lld - %d",
s->magnetic.v[0], s->magnetic.v[1], s->magnetic.v[2], s->timestamp, update);
- mCompassAccuracy = s->magnetic.status;
return update;
}
@@ -1509,17 +1317,9 @@ int MPLSensor::enable(int32_t handle, int en)
VFUNC_LOG;
android::String8 sname;
- int what = -1, err = 0;
+ int what = -1;
switch (handle) {
- case ID_SO:
- sname = "Screen Orientation";
- LOGV_IF(PROCESS_VERBOSE, "HAL:enable - sensor %s (handle %d) %s -> %s", sname.string(), handle,
- (mDmpOrientationEnabled? "en": "dis"),
- (en? "en" : "dis"));
- enableDmpOrientation(en && isDmpDisplayOrientationOn());
- mDmpOrientationEnabled = en;
- return 0;
case ID_A:
what = Accelerometer;
sname = "Accelerometer";
@@ -1536,10 +1336,6 @@ int MPLSensor::enable(int32_t handle, int en)
what = Gyro;
sname = "Gyro";
break;
- case ID_RG:
- what = RawGyro;
- sname = "RawGyro";
- break;
case ID_GR:
what = Gravity;
sname = "Gravity";
@@ -1558,10 +1354,11 @@ int MPLSensor::enable(int32_t handle, int en)
break;
}
- if (uint32_t(what) >= NUMSENSORS)
+ if (uint32_t(what) >= numSensors)
return -EINVAL;
int newState = en ? 1 : 0;
+ int err = 0;
unsigned long sen_mask;
LOGV_IF(PROCESS_VERBOSE, "HAL:enable - sensor %s (handle %d) %s -> %s", sname.string(), handle,
@@ -1570,6 +1367,7 @@ int MPLSensor::enable(int32_t handle, int en)
LOGV_IF(PROCESS_VERBOSE,
"HAL:%s sensor state change what=%d", sname.string(), what);
+ // TODO: disabled for GED tablet
// pthread_mutex_lock(&mMplMutex);
// pthread_mutex_lock(&mHALMutex);
@@ -1591,7 +1389,6 @@ int MPLSensor::enable(int32_t handle, int en)
switch (what) {
case Gyro:
- case RawGyro:
case Accelerometer:
case MagneticField:
if (!(mEnabled & ((1 << Orientation) | (1 << RotationVector) |
@@ -1625,7 +1422,7 @@ int MPLSensor::enable(int32_t handle, int en)
// pthread_mutex_unlock(&mHALMutex);
#ifdef INV_PLAYBACK_DBG
- /* apparently the logging needs to be go through this sequence
+ /* apparently the logging needs to be go through this sequence
to properly flush the log file */
inv_turn_off_data_logging();
fclose(logfile);
@@ -1645,46 +1442,41 @@ int MPLSensor::setDelay(int32_t handle, int64_t ns)
int what = -1;
switch (handle) {
- case ID_SO:
- return update_delay();
- case ID_A:
- what = Accelerometer;
- sname = "Accelerometer";
- break;
- case ID_M:
- what = MagneticField;
- sname = "MagneticField";
- break;
- case ID_O:
- what = Orientation;
- sname = "Orientation";
- break;
- case ID_GY:
- what = Gyro;
- sname = "Gyro";
- break;
- case ID_RG:
- what = RawGyro;
- sname = "RawGyro";
- break;
- case ID_GR:
- what = Gravity;
- sname = "Gravity";
- break;
- case ID_RV:
- what = RotationVector;
- sname = "RotationVector";
- break;
- case ID_LA:
- what = LinearAccel;
- sname = "LinearAccel";
- break;
- default: // this takes care of all the gestures
- what = handle;
- sname = "Others";
- break;
+ case ID_A:
+ what = Accelerometer;
+ sname = "Accelerometer";
+ break;
+ case ID_M:
+ what = MagneticField;
+ sname = "MagneticField";
+ break;
+ case ID_O:
+ what = Orientation;
+ sname = "Orientation";
+ break;
+ case ID_GY:
+ what = Gyro;
+ sname = "Gyro";
+ break;
+ case ID_GR:
+ what = Gravity;
+ sname = "Gravity";
+ break;
+ case ID_RV:
+ what = RotationVector;
+ sname = "RotationVector";
+ break;
+ case ID_LA:
+ what = LinearAccel;
+ sname = "LinearAccel";
+ break;
+ default: // this takes care of all the gestures
+ what = handle;
+ sname = "Others";
+ break;
}
+// TODO: disabled for GED tablet
#if 0
// skip the 1st call for enalbing sensors called by ICS/JB sensor service
static int counter_delay = 0;
@@ -1700,7 +1492,7 @@ int MPLSensor::setDelay(int32_t handle, int64_t ns)
}
#endif
- if (uint32_t(what) >= NUMSENSORS)
+ if (uint32_t(what) >= numSensors)
return -EINVAL;
if (ns < 0)
@@ -1708,6 +1500,7 @@ int MPLSensor::setDelay(int32_t handle, int64_t ns)
LOGV_IF(PROCESS_VERBOSE, "setDelay : %llu ns, (%.2f Hz)", ns, 1000000000.f / ns);
+ // TODO: for GED tablet
// limit all rates to reasonable ones */
/*
if (ns < 10000000LL) {
@@ -1723,7 +1516,6 @@ int MPLSensor::setDelay(int32_t handle, int64_t ns)
switch (what) {
case Gyro:
- case RawGyro:
case Accelerometer:
for (int i = Gyro; i <= Accelerometer + mCompassSensor->isIntegrated();
i++) {
@@ -1737,7 +1529,6 @@ int MPLSensor::setDelay(int32_t handle, int64_t ns)
case MagneticField:
if (mCompassSensor->isIntegrated() &&
(((mEnabled & (1 << Gyro)) && ns > mDelays[Gyro]) ||
- ((mEnabled & (1 << RawGyro)) && ns > mDelays[RawGyro]) ||
((mEnabled & (1 << Accelerometer)) && ns > mDelays[Accelerometer]))) {
LOGV_IF(PROCESS_VERBOSE, "HAL:ignore delay set due to gyro/accel");
return 0;
@@ -1748,12 +1539,7 @@ int MPLSensor::setDelay(int32_t handle, int64_t ns)
case RotationVector:
case LinearAccel:
case Gravity:
- if ( isLowPowerQuatEnabled() ) {
- LOGV_IF(PROCESS_VERBOSE, "HAL:need to update delay due to LPQ");
- break;
- }
-
- for (int i = 0; i < NUMSENSORS; i++) {
+ for (int i = 0; i < numSensors; i++) {
if (i != what && (mEnabled & (1 << i)) && ns > mDelays[i]) {
LOGV_IF(PROCESS_VERBOSE, "HAL:ignore delay set due to sensor %d", i);
return 0;
@@ -1762,6 +1548,7 @@ int MPLSensor::setDelay(int32_t handle, int64_t ns)
break;
}
+ // TODO: disabled for GED tablet
// pthread_mutex_lock(&mHALMutex);
int res = update_delay();
// pthread_mutex_unlock(&mHALMutex);
@@ -1775,31 +1562,33 @@ int MPLSensor::update_delay() {
int64_t got;
if (mEnabled) {
- int64_t wanted = 1000000000;
- int64_t wanted_3rd_party_sensor = 1000000000;
+ uint64_t wanted = -1LLU;
+ uint64_t wanted_ec = -1LLU;
- // Sequence to change sensor's FIFO rate
- // 1. enable Power state
+ // Sequence to change sensor's FIFO rate
+ // 1. enable Power state
// 2. reset master enable
// 3. Update delay
// 4. set master enable
+ // TODO: unnecessary for IIO
// ensure power on
- onPower(1);
+ // onPower(1);
+ // TODO: unnecessary for IIO
// reset master enable
- masterEnable(0);
+ // masterEnable(0);
/* search the minimum delay requested across all enabled sensors */
- for (int i = 0; i < NUMSENSORS; i++) {
+ for (int i = 0; i < numSensors; i++) {
if (mEnabled & (1 << i)) {
- int64_t ns = mDelays[i];
+ uint64_t ns = mDelays[i];
wanted = wanted < ns ? wanted : ns;
}
}
- // same delay for 3rd party Accel or Compass
- wanted_3rd_party_sensor = wanted;
+ // same delay for ext compass
+ wanted_ec = wanted;
/* mpl rate in us in future maybe different for
gyro vs compass vs accel */
@@ -1818,6 +1607,25 @@ int MPLSensor::update_delay() {
inv_set_accel_sample_rate(mplAccelRate);
inv_set_compass_sample_rate(mplCompassRate);
+// TODO: disabled for GED tablet
+#ifdef ENABLE_LP_QUAT_FEAT
+ // Set LP Quaternion sample rate if enabled
+ if (checkLPQuaternion()) {
+ // TODO: need to verify this part for LPQ
+ if (wanted < 5000000LL) {
+ enableLPQuaternion(0);
+ } else {
+ inv_set_quat_sample_rate(rateInus);
+ // set DMP output rate to FIFO
+ write_sysfs_int(mpu.dmp_output_rate, 1000000000.f / wanted);
+
+ //DMP running rate must be @ 200Hz
+ wanted= 5000000LL;
+ LOGV("HAL:DMP rate= %.2f Hz Fifo Rate= %d us", 1000000000.f / wanted, rateInus);
+ }
+ }
+#endif
+
/* TODO: Test 200Hz */
// inv_set_gyro_sample_rate(5000);
LOGV_IF(PROCESS_VERBOSE, "HAL:MPL gyro sample rate: %d", mplGyroRate);
@@ -1826,30 +1634,12 @@ int MPLSensor::update_delay() {
int enabled_sensors = mEnabled;
int tempFd = -1;
- if (LA_ENABLED || GR_ENABLED || RV_ENABLED || O_ENABLED) {
- if (isLowPowerQuatEnabled() ||
- (isDmpDisplayOrientationOn() && mDmpOrientationEnabled)) {
- bool setDMPrate= 0;
- // Set LP Quaternion sample rate if enabled
- if (checkLPQuaternion()) {
- if (wanted < RATE_200HZ) {
- enableLPQuaternion(0);
- } else {
- inv_set_quat_sample_rate(rateInus);
- setDMPrate= 1;
- }
- }
-
- if (checkDMPOrientation() || setDMPrate==1) {
- getDmpRate(&wanted);
- }
- }
-
- int64_t tempRate = wanted;
+ if(LA_ENABLED || GR_ENABLED || RV_ENABLED || O_ENABLED) {
+ uint64_t tempRate = wanted;
LOGV_IF(EXTRA_VERBOSE, "HAL:setDelay - Fusion");
//nsToHz
LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
- 1000000000.f / tempRate, mpu.gyro_fifo_rate,
+ 1000000000.f / tempRate, mpu.gyro_fifo_rate,
getTimestamp());
tempFd = open(mpu.gyro_fifo_rate, O_RDWR);
res = write_attribute_sensor(tempFd, 1000000000.f / tempRate);
@@ -1860,16 +1650,15 @@ int MPLSensor::update_delay() {
//nsToHz (BMA250)
if(USE_THIRD_PARTY_ACCEL == 1) {
LOGV_IF(SYSFS_VERBOSE, "echo %lld > %s (%lld)",
- wanted_3rd_party_sensor / 1000000L, mpu.accel_fifo_rate,
+ wanted / 1000000L, mpu.accel_fifo_rate,
getTimestamp());
tempFd = open(mpu.accel_fifo_rate, O_RDWR);
- res = write_attribute_sensor(tempFd, wanted_3rd_party_sensor / 1000000L);
+ res = write_attribute_sensor(tempFd, wanted / 1000000L);
LOGE_IF(res < 0, "HAL:ACCEL update delay error");
}
if (!mCompassSensor->isIntegrated()) {
- LOGV_IF(PROCESS_VERBOSE, "HAL:Ext compass rate %.2f Hz", 1000000000.f / wanted_3rd_party_sensor);
- mCompassSensor->setDelay(ID_M, wanted_3rd_party_sensor);
+ mCompassSensor->setDelay(ID_M, wanted_ec);
got = mCompassSensor->getDelay(ID_M);
inv_set_compass_sample_rate(got / 1000);
}
@@ -1890,14 +1679,7 @@ int MPLSensor::update_delay() {
} else {
if (GY_ENABLED) {
- wanted = (mDelays[Gyro] <= mDelays[RawGyro]?
- (mEnabled & (1 << Gyro)? mDelays[Gyro]: mDelays[RawGyro]):
- (mEnabled & (1 << RawGyro)? mDelays[RawGyro]: mDelays[Gyro]));
-
- if (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) {
- getDmpRate(&wanted);
- }
-
+ wanted = mDelays[Gyro];
LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
1000000000.f / wanted, mpu.gyro_fifo_rate, getTimestamp());
tempFd = open(mpu.gyro_fifo_rate, O_RDWR);
@@ -1908,30 +1690,17 @@ int MPLSensor::update_delay() {
if (A_ENABLED) { /* else if because there is only 1 fifo rate for MPUxxxx */
if (GY_ENABLED && mDelays[Gyro] < mDelays[Accelerometer]) {
wanted = mDelays[Gyro];
- }
- else if (GY_ENABLED && mDelays[RawGyro] < mDelays[Accelerometer]) {
- wanted = mDelays[RawGyro];
-
} else {
wanted = mDelays[Accelerometer];
}
-
- if (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) {
- getDmpRate(&wanted);
- }
-
/* TODO: use function pointers to calculate delay value specific to vendor */
LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
1000000000.f / wanted, mpu.accel_fifo_rate, getTimestamp());
tempFd = open(mpu.accel_fifo_rate, O_RDWR);
- if(USE_THIRD_PARTY_ACCEL == 1) {
- //BMA250 in ms
- res = write_attribute_sensor(tempFd, wanted / 1000000L);
- }
- else {
- //MPUxxxx in hz
- res = write_attribute_sensor(tempFd, 1000000000.f/wanted);
- }
+ //BMA250 in ms
+ //res = write_attribute_sensor(tempFd, wanted / 1000000L);
+ //MPU6050 in hz
+ res = write_attribute_sensor(tempFd, 1000000000.f/wanted);
LOGE_IF(res < 0, "HAL:ACCEL update delay error");
}
@@ -1942,20 +1711,12 @@ int MPLSensor::update_delay() {
} else {
if (GY_ENABLED && mDelays[Gyro] < mDelays[MagneticField]) {
wanted = mDelays[Gyro];
- }
- else if (GY_ENABLED && mDelays[RawGyro] < mDelays[MagneticField]) {
- wanted = mDelays[RawGyro];
- } else if (A_ENABLED && mDelays[Accelerometer] < mDelays[MagneticField]) {
+ } else if (GY_ENABLED && mDelays[Accelerometer] < mDelays[MagneticField]) {
wanted = mDelays[Accelerometer];
} else {
wanted = mDelays[MagneticField];
}
-
- if (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) {
- getDmpRate(&wanted);
- }
}
-
mCompassSensor->setDelay(ID_M, wanted);
got = mCompassSensor->getDelay(ID_M);
inv_set_compass_sample_rate(got / 1000);
@@ -1963,27 +1724,44 @@ int MPLSensor::update_delay() {
}
+ /*
+ if sensor & THREE_AXIS_GYRO
+ enable = 1
+ if sensor & THREE_AXIS_ACCEL
+ enable = 1
+ if compass_on_secondary
+ if sensor & THREE_AXIS_COMPASS
+ enable = 1
+ else
+ enable = 0
+ */
unsigned long sensors = mLocalSensorMask & mMasterSensorMask;
- if (sensors &
- (INV_THREE_AXIS_GYRO
- | INV_THREE_AXIS_ACCEL
+ if (sensors &
+ (INV_THREE_AXIS_GYRO
+ | INV_THREE_AXIS_ACCEL
| (INV_THREE_AXIS_COMPASS * mCompassSensor->isIntegrated()))) {
+// TODO: unnecessary for IIO
+#if 0
res = masterEnable(1);
if(res < 0) {
return res;
}
+#endif
} else { // all sensors idle -> reduce power
+// TODO: unnecessary for IIO
+#if 0
res = onPower(0);
if(res < 0) {
return res;
}
+#endif
}
}
return res;
}
-/* For Third Party Accel Input Subsystem Drivers only */
+/* use for third party accel */
int MPLSensor::readAccelEvents(sensors_event_t* data, int count)
{
VHANDLER_LOG;
@@ -2026,12 +1804,15 @@ int MPLSensor::readAccelEvents(sensors_event_t* data, int count)
mAccelInputReader.next();
}
+ LOGV_IF(ENG_VERBOSE, "HAL:readAccelEvents - events read=%d", numEventReceived);
+
return numEventReceived;
}
-/**
+/**
* Should be called after reading at least one of gyro
- * compass or accel data. (Also okay for handling all of them).
+ * compass or accel data. You should only read 1 sample of
+ * data and call this.
* @returns 0, if successful, error number if not.
*/
int MPLSensor::executeOnData(sensors_event_t* data, int count)
@@ -2060,7 +1841,7 @@ int MPLSensor::executeOnData(sensors_event_t* data, int count)
}
// load up virtual sensors
- for (int i = 0; i < NUMSENSORS; i++) {
+ for (int i = 0; i < numSensors; i++) {
int update;
if (mEnabled & (1 << i)) {
update = CALL_MEMBER_FN(this, mHandlers[i])(mPendingEvents + i);
@@ -2077,11 +1858,10 @@ int MPLSensor::executeOnData(sensors_event_t* data, int count)
return numEventReceived;
}
-// collect data for MPL (but NOT sensor service currently), from driver layer
int MPLSensor::readEvents(sensors_event_t *data, int count) {
- int lp_quaternion_on = 0, nbyte;
+ int lp_quaternion_on, nbyte;
int i, nb, mask = 0, numEventReceived = 0,
sensors = ((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 1: 0) +
((mLocalSensorMask & INV_THREE_AXIS_ACCEL)? 1: 0) +
@@ -2090,23 +1870,24 @@ int MPLSensor::readEvents(sensors_event_t *data, int count) {
nbyte= (8 * sensors + 8) * 1;
- if (isLowPowerQuatEnabled()) {
- lp_quaternion_on = checkLPQuaternion();
- if (lp_quaternion_on == 1) {
- nbyte += sizeof(mCachedQuaternionData); //currently 16 bytes for Q data
- }
+// TODO: disabled for GED tablet
+#ifdef ENABLE_LP_QUAT_FEAT
+ lp_quaternion_on = checkLPQuaternion();
+ if (lp_quaternion_on == 1) {
+ nbyte += sizeof(mCachedQuaternionData); //currently 16 bytes for Q data
}
+#endif
+ // TODO: disabled for GED tablet
// pthread_mutex_lock(&mMplMutex);
// pthread_mutex_lock(&mHALMutex);
- ssize_t rsize = read(iio_fd, rdata, nbyte);
+ size_t rsize = read(iio_fd, rdata, nbyte);
if (sensors == 0) {
// read(iio_fd, rdata, nbyte);
- read(iio_fd, rdata, IIO_BUFFER_LENGTH);
+ read(iio_fd, rdata, (16 + 8 * 3 + 8) * IIO_BUFFER_LENGTH);
}
-
-#ifdef TESTING
+/*
LOGI("get one sample of IIO data with size: %d", rsize);
LOGI("sensors: %d", sensors);
@@ -2126,20 +1907,27 @@ int MPLSensor::readEvents(sensors_event_t *data, int count) {
((mLocalSensorMask & INV_THREE_AXIS_ACCEL)? 6: 0))),
*((short *) (rdata + 4) + ((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 6: 0) +
((mLocalSensorMask & INV_THREE_AXIS_ACCEL)? 6: 0)));
-#endif
+*/
+ // TODO: need to verify this for LPQ
if (rsize < (nbyte - 8)) {
LOGE("HAL:ERR Full data packet was not read");
// return -1;
}
- if (isLowPowerQuatEnabled() && lp_quaternion_on == 1) {
-
+// TODO: disabled for GED tablet
+#ifdef ENABLE_LP_QUAT_FEAT
+ if (lp_quaternion_on == 1) {
for (i=0; i< 4; i++) {
mCachedQuaternionData[i]= *(long*)rdata;
rdata += sizeof(long);
}
}
+/*
+ LOGV("HAL:rdata= %x sensors= %d lp_q_on= %d nbyte= %d rsize= %d",
+ rdata, sensors, lp_quaternion_on, nbyte, rsize); //tbd
+*/
+#endif
for (i = 0; i < 3; i++) {
if (mLocalSensorMask & INV_THREE_AXIS_GYRO) {
@@ -2154,11 +1942,11 @@ int MPLSensor::readEvents(sensors_event_t *data, int count) {
}
}
- mask |= (((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 1 << Gyro: 0) +
- ((mLocalSensorMask & INV_THREE_AXIS_ACCEL)? 1 << Accelerometer: 0));
+ mask |= (((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 1: 0) +
+ ((mLocalSensorMask & INV_THREE_AXIS_ACCEL)? 2: 0));
if ((mLocalSensorMask & INV_THREE_AXIS_COMPASS) && mCompassSensor->isIntegrated() &&
(mCachedCompassData[0] != 0 || mCachedCompassData[1] != 0 || mCachedCompassData[0] != 0)) {
- mask |= 1 << MagneticField;
+ mask |= 4;
}
mSensorTimestamp = *((long long *) (rdata + 8 * sensors));
@@ -2166,61 +1954,58 @@ int MPLSensor::readEvents(sensors_event_t *data, int count) {
mCompassTimestamp = mSensorTimestamp;
}
- if (mask & (1 << Gyro)) {
- // send down temperature every 0.5 seconds
- // with timestamp measured in "driver" layer
- if(mSensorTimestamp - mTempCurrentTime >= 500000000LL) {
- mTempCurrentTime = mSensorTimestamp;
- long long temperature[2];
- if(inv_read_temperature(temperature) == 0) {
- LOGV_IF(INPUT_DATA,
- "HAL:inv_read_temperature = %lld, timestamp= %lld",
- temperature[0], temperature[1]);
- inv_build_temp(temperature[0], temperature[1]);
- }
+ // send down temperature every 0.5 seconds
+ if(mSensorTimestamp - mTempCurrentTime >= 500000000LL) {
+ mTempCurrentTime = mSensorTimestamp;
+ long long temperature[2];
+ if(inv_read_temperature(temperature) == 0) {
+ LOGV_IF(INPUT_DATA,
+ "HAL:inv_read_temperature = %lld, timestamp= %lld",
+ temperature[0], temperature[1]);
+ inv_build_temp(temperature[0], temperature[1]);
+ }
#ifdef TESTING
- long bias[3], temp, temp_slope[3];
- inv_get_gyro_bias(bias, &temp);
- inv_get_gyro_ts(temp_slope);
-
- LOGI("T: %.3f "
- "GB: %+13f %+13f %+13f "
- "TS: %+13f %+13f %+13f "
- "\n",
- (float)temperature[0] / 65536.f,
- (float)bias[0] / 65536.f / 16.384f,
- (float)bias[1] / 65536.f / 16.384f,
- (float)bias[2] / 65536.f / 16.384f,
- temp_slope[0] / 65536.f,
- temp_slope[1] / 65536.f,
- temp_slope[2] / 65536.f);
+ long bias[3], temp, temp_slope[3];
+ inv_get_gyro_bias(bias, &temp);
+ inv_get_gyro_ts(temp_slope);
+
+ LOGI("T: %.3f "
+ "GB: %+13f %+13f %+13f "
+ "TS: %+13f %+13f %+13f "
+ "\n",
+ (float)temperature[0] / 65536.f,
+ (float)bias[0] / 65536.f / 16.384f,
+ (float)bias[1] / 65536.f / 16.384f,
+ (float)bias[2] / 65536.f / 16.384f,
+ temp_slope[0] / 65536.f,
+ temp_slope[1] / 65536.f,
+ temp_slope[2] / 65536.f);
#endif
- }
+ }
+ if (mask & 1) {
mPendingMask |= 1 << Gyro;
- mPendingMask |= 1 << RawGyro;
-
if (mLocalSensorMask & INV_THREE_AXIS_GYRO) {
inv_build_gyro(mCachedGyroData, mSensorTimestamp);
LOGV_IF(INPUT_DATA,
"HAL:inv_build_gyro: %+8d %+8d %+8d - %lld",
- mCachedGyroData[0], mCachedGyroData[1],
+ mCachedGyroData[0], mCachedGyroData[1],
mCachedGyroData[2], mSensorTimestamp);
}
}
- if (mask & (1 << Accelerometer)) {
+ if (mask & 2) {
mPendingMask |= 1 << Accelerometer;
if (mLocalSensorMask & INV_THREE_AXIS_ACCEL) {
inv_build_accel(mCachedAccelData, 0, mSensorTimestamp);
LOGV_IF(INPUT_DATA,
"HAL:inv_build_accel: %+8ld %+8ld %+8ld - %lld",
- mCachedAccelData[0], mCachedAccelData[1],
+ mCachedAccelData[0], mCachedAccelData[1],
mCachedAccelData[2], mSensorTimestamp);
}
}
- if ((mask & (1 << MagneticField)) && mCompassSensor->isIntegrated()) {
+ if ((mask & 4) && mCompassSensor->isIntegrated()) {
int status = 0;
if (mCompassSensor->providesCalibration()) {
status = mCompassSensor->getAccuracy();
@@ -2229,19 +2014,21 @@ int MPLSensor::readEvents(sensors_event_t *data, int count) {
if (mLocalSensorMask & INV_THREE_AXIS_COMPASS) {
inv_build_compass(mCachedCompassData, status,
mCompassTimestamp);
- LOGV_IF(INPUT_DATA, "HAL:inv_build_compass: %+8ld %+8ld %+8ld - %lld",
- mCachedCompassData[0], mCachedCompassData[1],
+ LOGV_IF(INPUT_DATA, "HAL:inv_build_compass: %+8ld %+8ld %+8ld - %lld",
+ mCachedCompassData[0], mCachedCompassData[1],
mCachedCompassData[2], mCompassTimestamp);
}
}
- if (isLowPowerQuatEnabled() && lp_quaternion_on == 1) {
-
+// TODO: disabled for GED tablet
+#ifdef ENABLE_LP_QUAT_FEAT
+ if (lp_quaternion_on == 1) {
inv_build_quat(mCachedQuaternionData, 32 /*default 32 for now (16/32bits)*/, mSensorTimestamp);
- LOGV_IF(INPUT_DATA, "HAL:inv_build_quat: %+8ld %+8ld %+8ld %+8ld - %lld",
- mCachedQuaternionData[0], mCachedQuaternionData[1],
+ LOGV_IF(INPUT_DATA, "HAL:inv_build_quat: %+8ld %+8ld %+8ld %+8ld - %lld - %d",
+ mCachedQuaternionData[0], mCachedQuaternionData[1],
mCachedQuaternionData[2], mCachedQuaternionData[3], mSensorTimestamp);
}
+#endif
// pthread_mutex_unlock(&mMplMutex);
// pthread_mutex_unlock(&mHALMutex);
@@ -2254,20 +2041,19 @@ int MPLSensor::readCompassEvents(sensors_event_t *data, int count)
{
VHANDLER_LOG;
+ if (count < 1)
+ return -EINVAL;
+
int numEventReceived = 0;
int done = 0;
int nb;
+ // TODO: disabled for GED tablet
+ // TODO: for AMI306
// pthread_mutex_lock(&mMplMutex);
// pthread_mutex_lock(&mHALMutex);
done = mCompassSensor->readSample(mCachedCompassData, &mCompassTimestamp);
-#ifdef COMPASS_YAS53x
- if (mCompassSensor->checkCoilsReset() == 1) {
- //Reset relevant compass settings
- resetCompass();
- }
-#endif
if (done > 0) {
int status = 0;
if (mCompassSensor->providesCalibration()) {
@@ -2277,8 +2063,8 @@ int MPLSensor::readCompassEvents(sensors_event_t *data, int count)
if (mLocalSensorMask & INV_THREE_AXIS_COMPASS) {
inv_build_compass(mCachedCompassData, status,
mCompassTimestamp);
- LOGV_IF(INPUT_DATA, "HAL:inv_build_compass: %+8ld %+8ld %+8ld - %lld",
- mCachedCompassData[0], mCachedCompassData[1],
+ LOGV_IF(INPUT_DATA, "HAL:inv_build_compass: %+8ld %+8ld %+8ld - %lld",
+ mCachedCompassData[0], mCachedCompassData[1],
mCachedCompassData[2], mCompassTimestamp);
}
}
@@ -2289,27 +2075,6 @@ int MPLSensor::readCompassEvents(sensors_event_t *data, int count)
return numEventReceived;
}
-#ifdef COMPASS_YAS53x
-int MPLSensor::resetCompass()
-{
- VFUNC_LOG;
-
- //Reset compass cal if enabled
- if (mFeatureActiveMask & INV_COMPASS_CAL) {
- LOGV_IF(EXTRA_VERBOSE, "HAL:Reset compass cal");
- inv_init_vector_compass_cal();
- }
-
- //Reset compass fit if enabled
- if (mFeatureActiveMask & INV_COMPASS_FIT) {
- LOGV_IF(EXTRA_VERBOSE, "HAL:Reset compass fit");
- inv_init_compass_fit();
- }
-
- return 0;
-}
-#endif
-
int MPLSensor::getFd() const
{
VFUNC_LOG;
@@ -2332,206 +2097,6 @@ int MPLSensor::getCompassFd() const
return fd;
}
-int MPLSensor::turnOffAccelFifo() {
- int i, res, tempFd;
- char *accel_fifo_enable[3] = {mpu.accel_x_fifo_enable,
- mpu.accel_y_fifo_enable, mpu.accel_z_fifo_enable};
-
- for (i = 0; i < 3; i++) {
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 0, accel_fifo_enable[i], getTimestamp());
- tempFd = open(accel_fifo_enable[i], O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, 0);
- if (res < 0) {
- return res;
- }
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- accel_fifo_enable[i], strerror(res), res);
- return res;
- }
- }
-
- return res;
-}
-
-int MPLSensor::enableDmpOrientation(int en)
-{
- VFUNC_LOG;
- int res = 0;
- int enabled_sensors = mEnabled;
-
- if ( isMpu3050() )
- return res;
-
- // on power if not already On
- res = onPower(1);
- // reset master enable
- res = masterEnable(0);
-
- if (en == 1) {
- //Enable DMP orientation
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, mpu.display_orientation_on, getTimestamp());
- if (write_sysfs_int(mpu.display_orientation_on, en) < 0) {
- LOGE("HAL:ERR can't enable Android orientation");
- res = -1; // indicate an err
- }
-
- // open DMP Orient Fd
- res = openDmpOrientFd();
-
- // enable DMP
- res = onDMP(1);
-
- // default DMP output rate to FIFO
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 5, mpu.dmp_output_rate, getTimestamp());
- if (write_sysfs_int(mpu.dmp_output_rate, 5) < 0) {
- LOGE("HAL:ERR can't default DMP output rate");
- }
-
- // set DMP rate to 200Hz
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- 200, mpu.accel_fifo_rate, getTimestamp());
- if (write_sysfs_int(mpu.accel_fifo_rate, 200) < 0) {
- res = -1;
- LOGE("HAL:ERR can't set DMP rate to 200Hz");
- }
-
- // enable accel engine
- res = enableAccel(1);
-
- // disable accel FIFO
- if (!A_ENABLED) {
- res = turnOffAccelFifo();
- }
-
- mFeatureActiveMask |= INV_DMP_DISPL_ORIENTATION;
- } else {
- // disable DMP
- res = onDMP(0);
- // disable accel engine
- if (!A_ENABLED) {
- res = enableAccel(0);
- }
- }
-
- res = masterEnable(1);
- return res;
-}
-
-int MPLSensor::openDmpOrientFd()
-{
- VFUNC_LOG;
-
- if (!isDmpDisplayOrientationOn() || dmp_orient_fd >= 0) {
- LOGV_IF(PROCESS_VERBOSE, "HAL:DMP display orientation disabled or file desc opened");
- return -1;
- }
-
- dmp_orient_fd = open(mpu.event_display_orientation, O_RDONLY| O_NONBLOCK);
- if (dmp_orient_fd < 0) {
- LOGE("HAL:ERR couldn't open dmpOrient node");
- return -1;
- } else {
- LOGV_IF(PROCESS_VERBOSE, "HAL:dmp_orient_fd opened : %d", dmp_orient_fd);
- return 0;
- }
-}
-
-int MPLSensor::closeDmpOrientFd()
-{
- VFUNC_LOG;
- if (dmp_orient_fd >= 0)
- close(dmp_orient_fd);
- return 0;
-}
-
-int MPLSensor::dmpOrientHandler(int orient)
-{
- VFUNC_LOG;
-
- LOGV_IF(PROCESS_VERBOSE, "HAL:orient %x", orient);
- return 0;
-}
-
-int MPLSensor::readDmpOrientEvents(sensors_event_t* data, int count) {
- VFUNC_LOG;
-
- char dummy[4];
- int screen_orientation = 0;
- FILE *fp;
-
- fp = fopen(mpu.event_display_orientation, "r");
- if (fp == NULL) {
- LOGE("HAL:cannot open event_display_orientation");
- return 0;
- }
- fscanf(fp, "%d\n", &screen_orientation);
- fclose(fp);
-
- int numEventReceived = 0;
-
- if (mDmpOrientationEnabled && count > 0) {
- sensors_event_t temp;
-
- temp.version = sizeof(sensors_event_t);
- temp.sensor = ID_SO;
-#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
- temp.type = SENSOR_TYPE_SCREEN_ORIENTATION;
- temp.screen_orientation = screen_orientation;
-#endif
- struct timespec ts;
- clock_gettime(CLOCK_MONOTONIC, &ts);
- temp.timestamp = (int64_t) ts.tv_sec * 1000000000 + ts.tv_nsec;
-
- *data++ = temp;
- count--;
- numEventReceived++;
- }
-
- // read dummy data per driver's request
- dmpOrientHandler(screen_orientation);
- read(dmp_orient_fd, dummy, 4);
-
- return numEventReceived;
-}
-
-int MPLSensor::getDmpOrientFd()
-{
- VFUNC_LOG;
-
- LOGV_IF(EXTRA_VERBOSE, "MPLSensor::getDmpOrientFd returning %d", dmp_orient_fd);
- return dmp_orient_fd;
-
-}
-
-int MPLSensor::checkDMPOrientation()
-{
- VFUNC_LOG;
- return ((mFeatureActiveMask & INV_DMP_DISPL_ORIENTATION) ? 1 : 0);
-}
-
-int MPLSensor::getDmpRate(int64_t *wanted)
-{
- if (checkDMPOrientation() || checkLPQuaternion()) {
- // set DMP output rate to FIFO
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- int(1000000000.f / *wanted), mpu.dmp_output_rate,
- getTimestamp());
- write_sysfs_int(mpu.dmp_output_rate, 1000000000.f / *wanted);
- LOGV_IF(PROCESS_VERBOSE, "HAL:DMP FIFO rate %.2f Hz", 1000000000.f / *wanted);
-
- //DMP running rate must be @ 200Hz
- *wanted= RATE_200HZ;
- LOGV_IF(PROCESS_VERBOSE, "HAL:DMP rate= %.2f Hz", 1000000000.f / *wanted);
- }
- return 0;
-}
-
int MPLSensor::getPollTime()
{
VHANDLER_LOG;
@@ -2629,7 +2194,7 @@ int MPLSensor::inv_read_temperature(long long *data)
return -1;
}
- LOGV_IF(ENG_VERBOSE,
+ LOGV_IF(ENG_VERBOSE,
"HAL:temperature raw = %ld, timestamp = %lld, count = %d",
raw, timestamp, count);
data[0] = raw;
@@ -2687,39 +2252,41 @@ int MPLSensor::inv_read_sensor_bias(int fd, long *data)
count = sscanf(buf, "%[^','],%[^','],%[^',']", x, y, z);
if(count) {
/* scale appropriately for MPL */
- LOGV_IF(ENG_VERBOSE,
- "HAL:pre-scaled bias: X:Y:Z (%ld, %ld, %ld)",
+ LOGV_IF(ENG_VERBOSE,
+ "HAL:pre-scaled bias: X:Y:Z (%ld, %ld, %ld)",
atol(x), atol(y), atol(z));
data[0] = (long)(atol(x) / 10000 * (1L << 16));
data[1] = (long)(atol(y) / 10000 * (1L << 16));
data[2] = (long)(atol(z) / 10000 * (1L << 16));
- LOGV_IF(ENG_VERBOSE,
- "HAL:scaled bias: X:Y:Z (%ld, %ld, %ld)",
+ LOGV_IF(ENG_VERBOSE,
+ "HAL:scaled bias: X:Y:Z (%ld, %ld, %ld)",
data[0], data[1], data[2]);
}
return 0;
}
+
/** fill in the sensor list based on which sensors are configured.
* return the number of configured sensors.
* parameter list must point to a memory region of at least 7*sizeof(sensor_t)
* parameter len gives the length of the buffer pointed to by list
*/
+
int MPLSensor::populateSensorList(struct sensor_t *list, int len)
{
VFUNC_LOG;
int numsensors;
- if(len < (int)((sizeof(sSensorList) / sizeof(sensor_t)) * sizeof(sensor_t))) {
+ if(len < (int)(7 * sizeof(sensor_t))) {
LOGE("HAL:sensor list too small, not populating.");
- return -(sizeof(sSensorList) / sizeof(sensor_t));
+ return 0;
}
/* fill in the base values */
- memcpy(list, sSensorList, sizeof (struct sensor_t) * (sizeof(sSensorList) / sizeof(sensor_t)));
+ memcpy(list, sSensorList, sizeof (struct sensor_t) * 7);
/* first add gyro, accel and compass to the list */
@@ -2734,7 +2301,7 @@ int MPLSensor::populateSensorList(struct sensor_t *list, int len)
mCompassSensor->fillList(&list[MagneticField]);
if(1) {
- numsensors = (sizeof(sSensorList) / sizeof(sensor_t));
+ numsensors = 7;
/* all sensors will be added to the list
fill in orientation values */
fillOrientation(list);
@@ -2768,13 +2335,10 @@ void MPLSensor::fillAccel(const char* accel, struct sensor_t *list)
list[Accelerometer].maxRange = ACCEL_MPU6050_RANGE;
list[Accelerometer].resolution = ACCEL_MPU6050_RESOLUTION;
list[Accelerometer].power = ACCEL_MPU6050_POWER;
- list[Accelerometer].minDelay = ACCEL_MPU6050_MINDELAY;
- return;
- } else if (accel != NULL && strcmp(accel, "MPU6500") == 0) {
- list[Accelerometer].maxRange = ACCEL_MPU6500_RANGE;
- list[Accelerometer].resolution = ACCEL_MPU6500_RESOLUTION;
- list[Accelerometer].power = ACCEL_MPU6500_POWER;
- list[Accelerometer].minDelay = ACCEL_MPU6500_MINDELAY;
+
+ // TODO: for GED tablet
+ // list[Accelerometer].minDelay = ACCEL_MPU6050_MINDELAY;
+ list[Accelerometer].minDelay = 5000;
return;
} else if (accel != NULL && strcmp(accel, "MPU9150") == 0) {
@@ -2783,7 +2347,7 @@ void MPLSensor::fillAccel(const char* accel, struct sensor_t *list)
list[Accelerometer].power = ACCEL_MPU9150_POWER;
list[Accelerometer].minDelay = ACCEL_MPU9150_MINDELAY;
return;
- } else if (accel != NULL && strcmp(accel, "MPU3050") == 0) {
+ } else if (accel != NULL && strcmp(accel, "MPU3050") == 0) {
list[Accelerometer].maxRange = ACCEL_BMA250_RANGE;
list[Accelerometer].resolution = ACCEL_BMA250_RESOLUTION;
list[Accelerometer].power = ACCEL_BMA250_POWER;
@@ -2814,12 +2378,10 @@ void MPLSensor::fillGyro(const char* gyro, struct sensor_t *list)
list[Gyro].maxRange = GYRO_MPU6050_RANGE;
list[Gyro].resolution = GYRO_MPU6050_RESOLUTION;
list[Gyro].power = GYRO_MPU6050_POWER;
- list[Gyro].minDelay = GYRO_MPU6050_MINDELAY;
- } else if( gyro != NULL && strcmp(gyro, "MPU6500") == 0) {
- list[Gyro].maxRange = GYRO_MPU6500_RANGE;
- list[Gyro].resolution = GYRO_MPU6500_RESOLUTION;
- list[Gyro].power = GYRO_MPU6500_POWER;
- list[Gyro].minDelay = GYRO_MPU6500_MINDELAY;
+
+ // TODO: for GED tablet
+ // list[Gyro].minDelay = GYRO_MPU6050_MINDELAY;
+ list[Gyro].minDelay = 5000;
} else if( gyro != NULL && strcmp(gyro, "MPU9150") == 0) {
list[Gyro].maxRange = GYRO_MPU9150_RANGE;
list[Gyro].resolution = GYRO_MPU9150_RESOLUTION;
@@ -2833,12 +2395,6 @@ void MPLSensor::fillGyro(const char* gyro, struct sensor_t *list)
list[Gyro].power = GYRO_MPU3050_POWER;
list[Gyro].minDelay = GYRO_MPU3050_MINDELAY;
}
-
- list[RawGyro].maxRange = list[Gyro].maxRange;
- list[RawGyro].resolution = list[Gyro].resolution;
- list[RawGyro].power = list[Gyro].power;
- list[RawGyro].minDelay = list[Gyro].minDelay;
-
return;
}
@@ -2848,11 +2404,14 @@ void MPLSensor::fillRV(struct sensor_t *list)
VFUNC_LOG;
/* compute power on the fly */
- list[RotationVector].power = list[Gyro].power +
+ list[RotationVector].power = list[Gyro].power +
list[Accelerometer].power +
list[MagneticField].power;
list[RotationVector].resolution = .00001;
list[RotationVector].maxRange = 1.0;
+
+ // TODO: for GED tablet
+ // list[RotationVector].minDelay = 10000;
list[RotationVector].minDelay = 5000;
return;
@@ -2867,6 +2426,9 @@ void MPLSensor::fillOrientation(struct sensor_t *list)
list[MagneticField].power;
list[Orientation].resolution = .00001;
list[Orientation].maxRange = 360.0;
+
+ // TODO: for GED tablet
+ // list[Orientation].minDelay = 10000;
list[Orientation].minDelay = 5000;
return;
@@ -2881,6 +2443,9 @@ void MPLSensor::fillGravity( struct sensor_t *list)
list[MagneticField].power;
list[Gravity].resolution = .00001;
list[Gravity].maxRange = 9.81;
+
+ // TODO: for GED tablet
+ // list[Gravity].minDelay = 10000;
list[Gravity].minDelay = 5000;
return;
@@ -2895,6 +2460,9 @@ void MPLSensor::fillLinearAccel(struct sensor_t *list)
list[MagneticField].power;
list[LinearAccel].resolution = list[Accelerometer].resolution;
list[LinearAccel].maxRange = list[Accelerometer].maxRange;
+
+ // TODO: for GED tablet
+ // list[LinearAccel].minDelay = 10000;
list[LinearAccel].minDelay = 5000;
return;
@@ -2910,7 +2478,13 @@ int MPLSensor::inv_init_sysfs_attributes(void)
char **dptr;
int num;
- sysfs_names_ptr =
+ // get proper (in absolute/relative) IIO path & build MPU's sysfs paths
+ // inv_get_sysfs_abs_path(sysfs_path);
+ if(INV_SUCCESS != inv_get_sysfs_path(sysfs_path)) {
+ ALOGE("MPLSensor failed get sysfs path");
+ return -1;
+ }
+ sysfs_names_ptr =
(char*)malloc(sizeof(char[MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN]));
sptr = sysfs_names_ptr;
if (sptr != NULL) {
@@ -2924,9 +2498,6 @@ int MPLSensor::inv_init_sysfs_attributes(void)
return -1;
}
- // get proper (in absolute/relative) IIO path & build MPU's sysfs paths
- // inv_get_sysfs_abs_path(sysfs_path);
- inv_get_sysfs_path(sysfs_path);
inv_get_iio_trigger_path(iio_trigger_path);
sprintf(mpu.key, "%s%s", sysfs_path, "/key");
@@ -2941,7 +2512,6 @@ int MPLSensor::inv_init_sysfs_attributes(void)
sprintf(mpu.firmware_loaded,"%s%s", sysfs_path, "/firmware_loaded");
sprintf(mpu.dmp_on,"%s%s", sysfs_path, "/dmp_on");
sprintf(mpu.dmp_int_on,"%s%s", sysfs_path, "/dmp_int_on");
- sprintf(mpu.dmp_event_int_on,"%s%s", sysfs_path, "/dmp_event_int_on");
sprintf(mpu.dmp_output_rate,"%s%s", sysfs_path, "/dmp_output_rate");
sprintf(mpu.tap_on, "%s%s", sysfs_path, "/tap_on");
@@ -2956,58 +2526,39 @@ int MPLSensor::inv_init_sysfs_attributes(void)
sprintf(mpu.gyro_y_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_anglvel_y_en");
sprintf(mpu.gyro_z_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_anglvel_z_en");
+#ifdef THIRD_PARTY_ACCEL //BMA250
+ /* same as 'mpu.accel_enable' */
+ sprintf(mpu.accel_enable, "%s%s", sysfs_path, "/enable");
+ sprintf(mpu.accel_fifo_rate, "%s%s", sysfs_path, "/fifo_rate");
+ sprintf(mpu.accel_fsr, "%s%s", sysfs_path, "/NA");
+ sprintf(mpu.accel_bias, "%s%s", sysfs_path, "/NA");
+ sprintf(mpu.accel_orient, "%s%s", sysfs_path, "/NA");
+#else
sprintf(mpu.accel_enable, "%s%s", sysfs_path, "/accl_enable");
sprintf(mpu.accel_fifo_rate, "%s%s", sysfs_path, "/sampling_frequency");
- sprintf(mpu.accel_orient, "%s%s", sysfs_path, "/accl_matrix");
-
-#ifndef THIRD_PARTY_ACCEL //MPUxxxx
sprintf(mpu.accel_fsr, "%s%s", sysfs_path, "/in_accel_scale");
- // TODO: for bias settings
- sprintf(mpu.accel_bias, "%s%s", sysfs_path, "/accl_bias");
-#endif
-
sprintf(mpu.accel_x_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_accel_x_en");
sprintf(mpu.accel_y_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_accel_y_en");
sprintf(mpu.accel_z_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_accel_z_en");
+ // TODO: for bias settings
+ sprintf(mpu.accel_bias, "%s%s", sysfs_path, "/accl_bias");
+
+ sprintf(mpu.accel_orient, "%s%s", sysfs_path, "/accl_matrix");
+#endif
+
sprintf(mpu.quaternion_on, "%s%s", sysfs_path, "/quaternion_on");
sprintf(mpu.in_quat_r_en, "%s%s", sysfs_path, "/scan_elements/in_quaternion_r_en");
sprintf(mpu.in_quat_x_en, "%s%s", sysfs_path, "/scan_elements/in_quaternion_x_en");
sprintf(mpu.in_quat_y_en, "%s%s", sysfs_path, "/scan_elements/in_quaternion_y_en");
sprintf(mpu.in_quat_z_en, "%s%s", sysfs_path, "/scan_elements/in_quaternion_z_en");
- sprintf(mpu.display_orientation_on, "%s%s", sysfs_path, "/display_orientation_on");
- sprintf(mpu.event_display_orientation, "%s%s", sysfs_path, "/event_display_orientation");
-
- return 0;
-}
-
-bool MPLSensor::isMpu3050()
-{
- if (!strcmp(chip_ID, "mpu3050") || !strcmp(chip_ID, "MPU3050"))
- return true;
- else
- return false;
-}
-
-int MPLSensor::isLowPowerQuatEnabled()
-{
-#ifdef ENABLE_LP_QUAT_FEAT
- if (isMpu3050())
- return 0;
- return 1;
-#else
- return 0;
+#if 0
+ // test print sysfs paths
+ dptr = (char**)&mpu;
+ for (i = 0; i < MAX_SYSFS_ATTRB; i++) {
+ LOGE("HAL:sysfs path: %s", *dptr++);
+ }
#endif
-}
-
-int MPLSensor::isDmpDisplayOrientationOn()
-{
-#ifdef ENABLE_DMP_DISPL_ORIENT_FEAT
- if (isMpu3050())
- return 0;
- return 1;
-#else
return 0;
-#endif
}
diff --git a/libsensors_iio/MPLSensor.h b/libsensors_iio/MPLSensor.h
index 3f6bb5b..3ef1ba3 100644
--- a/libsensors_iio/MPLSensor.h
+++ b/libsensors_iio/MPLSensor.h
@@ -1,345 +1,288 @@
-/*
-* Copyright (C) 2012 Invensense, Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#ifndef ANDROID_MPL_SENSOR_H
-#define ANDROID_MPL_SENSOR_H
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <poll.h>
-#include <utils/Vector.h>
-#include <utils/KeyedVector.h>
-#include "sensors.h"
-#include "SensorBase.h"
-#include "InputEventReader.h"
-
-#ifdef INVENSENSE_COMPASS_CAL
-
-#ifdef COMPASS_YAS53x
-#warning "unified HAL for YAS53x"
-#include "CompassSensor.IIO.primary.h"
-#elif COMPASS_AMI306
-#warning "unified HAL for AMI306"
-#include "CompassSensor.IIO.primary.h"
-#else
-#warning "unified HAL for MPU9150"
-#include "CompassSensor.IIO.9150.h"
-#endif
-#else
-#warning "unified HAL for AKM"
-#include "CompassSensor.AKM.h"
-#endif
-
-/*****************************************************************************/
-/* Sensors Enable/Disable Mask
- *****************************************************************************/
-#define MAX_CHIP_ID_LEN (20)
-
-#define INV_THREE_AXIS_GYRO (0x000F)
-#define INV_THREE_AXIS_ACCEL (0x0070)
-#define INV_THREE_AXIS_COMPASS (0x0380)
-#define INV_ALL_SENSORS (0x7FFF)
-
-#ifdef INVENSENSE_COMPASS_CAL
-#define ALL_MPL_SENSORS_NP (INV_THREE_AXIS_ACCEL \
- | INV_THREE_AXIS_COMPASS \
- | INV_THREE_AXIS_GYRO)
-#else
-#define ALL_MPL_SENSORS_NP (INV_THREE_AXIS_ACCEL \
- | INV_THREE_AXIS_COMPASS \
- | INV_THREE_AXIS_GYRO)
-#endif
-
-// bit mask of current active features (mFeatureActiveMask)
-#define INV_COMPASS_CAL 0x01
-#define INV_COMPASS_FIT 0x02
-#define INV_DMP_QUATERNION 0x04
-#define INV_DMP_DISPL_ORIENTATION 0x08
-
-/* Uncomment to enable Low Power Quaternion */
-//#define ENABLE_LP_QUAT_FEAT
-
-/* Uncomment to enable DMP display orientation
- (within the HAL, see below for Java framework) */
-//#define ENABLE_DMP_DISPL_ORIENT_FEAT
-
-#ifdef ENABLE_DMP_DISPL_ORIENT_FEAT
-/* Uncomment following to expose the SENSOR_TYPE_SCREEN_ORIENTATION
- sensor type (DMP screen orientation) to the Java framework.
- NOTE:
- need Invensense customized
- 'hardware/libhardware/include/hardware/sensors.h' to compile correctly.
- NOTE:
- need Invensense java framework changes to:
- 'frameworks/base/core/java/android/view/WindowOrientationListener.java'
- 'frameworks/base/core/java/android/hardware/Sensor.java'
- 'frameworks/base/core/java/android/hardware/SensorEvent.java'
- for the 'Auto-rotate screen' to use this feature.
-*/
-#define ENABLE_DMP_SCREEN_AUTO_ROTATION
-#warning "ENABLE_DMP_DISPL_ORIENT_FEAT is defined, framework changes are necessary for HAL to work properly"
-#endif
-
-int isDmpScreenAutoRotationEnabled()
-{
-#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
- return 1;
-#else
- return 0;
-#endif
-}
-
-int (*m_pt2AccelCalLoadFunc)(long *bias) = NULL;
-
-/*****************************************************************************/
-/** MPLSensor implementation which fits into the HAL example for crespo provided
- * by Google.
- * WARNING: there may only be one instance of MPLSensor, ever.
- */
-
-class MPLSensor: public SensorBase
-{
- typedef int (MPLSensor::*hfunc_t)(sensors_event_t*);
-
-public:
-
- enum {
- Gyro = 0,
- RawGyro,
- Accelerometer,
- MagneticField,
- Orientation,
- RotationVector,
- LinearAccel,
- Gravity,
- NUMSENSORS
- };
-
- MPLSensor(CompassSensor *, int (*m_pt2AccelCalLoadFunc)(long*) = 0);
- virtual ~MPLSensor();
-
- virtual int setDelay(int32_t handle, int64_t ns);
- virtual int enable(int32_t handle, int enabled);
- int32_t getEnableMask() { return mEnabled; }
-
- virtual int readEvents(sensors_event_t *data, int count);
- virtual int getFd() const;
- virtual int getAccelFd() const;
- virtual int getCompassFd() const;
- virtual int getPollTime();
- virtual bool hasPendingEvents() const;
- virtual void sleepEvent();
- virtual void wakeEvent();
- int populateSensorList(struct sensor_t *list, int len);
- void cbProcData();
-
- //static pointer to the object that will handle callbacks
- static MPLSensor* gMPLSensor;
-
- //AKM HAL Integration
- //void set_compass(long ready, long x, long y, long z, long accuracy);
- int executeOnData(sensors_event_t* data, int count);
- int readAccelEvents(sensors_event_t* data, int count);
- int readCompassEvents(sensors_event_t* data, int count);
-
- int turnOffAccelFifo();
- int enableDmpOrientation(int);
- int dmpOrientHandler(int);
- int readDmpOrientEvents(sensors_event_t* data, int count);
- int getDmpOrientFd();
- int openDmpOrientFd();
- int closeDmpOrientFd();
-
- int getDmpRate(int64_t *);
- int checkDMPOrientation();
-
-protected:
- CompassSensor *mCompassSensor;
-
- int gyroHandler(sensors_event_t *data);
- int rawGyroHandler(sensors_event_t *data);
- int accelHandler(sensors_event_t *data);
- int compassHandler(sensors_event_t *data);
- int rvHandler(sensors_event_t *data);
- int laHandler(sensors_event_t *data);
- int gravHandler(sensors_event_t *data);
- int orienHandler(sensors_event_t *data);
- void calcOrientationSensor(float *Rx, float *Val);
- virtual int update_delay();
-
- void inv_set_device_properties();
- int inv_constructor_init();
- int inv_constructor_default_enable();
- int setGyroInitialState();
- int setAccelInitialState();
- int masterEnable(int en);
- int onPower(int en);
- int enableLPQuaternion(int);
- int enableQuaternionData(int);
- int onDMP(int);
- int enableGyro(int en);
- int enableAccel(int en);
- int enableCompass(int en);
- void computeLocalSensorMask(int enabled_sensors);
- int enableSensors(unsigned long sensors, int en, uint32_t changed);
- int inv_read_gyro_buffer(int fd, short *data, long long *timestamp);
- int inv_float_to_q16(float *fdata, long *ldata);
- int inv_long_to_q16(long *fdata, long *ldata);
- int inv_float_to_round(float *fdata, long *ldata);
- int inv_float_to_round2(float *fdata, short *sdata);
- int inv_read_temperature(long long *data);
- int inv_read_dmp_state(int fd);
- int inv_read_sensor_bias(int fd, long *data);
- void inv_get_sensors_orientation(void);
- int inv_init_sysfs_attributes(void);
-#ifdef COMPASS_YAS53x
- int resetCompass(void);
-#endif
- void setCompassDelay(int64_t ns);
- void enable_iio_sysfs(void);
- int enableTap(int);
- int enableFlick(int);
- int enablePedometer(int);
- int checkLPQuaternion();
-
- int mNewData; // flag indicating that the MPL calculated new output values
- int mDmpStarted;
- long mMasterSensorMask;
- long mLocalSensorMask;
- int mPollTime;
- bool mHaveGoodMpuCal; // flag indicating that the cal file can be written
- int mGyroAccuracy; // value indicating the quality of the gyro calibr.
- int mAccelAccuracy; // value indicating the quality of the accel calibr.
- int mCompassAccuracy; // value indicating the quality of the compass calibr.
- struct pollfd mPollFds[5];
- int mSampleCount;
- pthread_mutex_t mMplMutex;
- pthread_mutex_t mHALMutex;
-
- char mIIOBuffer[(16 + 8 * 3 + 8) * IIO_BUFFER_LENGTH];
-
- int iio_fd;
- int accel_fd;
- int mpufifo_fd;
- int gyro_temperature_fd;
-
- int dmp_orient_fd;
- int mDmpOrientationEnabled;
-
- uint32_t mEnabled;
- uint32_t mOldEnabledMask;
- sensors_event_t mPendingEvents[NUMSENSORS];
- int64_t mDelays[NUMSENSORS];
- hfunc_t mHandlers[NUMSENSORS];
- short mCachedGyroData[3];
- long mCachedAccelData[3];
- long mCachedCompassData[3];
- long mCachedQuaternionData[4];
- android::KeyedVector<int, int> mIrqFds;
-
- InputEventCircularReader mAccelInputReader;
- InputEventCircularReader mGyroInputReader;
-
- bool mFirstRead;
- short mTempScale;
- short mTempOffset;
- int64_t mTempCurrentTime;
- int mAccelScale;
-
- uint32_t mPendingMask;
- unsigned long mSensorMask;
-
- char chip_ID[MAX_CHIP_ID_LEN];
-
- signed char mGyroOrientation[9];
- signed char mAccelOrientation[9];
-
- int64_t mSensorTimestamp;
- int64_t mCompassTimestamp;
-
- struct sysfs_attrbs {
- char *chip_enable;
- char *power_state;
- char *dmp_firmware;
- char *firmware_loaded;
- char *dmp_on;
- char *dmp_int_on;
- char *dmp_event_int_on;
- char *dmp_output_rate;
- char *tap_on;
- char *key;
- char *self_test;
- char *temperature;
-
- char *gyro_enable;
- char *gyro_fifo_rate;
- char *gyro_orient;
- char *gyro_x_fifo_enable;
- char *gyro_y_fifo_enable;
- char *gyro_z_fifo_enable;
-
- char *accel_enable;
- char *accel_fifo_rate;
- char *accel_fsr;
- char *accel_bias;
- char *accel_orient;
- char *accel_x_fifo_enable;
- char *accel_y_fifo_enable;
- char *accel_z_fifo_enable;
-
- char *quaternion_on;
- char *in_quat_r_en;
- char *in_quat_x_en;
- char *in_quat_y_en;
- char *in_quat_z_en;
-
- char *in_timestamp_en;
- char *trigger_name;
- char *current_trigger;
- char *buffer_length;
-
- char *display_orientation_on;
- char *event_display_orientation;
- } mpu;
-
- char *sysfs_names_ptr;
- int mFeatureActiveMask;
-
-private:
- /* added for dynamic get sensor list */
- void fillAccel(const char* accel, struct sensor_t *list);
- void fillGyro(const char* gyro, struct sensor_t *list);
- void fillRV(struct sensor_t *list);
- void fillOrientation(struct sensor_t *list);
- void fillGravity(struct sensor_t *list);
- void fillLinearAccel(struct sensor_t *list);
- void storeCalibration();
- void loadDMP();
- bool isMpu3050();
- int isLowPowerQuatEnabled();
- int isDmpDisplayOrientationOn();
-
-
-};
-
-extern "C" {
- void setCallbackObject(MPLSensor*);
- MPLSensor *getCallbackObject();
-}
-
-#endif // ANDROID_MPL_SENSOR_H
+/*
+* Copyright (C) 2012 Invensense, Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef ANDROID_MPL_SENSOR_H
+#define ANDROID_MPL_SENSOR_H
+
+#include <stdint.h>
+#include <errno.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <poll.h>
+#include <utils/Vector.h>
+#include <utils/KeyedVector.h>
+#include "sensors.h"
+#include "SensorBase.h"
+#include "InputEventReader.h"
+
+// TODO: change to wanted vendor
+#ifdef INVENSENSE_COMPASS_CAL
+
+#ifdef COMPASS_AMI306
+#warning "unified HAL for AMI306"
+#include "CompassSensor.IIO.AMI.h"
+#else
+#warning "unified HAL for MPU9150"
+#include "CompassSensor.IIO.9150.h"
+#endif
+
+#else
+#warning "unified HAL for AKM"
+#include "CompassSensor.AKM.h"
+#endif
+
+/*****************************************************************************/
+/* Sensors Enable/Disable Mask
+ *****************************************************************************/
+#define MAX_CHIP_ID_LEN (20)
+#define IIO_BUFFER_LENGTH (100 * 2)
+
+#define INV_THREE_AXIS_GYRO (0x000F)
+#define INV_THREE_AXIS_ACCEL (0x0070)
+#define INV_THREE_AXIS_COMPASS (0x0380)
+#define INV_ALL_SENSORS (0x7FFF)
+
+#ifdef INVENSENSE_COMPASS_CAL
+#define ALL_MPL_SENSORS_NP (INV_THREE_AXIS_ACCEL \
+ | INV_THREE_AXIS_COMPASS \
+ | INV_THREE_AXIS_GYRO)
+#else
+// TODO: ID_M = 2 even for 3rd-party solution
+#define ALL_MPL_SENSORS_NP (INV_THREE_AXIS_ACCEL \
+ | INV_THREE_AXIS_COMPASS \
+ | INV_THREE_AXIS_GYRO)
+#endif
+
+// bit mask of current active features (mFeatureActiveMask)
+#define INV_COMPASS_CAL 0x01
+#define INV_COMPASS_FIT 0x02
+#define INV_DMP_QUATERNION 0x04
+
+/*****************************************************************************/
+/** MPLSensor implementation which fits into the HAL example for crespo provided
+ * by Google.
+ * WARNING: there may only be one instance of MPLSensor, ever.
+ */
+
+class MPLSensor: public SensorBase
+{
+ typedef int (MPLSensor::*hfunc_t)(sensors_event_t*);
+
+public:
+ MPLSensor(CompassSensor *);
+ virtual ~MPLSensor();
+
+ enum
+ {
+ Gyro = 0,
+ Accelerometer,
+ MagneticField,
+ Orientation,
+ RotationVector,
+ LinearAccel,
+ Gravity,
+ numSensors
+ };
+
+ virtual int setDelay(int32_t handle, int64_t ns);
+ virtual int enable(int32_t handle, int enabled);
+ int32_t getEnableMask() { return mEnabled; }
+
+ virtual int readEvents(sensors_event_t *data, int count);
+ virtual int getFd() const;
+ virtual int getAccelFd() const;
+ virtual int getCompassFd() const;
+ virtual int getPollTime();
+ virtual bool hasPendingEvents() const;
+ virtual void sleepEvent();
+ virtual void wakeEvent();
+ int populateSensorList(struct sensor_t *list, int len);
+ void cbProcData();
+
+ // Do not work with this object unless it is initialized
+ bool isValid() { return mMplSensorInitialized; };
+
+ //static pointer to the object that will handle callbacks
+ static MPLSensor* gMPLSensor;
+
+ //AKM HAL Integration
+ //void set_compass(long ready, long x, long y, long z, long accuracy);
+ int executeOnData(sensors_event_t* data, int count);
+ int readAccelEvents(sensors_event_t* data, int count);
+ int readCompassEvents(sensors_event_t* data, int count);
+
+protected:
+ // Lets us know if the constructor was actually able to finish its job.
+ // E.g. false if init sysfs failed.
+ bool mMplSensorInitialized;
+ CompassSensor *mCompassSensor;
+
+ int gyroHandler(sensors_event_t *data);
+ int accelHandler(sensors_event_t *data);
+ int compassHandler(sensors_event_t *data);
+ int rvHandler(sensors_event_t *data);
+ int laHandler(sensors_event_t *data);
+ int gravHandler(sensors_event_t *data);
+ int orienHandler(sensors_event_t *data);
+ void calcOrientationSensor(float *Rx, float *Val);
+ virtual int update_delay();
+
+ void inv_set_device_properties();
+ int inv_constructor_init();
+ int inv_constructor_default_enable();
+ int setGyroInitialState();
+ int setAccelInitialState();
+ int masterEnable(int en);
+ int onPower(int en);
+ int enableLPQuaternion(int);
+ int enableQuaternionData(int);
+ int onDMP(int);
+ int enableGyro(int en);
+ int enableAccel(int en);
+ int enableCompass(int en);
+ void computeLocalSensorMask(int enabled_sensors);
+ int enableSensors(unsigned long sensors, int en, uint32_t changed);
+ int inv_read_gyro_buffer(int fd, short *data, long long *timestamp);
+ int update_delay_sysfs_sensor(int fd, uint64_t ns);
+ int inv_float_to_q16(float *fdata, long *ldata);
+ int inv_long_to_q16(long *fdata, long *ldata);
+ int inv_float_to_round(float *fdata, long *ldata);
+ int inv_float_to_round2(float *fdata, short *sdata);
+ int inv_read_temperature(long long *data);
+ int inv_read_dmp_state(int fd);
+ int inv_read_sensor_bias(int fd, long *data);
+ void inv_get_sensors_orientation(void);
+ int inv_init_sysfs_attributes(void);
+ void setCompassDelay(int64_t ns);
+ void enable_iio_sysfs(void);
+ int enableTap(int);
+ int enableFlick(int);
+ int enablePedometer(int);
+ int checkLPQuaternion();
+
+ int mNewData; // flag indicating that the MPL calculated new output values
+ int mDmpStarted;
+ long mMasterSensorMask;
+ long mLocalSensorMask;
+ int mPollTime;
+ bool mHaveGoodMpuCal; // flag indicating that the cal file can be written
+ int mGyroAccuracy; // value indicating the quality of the gyro calibr.
+ int mAccelAccuracy; // value indicating the quality of the accel calibr.
+ struct pollfd mPollFds[5];
+ int mSampleCount;
+ pthread_mutex_t mMplMutex;
+ pthread_mutex_t mHALMutex;
+
+ char mIIOBuffer[(16 + 8 * 3 + 8) * IIO_BUFFER_LENGTH];
+
+ int iio_fd;
+ int accel_fd;
+ int mpufifo_fd;
+ int gyro_temperature_fd;
+
+ uint32_t mEnabled;
+ uint32_t mOldEnabledMask;
+ sensors_event_t mPendingEvents[numSensors];
+ uint64_t mDelays[numSensors];
+ hfunc_t mHandlers[numSensors];
+ short mCachedGyroData[3];
+ long mCachedAccelData[3];
+ long mCachedCompassData[3];
+ long mCachedQuaternionData[4];
+ android::KeyedVector<int, int> mIrqFds;
+
+ InputEventCircularReader mAccelInputReader;
+ InputEventCircularReader mGyroInputReader;
+
+ bool mFirstRead;
+ short mTempScale;
+ short mTempOffset;
+ int64_t mTempCurrentTime;
+ int mAccelScale;
+
+ uint32_t mPendingMask;
+ unsigned long mSensorMask;
+
+ char chip_ID[MAX_CHIP_ID_LEN];
+
+ signed char mGyroOrientation[9];
+ signed char mAccelOrientation[9];
+
+ int64_t mSensorTimestamp;
+ int64_t mCompassTimestamp;
+
+ struct sysfs_attrbs {
+ char *chip_enable;
+ char *power_state;
+ char *dmp_firmware;
+ char *firmware_loaded;
+ char *dmp_on;
+ char *dmp_int_on;
+ char *tap_on;
+ char *key;
+ char *self_test;
+ char *temperature;
+ char *dmp_output_rate;
+
+ char *gyro_enable;
+ char *gyro_fifo_rate;
+ char *gyro_orient;
+ char *gyro_x_fifo_enable;
+ char *gyro_y_fifo_enable;
+ char *gyro_z_fifo_enable;
+
+ char *accel_enable;
+ char *accel_fifo_rate;
+ char *accel_fsr;
+ char *accel_bias;
+ char *accel_orient;
+ char *accel_x_fifo_enable;
+ char *accel_y_fifo_enable;
+ char *accel_z_fifo_enable;
+
+ char *quaternion_on;
+ char *in_quat_r_en;
+ char *in_quat_x_en;
+ char *in_quat_y_en;
+ char *in_quat_z_en;
+
+ char *in_timestamp_en;
+ char *trigger_name;
+ char *current_trigger;
+ char *buffer_length;
+ } mpu;
+
+ char *sysfs_names_ptr;
+ int mFeatureActiveMask;
+
+private:
+ /* added for dynamic get sensor list */
+ void fillAccel(const char* accel, struct sensor_t *list);
+ void fillGyro(const char* gyro, struct sensor_t *list);
+ void fillRV(struct sensor_t *list);
+ void fillOrientation(struct sensor_t *list);
+ void fillGravity(struct sensor_t *list);
+ void fillLinearAccel(struct sensor_t *list);
+ void storeCalibration();
+ void loadDMP();
+};
+
+extern "C" {
+ void setCallbackObject(MPLSensor*);
+ MPLSensor *getCallbackObject();
+}
+
+#endif // ANDROID_MPL_SENSOR_H
diff --git a/libsensors_iio/MPLSupport.cpp b/libsensors_iio/MPLSupport.cpp
index c0b7d2a..a961d78 100644
--- a/libsensors_iio/MPLSupport.cpp
+++ b/libsensors_iio/MPLSupport.cpp
@@ -1,19 +1,3 @@
-/*
-* Copyright (C) 2012 Invensense, Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
#include <MPLSupport.h>
#include <string.h>
#include <stdio.h>
@@ -21,8 +5,6 @@
#include "SensorBase.h"
#include <fcntl.h>
-#include "ml_sysfs_helper.h"
-
int inv_read_data(char *fname, long *data)
{
VFUNC_LOG;
@@ -83,13 +65,20 @@ int enable_sysfs_sensor(int fd, int en)
int err = 0;
if (fd >= 0) {
- char c = en ? '1' : '0';
- nb = write(fd, &c, 1);
+ char buf[2];
+ if (en) {
+ buf[0] = '1';
+ nb = write(fd, buf, 1);
+ } else {
+ buf[0] = '0';
+ nb = write(fd, buf, 1);
+ }
+ buf[1] = '\0';
if (nb <= 0) {
err = errno;
LOGE("HAL:enable_sysfs_sensor - write %c returned %d (%s / %d)",
- c, nb, strerror(err), err);
+ buf[0], nb, strerror(err), err);
}
close(fd);
} else {
@@ -122,28 +111,6 @@ int write_attribute_sensor(int fd, long data)
return num_b;
}
-/* This one DOES NOT close FDs for you */
-int write_attribute_sensor_continuous(int fd, long data)
-{
- VFUNC_LOG;
-
- int num_b = 0;
-
- if (fd >= 0) {
- char buf[80];
- sprintf(buf, "%ld", data);
- num_b = write(fd, buf, strlen(buf) + 1);
- if (num_b <= 0) {
- int err = errno;
- LOGE("HAL:write fd %d returned '%s' (%d)", fd, strerror(err), err);
- } else {
- LOGV_IF(EXTRA_VERBOSE, "HAL:fd=%d write attribute to %ld", fd, data);
- }
- }
-
- return num_b;
-}
-
int read_sysfs_int(char *filename, int *var)
{
int res=0;
@@ -152,10 +119,10 @@ int read_sysfs_int(char *filename, int *var)
sysfsfp = fopen(filename, "r");
if (sysfsfp!=NULL) {
fscanf(sysfsfp, "%d\n", var);
- fclose(sysfsfp);
+ fclose(sysfsfp);
} else {
- res = errno;
- LOGE("HAL:ERR open file %s to read with error %d", filename, res);
+ LOGE("HAL:ERR open file to read");
+ res= -1;
}
return res;
}
@@ -168,54 +135,10 @@ int write_sysfs_int(char *filename, int var)
sysfsfp = fopen(filename, "w");
if (sysfsfp!=NULL) {
fprintf(sysfsfp, "%d\n", var);
- fclose(sysfsfp);
+ fclose(sysfsfp);
} else {
- res = errno;
- LOGE("HAL:ERR open file %s to read with error %d", filename, res);
+ LOGE("HAL:ERR open file to write");
+ res= -1;
}
return res;
}
-
-int fill_dev_full_name_by_prefix(const char* dev_prefix,
- char *dev_full_name, int len)
-{
- char cand_name[20];
- int prefix_len = strlen(dev_prefix);
- strncpy(cand_name, dev_prefix, sizeof(cand_name) / sizeof(cand_name[0]));
-
- // try adding a number, 0-9
- for(int cand_postfix = 0; cand_postfix < 10; cand_postfix++) {
- snprintf(&cand_name[prefix_len],
- sizeof(cand_name) / sizeof(cand_name[0]),
- "%d", cand_postfix);
- int dev_num = find_type_by_name(cand_name, "iio:device");
- if (dev_num != -ENODEV) {
- strncpy(dev_full_name, cand_name, len);
- return 0;
- }
- }
- // try adding a small letter, a-z
- for(char cand_postfix = 'a'; cand_postfix <= 'z'; cand_postfix++) {
- snprintf(&cand_name[prefix_len],
- sizeof(cand_name) / sizeof(cand_name[0]),
- "%c", cand_postfix);
- int dev_num = find_type_by_name(cand_name, "iio:device");
- if (dev_num != -ENODEV) {
- strncpy(dev_full_name, cand_name, len);
- return 0;
- }
- }
- // try adding a capital letter, A-Z
- for(char cand_postfix = 'A'; cand_postfix <= 'Z'; cand_postfix++) {
- snprintf(&cand_name[prefix_len],
- sizeof(cand_name) / sizeof(cand_name[0]),
- "%c", cand_postfix);
- int dev_num = find_type_by_name(cand_name, "iio:device");
- if (dev_num != -ENODEV) {
- strncpy(dev_full_name, cand_name, len);
- return 0;
- }
- }
- return 1;
-}
-
diff --git a/libsensors_iio/MPLSupport.h b/libsensors_iio/MPLSupport.h
index 42d7643..73604ba 100644
--- a/libsensors_iio/MPLSupport.h
+++ b/libsensors_iio/MPLSupport.h
@@ -19,14 +19,11 @@
#include <stdint.h>
-int inv_read_data(char *fname, long *data);
-int read_attribute_sensor(int fd, char* data, unsigned int size);
-int enable_sysfs_sensor(int fd, int en);
-int write_attribute_sensor(int fd, long data);
-int write_attribute_sensor_continuous(int fd, long data);
-int read_sysfs_int(char*, int*);
-int write_sysfs_int(char*, int);
-int fill_dev_full_name_by_prefix(const char* dev_prefix,
- char* dev_full_name, int len);
+ int inv_read_data(char *fname, long *data);
+ int read_attribute_sensor(int fd, char* data, unsigned int size);
+ int enable_sysfs_sensor(int fd, int en);
+ int write_attribute_sensor(int fd, long data);
+ int read_sysfs_int(char*, int*);
+ int write_sysfs_int(char*, int);
#endif // ANDROID_MPL_SUPPORT_H
diff --git a/libsensors_iio/SensorBase.cpp b/libsensors_iio/SensorBase.cpp
index 0cf17af..fd0e2ca 100644
--- a/libsensors_iio/SensorBase.cpp
+++ b/libsensors_iio/SensorBase.cpp
@@ -1,142 +1,143 @@
-/*
-* Copyright (C) 2012 Invensense, Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include <fcntl.h>
-#include <errno.h>
-#include <math.h>
-#include <poll.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <sys/select.h>
-#include <cutils/log.h>
-#include <linux/input.h>
-
-#include "SensorBase.h"
-
-/*****************************************************************************/
-
-SensorBase::SensorBase(const char* dev_name,
- const char* data_name) : dev_name(dev_name),
- data_name(data_name),
- dev_fd(-1),
- data_fd(-1)
-{
- if (data_name) {
- data_fd = openInput(data_name);
- }
-}
-
-SensorBase::~SensorBase()
-{
- if (data_fd >= 0) {
- close(data_fd);
- }
- if (dev_fd >= 0) {
- close(dev_fd);
- }
-}
-
-int SensorBase::open_device()
-{
- if (dev_fd<0 && dev_name) {
- dev_fd = open(dev_name, O_RDONLY);
- LOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno));
- }
- return 0;
-}
-
-int SensorBase::close_device()
-{
- if (dev_fd >= 0) {
- close(dev_fd);
- dev_fd = -1;
- }
- return 0;
-}
-
-int SensorBase::getFd() const
-{
- if (!data_name) {
- return dev_fd;
- }
- return data_fd;
-}
-
-int SensorBase::setDelay(int32_t handle, int64_t ns)
-{
- return 0;
-}
-
-bool SensorBase::hasPendingEvents() const
-{
- return false;
-}
-
-int64_t SensorBase::getTimestamp()
-{
- struct timespec t;
- t.tv_sec = t.tv_nsec = 0;
- clock_gettime(CLOCK_MONOTONIC, &t);
- return int64_t(t.tv_sec) * 1000000000LL + t.tv_nsec;
-}
-
-int SensorBase::openInput(const char *inputName)
-{
- int fd = -1;
- const char *dirname = "/dev/input";
- char devname[PATH_MAX];
- char *filename;
- DIR *dir;
- struct dirent *de;
- dir = opendir(dirname);
- if(dir == NULL)
- return -1;
- strcpy(devname, dirname);
- filename = devname + strlen(devname);
- *filename++ = '/';
- while((de = readdir(dir))) {
- if(de->d_name[0] == '.' &&
- (de->d_name[1] == '\0' ||
- (de->d_name[1] == '.' && de->d_name[2] == '\0')))
- continue;
- strcpy(filename, de->d_name);
- fd = open(devname, O_RDONLY);
- LOGV_IF(EXTRA_VERBOSE, "path open %s", devname);
- LOGI("path open %s", devname);
- if (fd >= 0) {
- char name[80];
- if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) {
- name[0] = '\0';
- }
- LOGV_IF(EXTRA_VERBOSE, "name read %s", name);
- if (!strcmp(name, inputName)) {
- strcpy(input_name, filename);
- break;
- } else {
- close(fd);
- fd = -1;
- }
- }
- }
- closedir(dir);
- LOGE_IF(fd < 0, "couldn't find '%s' input device", inputName);
- return fd;
-}
-
-int SensorBase::enable(int32_t handle, int enabled)
-{
- return 0;
-}
+/*
+* Copyright (C) 2012 Invensense, Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#include <fcntl.h>
+#include <errno.h>
+#include <math.h>
+#include <poll.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/select.h>
+#include <cutils/log.h>
+#include <linux/input.h>
+
+#include "SensorBase.h"
+#include "local_log_def.h"
+
+/*****************************************************************************/
+
+SensorBase::SensorBase(const char* dev_name,
+ const char* data_name) : dev_name(dev_name),
+ data_name(data_name),
+ dev_fd(-1),
+ data_fd(-1)
+{
+ if (data_name) {
+ data_fd = openInput(data_name);
+ }
+}
+
+SensorBase::~SensorBase()
+{
+ if (data_fd >= 0) {
+ close(data_fd);
+ }
+ if (dev_fd >= 0) {
+ close(dev_fd);
+ }
+}
+
+int SensorBase::open_device()
+{
+ if (dev_fd<0 && dev_name) {
+ dev_fd = open(dev_name, O_RDONLY);
+ LOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno));
+ }
+ return 0;
+}
+
+int SensorBase::close_device()
+{
+ if (dev_fd >= 0) {
+ close(dev_fd);
+ dev_fd = -1;
+ }
+ return 0;
+}
+
+int SensorBase::getFd() const
+{
+ if (!data_name) {
+ return dev_fd;
+ }
+ return data_fd;
+}
+
+int SensorBase::setDelay(int32_t handle, int64_t ns)
+{
+ return 0;
+}
+
+bool SensorBase::hasPendingEvents() const
+{
+ return false;
+}
+
+int64_t SensorBase::getTimestamp()
+{
+ struct timespec t;
+ t.tv_sec = t.tv_nsec = 0;
+ clock_gettime(CLOCK_MONOTONIC, &t);
+ return int64_t(t.tv_sec) * 1000000000LL + t.tv_nsec;
+}
+
+int SensorBase::openInput(const char *inputName)
+{
+ int fd = -1;
+ const char *dirname = "/dev/input";
+ char devname[PATH_MAX];
+ char *filename;
+ DIR *dir;
+ struct dirent *de;
+ dir = opendir(dirname);
+ if(dir == NULL)
+ return -1;
+ strcpy(devname, dirname);
+ filename = devname + strlen(devname);
+ *filename++ = '/';
+ while((de = readdir(dir))) {
+ if(de->d_name[0] == '.' &&
+ (de->d_name[1] == '\0' ||
+ (de->d_name[1] == '.' && de->d_name[2] == '\0')))
+ continue;
+ strcpy(filename, de->d_name);
+ fd = open(devname, O_RDONLY);
+ LOGV_IF(EXTRA_VERBOSE, "path open %s", devname);
+ LOGI("path open %s", devname);
+ if (fd >= 0) {
+ char name[80];
+ if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) {
+ name[0] = '\0';
+ }
+ LOGV_IF(EXTRA_VERBOSE, "name read %s", name);
+ if (!strcmp(name, inputName)) {
+ strcpy(input_name, filename);
+ break;
+ } else {
+ close(fd);
+ fd = -1;
+ }
+ }
+ }
+ closedir(dir);
+ LOGE_IF(fd < 0, "couldn't find '%s' input device", inputName);
+ return fd;
+}
+
+int SensorBase::enable(int32_t handle, int enabled)
+{
+ return 0;
+}
diff --git a/libsensors_iio/SensorBase.h b/libsensors_iio/SensorBase.h
index ddd1a05..d9abe92 100644
--- a/libsensors_iio/SensorBase.h
+++ b/libsensors_iio/SensorBase.h
@@ -22,42 +22,9 @@
#include <sys/cdefs.h>
#include <sys/types.h>
-#if defined ANDROID_JELLYBEAN
-#warning "build for Jellybean"
-#define LOGV_IF ALOGV_IF
-#define LOGE_IF ALOGE_IF
-#define LOGI ALOGI
-#define LOGE ALOGE
-#define LOGV ALOGV
-#define LOGW ALOGW
-#else
-#warning "build for ICS or earlier version"
-#endif
-
-/* Log enablers, each of these independent */
-
-#define PROCESS_VERBOSE (0) /* process log messages */
-#define EXTRA_VERBOSE (0) /* verbose log messages */
-#define SYSFS_VERBOSE (0) /* log sysfs interactions as cat/echo for repro
- purpose on a shell */
-#define FUNC_ENTRY (0) /* log entry in all one-time functions */
-
-/* Note that enabling this logs may affect performance */
-#define HANDLER_ENTRY (0) /* log entry in all handler functions */
-#define ENG_VERBOSE (0) /* log some a lot more info about the internals */
-#define INPUT_DATA (0) /* log the data input from the events */
-#define HANDLER_DATA (0) /* log the data fetched from the handlers */
-
-#define FUNC_LOG \
- LOGV("%s", __PRETTY_FUNCTION__)
-#define VFUNC_LOG \
- LOGV_IF(FUNC_ENTRY, "Entering function '%s'", __PRETTY_FUNCTION__)
-#define VHANDLER_LOG \
- LOGV_IF(HANDLER_ENTRY, "Entering handler '%s'", __PRETTY_FUNCTION__)
#define CALL_MEMBER_FN(pobject, ptrToMember) ((pobject)->*(ptrToMember))
#define MAX_SYSFS_NAME_LEN (100)
-#define IIO_BUFFER_LENGTH (480)
/*****************************************************************************/
diff --git a/libsensors_iio/libmllite.so b/libsensors_iio/libmllite.so
index c23e5b9..ed13b13 100644
--- a/libsensors_iio/libmllite.so
+++ b/libsensors_iio/libmllite.so
Binary files differ
diff --git a/libsensors_iio/libmplmpu.so b/libsensors_iio/libmplmpu.so
index 23b4721..e2ab461 100644
--- a/libsensors_iio/libmplmpu.so
+++ b/libsensors_iio/libmplmpu.so
Binary files differ
diff --git a/libsensors_iio/local_log_def.h b/libsensors_iio/local_log_def.h
new file mode 100644
index 0000000..b08fdf1
--- /dev/null
+++ b/libsensors_iio/local_log_def.h
@@ -0,0 +1,46 @@
+#ifndef LOCAL_LOG_DEF_H
+#define LOCAL_LOG_DEF_H
+
+// -- workaround for different LOG definition in JellyBean --
+#define LOGV ALOGV
+#define LOGV_IF ALOGV_IF
+#define LOGD ALOGD
+#define LOGD_IF ALOGD_IF
+#define LOGI ALOGI
+#define LOGI_IF ALOGI_IF
+#define LOGW ALOGW
+#define LOGW_IF ALOGW_IF
+#define LOGE ALOGE
+#define LOGE_IF ALOGE_IF
+#define IF_LOGV IF_ALOGV
+#define IF_LOGD IF_ALOGD
+#define IF_LOGI IF_ALOGI
+#define IF_LOGW IF_ALOGW
+#define IF_LOGE IF_ALOGE
+#define LOG_ASSERT ALOG_ASSERT
+#define LOG ALOG
+#define IF_LOG IF_ALOG
+// -- Workaround End --
+
+/* Log enablers, each of these independent */
+
+#define PROCESS_VERBOSE (0) /* process log messages */
+#define EXTRA_VERBOSE (0) /* verbose log messages */
+#define SYSFS_VERBOSE (0) /* log sysfs interactions as cat/echo for repro
+ purpose on a shell */
+#define FUNC_ENTRY (0) /* log entry in all one-time functions */
+
+/* Note that enabling this logs may affect performance */
+#define HANDLER_ENTRY (0) /* log entry in all handler functions */
+#define ENG_VERBOSE (0) /* log some a lot more info about the internals */
+#define INPUT_DATA (0) /* log the data input from the events */
+#define HANDLER_DATA (0) /* log the data fetched from the handlers */
+
+#define FUNC_LOG \
+ LOGV("%s", __PRETTY_FUNCTION__)
+#define VFUNC_LOG \
+ LOGV_IF(FUNC_ENTRY, "Entering function '%s'", __PRETTY_FUNCTION__)
+#define VHANDLER_LOG \
+ LOGV_IF(HANDLER_ENTRY, "Entering handler '%s'", __PRETTY_FUNCTION__)
+
+#endif
diff --git a/libsensors_iio/sensor_params.h b/libsensors_iio/sensor_params.h
index c5d6307..88d5ba0 100644
--- a/libsensors_iio/sensor_params.h
+++ b/libsensors_iio/sensor_params.h
@@ -1,194 +1,162 @@
-/*
-* Copyright (C) 2012 Invensense, Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#ifndef INV_SENSOR_PARAMS_H
-#define INV_SENSOR_PARAMS_H
-
-/* Physical parameters of the sensors supported by Invensense MPL */
-#define SENSORS_ROTATION_VECTOR_HANDLE (ID_RV)
-#define SENSORS_LINEAR_ACCEL_HANDLE (ID_LA)
-#define SENSORS_GRAVITY_HANDLE (ID_GR)
-#define SENSORS_GYROSCOPE_HANDLE (ID_GY)
-#define SENSORS_RAW_GYROSCOPE_HANDLE (ID_RG)
-#define SENSORS_ACCELERATION_HANDLE (ID_A)
-#define SENSORS_MAGNETIC_FIELD_HANDLE (ID_M)
-#define SENSORS_ORIENTATION_HANDLE (ID_O)
-#define SENSORS_SCREEN_ORIENTATION_HANDLE (ID_SO)
-
-/******************************************/
-//MPU9250 INV_COMPASS
-#define COMPASS_MPU9250_RANGE (9830.f)
-#define COMPASS_MPU9250_RESOLUTION (0.15f)
-#define COMPASS_MPU9250_POWER (10.f)
-#define COMPASS_MPU9250_MINDELAY (10000)
-//MPU9150 INV_COMPASS
-#define COMPASS_MPU9150_RANGE (9830.f)
-#define COMPASS_MPU9150_RESOLUTION (0.285f)
-#define COMPASS_MPU9150_POWER (10.f)
-#define COMPASS_MPU9150_MINDELAY (10000)
-//COMPASS_ID_AK8975
-#define COMPASS_AKM8975_RANGE (9830.f)
-#define COMPASS_AKM8975_RESOLUTION (0.285f)
-#define COMPASS_AKM8975_POWER (10.f)
-#define COMPASS_AKM8975_MINDELAY (10000)
-//COMPASS_ID_AK8963C
-#define COMPASS_AKM8963_RANGE (9830.f)
-#define COMPASS_AKM8963_RESOLUTION (0.15f)
-#define COMPASS_AKM8963_POWER (10.f)
-#define COMPASS_AKM8963_MINDELAY (10000)
-//COMPASS_ID_AMI30X
-#define COMPASS_AMI30X_RANGE (5461.f)
-#define COMPASS_AMI30X_RESOLUTION (0.9f)
-#define COMPASS_AMI30X_POWER (0.15f)
-//COMPASS_ID_AMI306
-#define COMPASS_AMI306_RANGE (5461.f)
-#define COMPASS_AMI306_RESOLUTION (0.9f)
-#define COMPASS_AMI306_POWER (0.15f)
-#define COMPASS_AMI306_MINDELAY (10000)
-//COMPASS_ID_YAS529
-#define COMPASS_YAS529_RANGE (19660.f)
-#define COMPASS_YAS529_RESOLUTION (0.012f)
-#define COMPASS_YAS529_POWER (4.f)
-//COMPASS_ID_YAS53x
-#define COMPASS_YAS53x_RANGE (8001.f)
-#define COMPASS_YAS53x_RESOLUTION (0.012f)
-#define COMPASS_YAS53x_POWER (4.f)
-#define COMPASS_YAS53x_MINDELAY (10000)
-//COMPASS_ID_HMC5883
-#define COMPASS_HMC5883_RANGE (10673.f)
-#define COMPASS_HMC5883_RESOLUTION (10.f)
-#define COMPASS_HMC5883_POWER (0.24f)
-//COMPASS_ID_LSM303DLH
-#define COMPASS_LSM303DLH_RANGE (10240.f)
-#define COMPASS_LSM303DLH_RESOLUTION (1.f)
-#define COMPASS_LSM303DLH_POWER (1.f)
-//COMPASS_ID_LSM303DLM
-#define COMPASS_LSM303DLM_RANGE (10240.f)
-#define COMPASS_LSM303DLM_RESOLUTION (1.f)
-#define COMPASS_LSM303DLM_POWER (1.f)
-//COMPASS_ID_MMC314X
-#define COMPASS_MMC314X_RANGE (400.f)
-#define COMPASS_MMC314X_RESOLUTION (2.f)
-#define COMPASS_MMC314X_POWER (0.55f)
-//COMPASS_ID_HSCDTD002B
-#define COMPASS_HSCDTD002B_RANGE (9830.f)
-#define COMPASS_HSCDTD002B_RESOLUTION (1.f)
-#define COMPASS_HSCDTD002B_POWER (1.f)
-//COMPASS_ID_HSCDTD004A
-#define COMPASS_HSCDTD004A_RANGE (9830.f)
-#define COMPASS_HSCDTD004A_RESOLUTION (1.f)
-#define COMPASS_HSCDTD004A_POWER (1.f)
-/*******************************************/
-//ACCEL_ID_MPU6500
-#define ACCEL_MPU6500_RANGE (2.f * GRAVITY_EARTH)
-#define ACCEL_MPU6500_RESOLUTION (0.004f * GRAVITY_EARTH)
-#define ACCEL_MPU6500_POWER (0.f)
-#define ACCEL_MPU6500_MINDELAY (1000)
-//ACCEL_ID_MPU9250
-#define ACCEL_MPU9250_RANGE (2.f * GRAVITY_EARTH)
-#define ACCEL_MPU9250_RESOLUTION (0.004f * GRAVITY_EARTH)
-#define ACCEL_MPU9250_POWER (0.f)
-#define ACCEL_MPU9250_MINDELAY (1000)
-//ACCEL_ID_MPU9150
-#define ACCEL_MPU9150_RANGE (2.f * GRAVITY_EARTH)
-#define ACCEL_MPU9150_RESOLUTION (0.004f * GRAVITY_EARTH)
-#define ACCEL_MPU9150_POWER (0.f)
-#define ACCEL_MPU9150_MINDELAY (1000)
-//ACCEL_ID_LIS331
-#define ACCEL_LIS331_RANGE (2.48f * GRAVITY_EARTH)
-#define ACCEL_LIS331_RESOLUTION (0.001f * GRAVITY_EARTH)
-#define ACCEL_LIS331_POWER (1.f)
-//ACCEL_ID_LSM303DLX
-#define ACCEL_LSM303DLX_RANGE (2.48f * GRAVITY_EARTH)
-#define ACCEL_LSM303DLX_RESOLUTION (0.001f * GRAVITY_EARTH)
-#define ACCEL_LSM303DLX_POWER (1.f)
-//ACCEL_ID_LIS3DH
-#define ACCEL_LIS3DH_RANGE (2.48f * GRAVITY_EARTH)
-#define ACCEL_LIS3DH_RESOLUTION (0.001f * GRAVITY_EARTH)
-#define ACCEL_LIS3DH_POWER (1.f)
-//ACCEL_ID_KXSD9
-#define ACCEL_KXSD9_RANGE (2.5006f * GRAVITY_EARTH)
-#define ACCEL_KXSD9_RESOLUTION (0.001f * GRAVITY_EARTH)
-#define ACCEL_KXSD9_POWER (1.f)
-//ACCEL_ID_KXTF9
-#define ACCEL_KXTF9_RANGE (1.f * GRAVITY_EARTH)
-#define ACCEL_KXTF9_RESOLUTION (0.033f * GRAVITY_EARTH)
-#define ACCEL_KXTF9_POWER (0.35f)
-//ACCEL_ID_BMA150
-#define ACCEL_BMA150_RANGE (2.f * GRAVITY_EARTH)
-#define ACCEL_BMA150_RESOLUTION (0.004f * GRAVITY_EARTH)
-#define ACCEL_BMA150_POWER (0.2f)
-//ACCEL_ID_BMA222
-#define ACCEL_BMA222_RANGE (2.f * GRAVITY_EARTH)
-#define ACCEL_BMA222_RESOLUTION (0.001f * GRAVITY_EARTH)
-#define ACCEL_BMA222_POWER (0.1f)
-//ACCEL_ID_BMA250
-#define ACCEL_BMA250_RANGE (2.f * GRAVITY_EARTH)
-#define ACCEL_BMA250_RESOLUTION (0.00391f * GRAVITY_EARTH)
-#define ACCEL_BMA250_POWER (0.139f)
-#define ACCEL_BMA250_MINDELAY (1000)
-//ACCEL_ID_ADXL34X
-#define ACCEL_ADXL34X_RANGE (2.f * GRAVITY_EARTH)
-#define ACCEL_ADXL34X_RESOLUTION (0.001f * GRAVITY_EARTH)
-#define ACCEL_ADXL34X_POWER (1.f)
-//ACCEL_ID_MMA8450
-#define ACCEL_MMA8450_RANGE (2.f * GRAVITY_EARTH)
-#define ACCEL_MMA8450_RESOLUTION (0.001f * GRAVITY_EARTH)
-#define ACCEL_MMA8450_POWER (1.0f)
-//ACCEL_ID_MMA845X
-#define ACCEL_MMA845X_RANGE (2.f * GRAVITY_EARTH)
-#define ACCEL_MMA845X_RESOLUTION (0.001f * GRAVITY_EARTH)
-#define ACCEL_MMA845X_POWER (1.f)
-//ACCEL_ID_MPU6050
-#define ACCEL_MPU6050_RANGE (2.f * GRAVITY_EARTH)
-#define ACCEL_MPU6050_RESOLUTION (0.004f * GRAVITY_EARTH)
-#define ACCEL_MPU6050_POWER (0.f)
-#define ACCEL_MPU6050_MINDELAY (1000)
-/******************************************/
-//GYRO MPU3050
-#define RAD_P_DEG (3.14159f / 180.f)
-#define GYRO_MPU3050_RANGE (2000.f * RAD_P_DEG)
-#define GYRO_MPU3050_RESOLUTION (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_MPU3050_POWER (6.1f)
-#define GYRO_MPU3050_MINDELAY (1000)
-//GYRO MPU6050
-#define GYRO_MPU6050_RANGE (2000.f * RAD_P_DEG)
-#define GYRO_MPU6050_RESOLUTION (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_MPU6050_POWER (5.5f)
-#define GYRO_MPU6050_MINDELAY (1000)
-//GYRO MPU9150
-#define GYRO_MPU9150_RANGE (2000.f * RAD_P_DEG)
-#define GYRO_MPU9150_RESOLUTION (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_MPU9150_POWER (5.5f)
-#define GYRO_MPU9150_MINDELAY (1000)
-//GYRO MPU9250
-#define GYRO_MPU9250_RANGE (2000.f * RAD_P_DEG)
-#define GYRO_MPU9250_RESOLUTION (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_MPU9250_POWER (5.5f)
-#define GYRO_MPU9250_MINDELAY (1000)
-//GYRO MPU6500
-#define GYRO_MPU6500_RANGE (2000.f * RAD_P_DEG)
-#define GYRO_MPU6500_RESOLUTION (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_MPU6500_POWER (5.5f)
-#define GYRO_MPU6500_MINDELAY (1000)
-//GYRO ITG3500
-#define GYRO_ITG3500_RANGE (2000.f * RAD_P_DEG)
-#define GYRO_ITG3500_RESOLUTION (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_ITG3500_POWER (5.5f)
-#define GYRO_ITG3500_MINDELAY (1000)
-
-#endif /* INV_SENSOR_PARAMS_H */
-
+/*
+* Copyright (C) 2012 Invensense, Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef INV_SENSOR_PARAMS_H
+#define INV_SENSOR_PARAMS_H
+
+/* Physical parameters of the sensors supported by Invensense MPL */
+#define SENSORS_ROTATION_VECTOR_HANDLE (ID_RV)
+#define SENSORS_LINEAR_ACCEL_HANDLE (ID_LA)
+#define SENSORS_GRAVITY_HANDLE (ID_GR)
+#define SENSORS_GYROSCOPE_HANDLE (ID_GY)
+#define SENSORS_ACCELERATION_HANDLE (ID_A)
+#define SENSORS_MAGNETIC_FIELD_HANDLE (ID_M)
+#define SENSORS_ORIENTATION_HANDLE (ID_O)
+
+/******************************************/
+//MPU9150 INV_COMPASS
+#define COMPASS_MPU9150_RANGE (9830.f)
+#define COMPASS_MPU9150_RESOLUTION (0.285f)
+#define COMPASS_MPU9150_POWER (10.f)
+#define COMPASS_MPU9150_MINDELAY (10000)
+//COMPASS_ID_AKM
+#define COMPASS_AKM8975_RANGE (9830.f)
+#define COMPASS_AKM8975_RESOLUTION (0.285f)
+#define COMPASS_AKM8975_POWER (10.f)
+#define COMPASS_AKM8975_MINDELAY (10000)
+//COMPASS_ID_AMI30X
+#define COMPASS_AMI30X_RANGE (5461.f)
+#define COMPASS_AMI30X_RESOLUTION (0.9f)
+#define COMPASS_AMI30X_POWER (0.15f)
+//COMPASS_ID_AMI306
+#define COMPASS_AMI306_RANGE (5461.f)
+#define COMPASS_AMI306_RESOLUTION (0.9f)
+#define COMPASS_AMI306_POWER (0.15f)
+#define COMPASS_AMI306_MINDELAY (10000)
+//COMPASS_ID_YAS529
+#define COMPASS_YAS529_RANGE (19660.f)
+#define COMPASS_YAS529_RESOLUTION (0.012f)
+#define COMPASS_YAS529_POWER (4.f)
+//COMPASS_ID_YAS530
+#define COMPASS_YAS530_RANGE (8001.f)
+#define COMPASS_YAS530_RESOLUTION (0.012f)
+#define COMPASS_YAS530_POWER (4.f)
+#define COMPASS_YAS530_MINDELAY (10000)
+//COMPASS_ID_HMC5883
+#define COMPASS_HMC5883_RANGE (10673.f)
+#define COMPASS_HMC5883_RESOLUTION (10.f)
+#define COMPASS_HMC5883_POWER (0.24f)
+//COMPASS_ID_LSM303DLH
+#define COMPASS_LSM303DLH_RANGE (10240.f)
+#define COMPASS_LSM303DLH_RESOLUTION (1.f)
+#define COMPASS_LSM303DLH_POWER (1.f)
+//COMPASS_ID_LSM303DLM
+#define COMPASS_LSM303DLM_RANGE (10240.f)
+#define COMPASS_LSM303DLM_RESOLUTION (1.f)
+#define COMPASS_LSM303DLM_POWER (1.f)
+//COMPASS_ID_MMC314X
+#define COMPASS_MMC314X_RANGE (400.f)
+#define COMPASS_MMC314X_RESOLUTION (2.f)
+#define COMPASS_MMC314X_POWER (0.55f)
+//COMPASS_ID_HSCDTD002B
+#define COMPASS_HSCDTD002B_RANGE (9830.f)
+#define COMPASS_HSCDTD002B_RESOLUTION (1.f)
+#define COMPASS_HSCDTD002B_POWER (1.f)
+//COMPASS_ID_HSCDTD004A
+#define COMPASS_HSCDTD004A_RANGE (9830.f)
+#define COMPASS_HSCDTD004A_RESOLUTION (1.f)
+#define COMPASS_HSCDTD004A_POWER (1.f)
+/*******************************************/
+//ACCEL_ID_MPU9150
+#define ACCEL_MPU9150_RANGE (2.f * GRAVITY_EARTH)
+#define ACCEL_MPU9150_RESOLUTION (0.004f * GRAVITY_EARTH)
+#define ACCEL_MPU9150_POWER (0.f)
+#define ACCEL_MPU9150_MINDELAY (1000)
+//ACCEL_ID_LIS331
+#define ACCEL_LIS331_RANGE (2.48f * GRAVITY_EARTH)
+#define ACCEL_LIS331_RESOLUTION (0.001f * GRAVITY_EARTH)
+#define ACCEL_LIS331_POWER (1.f)
+//ACCEL_ID_LSM303DLX
+#define ACCEL_LSM303DLX_RANGE (2.48f * GRAVITY_EARTH)
+#define ACCEL_LSM303DLX_RESOLUTION (0.001f * GRAVITY_EARTH)
+#define ACCEL_LSM303DLX_POWER (1.f)
+//ACCEL_ID_LIS3DH
+#define ACCEL_LIS3DH_RANGE (2.48f * GRAVITY_EARTH)
+#define ACCEL_LIS3DH_RESOLUTION (0.001f * GRAVITY_EARTH)
+#define ACCEL_LIS3DH_POWER (1.f)
+//ACCEL_ID_KXSD9
+#define ACCEL_KXSD9_RANGE (2.5006f * GRAVITY_EARTH)
+#define ACCEL_KXSD9_RESOLUTION (0.001f * GRAVITY_EARTH)
+#define ACCEL_KXSD9_POWER (1.f)
+//ACCEL_ID_KXTF9
+#define ACCEL_KXTF9_RANGE (1.f * GRAVITY_EARTH)
+#define ACCEL_KXTF9_RESOLUTION (0.033f * GRAVITY_EARTH)
+#define ACCEL_KXTF9_POWER (0.35f)
+//ACCEL_ID_BMA150
+#define ACCEL_BMA150_RANGE (2.f * GRAVITY_EARTH)
+#define ACCEL_BMA150_RESOLUTION (0.004f * GRAVITY_EARTH)
+#define ACCEL_BMA150_POWER (0.2f)
+//ACCEL_ID_BMA222
+#define ACCEL_BMA222_RANGE (2.f * GRAVITY_EARTH)
+#define ACCEL_BMA222_RESOLUTION (0.001f * GRAVITY_EARTH)
+#define ACCEL_BMA222_POWER (0.1f)
+//ACCEL_ID_BMA250
+#define ACCEL_BMA250_RANGE (2.f * GRAVITY_EARTH)
+#define ACCEL_BMA250_RESOLUTION (0.00391f * GRAVITY_EARTH)
+#define ACCEL_BMA250_POWER (0.139f)
+#define ACCEL_BMA250_MINDELAY (1000)
+//ACCEL_ID_ADXL34X
+#define ACCEL_ADXL34X_RANGE (2.f * GRAVITY_EARTH)
+#define ACCEL_ADXL34X_RESOLUTION (0.001f * GRAVITY_EARTH)
+#define ACCEL_ADXL34X_POWER (1.f)
+//ACCEL_ID_MMA8450
+#define ACCEL_MMA8450_RANGE (2.f * GRAVITY_EARTH)
+#define ACCEL_MMA8450_RESOLUTION (0.001f * GRAVITY_EARTH)
+#define ACCEL_MMA8450_POWER (1.0f)
+//ACCEL_ID_MMA845X
+#define ACCEL_MMA845X_RANGE (2.f * GRAVITY_EARTH)
+#define ACCEL_MMA845X_RESOLUTION (0.001f * GRAVITY_EARTH)
+#define ACCEL_MMA845X_POWER (1.f)
+//ACCEL_ID_MPU6050
+#define ACCEL_MPU6050_RANGE (2.f * GRAVITY_EARTH)
+#define ACCEL_MPU6050_RESOLUTION (0.004f * GRAVITY_EARTH)
+#define ACCEL_MPU6050_POWER (0.f)
+#define ACCEL_MPU6050_MINDELAY (1000)
+/******************************************/
+//GYRO MPU3050
+#define RAD_P_DEG (3.14159f / 180.f)
+#define GYRO_MPU3050_RANGE (2000.f * RAD_P_DEG)
+#define GYRO_MPU3050_RESOLUTION (32.8f * RAD_P_DEG)
+#define GYRO_MPU3050_POWER (6.1f)
+#define GYRO_MPU3050_MINDELAY (1000)
+//GYRO MPU6050
+#define GYRO_MPU6050_RANGE (2000.f * RAD_P_DEG)
+#define GYRO_MPU6050_RESOLUTION (16.4f * RAD_P_DEG)
+#define GYRO_MPU6050_POWER (5.5f)
+#define GYRO_MPU6050_MINDELAY (1000)
+//GYRO MPU9150
+#define GYRO_MPU9150_RANGE (2000.f * RAD_P_DEG)
+#define GYRO_MPU9150_RESOLUTION (16.4f * RAD_P_DEG)
+#define GYRO_MPU9150_POWER (5.5f)
+#define GYRO_MPU9150_MINDELAY (1000)
+//GYRO ITG3500
+#define GYRO_ITG3500_RANGE (2000.f * RAD_P_DEG)
+#define GYRO_ITG3500_RESOLUTION (16.4f * RAD_P_DEG)
+#define GYRO_ITG3500_POWER (5.5f)
+#define GYRO_ITG3500_MINDELAY (1000)
+
+#endif /* INV_SENSOR_PARAMS_H */
+
diff --git a/libsensors_iio/sensors.h b/libsensors_iio/sensors.h
index d07e956..0556c10 100644
--- a/libsensors_iio/sensors.h
+++ b/libsensors_iio/sensors.h
@@ -1,97 +1,104 @@
-/*
-* Copyright (C) 2012 Invensense, Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#ifndef ANDROID_SENSORS_H
-#define ANDROID_SENSORS_H
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include <linux/input.h>
-
-#include <hardware/hardware.h>
-#include <hardware/sensors.h>
-
-__BEGIN_DECLS
-
-/*****************************************************************************/
-
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
-#endif
-
-enum {
- ID_GY = 0,
- ID_RG,
- ID_A,
- ID_M,
- ID_O,
- ID_RV,
- ID_LA,
- ID_GR,
- ID_SO
-};
-
-/*****************************************************************************/
-
-/*
- * The SENSORS Module
- */
-
-/* ITG3500 */
-#define EVENT_TYPE_GYRO_X REL_X
-#define EVENT_TYPE_GYRO_Y REL_Y
-#define EVENT_TYPE_GYRO_Z REL_Z
-/* MPU6050 MPU9150 */
-#define EVENT_TYPE_IACCEL_X REL_RX
-#define EVENT_TYPE_IACCEL_Y REL_RY
-#define EVENT_TYPE_IACCEL_Z REL_RZ
-/* MPU6050 MPU9150 */
-#define EVENT_TYPE_ICOMPASS_X REL_X
-#define EVENT_TYPE_ICOMPASS_Y REL_Y
-#define EVENT_TYPE_ICOMPASS_Z REL_Z
-/* MPUxxxx */
-#define EVENT_TYPE_TIMESTAMP_HI REL_MISC
-#define EVENT_TYPE_TIMESTAMP_LO REL_WHEEL
-
-/* Accel BMA250 */
-#define EVENT_TYPE_ACCEL_X ABS_X
-#define EVENT_TYPE_ACCEL_Y ABS_Y
-#define EVENT_TYPE_ACCEL_Z ABS_Z
-#define LSG (1000.0f)
-
-// conversion of acceleration data to SI units (m/s^2)
-#define RANGE_A (4*GRAVITY_EARTH)
-#define RESOLUTION_A (GRAVITY_EARTH / LSG)
-#define CONVERT_A (GRAVITY_EARTH / LSG)
-#define CONVERT_A_X (CONVERT_A)
-#define CONVERT_A_Y (CONVERT_A)
-#define CONVERT_A_Z (CONVERT_A)
-
-/* Compass AKM8975 */
-#define EVENT_TYPE_MAGV_X ABS_RX
-#define EVENT_TYPE_MAGV_Y ABS_RY
-#define EVENT_TYPE_MAGV_Z ABS_RZ
-#define EVENT_TYPE_MAGV_STATUS ABS_RUDDER
-
-// conversion of magnetic data to uT units
-#define CONVERT_M (0.06f)
-
-__END_DECLS
-
-#endif // ANDROID_SENSORS_H
+/*
+* Copyright (C) 2012 Invensense, Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef ANDROID_SENSORS_H
+#define ANDROID_SENSORS_H
+
+#include <stdint.h>
+#include <errno.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+#include <linux/input.h>
+
+#include <hardware/hardware.h>
+#include <hardware/sensors.h>
+
+__BEGIN_DECLS
+
+/*****************************************************************************/
+
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#endif
+
+#define ID_MPL_BASE (0)
+#define ID_GY (ID_MPL_BASE)
+#define ID_A (ID_GY + 1)
+#define ID_M (ID_A + 1)
+#define ID_O (ID_M + 1)
+#define ID_RV (ID_O + 1)
+#define ID_LA (ID_RV + 1)
+#define ID_GR (ID_LA + 1)
+
+/*#define ID_MPL_BASE (0)
+#define ID_RV (ID_MPL_BASE)
+#define ID_LA (ID_RV + 1)
+#define ID_GR (ID_LA + 1)
+#define ID_GY (ID_GR + 1)
+#define ID_A (ID_GY + 1)
+#define ID_M (ID_A + 1)
+#define ID_O (ID_M + 1)
+*/
+
+/*****************************************************************************/
+
+/*
+ * The SENSORS Module
+ */
+
+/* ITG3500 */
+#define EVENT_TYPE_GYRO_X REL_X
+#define EVENT_TYPE_GYRO_Y REL_Y
+#define EVENT_TYPE_GYRO_Z REL_Z
+/* MPU6050 MPU9150 */
+#define EVENT_TYPE_IACCEL_X REL_RX
+#define EVENT_TYPE_IACCEL_Y REL_RY
+#define EVENT_TYPE_IACCEL_Z REL_RZ
+/* MPU6050 MPU9150 */
+#define EVENT_TYPE_ICOMPASS_X REL_X
+#define EVENT_TYPE_ICOMPASS_Y REL_Y
+#define EVENT_TYPE_ICOMPASS_Z REL_Z
+/* MPUxxxx */
+#define EVENT_TYPE_TIMESTAMP_HI REL_MISC
+#define EVENT_TYPE_TIMESTAMP_LO REL_WHEEL
+
+/* Accel BMA250 */
+#define EVENT_TYPE_ACCEL_X ABS_X
+#define EVENT_TYPE_ACCEL_Y ABS_Y
+#define EVENT_TYPE_ACCEL_Z ABS_Z
+#define LSG (1000.0f)
+
+// conversion of acceleration data to SI units (m/s^2)
+#define RANGE_A (4*GRAVITY_EARTH)
+#define RESOLUTION_A (GRAVITY_EARTH / LSG)
+#define CONVERT_A (GRAVITY_EARTH / LSG)
+#define CONVERT_A_X (CONVERT_A)
+#define CONVERT_A_Y (CONVERT_A)
+#define CONVERT_A_Z (CONVERT_A)
+
+/* Compass AKM8975 */
+#define EVENT_TYPE_MAGV_X ABS_RX
+#define EVENT_TYPE_MAGV_Y ABS_RY
+#define EVENT_TYPE_MAGV_Z ABS_RZ
+#define EVENT_TYPE_MAGV_STATUS ABS_RUDDER
+
+// conversion of magnetic data to uT units
+#define CONVERT_M (0.06f)
+
+__END_DECLS
+
+#endif // ANDROID_SENSORS_H
diff --git a/libsensors_iio/sensors_mpl.cpp b/libsensors_iio/sensors_mpl.cpp
index 50bf315..990c5f5 100644
--- a/libsensors_iio/sensors_mpl.cpp
+++ b/libsensors_iio/sensors_mpl.cpp
@@ -1,260 +1,236 @@
-/*
-* Copyright (C) 2012 Invensense, Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#define FUNC_LOG LOGV("%s", __PRETTY_FUNCTION__)
-
-#include <hardware/sensors.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <dirent.h>
-#include <math.h>
-#include <poll.h>
-#include <pthread.h>
-#include <stdlib.h>
-
-#include <linux/input.h>
-
-#include <utils/Atomic.h>
-#include <utils/Log.h>
-
-#include "sensors.h"
-#include "MPLSensor.h"
-
-/*****************************************************************************/
-/* The SENSORS Module */
-
-#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
-#define LOCAL_SENSORS (MPLSensor::NUMSENSORS + 1)
-#else
-#define LOCAL_SENSORS MPLSensor::NUMSENSORS
-#endif
-
-/* Vendor-defined Accel Load Calibration File Method
-* @param[out] Accel bias, length 3. In HW units scaled by 2^16 in body frame
-* @return '0' for a successful load, '1' otherwise
-* example: int AccelLoadConfig(long* offset);
-* End of Vendor-defined Accel Load Cal Method
-*/
-
-static struct sensor_t sSensorList[LOCAL_SENSORS];
-static int sensors = (sizeof(sSensorList) / sizeof(sensor_t));
-
-static int open_sensors(const struct hw_module_t* module, const char* id,
- struct hw_device_t** device);
-
-static int sensors__get_sensors_list(struct sensors_module_t* module,
- struct sensor_t const** list)
-{
- *list = sSensorList;
- return sensors;
-}
-
-static struct hw_module_methods_t sensors_module_methods = {
- open: open_sensors
-};
-
-struct sensors_module_t HAL_MODULE_INFO_SYM = {
- common: {
- tag: HARDWARE_MODULE_TAG,
- version_major: 1,
- version_minor: 0,
- id: SENSORS_HARDWARE_MODULE_ID,
- name: "Invensense module",
- author: "Invensense Inc.",
- methods: &sensors_module_methods,
- },
- get_sensors_list: sensors__get_sensors_list,
-};
-
-struct sensors_poll_context_t {
- struct sensors_poll_device_t device; // must be first
-
- sensors_poll_context_t();
- ~sensors_poll_context_t();
- int activate(int handle, int enabled);
- int setDelay(int handle, int64_t ns);
- int pollEvents(sensors_event_t* data, int count);
-
-private:
- enum {
- mpl = 0,
- compass,
- dmpOrient,
- numSensorDrivers, // wake pipe goes here
- numFds,
- };
-
- struct pollfd mPollFds[numSensorDrivers];
- SensorBase *mSensor;
- CompassSensor *mCompassSensor;
-};
-
-/******************************************************************************/
-
-sensors_poll_context_t::sensors_poll_context_t() {
- VFUNC_LOG;
-
- mCompassSensor = new CompassSensor();
- MPLSensor *mplSensor = new MPLSensor(mCompassSensor);
-
- /* For Vendor-defined Accel Calibration File Load
- * Use the Following Constructor and Pass Your Load Cal File Function
- *
- * MPLSensor *mplSensor = new MPLSensor(mCompassSensor, AccelLoadConfig);
- */
-
- // setup the callback object for handing mpl callbacks
- setCallbackObject(mplSensor);
-
- // populate the sensor list
- sensors =
- mplSensor->populateSensorList(sSensorList, sizeof(sSensorList));
-
- mSensor = mplSensor;
- mPollFds[mpl].fd = mSensor->getFd();
- mPollFds[mpl].events = POLLIN;
- mPollFds[mpl].revents = 0;
-
- mPollFds[compass].fd = mCompassSensor->getFd();
- mPollFds[compass].events = POLLIN;
- mPollFds[compass].revents = 0;
-
- mPollFds[dmpOrient].fd = ((MPLSensor*) mSensor)->getDmpOrientFd();
- mPollFds[dmpOrient].events = POLLPRI;
- mPollFds[dmpOrient].revents = 0;
-}
-
-sensors_poll_context_t::~sensors_poll_context_t() {
- FUNC_LOG;
- delete mSensor;
- delete mCompassSensor;
-}
-
-int sensors_poll_context_t::activate(int handle, int enabled) {
- FUNC_LOG;
- return mSensor->enable(handle, enabled);
-}
-
-int sensors_poll_context_t::setDelay(int handle, int64_t ns)
-{
- FUNC_LOG;
- return mSensor->setDelay(handle, ns);
-}
-
-int sensors_poll_context_t::pollEvents(sensors_event_t *data, int count)
-{
- VHANDLER_LOG;
-
- int nbEvents = 0;
- int nb, polltime = -1;
-
- // look for new events
- nb = poll(mPollFds, numSensorDrivers, polltime);
-
- if (nb > 0) {
- for (int i = 0; count && i < numSensorDrivers; i++) {
- if (mPollFds[i].revents & (POLLIN | POLLPRI)) {
- nb = 0;
- if (i == mpl) {
- nb = mSensor->readEvents(NULL, 0);
- mPollFds[i].revents = 0;
- }
- else if (i == compass) {
- nb = ((MPLSensor*) mSensor)->readCompassEvents(NULL, 0);
- mPollFds[i].revents = 0;
- }
- }
- }
- nb = ((MPLSensor*) mSensor)->executeOnData(data, count);
- if (nb > 0) {
- count -= nb;
- nbEvents += nb;
- data += nb;
- }
-
- if (mPollFds[dmpOrient].revents & (POLLIN | POLLPRI)) {
- nb = ((MPLSensor*) mSensor)->readDmpOrientEvents(data, count);
- mPollFds[dmpOrient].revents= 0;
- if (isDmpScreenAutoRotationEnabled() && nb > 0) {
- count -= nb;
- nbEvents += nb;
- data += nb;
- }
- }
- }
-
- return nbEvents;
-}
-
-/******************************************************************************/
-
-static int poll__close(struct hw_device_t *dev)
-{
- FUNC_LOG;
- sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
- if (ctx) {
- delete ctx;
- }
- return 0;
-}
-
-static int poll__activate(struct sensors_poll_device_t *dev,
- int handle, int enabled)
-{
- sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
- return ctx->activate(handle, enabled);
-}
-
-static int poll__setDelay(struct sensors_poll_device_t *dev,
- int handle, int64_t ns)
-{
- sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
- int s= ctx->setDelay(handle, ns);
- return s;
-}
-
-static int poll__poll(struct sensors_poll_device_t *dev,
- sensors_event_t* data, int count)
-{
- sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
- return ctx->pollEvents(data, count);
-}
-
-/******************************************************************************/
-
-/** Open a new instance of a sensor device using name */
-static int open_sensors(const struct hw_module_t* module, const char* id,
- struct hw_device_t** device)
-{
- FUNC_LOG;
- int status = -EINVAL;
- sensors_poll_context_t *dev = new sensors_poll_context_t();
-
- memset(&dev->device, 0, sizeof(sensors_poll_device_t));
-
- dev->device.common.tag = HARDWARE_DEVICE_TAG;
- dev->device.common.version = 0;
- dev->device.common.module = const_cast<hw_module_t*>(module);
- dev->device.common.close = poll__close;
- dev->device.activate = poll__activate;
- dev->device.setDelay = poll__setDelay;
- dev->device.poll = poll__poll;
-
- *device = &dev->device.common;
- status = 0;
-
- return status;
-}
+/*
+* Copyright (C) 2012 Invensense, Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#define FUNC_LOG LOGV("%s", __PRETTY_FUNCTION__)
+
+#include <hardware/sensors.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <dirent.h>
+#include <math.h>
+#include <poll.h>
+#include <pthread.h>
+#include <stdlib.h>
+
+#include <linux/input.h>
+
+#include <utils/Atomic.h>
+#include <utils/Log.h>
+
+#include "sensors.h"
+#include "MPLSensor.h"
+#include "local_log_def.h"
+
+/*****************************************************************************/
+/* The SENSORS Module */
+#define LOCAL_SENSORS (7)
+
+static struct sensor_t sSensorList[7];
+static int numSensors = LOCAL_SENSORS;
+
+static int open_sensors(const struct hw_module_t* module, const char* id,
+ struct hw_device_t** device);
+
+static int sensors__get_sensors_list(struct sensors_module_t* module,
+ struct sensor_t const** list)
+{
+ *list = sSensorList;
+ return numSensors;
+}
+
+static struct hw_module_methods_t sensors_module_methods = {
+ open: open_sensors
+};
+
+struct sensors_module_t HAL_MODULE_INFO_SYM = {
+ common: {
+ tag: HARDWARE_MODULE_TAG,
+ version_major: 1,
+ version_minor: 0,
+ id: SENSORS_HARDWARE_MODULE_ID,
+ name: "Invensense module",
+ author: "Invensense Inc.",
+ methods: &sensors_module_methods,
+ },
+ get_sensors_list: sensors__get_sensors_list,
+};
+
+struct sensors_poll_context_t {
+ struct sensors_poll_device_t device; // must be first
+
+ sensors_poll_context_t();
+ ~sensors_poll_context_t();
+ int activate(int handle, int enabled);
+ int setDelay(int handle, int64_t ns);
+ int pollEvents(sensors_event_t* data, int count);
+
+private:
+ enum {
+ mpl = 0,
+ compass,
+ numSensorDrivers, // wake pipe goes here
+ numFds,
+ };
+
+ struct pollfd mPollFds[numSensorDrivers];
+ SensorBase *mSensor;
+ CompassSensor *mCompassSensor;
+};
+
+/******************************************************************************/
+
+sensors_poll_context_t::sensors_poll_context_t() {
+ VFUNC_LOG;
+
+ CompassSensor *mCompassSensor = new CompassSensor();
+ MPLSensor *mplSensor = new MPLSensor(mCompassSensor);
+
+ // setup the callback object for handing mpl callbacks
+ setCallbackObject(mplSensor);
+
+ // populate the sensor list
+ numSensors =
+ mplSensor->populateSensorList(sSensorList, sizeof(sSensorList));
+
+ mSensor = mplSensor;
+ mPollFds[mpl].fd = mSensor->getFd();
+ mPollFds[mpl].events = POLLIN;
+ mPollFds[mpl].revents = 0;
+
+ mPollFds[compass].fd = mCompassSensor->getFd();
+ mPollFds[compass].events = POLLIN;
+ mPollFds[compass].revents = 0;
+}
+
+sensors_poll_context_t::~sensors_poll_context_t() {
+ FUNC_LOG;
+ delete mSensor;
+ delete mCompassSensor;
+}
+
+int sensors_poll_context_t::activate(int handle, int enabled) {
+ FUNC_LOG;
+ return mSensor->enable(handle, enabled);
+}
+
+int sensors_poll_context_t::setDelay(int handle, int64_t ns)
+{
+ FUNC_LOG;
+ return mSensor->setDelay(handle, ns);
+}
+
+int sensors_poll_context_t::pollEvents(sensors_event_t *data, int count)
+{
+ VHANDLER_LOG;
+
+ int nbEvents = 0;
+ int nb, polltime = -1;
+
+ // look for new events
+ nb = poll(mPollFds, numSensorDrivers, polltime);
+
+ if (nb > 0) {
+ for (int i = 0; count && i < numSensorDrivers; i++) {
+ if (mPollFds[i].revents & POLLIN) {
+ nb = 0;
+ if (i == mpl) {
+ nb = mSensor->readEvents(data, count);
+ }
+ else if (i == compass) {
+ nb = ((MPLSensor*) mSensor)->readCompassEvents(data, count);
+ }
+/*
+ if (nb > 0) {
+ count -= nb;
+ nbEvents += nb;
+ data += nb;
+ mPollFds[i].revents = 0;
+ }
+ */
+ }
+ }
+ nb = ((MPLSensor*) mSensor)->executeOnData(data, count);
+ if (nb > 0) {
+ count -= nb;
+ nbEvents += nb;
+ data += nb;
+ mPollFds[mpl].revents = 0;
+ mPollFds[compass].revents = 0;
+ }
+ }
+
+ return nbEvents;
+}
+
+/******************************************************************************/
+
+static int poll__close(struct hw_device_t *dev)
+{
+ FUNC_LOG;
+ sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
+ if (ctx) {
+ delete ctx;
+ }
+ return 0;
+}
+
+static int poll__activate(struct sensors_poll_device_t *dev,
+ int handle, int enabled)
+{
+ sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
+ return ctx->activate(handle, enabled);
+}
+
+static int poll__setDelay(struct sensors_poll_device_t *dev,
+ int handle, int64_t ns)
+{
+ sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
+ int s= ctx->setDelay(handle, ns);
+ return s;
+}
+
+static int poll__poll(struct sensors_poll_device_t *dev,
+ sensors_event_t* data, int count)
+{
+ sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
+ return ctx->pollEvents(data, count);
+}
+
+/******************************************************************************/
+
+/** Open a new instance of a sensor device using name */
+static int open_sensors(const struct hw_module_t* module, const char* id,
+ struct hw_device_t** device)
+{
+ FUNC_LOG;
+ int status = -EINVAL;
+ sensors_poll_context_t *dev = new sensors_poll_context_t();
+
+ memset(&dev->device, 0, sizeof(sensors_poll_device_t));
+
+ dev->device.common.tag = HARDWARE_DEVICE_TAG;
+ dev->device.common.version = 0;
+ dev->device.common.module = const_cast<hw_module_t*>(module);
+ dev->device.common.close = poll__close;
+ dev->device.activate = poll__activate;
+ dev->device.setDelay = poll__setDelay;
+ dev->device.poll = poll__poll;
+
+ *device = &dev->device.common;
+ status = 0;
+
+ return status;
+}
diff --git a/libsensors_iio/software/build/android/common.mk b/libsensors_iio/software/build/android/common.mk
index 84e7e9b..b84a99c 100644
--- a/libsensors_iio/software/build/android/common.mk
+++ b/libsensors_iio/software/build/android/common.mk
@@ -4,9 +4,6 @@ SHELL = /bin/bash
####################################################################################################
## defines
-# Build for Jellybean
-BUILD_ANDROID_JELLYBEAN = 1
-
## libraries ##
LIB_PREFIX = lib
@@ -19,39 +16,23 @@ TARGET ?= android
MLLITE_LIB_NAME ?= mllite
MPL_LIB_NAME ?= mplmpu
+HALWRAPPER_LIB_NAME ?= androidhal
## applications ##
SHARED_APP_SUFFIX = -shared
STATIC_APP_SUFFIX = -static
####################################################################################################
-## compile, includes, and linker
-
-ifeq ($(BUILD_ANDROID_JELLYBEAN),1)
-ANDROID_COMPILE = -DANDROID_JELLYBEAN=1
-endif
+## includes and linker
-ANDROID_LINK = -nostdlib
-ANDROID_LINK += -fpic
-ANDROID_LINK += -Wl,--gc-sections
-ANDROID_LINK += -Wl,--no-whole-archive
+ANDROID_LINK = -L$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/system/lib
ANDROID_LINK += -L$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib
-ANDROID_LINK += -L$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/system/lib
-
-ANDROID_LINK_EXECUTABLE = $(ANDROID_LINK)
-ANDROID_LINK_EXECUTABLE += -Wl,-dynamic-linker,/system/bin/linker
-ifneq ($(BUILD_ANDROID_JELLYBEAN),1)
-ANDROID_LINK_EXECUTABLE += -Wl,-T,$(ANDROID_ROOT)/build/core/armelf.x
-endif
-ANDROID_LINK_EXECUTABLE += $(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib/crtbegin_dynamic.o
-ANDROID_LINK_EXECUTABLE += $(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib/crtend_android.o
ANDROID_INCLUDES = -I$(ANDROID_ROOT)/system/core/include
ANDROID_INCLUDES += -I$(ANDROID_ROOT)/hardware/libhardware/include
ANDROID_INCLUDES += -I$(ANDROID_ROOT)/hardware/ril/include
ANDROID_INCLUDES += -I$(ANDROID_ROOT)/dalvik/libnativehelper/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/frameworks/base/include # ICS
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/frameworks/native/include # Jellybean
+ANDROID_INCLUDES += -I$(ANDROID_ROOT)/frameworks/base/include
ANDROID_INCLUDES += -I$(ANDROID_ROOT)/external/skia/include
ANDROID_INCLUDES += -I$(ANDROID_ROOT)/out/target/product/generic/obj/include
ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libc/arch-arm/include
diff --git a/libsensors_iio/software/build/android/shared.mk b/libsensors_iio/software/build/android/shared.mk
index 47dedfe..bc8548c 100644
--- a/libsensors_iio/software/build/android/shared.mk
+++ b/libsensors_iio/software/build/android/shared.mk
@@ -22,9 +22,9 @@ LIB_FOLDERS = $(INV_ROOT)/core/mllite/build/$(TARGET)
ifeq ($(BUILD_MPL),1)
LIB_FOLDERS += $(INV_ROOT)/core/mpl/build/$(TARGET)
endif
-APP_FOLDERS = $(INV_ROOT)/simple_apps/mpu_iio/build/$(TARGET)
+APP_FOLDERS = $(INV_ROOT)/simple_apps/console/linux/build/$(TARGET)
+APP_FOLDERS += $(INV_ROOT)/simple_apps/input_sub/build/$(TARGET)
APP_FOLDERS += $(INV_ROOT)/simple_apps/self_test/build/$(TARGET)
-APP_FOLDERS += $(INV_ROOT)/simple_apps/gesture_test/build/$(TARGET)
INSTALL_DIR = $(CURDIR)
diff --git a/libsensors_iio/software/core/HAL/include/inv_sysfs_utils.h b/libsensors_iio/software/core/HAL/include/inv_sysfs_utils.h
new file mode 100644
index 0000000..fce28ae
--- /dev/null
+++ b/libsensors_iio/software/core/HAL/include/inv_sysfs_utils.h
@@ -0,0 +1,83 @@
+/**
+ * @brief Provides helpful file IO wrappers for use with sysfs.
+ * @details Based on Jonathan Cameron's @e iio_utils.h.
+ */
+
+#ifndef _INV_SYSFS_UTILS_H_
+#define _INV_SYSFS_UTILS_H_
+
+/**
+ * struct inv_sysfs_names_s - Files needed by user applications.
+ * @buffer: Ring buffer attached to FIFO.
+ * @enable: Turns on HW-to-ring buffer flow.
+ * @raw_data: Raw data from registers.
+ * @temperature: Temperature data from register.
+ * @fifo_rate: FIFO rate/ODR.
+ * @power_state: Power state (this is a five-star comment).
+ * @fsr: Full-scale range.
+ * @lpf: Digital low pass filter.
+ * @scale: LSBs / dps (or LSBs / Gs).
+ * @temp_scale: LSBs / degrees C.
+ * @temp_offset: Offset in LSBs.
+ */
+struct inv_sysfs_names_s {
+
+ //Sysfs for ITG3500 & MPU6050
+ const char *buffer;
+ const char *enable;
+ const char *raw_data; //Raw Gyro data
+ const char *temperature;
+ const char *fifo_rate;
+ const char *power_state;
+ const char *fsr;
+ const char *lpf;
+ const char *scale; //Gyro scale
+ const char *temp_scale;
+ const char *temp_offset;
+ const char *self_test;
+ //Starting Sysfs available for MPU6050 only
+ const char *accel_en;
+ const char *accel_fifo_en;
+ const char *accel_fs;
+ const char *clock_source;
+ const char *early_suspend_en;
+ const char *firmware_loaded;
+ const char *gyro_en;
+ const char *gyro_fifo_en;
+ const char *key;
+ const char *raw_accel;
+ const char *reg_dump;
+ const char *tap_on;
+ const char *dmp_firmware;
+};
+
+/* File IO. Typically won't be called directly by user application, but they'll
+ * be here for your enjoyment.
+ */
+int inv_sysfs_write(char *filename, long data);
+int inv_sysfs_read(char *filename, long num_bytes, char *data);
+
+/* Helper APIs to extract specific data. */
+int inv_read_buffer(int fd, long *data, long long *timestamp);
+int inv_read_raw(const struct inv_sysfs_names_s *names, long *data,
+ long long *timestamp);
+int inv_read_temperature_raw(const struct inv_sysfs_names_s *names, short *data,
+ long long *timestamp);
+int inv_read_fifo_rate(const struct inv_sysfs_names_s *names, short *data);
+int inv_read_power_state(const struct inv_sysfs_names_s *names, char *data);
+int inv_read_scale(const struct inv_sysfs_names_s *names, float *data);
+int inv_read_temp_scale(const struct inv_sysfs_names_s *names, short *data);
+int inv_read_temp_offset(const struct inv_sysfs_names_s *names, short *data);
+int inv_write_fifo_rate(const struct inv_sysfs_names_s *names, short data);
+int inv_write_buffer_enable(const struct inv_sysfs_names_s *names, char data);
+int inv_write_power_state(const struct inv_sysfs_names_s *names, char data);
+
+/* Scaled data. */
+int inv_read_q16(const struct inv_sysfs_names_s *names, long *data,
+ long long *timestamp);
+int inv_read_temp_q16(const struct inv_sysfs_names_s *names, long *data,
+ long long *timestamp);
+
+#endif /* #ifndef _INV_SYSFS_UTILS_H_ */
+
+
diff --git a/libsensors_iio/software/core/HAL/include/mlos.h b/libsensors_iio/software/core/HAL/include/mlos.h
new file mode 100644
index 0000000..ce06b07
--- /dev/null
+++ b/libsensors_iio/software/core/HAL/include/mlos.h
@@ -0,0 +1,104 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+
+#ifndef _MLOS_H
+#define _MLOS_H
+
+#ifndef __KERNEL__
+#include <stdio.h>
+#endif
+
+#include "mltypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(LINUX) || defined(__KERNEL__)
+typedef unsigned int HANDLE;
+#endif
+
+ /* ------------ */
+ /* - Defines. - */
+ /* ------------ */
+
+ /* - MLOSCreateFile defines. - */
+
+#define MLOS_GENERIC_READ ((unsigned int)0x80000000)
+#define MLOS_GENERIC_WRITE ((unsigned int)0x40000000)
+#define MLOS_FILE_SHARE_READ ((unsigned int)0x00000001)
+#define MLOS_FILE_SHARE_WRITE ((unsigned int)0x00000002)
+#define MLOS_OPEN_EXISTING ((unsigned int)0x00000003)
+
+ /* ---------- */
+ /* - Enums. - */
+ /* ---------- */
+
+ /* --------------- */
+ /* - Structures. - */
+ /* --------------- */
+
+ /* --------------------- */
+ /* - Function p-types. - */
+ /* --------------------- */
+
+#ifndef __KERNEL__
+#include <string.h>
+ void *inv_malloc(unsigned int numBytes);
+ inv_error_t inv_free(void *ptr);
+ inv_error_t inv_create_mutex(HANDLE *mutex);
+ inv_error_t inv_lock_mutex(HANDLE mutex);
+ inv_error_t inv_unlock_mutex(HANDLE mutex);
+ FILE *inv_fopen(char *filename);
+ void inv_fclose(FILE *fp);
+
+ // Binary Semaphore
+ inv_error_t inv_create_binary_semaphore(HANDLE *semaphore);
+ inv_error_t inv_destroy_binary_semaphore(HANDLE handle);
+ inv_error_t inv_increment_binary_semaphore(HANDLE handle);
+ inv_error_t inv_decrement_binary_semaphore(HANDLE handle, long timeout_ms);
+
+ inv_error_t inv_destroy_mutex(HANDLE handle);
+
+ void inv_sleep(int mSecs);
+ inv_time_t inv_get_tick_count(void);
+
+ /* Kernel implmentations */
+#define GFP_KERNEL (0x70)
+ static inline void *kmalloc(size_t size,
+ unsigned int gfp_flags)
+ {
+ (void)gfp_flags;
+ return inv_malloc((unsigned int)size);
+ }
+ static inline void *kzalloc(size_t size, unsigned int gfp_flags)
+ {
+ void *tmp = inv_malloc((unsigned int)size);
+ (void)gfp_flags;
+ if (tmp)
+ memset(tmp, 0, size);
+ return tmp;
+ }
+ static inline void kfree(void *ptr)
+ {
+ inv_free(ptr);
+ }
+ static inline void msleep(long msecs)
+ {
+ inv_sleep(msecs);
+ }
+ static inline void udelay(unsigned long usecs)
+ {
+ inv_sleep((usecs + 999) / 1000);
+ }
+#else
+#include <linux/delay.h>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _MLOS_H */
diff --git a/libsensors_iio/software/core/HAL/linux/inv_sysfs_utils.c b/libsensors_iio/software/core/HAL/linux/inv_sysfs_utils.c
new file mode 100644
index 0000000..c45badd
--- /dev/null
+++ b/libsensors_iio/software/core/HAL/linux/inv_sysfs_utils.c
@@ -0,0 +1,317 @@
+/**
+ * @brief Provides helpful file IO wrappers for use with sysfs.
+ * @details Based on Jonathan Cameron's @e iio_utils.h.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <dirent.h>
+#include <errno.h>
+#include <unistd.h>
+#include "inv_sysfs_utils.h"
+
+/* General TODO list:
+ * Select more reasonable string lengths or use fseek and malloc.
+ */
+
+/**
+ * inv_sysfs_write() - Write an integer to a file.
+ * @filename: Path to file.
+ * @data: Value to write to file.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_sysfs_write(char *filename, long data)
+{
+ FILE *fp;
+ int count;
+
+ if (!filename)
+ return -1;
+ fp = fopen(filename, "w");
+ if (!fp)
+ return -errno;
+ count = fprintf(fp, "%ld", data);
+ fclose(fp);
+ return count;
+}
+
+/**
+ * inv_sysfs_read() - Read a string from a file.
+ * @filename: Path to file.
+ * @num_bytes: Number of bytes to read.
+ * @data: Data from file.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_sysfs_read(char *filename, long num_bytes, char *data)
+{
+ FILE *fp;
+ int count;
+
+ if (!filename)
+ return -1;
+ fp = fopen(filename, "r");
+ if (!fp)
+ return -errno;
+ count = fread(data, 1, num_bytes, fp);
+ fclose(fp);
+ return count;
+}
+
+/**
+ * inv_read_buffer() - Read data from ring buffer.
+ * @fd: File descriptor for buffer file.
+ * @data: Data in hardware units.
+ * @timestamp: Time when data was read from device. Use NULL if unsupported.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_read_buffer(int fd, long *data, long long *timestamp)
+{
+ char str[35];
+ int count;
+
+ count = read(fd, str, sizeof(str));
+ if (!count)
+ return count;
+ if (!timestamp)
+ count = sscanf(str, "%ld%ld%ld", &data[0], &data[1], &data[2]);
+ else
+ count = sscanf(str, "%ld%ld%ld%lld", &data[0], &data[1],
+ &data[2], timestamp);
+
+ if (count < (timestamp?4:3))
+ return -EAGAIN;
+ return count;
+}
+
+/**
+ * inv_read_raw() - Read raw data.
+ * @names: Names of sysfs files.
+ * @data: Data in hardware units.
+ * @timestamp: Time when data was read from device. Use NULL if unsupported.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_read_raw(const struct inv_sysfs_names_s *names, long *data,
+ long long *timestamp)
+{
+ char str[40];
+ int count;
+
+ count = inv_sysfs_read((char*)names->raw_data, sizeof(str), str);
+ if (count < 0)
+ return count;
+ if (!timestamp)
+ count = sscanf(str, "%ld%ld%ld", &data[0], &data[1], &data[2]);
+ else
+ count = sscanf(str, "%ld%ld%ld%lld", &data[0], &data[1],
+ &data[2], timestamp);
+ if (count < (timestamp?4:3))
+ return -EAGAIN;
+ return count;
+}
+
+/**
+ * inv_read_temperature_raw() - Read temperature.
+ * @names: Names of sysfs files.
+ * @data: Data in hardware units.
+ * @timestamp: Time when data was read from device.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_read_temperature_raw(const struct inv_sysfs_names_s *names, short *data,
+ long long *timestamp)
+{
+ char str[25];
+ int count;
+
+ count = inv_sysfs_read((char*)names->temperature, sizeof(str), str);
+ if (count < 0)
+ return count;
+ count = sscanf(str, "%hd%lld", &data[0], timestamp);
+ if (count < 2)
+ return -EAGAIN;
+ return count;
+}
+
+/**
+ * inv_read_fifo_rate() - Read fifo rate.
+ * @names: Names of sysfs files.
+ * @data: Fifo rate.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_read_fifo_rate(const struct inv_sysfs_names_s *names, short *data)
+{
+ char str[8];
+ int count;
+
+ count = inv_sysfs_read((char*)names->fifo_rate, sizeof(str), str);
+ if (count < 0)
+ return count;
+ count = sscanf(str, "%hd", data);
+ if (count < 1)
+ return -EAGAIN;
+ return count;
+}
+
+/**
+ * inv_read_power_state() - Read power state.
+ * @names: Names of sysfs files.
+ * @data: 1 if device is on.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_read_power_state(const struct inv_sysfs_names_s *names, char *data)
+{
+ char str[2];
+ int count;
+
+ count = inv_sysfs_read((char*)names->power_state, sizeof(str), str);
+ if (count < 0)
+ return count;
+ count = sscanf(str, "%hd", (short*)data);
+ if (count < 1)
+ return -EAGAIN;
+ return count;
+}
+
+/**
+ * inv_read_scale() - Read scale.
+ * @names: Names of sysfs files.
+ * @data: 1 if device is on.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_read_scale(const struct inv_sysfs_names_s *names, float *data)
+{
+ char str[5];
+ int count;
+
+ count = inv_sysfs_read((char*)names->scale, sizeof(str), str);
+ if (count < 0)
+ return count;
+ count = sscanf(str, "%f", data);
+ if (count < 1)
+ return -EAGAIN;
+ return count;
+}
+
+/**
+ * inv_read_temp_scale() - Read temperature scale.
+ * @names: Names of sysfs files.
+ * @data: 1 if device is on.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_read_temp_scale(const struct inv_sysfs_names_s *names, short *data)
+{
+ char str[4];
+ int count;
+
+ count = inv_sysfs_read((char*)names->temp_scale, sizeof(str), str);
+ if (count < 0)
+ return count;
+ count = sscanf(str, "%hd", data);
+ if (count < 1)
+ return -EAGAIN;
+ return count;
+}
+
+/**
+ * inv_read_temp_offset() - Read temperature offset.
+ * @names: Names of sysfs files.
+ * @data: 1 if device is on.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_read_temp_offset(const struct inv_sysfs_names_s *names, short *data)
+{
+ char str[4];
+ int count;
+
+ count = inv_sysfs_read((char*)names->temp_offset, sizeof(str), str);
+ if (count < 0)
+ return count;
+ count = sscanf(str, "%hd", data);
+ if (count < 1)
+ return -EAGAIN;
+ return count;
+}
+
+/**
+ * inv_read_q16() - Get data as q16 fixed point.
+ * @names: Names of sysfs files.
+ * @data: 1 if device is on.
+ * @timestamp: Time when data was read from device.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_read_q16(const struct inv_sysfs_names_s *names, long *data,
+ long long *timestamp)
+{
+ int count;
+ short raw[3];
+ float scale;
+ count = inv_read_raw(names, (long*)raw, timestamp);
+ count += inv_read_scale(names, &scale);
+ data[0] = (long)(raw[0] * (65536.f / scale));
+ data[1] = (long)(raw[1] * (65536.f / scale));
+ data[2] = (long)(raw[2] * (65536.f / scale));
+ return count;
+}
+
+/**
+ * inv_read_q16() - Get temperature data as q16 fixed point.
+ * @names: Names of sysfs files.
+ * @data: 1 if device is on.
+ * @timestamp: Time when data was read from device.
+ * Returns number of bytes read or a negative error code.
+ */
+int inv_read_temp_q16(const struct inv_sysfs_names_s *names, long *data,
+ long long *timestamp)
+{
+ int count = 0;
+ short raw;
+ static short scale, offset;
+ static unsigned char first_read = 1;
+
+ if (first_read) {
+ count += inv_read_temp_scale(names, &scale);
+ count += inv_read_temp_offset(names, &offset);
+ first_read = 0;
+ }
+ count += inv_read_temperature_raw(names, &raw, timestamp);
+ data[0] = (long)((35 + ((float)(raw - offset) / scale)) * 65536.f);
+
+ return count;
+}
+
+/**
+ * inv_write_fifo_rate() - Write fifo rate.
+ * @names: Names of sysfs files.
+ * @data: Fifo rate.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_write_fifo_rate(const struct inv_sysfs_names_s *names, short data)
+{
+ return inv_sysfs_write((char*)names->fifo_rate, (long)data);
+}
+
+/**
+ * inv_write_buffer_enable() - Enable/disable buffer in /dev.
+ * @names: Names of sysfs files.
+ * @data: Fifo rate.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_write_buffer_enable(const struct inv_sysfs_names_s *names, char data)
+{
+ return inv_sysfs_write((char*)names->enable, (long)data);
+}
+
+/**
+ * inv_write_power_state() - Turn device on/off.
+ * @names: Names of sysfs files.
+ * @data: 1 to turn on.
+ * Returns number of bytes written or a negative error code.
+ */
+int inv_write_power_state(const struct inv_sysfs_names_s *names, char data)
+{
+ return inv_sysfs_write((char*)names->power_state, (long)data);
+}
+
+
diff --git a/libsensors_iio/software/core/HAL/linux/mlos_linux.c b/libsensors_iio/software/core/HAL/linux/mlos_linux.c
new file mode 100644
index 0000000..75f062e
--- /dev/null
+++ b/libsensors_iio/software/core/HAL/linux/mlos_linux.c
@@ -0,0 +1,194 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+/*******************************************************************************
+ *
+ * $Id: mlos_linux.c 5629 2011-06-11 03:13:08Z mcaramello $
+ *
+ *******************************************************************************/
+
+/**
+ * @defgroup MLOS
+ * @brief OS Interface.
+ *
+ * @{
+ * @file mlos.c
+ * @brief OS Interface.
+**/
+
+/* ------------- */
+/* - Includes. - */
+/* ------------- */
+
+#include <sys/time.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <stdlib.h>
+
+#include "stdint_invensense.h"
+
+#include "mlos.h"
+#include <errno.h>
+
+
+/* -------------- */
+/* - Functions. - */
+/* -------------- */
+
+/**
+ * @brief Allocate space
+ * @param numBytes number of bytes
+ * @return pointer to allocated space
+**/
+void *inv_malloc(unsigned int numBytes)
+{
+ // Allocate space.
+ void *allocPtr = malloc(numBytes);
+ return allocPtr;
+}
+
+
+/**
+ * @brief Free allocated space
+ * @param ptr pointer to space to deallocate
+ * @return error code.
+**/
+inv_error_t inv_free(void *ptr)
+{
+ // Deallocate space.
+ free(ptr);
+
+ return INV_SUCCESS;
+}
+
+
+/**
+ * @brief Mutex create function
+ * @param mutex pointer to mutex handle
+ * @return error code.
+ */
+inv_error_t inv_create_mutex(HANDLE *mutex)
+{
+ int res;
+ pthread_mutex_t *pm = malloc(sizeof(pthread_mutex_t));
+ if(pm == NULL)
+ return INV_ERROR;
+
+ res = pthread_mutex_init(pm, NULL);
+ if(res == -1) {
+ free(pm);
+ return INV_ERROR_OS_CREATE_FAILED;
+ }
+
+ *mutex = (HANDLE)pm;
+
+ return INV_SUCCESS;
+}
+
+
+/**
+ * @brief Mutex lock function
+ * @param mutex Mutex handle
+ * @return error code.
+ */
+inv_error_t inv_lock_mutex(HANDLE mutex)
+{
+ int res;
+ pthread_mutex_t *pm = (pthread_mutex_t*)mutex;
+
+ res = pthread_mutex_lock(pm);
+ if(res == -1)
+ return INV_ERROR_OS_LOCK_FAILED;
+
+ return INV_SUCCESS;
+}
+
+
+/**
+ * @brief Mutex unlock function
+ * @param mutex mutex handle
+ * @return error code.
+**/
+inv_error_t inv_unlock_mutex(HANDLE mutex)
+{
+ int res;
+ pthread_mutex_t *pm = (pthread_mutex_t*)mutex;
+
+ res = pthread_mutex_unlock(pm);
+ if(res == -1)
+ return INV_ERROR_OS_LOCK_FAILED;
+
+ return INV_SUCCESS;
+}
+
+
+/**
+ * @brief open file
+ * @param filename name of the file to open.
+ * @return error code.
+ */
+FILE *inv_fopen(char *filename)
+{
+ FILE *fp = fopen(filename,"r");
+ return fp;
+}
+
+
+/**
+ * @brief close the file.
+ * @param fp handle to file to close.
+ * @return error code.
+ */
+void inv_fclose(FILE *fp)
+{
+ fclose(fp);
+}
+
+/**
+ * @brief Close Handle
+ * @param handle handle to the resource.
+ * @return Zero if success, an error code otherwise.
+ */
+inv_error_t inv_destroy_mutex(HANDLE handle)
+{
+ int error;
+ pthread_mutex_t *pm = (pthread_mutex_t*)handle;
+ error = pthread_mutex_destroy(pm);
+ if (error) {
+ return errno;
+ }
+ free((void*) handle);
+
+ return INV_SUCCESS;}
+
+
+/**
+ * @brief Sleep function.
+ */
+void inv_sleep(int mSecs)
+{
+ usleep(mSecs*1000);
+}
+
+
+/**
+ * @brief get system's internal tick count.
+ * Used for time reference.
+ * @return current tick count.
+ */
+unsigned long inv_get_tick_count()
+{
+ struct timeval tv;
+
+ if (gettimeofday(&tv, NULL) !=0)
+ return 0;
+
+ return (long)((tv.tv_sec * 1000000LL + tv.tv_usec) / 1000LL);
+}
+
+ /**********************/
+ /** @} */ /* defgroup */
+/**********************/
+
diff --git a/libsensors_iio/software/core/driver/include/linux/mpu.h b/libsensors_iio/software/core/driver/include/linux/mpu.h
index 4391226..9b29695 100644
--- a/libsensors_iio/software/core/driver/include/linux/mpu.h
+++ b/libsensors_iio/software/core/driver/include/linux/mpu.h
@@ -27,8 +27,135 @@
#ifdef __KERNEL__
#include <linux/types.h>
#include <linux/ioctl.h>
+#elif defined LINUX
+#include <sys/ioctl.h>
+#include <linux/types.h>
+#else
+#include "mltypes.h"
#endif
+struct mpu_read_write {
+ /* Memory address or register address depending on ioctl */
+ __u16 address;
+ __u16 length;
+ __u8 *data;
+};
+
+enum mpuirq_data_type {
+ MPUIRQ_DATA_TYPE_MPU_DATA_READY_IRQ,
+ MPUIRQ_DATA_TYPE_MPU_FIFO_READY_IRQ,
+ MPUIRQ_DATA_TYPE_SLAVE_IRQ,
+ MPUIRQ_DATA_TYPE_PM_EVENT,
+ MPUIRQ_DATA_TYPE_NUM_TYPES,
+};
+
+/* User space PM event notification */
+#define MPU_PM_EVENT_SUSPEND_PREPARE (3)
+#define MPU_PM_EVENT_POST_SUSPEND (4)
+
+/**
+ * struct mpuirq_data - structure to report what and when
+ * @interruptcount : The number of times this IRQ has occured since open
+ * @irqtime : monotonic time of the IRQ in ns
+ * @data_type : The type of this IRQ enum mpuirq_data_type
+ * @data : Data associated with this IRQ
+ */
+struct mpuirq_data {
+ __u32 interruptcount;
+ __s64 irqtime_ns;
+ __u32 data_type;
+ __s32 data;
+};
+
+enum ext_slave_config_key {
+ /* TODO: Remove these first six. */
+ MPU_SLAVE_CONFIG_ODR_SUSPEND,
+ MPU_SLAVE_CONFIG_ODR_RESUME,
+ MPU_SLAVE_CONFIG_FSR_SUSPEND,
+ MPU_SLAVE_CONFIG_FSR_RESUME,
+ MPU_SLAVE_CONFIG_IRQ_SUSPEND,
+ MPU_SLAVE_CONFIG_IRQ_RESUME,
+ MPU_SLAVE_CONFIG_ODR,
+ MPU_SLAVE_CONFIG_FSR,
+ MPU_SLAVE_CONFIG_MOT_THS,
+ MPU_SLAVE_CONFIG_NMOT_THS,
+ MPU_SLAVE_CONFIG_MOT_DUR,
+ MPU_SLAVE_CONFIG_NMOT_DUR,
+ MPU_SLAVE_CONFIG_IRQ,
+ MPU_SLAVE_WRITE_REGISTERS,
+ MPU_SLAVE_READ_REGISTERS,
+ MPU_SLAVE_CONFIG_INTERNAL_REFERENCE,
+ /* AMI 306 specific config keys */
+ MPU_SLAVE_PARAM,
+ MPU_SLAVE_WINDOW,
+ MPU_SLAVE_READWINPARAMS,
+ MPU_SLAVE_SEARCHOFFSET,
+ /* MPU3050 and MPU6050 Keys */
+ MPU_SLAVE_INT_CONFIG,
+ MPU_SLAVE_EXT_SYNC,
+ MPU_SLAVE_FULL_SCALE,
+ MPU_SLAVE_LPF,
+ MPU_SLAVE_CLK_SRC,
+ MPU_SLAVE_DIVIDER,
+ MPU_SLAVE_DMP_ENABLE,
+ MPU_SLAVE_FIFO_ENABLE,
+ MPU_SLAVE_DMP_CFG1,
+ MPU_SLAVE_DMP_CFG2,
+ MPU_SLAVE_TC,
+ MPU_SLAVE_GYRO,
+ MPU_SLAVE_ADDR,
+ MPU_SLAVE_PRODUCT_REVISION,
+ MPU_SLAVE_SILICON_REVISION,
+ MPU_SLAVE_PRODUCT_ID,
+ MPU_SLAVE_GYRO_SENS_TRIM,
+ MPU_SLAVE_ACCEL_SENS_TRIM,
+ MPU_SLAVE_RAM,
+ /* -------------------------- */
+ MPU_SLAVE_CONFIG_NUM_CONFIG_KEYS
+};
+
+/* For the MPU_SLAVE_CONFIG_IRQ_SUSPEND and MPU_SLAVE_CONFIG_IRQ_RESUME */
+enum ext_slave_config_irq_type {
+ MPU_SLAVE_IRQ_TYPE_NONE,
+ MPU_SLAVE_IRQ_TYPE_MOTION,
+ MPU_SLAVE_IRQ_TYPE_DATA_READY,
+};
+
+/* Structure for the following IOCTS's
+ * MPU_CONFIG_GYRO
+ * MPU_CONFIG_ACCEL
+ * MPU_CONFIG_COMPASS
+ * MPU_CONFIG_PRESSURE
+ * MPU_GET_CONFIG_GYRO
+ * MPU_GET_CONFIG_ACCEL
+ * MPU_GET_CONFIG_COMPASS
+ * MPU_GET_CONFIG_PRESSURE
+ *
+ * @key one of enum ext_slave_config_key
+ * @len length of data pointed to by data
+ * @apply zero if communication with the chip is not necessary, false otherwise
+ * This flag can be used to select cached data or to refresh cashed data
+ * cache data to be pushed later or push immediately. If true and the
+ * slave is on the secondary bus the MPU will first enger bypass mode
+ * before calling the slaves .config or .get_config funcion
+ * @data pointer to the data to confgure or get
+ */
+struct ext_slave_config {
+ __u8 key;
+ __u16 len;
+ __u8 apply;
+ void *data;
+};
+
+enum ext_slave_type {
+ EXT_SLAVE_TYPE_GYROSCOPE,
+ EXT_SLAVE_TYPE_ACCEL,
+ EXT_SLAVE_TYPE_COMPASS,
+ EXT_SLAVE_TYPE_PRESSURE,
+ /*EXT_SLAVE_TYPE_TEMPERATURE */
+
+ EXT_SLAVE_NUM_TYPES
+};
enum secondary_slave_type {
SECONDARY_SLAVE_TYPE_NONE,
SECONDARY_SLAVE_TYPE_ACCEL,
@@ -77,6 +204,127 @@ enum ext_slave_id {
};
#define INV_PROD_KEY(ver, rev) (ver * 100 + rev)
+
+enum ext_slave_endian {
+ EXT_SLAVE_BIG_ENDIAN,
+ EXT_SLAVE_LITTLE_ENDIAN,
+ EXT_SLAVE_FS8_BIG_ENDIAN,
+ EXT_SLAVE_FS16_BIG_ENDIAN,
+};
+
+enum ext_slave_bus {
+ EXT_SLAVE_BUS_INVALID = -1,
+ EXT_SLAVE_BUS_PRIMARY = 0,
+ EXT_SLAVE_BUS_SECONDARY = 1
+};
+
+
+/**
+ * struct ext_slave_platform_data - Platform data for mpu3050 and mpu6050
+ * slave devices
+ *
+ * @type: the type of slave device based on the enum ext_slave_type
+ * definitions.
+ * @irq: the irq number attached to the slave if any.
+ * @adapt_num: the I2C adapter number.
+ * @bus: the bus the slave is attached to: enum ext_slave_bus
+ * @address: the I2C slave address of the slave device.
+ * @orientation: the mounting matrix of the device relative to MPU.
+ * @irq_data: private data for the slave irq handler
+ * @private_data: additional data, user customizable. Not touched by the MPU
+ * driver.
+ *
+ * The orientation matricies are 3x3 rotation matricies
+ * that are applied to the data to rotate from the mounting orientation to the
+ * platform orientation. The values must be one of 0, 1, or -1 and each row and
+ * column should have exactly 1 non-zero value.
+ */
+struct ext_slave_platform_data {
+ __u8 type;
+ __u32 irq;
+ __u32 adapt_num;
+ __u32 bus;
+ __u8 address;
+ __s8 orientation[9];
+ void *irq_data;
+ void *private_data;
+};
+
+struct fix_pnt_range {
+ __s32 mantissa;
+ __s32 fraction;
+};
+
+static inline long range_fixedpoint_to_long_mg(struct fix_pnt_range rng)
+{
+ return (long)(rng.mantissa * 1000 + rng.fraction / 10);
+}
+
+struct ext_slave_read_trigger {
+ __u8 reg;
+ __u8 value;
+};
+
+/**
+ * struct ext_slave_descr - Description of the slave device for programming.
+ *
+ * @suspend: function pointer to put the device in suspended state
+ * @resume: function pointer to put the device in running state
+ * @read: function that reads the device data
+ * @init: function used to preallocate memory used by the driver
+ * @exit: function used to free memory allocated for the driver
+ * @config: function used to configure the device
+ * @get_config:function used to get the device's configuration
+ *
+ * @name: text name of the device
+ * @type: device type. enum ext_slave_type
+ * @id: enum ext_slave_id
+ * @read_reg: starting register address to retrieve data.
+ * @read_len: length in bytes of the sensor data. Typically 6.
+ * @endian: byte order of the data. enum ext_slave_endian
+ * @range: full scale range of the slave ouput: struct fix_pnt_range
+ * @trigger: If reading data first requires writing a register this is the
+ * data to write.
+ *
+ * Defines the functions and information about the slave the mpu3050 and
+ * mpu6050 needs to use the slave device.
+ */
+struct ext_slave_descr {
+ int (*init) (void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata);
+ int (*exit) (void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata);
+ int (*suspend) (void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata);
+ int (*resume) (void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata);
+ int (*read) (void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata,
+ __u8 *data);
+ int (*config) (void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata,
+ struct ext_slave_config *config);
+ int (*get_config) (void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata,
+ struct ext_slave_config *config);
+
+ char *name;
+ __u8 type;
+ __u8 id;
+ __u8 read_reg;
+ __u8 read_len;
+ __u8 endian;
+ struct fix_pnt_range range;
+ struct ext_slave_read_trigger *trigger;
+};
+
/**
* struct mpu_platform_data - Platform data for the mpu driver
* @int_config: Bits [7:3] of the int config register.
@@ -86,7 +334,6 @@ enum ext_slave_id {
* @sec_slave_id: id of the secondary slave device
* @secondary_i2c_address: secondary device's i2c address
* @secondary_orientation: secondary device's orientation matrix
- * @key: key for MPL library.
*
* Contains platform specific information on how to configure the MPU3050 to
* work on this platform. The orientation matricies are 3x3 rotation matricies
diff --git a/libsensors_iio/software/core/driver/include/log.h b/libsensors_iio/software/core/driver/include/log.h
index 97e5b2f..74c49f3 100644
--- a/libsensors_iio/software/core/driver/include/log.h
+++ b/libsensors_iio/software/core/driver/include/log.h
@@ -37,8 +37,8 @@
#ifndef _LIBS_CUTILS_MPL_LOG_H
#define _LIBS_CUTILS_MPL_LOG_H
-#include <stdlib.h>
#include <stdarg.h>
+#include "local_log_def.h"
#ifdef ANDROID
#ifdef NDK_BUILD
@@ -56,10 +56,6 @@
extern "C" {
#endif
-#if defined ANDROID_JELLYBEAN
-#define LOG ALOG
-#endif
-
/* --------------------------------------------------------------------- */
/*
@@ -291,7 +287,7 @@ extern "C" {
#ifndef MPL_LOG_PRI
#ifdef ANDROID
#define MPL_LOG_PRI(priority, tag, fmt, ...) \
- ALOG(priority, tag, fmt, ##__VA_ARGS__)
+ LOG(priority, tag, fmt, ##__VA_ARGS__)
#elif defined __KERNEL__
#define MPL_LOG_PRI(priority, tag, fmt, ...) \
pr_debug(MPL_##priority tag fmt, ##__VA_ARGS__)
diff --git a/libsensors_iio/software/core/mllite/CMakeLists.txt b/libsensors_iio/software/core/mllite/CMakeLists.txt
new file mode 100644
index 0000000..8650553
--- /dev/null
+++ b/libsensors_iio/software/core/mllite/CMakeLists.txt
@@ -0,0 +1,39 @@
+## CMakeLists for mlsdk/mldmp
+
+project(mldmp C)
+
+if (NOT CMAKE_BUILD_ENGINEERING)
+
+# # just copy the library from mldmp/mpl/$PLATFORM to mldmp/
+# if (CMAKE_SYSTEM_NAME MATCHES Windows)
+# execute_process(
+# COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/mpl/win32/mpl.lib ${CMAKE_CURRENT_BINARY_DIR}/mpl.lib
+# )
+# elseif (CMAKE_SYSTEM_NAME MATCHES Android)
+# execute_process(
+# COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/mpl/android/libmpl.a ${CMAKE_CURRENT_BINARY_DIR}/libmpl.a
+# )
+# elseif (CMAKE_SYSTEM_NAME MATCHES Linux)
+# message("copying ${CMAKE_CURRENT_SOURCE_DIR}/mpl/linux/libmpl.a to ${CMAKE_CURRENT_BINARY_DIR}/libmpl.a")
+# execute_process(
+# COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/mpl/linux/libmpl.a ${CMAKE_CURRENT_BINARY_DIR}/libmpl.a
+# )
+# elseif (CMAKE_SYSTEM_NAME MATCHES Catalina)
+# execute_process(
+# COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/mpl/linux/mpl.lib ${CMAKE_CURRENT_BINARY_DIR}/libmpl.a
+# )
+# endif()
+# # better way that doesn't work for now
+# # add_custom_command(
+# # TARGET mpl
+# # PRE_BUILD
+# # COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${DDF} ${CMAKE_CURRENT_BINARY_DIR}
+# # COMMAND ${CMAKE_COMMAND} ARGS -E echo "copying ${DDF}"
+# # )
+
+else (NOT CMAKE_BUILD_ENGINEERING)
+
+ set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
+ include(Engineering)
+
+endif (NOT CMAKE_BUILD_ENGINEERING)
diff --git a/libsensors_iio/software/core/mllite/Engineering.cmake b/libsensors_iio/software/core/mllite/Engineering.cmake
new file mode 100644
index 0000000..42f2429
--- /dev/null
+++ b/libsensors_iio/software/core/mllite/Engineering.cmake
@@ -0,0 +1,150 @@
+## Engineering CMakeLists for software/core/mllite
+
+include_directories(
+ .
+ ${SOLUTION_SOURCE_DIR}/core/mpl
+ ${SOLUTION_SOURCE_DIR}/core/HAL
+ ${SOLUTION_SOURCE_DIR}/driver/include
+)
+
+add_definitions (
+ -DINV_INCLUDE_LEGACY_HEADERS
+)
+
+if (CMAKE_SYSTEM_NAME MATCHES Android)
+
+ include_directories(
+ ${SOLUTION_SOURCE_DIR}/core/mllite/linux
+ ${SOLUTION_SOURCE_DIR}/driver/include/linux
+ )
+ add_definitions(
+ -DLINUX
+ -D_REENTRANT
+ )
+ set (HEADERS
+ ${HEADERS}
+ linux/mlos.h
+ linux/ml_stored_data.h
+ linux/ml_load_dmp.h
+ linux/ml_sysfs_helper.h
+ )
+ set (SOURCES
+ ${SOURCES}
+ linux/mlos_linux.c
+ linux/ml_stored_data.c
+ linux/ml_load_dmp.c
+ linux/ml_sysfs_helper.c
+ )
+
+elseif (CMAKE_SYSTEM_NAME MATCHES Linux)
+
+ add_definitions(
+ -DLINUX
+ -D_REENTRANT
+ )
+ set (HEADERS
+ ${HEADERS}
+ )
+ set (SOURCES
+ ${SOURCES}
+ )
+
+elseif (CMAKE_SYSTEM_NAME MATCHES Windows)
+
+ add_definitions(
+ -DAIO
+ -DUART_COM
+ -D_CRT_SECURE_NO_WARNINGS
+ -D_CRT_SECURE_NO_DEPRECATE
+ )
+ set (HEADERS
+ ${HEADERS}
+ )
+ set (SOURCES
+ ${SOURCES}
+ )
+
+endif ()
+
+set (HEADERS
+ ${HEADERS}
+ data_builder.h
+ hal_outputs.h
+ message_layer.h
+ ml_math_func.h
+ mpl.h
+ results_holder.h
+ start_manager.h
+ storage_manager.h
+)
+set (SOURCES
+ ${SOURCES}
+ data_builder.c
+ hal_outputs.c
+ message_layer.c
+ ml_math_func.c
+ mpl.c
+ results_holder.c
+ start_manager.c
+ storage_manager.c
+)
+
+# coveniently add this file to the resources for easy access within IDEs
+set (RESOURCES
+ Engineering.cmake
+)
+
+if (CMAKE_TESTING_SUPPORT)
+
+ message("Including Testing support")
+ include_directories(
+ ${SOLUTION_SOURCE_DIR}/mltools/debugsupport
+ )
+ add_definitions(
+ -DSELF_VERIFICATION
+ )
+ set(
+ HEADERS
+ ${HEADERS}
+ ${SOLUTION_SOURCE_DIR}/mltools/debugsupport/testsupport.h
+ )
+ set(
+ SOURCES
+ ${SOURCES}
+ ${SOLUTION_SOURCE_DIR}/mltools/debugsupport/testsupport.c
+ )
+
+endif ()
+
+############
+## TARGET ##
+############
+add_library(
+ mllite STATIC
+ ${SOURCES}
+ ${HEADERS}
+ ${RESOURCES}
+)
+set_target_properties(
+ mllite
+ PROPERTIES CLEAN_DIRECT_OUTPUT 1
+)
+
+if (CMAKE_SYSTEM_NAME MATCHES "(Android|Linux)")
+
+ add_library(
+ mllite_shared SHARED
+ ${SOURCES}
+ ${HEADERS}
+ ${RESOURCES}
+ )
+ FIX_SHARED_LIBRARY_NAME("mllite_shared" "mllite")
+
+ install (
+ TARGETS mllite_shared
+ DESTINATION lib
+ )
+
+endif ()
+
+
diff --git a/libsensors_iio/software/core/mllite/build/android/libmllite.so b/libsensors_iio/software/core/mllite/build/android/libmllite.so
deleted file mode 100644
index acd25a7..0000000
--- a/libsensors_iio/software/core/mllite/build/android/libmllite.so
+++ /dev/null
Binary files differ
diff --git a/libsensors_iio/software/core/mllite/build/android/shared.mk b/libsensors_iio/software/core/mllite/build/android/shared.mk
index 1418450..2ee2e20 100644
--- a/libsensors_iio/software/core/mllite/build/android/shared.mk
+++ b/libsensors_iio/software/core/mllite/build/android/shared.mk
@@ -15,7 +15,6 @@ MLLITE_DIR = $(INV_ROOT)/software/core/mllite
include $(INV_ROOT)/software/build/android/common.mk
CFLAGS += $(CMDLINE_CFLAGS)
-CFLAGS += $(ANDROID_COMPILE)
CFLAGS += -Wall
CFLAGS += -fpic
CFLAGS += -nostdlib
@@ -45,7 +44,12 @@ LLINK += -ldl
LFLAGS += $(CMDLINE_LFLAGS)
LFLAGS += -shared
LFLAGS += -Wl,-soname,$(LIBRARY)
-LFLAGS += -Wl,-shared,-Bsymbolic
+LFLAGS += -nostdlib
+LFLAGS += -fpic
+LFLAGS += -Wl,-T,$(ANDROID_ROOT)/build/core/armelf.xsc
+LFLAGS += -Wl,--gc-sections
+LFLAGS += -Wl,--no-whole-archive
+LFLAGS += -Wl,-shared,-Bsymbolic
LFLAGS += $(ANDROID_LINK)
LFLAGS += -Wl,-rpath,$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib:$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/system/lib
diff --git a/libsensors_iio/software/core/mllite/build/android/static.mk b/libsensors_iio/software/core/mllite/build/android/static.mk
new file mode 100644
index 0000000..6ad45de
--- /dev/null
+++ b/libsensors_iio/software/core/mllite/build/android/static.mk
@@ -0,0 +1,110 @@
+MLLITE_LIB_NAME = mllite
+LIBRARY = $(LIB_PREFIX)$(MLLITE_LIB_NAME).$(STATIC_LIB_EXT)
+
+MK_NAME = $(notdir $(CURDIR)/$(firstword $(MAKEFILE_LIST)))
+
+OBJFOLDER = $(CURDIR)/obj
+
+CROSS = arm-none-linux-gnueabi-
+COMP= $(CROSS)gcc
+LINK= $(CROSS)ar cr
+
+MLLITE_DIR = $(MLSDK_ROOT)/mllite
+MPL_DIR = $(MLSDK_ROOT)/mldmp
+MLPLATFORM_DIR = $(MLSDK_ROOT)/platform
+
+include $(MLSDK_ROOT)/Android-common.mk
+
+CFLAGS += $(CMDLINE_CFLAGS)
+CFLAGS += -Wall -fpic
+CFLAGS += -mthumb-interwork -fno-exceptions -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -fmessage-length=0
+CFLAGS += -DNDEBUG
+CFLAGS += -D_REENTRANT -DLINUX -DANDROID
+CFLAGS += -I$(MLLITE_DIR)
+CFLAGS += -I$(MLPLATFORM_DIR)/include
+CFLAGS += -I$(MLSDK_ROOT)/mlutils
+CFLAGS += -I$(MLSDK_ROOT)/mlapps/common
+CFLAGS += $(MLSDK_INCLUDES)
+CFLAGS += $(MLSDK_DEFINES)
+
+VPATH += $(MLLITE_DIR)
+VPATH += $(MLSDK_ROOT)/mlutils
+VPATH += $(MLLITE_DIR)/accel
+VPATH += $(MLLITE_DIR)/compass
+VPATH += $(MLLITE_DIR)/pressure
+VPATH += $(MLLITE_DIR)/mlapps/common
+
+####################################################################################################
+## sources
+
+ML_LIBS = $(MLPLATFORM_DIR)/linux/$(LIB_PREFIX)$(MLPLATFORM_LIB_NAME).$(STATIC_LIB_EXT)
+
+ML_SOURCES += $(MLLITE_DIR)/mldl_cfg_mpu.c
+ML_SOURCES += $(MLLITE_DIR)/mldl_cfg_init_linux.c
+ML_SOURCES += $(MLLITE_DIR)/accel.c
+ML_SOURCES += $(MLLITE_DIR)/compass.c
+ML_SOURCES += $(MLLITE_DIR)/compass_supervisor.c
+ML_SOURCES += $(MLLITE_DIR)/compass_supervisor_adv_callbacks.c
+ML_SOURCES += $(MLLITE_DIR)/key0_96.c
+ML_SOURCES += $(MLLITE_DIR)/pressure.c
+ML_SOURCES += $(MLLITE_DIR)/ml.c
+ML_SOURCES += $(MLLITE_DIR)/ml_invobj.c
+ML_SOURCES += $(MLLITE_DIR)/ml_init.c
+ML_SOURCES += $(MLLITE_DIR)/mlarray_lite.c
+ML_SOURCES += $(MLLITE_DIR)/mlarray_adv.c
+ML_SOURCES += $(MLLITE_DIR)/mlarray_legacy.c
+ML_SOURCES += $(MLLITE_DIR)/mlBiasNoMotion.c
+ML_SOURCES += $(MLLITE_DIR)/mlFIFO.c
+ML_SOURCES += $(MLLITE_DIR)/mlFIFOHW.c
+ML_SOURCES += $(MLLITE_DIR)/mlMathFunc.c
+ML_SOURCES += $(MLLITE_DIR)/mlcontrol.c
+ML_SOURCES += $(MLLITE_DIR)/mldl.c
+ML_SOURCES += $(MLLITE_DIR)/mldmp.c
+ML_SOURCES += $(MLLITE_DIR)/dmpDefault.c
+ML_SOURCES += $(MLLITE_DIR)/mlstates.c
+ML_SOURCES += $(MLLITE_DIR)/mlsupervisor.c
+ML_SOURCES += $(MLLITE_DIR)/ml_stored_data.c
+ML_SOURCES += $(MLLITE_DIR)/ustore_manager.c
+ML_SOURCES += $(MLLITE_DIR)/ustore_mlsl_io.c
+ML_SOURCES += $(MLLITE_DIR)/ustore_adv_fusion_delegate.c
+ML_SOURCES += $(MLLITE_DIR)/ustore_lite_fusion_delegate.c
+ML_SOURCES += $(MLLITE_DIR)/temp_comp_legacy.c
+ML_SOURCES += $(MLLITE_DIR)/mlSetGyroBias.c
+ML_SOURCES += $(MLSDK_ROOT)/mlutils/checksum.c
+ML_SOURCES += $(MLSDK_ROOT)/mlutils/mputest.c
+ML_SOURCES += $(MLLITE_DIR)/mldl_print_cfg.c
+ifeq ($(MPU_NAME),MPU3050)
+ML_SOURCES += $(MLSDK_ROOT)/mlutils/mpu3050test.c
+else
+ML_SOURCES += $(MLSDK_ROOT)/mlutils/mpu6050test.c
+endif
+
+ML_OBJS := $(addsuffix .o,$(ML_SOURCES))
+ML_OBJS_DST = $(addprefix $(OBJFOLDER)/,$(addsuffix .o, $(notdir $(ML_SOURCES))))
+
+####################################################################################################
+## rules
+
+.PHONY: all clean cleanall
+
+all: $(LIBRARY) $(MK_NAME)
+
+$(LIBRARY) : $(OBJFOLDER) $(ML_OBJS_DST) $(ML_LIBS) $(MK_NAME)
+ @$(call echo_in_colors, "\n<linking $(LIBRARY) with objects $(ML_OBJS_DST)\n")
+ $(LINK) $(LIBRARY) $(ML_OBJS_DST)
+ $(CROSS)ranlib $(LIBRARY)
+
+$(OBJFOLDER) :
+ @$(call echo_in_colors, "\n<creating object's folder 'obj/'>\n")
+ mkdir obj
+
+$(ML_OBJS_DST) : $(OBJFOLDER)/%.c.o : %.c $(MK_NAME)
+ @$(call echo_in_colors, "\n<compile $< to $(OBJFOLDER)/$(notdir $@)>\n")
+ $(COMP) $(CFLAGS) $(ANDROID_INCLUDES) $(KERNEL_INCLUDES) $(MLSDK_INCLUDES) -o $@ -c $<
+
+clean :
+ rm -fR $(OBJFOLDER)
+
+cleanall :
+ rm -fR $(LIBRARY) $(OBJFOLDER)
+
diff --git a/libsensors_iio/software/core/mllite/data_builder.c b/libsensors_iio/software/core/mllite/data_builder.c
index 48993bc..f70be7c 100644
--- a/libsensors_iio/software/core/mllite/data_builder.c
+++ b/libsensors_iio/software/core/mllite/data_builder.c
@@ -18,14 +18,11 @@
#undef MPL_LOG_NDEBUG
#define MPL_LOG_NDEBUG 0 /* Use 0 to turn on MPL_LOGV output */
-#include <string.h>
-
#include "ml_math_func.h"
#include "data_builder.h"
#include "mlmath.h"
#include "storage_manager.h"
#include "message_layer.h"
-#include "results_holder.h"
#include "log.h"
#undef MPL_LOG_TAG
@@ -51,10 +48,6 @@ struct inv_db_save_t {
/** Temperature when accel bias was stored. */
long accel_temp;
long gyro_temp_slope[3];
- /** Sensor Accuracy */
- int gyro_accuracy;
- int accel_accuracy;
- int compass_accuracy;
};
struct inv_data_builder_t {
@@ -76,7 +69,7 @@ static struct inv_data_builder_t inv_data_builder;
static struct inv_sensor_cal_t sensors;
/** Change this key if the data being stored by this file changes */
-#define INV_DB_SAVE_KEY 53395
+#define INV_DB_SAVE_KEY 53394
#ifdef INV_PLAYBACK_DBG
@@ -105,14 +98,6 @@ void inv_turn_off_data_logging()
static inv_error_t inv_db_load_func(const unsigned char *data)
{
memcpy(&inv_data_builder.save, data, sizeof(inv_data_builder.save));
- // copy in the saved accuracy in the actual sensors accuracy
- sensors.gyro.accuracy = inv_data_builder.save.gyro_accuracy;
- sensors.accel.accuracy = inv_data_builder.save.accel_accuracy;
- sensors.compass.accuracy = inv_data_builder.save.compass_accuracy;
- // TODO
- if (sensors.compass.accuracy == 3) {
- inv_set_compass_bias_found(1);
- }
return INV_SUCCESS;
}
@@ -177,7 +162,119 @@ void set_sensor_orientation_and_scale(struct inv_single_sensor_t *sensor,
sensor->sensitivity = sensitivity;
sensor->orientation = orientation;
}
-
+void inv_get_quaternion_transformation(int orientation, long *q)
+{
+ long s = 759250125; // sqrt(.5)*2^30
+
+ switch (orientation)
+ {
+ case 0x70:
+ q[0] = 759250125;
+ q[1] = 759250125;
+ q[2] = 0;
+ q[3] = 0;
+ break;
+ case 0x10a:
+ q[0] = 759250125;
+ q[1] = 0;
+ q[2] = 759250125;
+ q[3] = 0;
+ break;
+ case 0x85:
+ q[0] = 759250125;
+ q[1] = 0;
+ q[2] = 0;
+ q[3] = 759250125;
+ break;
+ case 0x181:
+ q[0] = 0;
+ q[1] = 759250125;
+ q[2] = 759250125;
+ q[3] = 0;
+ break;
+ case 0x2a:
+ q[0] = 0;
+ q[1] = 759250125;
+ q[2] = 0;
+ q[3] = 759250125;
+ break;
+ case 0x54:
+ q[0] = 0;
+ q[1] = 0;
+ q[2] = 759250125;
+ q[3] = 759250125;
+ break;
+ case 0x150:
+ q[0] = 759250125;
+ q[1] = -759250125;
+ q[2] = 0;
+ q[3] = 0;
+ break;
+ case 0xe:
+ q[0] = 759250125;
+ q[1] = 0;
+ q[2] = -759250125;
+ q[3] = 0;
+ break;
+ case 0xa1:
+ q[0] = 759250125;
+ q[1] = 0;
+ q[2] = 0;
+ q[3] = -759250125;
+ break;
+ case 0x1a5:
+ q[0] = 0;
+ q[1] = 759250125;
+ q[2] = -759250125;
+ q[3] = 0;
+ break;
+ case 0x12e:
+ q[0] = 0;
+ q[1] = 759250125;
+ q[2] = 0;
+ q[3] = -759250125;
+ break;
+ case 0x174:
+ q[0] = 0;
+ q[1] = 0;
+ q[2] = 759250125;
+ q[3] = -759250125;
+ break;
+
+
+ case 0x88:
+ q[0] = 1073741824;
+ q[1] = 0;
+ q[2] = 0;
+ q[3] = 0;
+ break;
+
+
+ case 0x1a8:
+ q[0] = 0;
+ q[1] = 1073741824;
+ q[2] = 0;
+ q[3] = 0;
+ break;
+
+ case 0x18c:
+ q[0] = 0;
+ q[1] = 0;
+ q[2] = 1073741824;
+ q[3] = 0;
+ break;
+
+ case 0xac:
+ q[0] = 0;
+ q[1] = 0;
+ q[2] = 0;
+ q[3] = 1073741824;
+ break;
+
+ default:
+ break;
+ }
+}
/** Sets the Orientation and Sensitivity of the gyro data.
* @param[in] orientation A scalar defining the transformation from chip mounting
* to the body frame. The function inv_orientation_matrix_to_scalar()
@@ -257,22 +354,6 @@ void inv_set_compass_sample_rate(long sample_rate_us)
sensors.compass.bandwidth = (int)(1000000L / sample_rate_us);
}
}
-
-void inv_get_gyro_sample_rate_ms(long *sample_rate_ms)
-{
- *sample_rate_ms = sensors.gyro.sample_rate_ms;
-}
-
-void inv_get_accel_sample_rate_ms(long *sample_rate_ms)
-{
- *sample_rate_ms = sensors.accel.sample_rate_ms;
-}
-
-void inv_get_compass_sample_rate_ms(long *sample_rate_ms)
-{
- *sample_rate_ms = sensors.compass.sample_rate_ms;
-}
-
/** Set Quat Sample rate in micro seconds.
* @param[in] sample_rate_us Set Quat Sample rate in us
*/
@@ -417,7 +498,7 @@ void inv_matrix_vector_mult(const long *A, const long *x, long *y)
}
/** Takes raw data stored in the sensor, removes bias, and converts it to
-* calibrated data in the body frame. Also store raw data for body frame.
+* calibrated data in the body frame.
* @param[in,out] sensor structure to modify
* @param[in] bias bias in the mounting frame, in hardware units scaled by
* 2^16. Length 3.
@@ -427,17 +508,15 @@ void inv_apply_calibration(struct inv_single_sensor_t *sensor, const long *bias)
long raw32[3];
// Convert raw to calibrated
- raw32[0] = (long)sensor->raw[0] << 15;
- raw32[1] = (long)sensor->raw[1] << 15;
- raw32[2] = (long)sensor->raw[2] << 15;
-
- inv_convert_to_body_with_scale(sensor->orientation, sensor->sensitivity << 1, raw32, sensor->raw_scaled);
+ raw32[0] = (long)sensor->raw[0] << 16;
+ raw32[1] = (long)sensor->raw[1] << 16;
+ raw32[2] = (long)sensor->raw[2] << 16;
- raw32[0] -= bias[0] >> 1;
- raw32[1] -= bias[1] >> 1;
- raw32[2] -= bias[2] >> 1;
+ raw32[0] -= bias[0];
+ raw32[1] -= bias[1];
+ raw32[2] -= bias[2];
- inv_convert_to_body_with_scale(sensor->orientation, sensor->sensitivity << 1, raw32, sensor->calibrated);
+ inv_convert_to_body_with_scale(sensor->orientation, sensor->sensitivity, raw32, sensor->calibrated);
sensor->status |= INV_CALIBRATED;
}
@@ -460,7 +539,6 @@ void inv_set_compass_bias(const long *bias, int accuracy)
inv_apply_calibration(&sensors.compass, inv_data_builder.save.compass_bias);
}
sensors.compass.accuracy = accuracy;
- inv_data_builder.save.compass_accuracy = accuracy;
inv_set_message(INV_MSG_NEW_CB_EVENT, INV_MSG_NEW_CB_EVENT, 0);
}
@@ -488,17 +566,6 @@ void inv_set_accel_bias(const long *bias, int accuracy)
}
}
sensors.accel.accuracy = accuracy;
- inv_data_builder.save.accel_accuracy = accuracy;
- inv_set_message(INV_MSG_NEW_AB_EVENT, INV_MSG_NEW_AB_EVENT, 0);
-}
-
-/** Sets the accel accuracy.
-* @param[in] accuracy Accuracy rating from 0 to 3, with 3 being most accurate.
-*/
-void inv_set_accel_accuracy(int accuracy)
-{
- sensors.accel.accuracy = accuracy;
- inv_data_builder.save.accel_accuracy = accuracy;
inv_set_message(INV_MSG_NEW_AB_EVENT, INV_MSG_NEW_AB_EVENT, 0);
}
@@ -523,8 +590,6 @@ void inv_set_accel_bias_mask(const long *bias, int accuracy, int mask)
inv_apply_calibration(&sensors.accel, inv_data_builder.save.accel_bias);
}
sensors.accel.accuracy = accuracy;
- inv_data_builder.save.accel_accuracy = accuracy;
- inv_set_message(INV_MSG_NEW_AB_EVENT, INV_MSG_NEW_AB_EVENT, 0);
}
@@ -542,8 +607,6 @@ void inv_set_gyro_bias(const long *bias, int accuracy)
}
}
sensors.gyro.accuracy = accuracy;
- inv_data_builder.save.gyro_accuracy = accuracy;
-
/* TODO: What should we do if there's no temperature data? */
if (sensors.temp.calibrated[0])
inv_data_builder.save.gyro_temp = sensors.temp.calibrated[0];
@@ -624,7 +687,6 @@ inv_error_t inv_build_accel(const long *accel, int status, inv_time_t timestamp)
sensors.accel.calibrated[2] = accel[2];
sensors.accel.status |= INV_CALIBRATED;
sensors.accel.accuracy = status & 3;
- inv_data_builder.save.accel_accuracy = status & 3;
}
sensors.accel.status |= INV_NEW_DATA | INV_SENSOR_ON;
sensors.accel.timestamp_prev = sensors.accel.timestamp;
@@ -695,7 +757,6 @@ inv_error_t inv_build_compass(const long *compass, int status,
sensors.compass.calibrated[2] = compass[2];
sensors.compass.status |= INV_CALIBRATED;
sensors.compass.accuracy = status & 3;
- inv_data_builder.save.compass_accuracy = status & 3;
}
sensors.compass.timestamp_prev = sensors.compass.timestamp;
sensors.compass.timestamp = timestamp;
@@ -1016,22 +1077,6 @@ void inv_get_gyro_set(long *data, int8_t *accuracy, inv_time_t *timestamp)
}
}
-/** Gets a whole set of gyro raw data including data, accuracy and timestamp.
- * @param[out] data Gyro Data where 1 dps = 2^16
- * @param[out] accuracy Accuracy 0 being not accurate, and 3 being most accurate.
- * @param[out] timestamp The timestamp of the data sample.
-*/
-void inv_get_gyro_set_raw(long *data, int8_t *accuracy, inv_time_t *timestamp)
-{
- memcpy(data, sensors.gyro.raw_scaled, sizeof(sensors.gyro.raw_scaled));
- if (timestamp != NULL) {
- *timestamp = sensors.gyro.timestamp;
- }
- if (accuracy != NULL) {
- *accuracy = sensors.gyro.accuracy;
- }
-}
-
/** Get's latest gyro data.
* @param[out] gyro Gyro Data, Length 3. 1 dps = 2^16.
*/
diff --git a/libsensors_iio/software/core/mllite/data_builder.h b/libsensors_iio/software/core/mllite/data_builder.h
index 9aa46e6..b2d0881 100644
--- a/libsensors_iio/software/core/mllite/data_builder.h
+++ b/libsensors_iio/software/core/mllite/data_builder.h
@@ -56,7 +56,6 @@ extern "C" {
#define INV_PRIORITY_INUSE_AUTO_CALIBRATION 850
#define INV_PRIORITY_HAL_OUTPUTS 900
#define INV_PRIORITY_GLYPH 950
-#define INV_PRIORITY_SHAKE 975
#define INV_PRIORITY_SM 1000
struct inv_single_sensor_t {
@@ -70,8 +69,6 @@ struct inv_single_sensor_t {
int orientation;
/** The raw data in raw data units in the mounting frame */
short raw[3];
- /** Raw data in body frame */
- long raw_scaled[3];
/** Calibrated data */
long calibrated[3];
long sensitivity;
@@ -163,10 +160,6 @@ void inv_set_gyro_bandwidth(int bandwidth_hz);
void inv_set_accel_bandwidth(int bandwidth_hz);
void inv_set_compass_bandwidth(int bandwidth_hz);
-void inv_get_gyro_sample_rate_ms(long *sample_rate_ms);
-void inv_get_accel_sample_rate_ms(long *sample_rate_ms);
-void inv_get_compass_sample_rate_ms(long *sample_rate_ms);
-
inv_error_t inv_register_data_cb(inv_error_t (*func)
(struct inv_sensor_cal_t * data), int priority,
int sensor_type);
@@ -188,7 +181,6 @@ void inv_set_compass_bias(const long *bias, int accuracy);
void inv_set_compass_disturbance(int dist);
void inv_set_gyro_bias(const long *bias, int accuracy);
void inv_set_accel_bias(const long *bias, int accuracy);
-void inv_set_accel_accuracy(int accuracy);
void inv_set_accel_bias_mask(const long *bias, int accuracy, int mask);
void inv_get_gyro_bias(long *bias, long *temp);
@@ -205,7 +197,6 @@ long inv_get_compass_sensitivity(void);
void inv_get_accel_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
void inv_get_gyro_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
-void inv_get_gyro_set_raw(long *data, int8_t *accuracy, inv_time_t * timestamp);
void inv_get_compass_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
void inv_get_gyro(long *gyro);
diff --git a/libsensors_iio/software/core/mllite/dmpconfig.txt b/libsensors_iio/software/core/mllite/dmpconfig.txt
new file mode 100644
index 0000000..4643ed5
--- /dev/null
+++ b/libsensors_iio/software/core/mllite/dmpconfig.txt
@@ -0,0 +1,3 @@
+major version = 1
+minor version = 0
+startAddr = 0
diff --git a/libsensors_iio/software/core/mllite/hal_outputs.c b/libsensors_iio/software/core/mllite/hal_outputs.c
index 6d457db..1cd3b81 100644
--- a/libsensors_iio/software/core/mllite/hal_outputs.c
+++ b/libsensors_iio/software/core/mllite/hal_outputs.c
@@ -4,19 +4,16 @@
See included License.txt for License information.
$
*/
-
+
/**
* @defgroup HAL_Outputs hal_outputs
* @brief Motion Library - HAL Outputs
* Sets up common outputs for HAL
*
* @{
- * @file hal_outputs.c
+ * @file hal_outputs.c
* @brief HAL Outputs.
*/
-
-#include <string.h>
-
#include "hal_outputs.h"
#include "log.h"
#include "ml_math_func.h"
@@ -26,22 +23,17 @@
#include "results_holder.h"
struct hal_output_t {
- int accuracy_mag; /**< Compass accuracy */
-// int accuracy_gyro; /**< Gyro Accuracy */
-// int accuracy_accel; /**< Accel Accuracy */
- int accuracy_quat; /**< quat Accuracy */
-
+ int accuracy_mag; /**< Compass accuracy */
+ int accuracy_gyro; /**< Gyro Accuracy */
+ int accuracy_accel; /**< Accel Accuracy */
inv_time_t nav_timestamp;
inv_time_t gam_timestamp;
-// inv_time_t accel_timestamp;
- inv_time_t mag_timestamp;
+ inv_time_t accel_timestamp;
long nav_quat[4];
int gyro_status;
int accel_status;
int compass_status;
int nine_axis_status;
- inv_biquad_filter_t lp_filter[3];
- float compass_float[3];
};
static struct hal_output_t hal_out;
@@ -111,7 +103,7 @@ int inv_get_sensor_type_gravity(float *values, int8_t *accuracy,
long gravity[3];
int status;
- *accuracy = (int8_t) hal_out.accuracy_quat;
+ *accuracy = hal_out.accuracy_mag;
*timestamp = hal_out.nav_timestamp;
inv_get_gravity(gravity);
values[0] = (gravity[0] >> 14) * ACCEL_CONVERSION;
@@ -124,11 +116,7 @@ int inv_get_sensor_type_gravity(float *values, int8_t *accuracy,
return status;
}
-/* Converts fixed point to rad/sec. Fixed point has 1 dps = 2^16.
- * So this is: pi / 2^16 / 180 */
-#define GYRO_CONVERSION 2.66316109007924e-007f
-
-/** Gyroscope calibrated data (rad/s) in body frame.
+/** Gyroscope data (rad/s) in body frame.
* @param[out] values Rotation Rate in rad/sec.
* @param[out] accuracy Accuracy of the measurment, 0 is least accurate, while 3 is most accurate.
* @param[out] timestamp The timestamp for this sensor. Derived from the timestamp sent to
@@ -138,6 +126,9 @@ int inv_get_sensor_type_gravity(float *values, int8_t *accuracy,
int inv_get_sensor_type_gyroscope(float *values, int8_t *accuracy,
inv_time_t * timestamp)
{
+ /* Converts fixed point to rad/sec. Fixed point has 1 dps = 2^16.
+ * So this is: pi / 2^16 / 180 */
+#define GYRO_CONVERSION 2.66316109007924e-007f
long gyro[3];
int status;
@@ -152,30 +143,6 @@ int inv_get_sensor_type_gyroscope(float *values, int8_t *accuracy,
return status;
}
-/** Gyroscope raw data (rad/s) in body frame.
-* @param[out] values Rotation Rate in rad/sec.
-* @param[out] accuracy Accuracy of the measurment, 0 is least accurate, while 3 is most accurate.
-* @param[out] timestamp The timestamp for this sensor. Derived from the timestamp sent to
-* inv_build_gyro().
-* @return Returns 1 if the data was updated or 0 if it was not updated.
-*/
-int inv_get_sensor_type_gyroscope_raw(float *values, int8_t *accuracy,
- inv_time_t * timestamp)
-{
- long gyro[3];
- int status;
-
- inv_get_gyro_set_raw(gyro, accuracy, timestamp);
- values[0] = gyro[0] * GYRO_CONVERSION;
- values[1] = gyro[1] * GYRO_CONVERSION;
- values[2] = gyro[2] * GYRO_CONVERSION;
- if (hal_out.gyro_status & INV_NEW_DATA)
- status = 1;
- else
- status = 0;
- return status;
-}
-
/**
* This corresponds to Sensor.TYPE_ROTATION_VECTOR.
* The rotation vector represents the orientation of the device as a combination
@@ -203,7 +170,7 @@ int inv_get_sensor_type_gyroscope_raw(float *values, int8_t *accuracy,
int inv_get_sensor_type_rotation_vector(float *values, int8_t *accuracy,
inv_time_t * timestamp)
{
- *accuracy = (int8_t) hal_out.accuracy_quat;
+ *accuracy = hal_out.accuracy_mag;
*timestamp = hal_out.nav_timestamp;
if (hal_out.nav_quat[0] >= 0) {
@@ -236,54 +203,19 @@ int inv_get_sensor_type_magnetic_field(float *values, int8_t *accuracy,
int status;
/* Converts fixed point to uT. Fixed point has 1 uT = 2^16.
* So this is: 1 / 2^16*/
-//#define COMPASS_CONVERSION 1.52587890625e-005f
- int i;
-
- *timestamp = hal_out.mag_timestamp;
- *accuracy = (int8_t) hal_out.accuracy_mag;
-
- for (i=0; i<3; i++) {
- values[i] = hal_out.compass_float[i];
- }
+#define COMPASS_CONVERSION 1.52587890625e-005f
+ long compass[3];
+ inv_get_compass_set(compass, accuracy, timestamp);
+ values[0] = compass[0] * COMPASS_CONVERSION;
+ values[1] = compass[1] * COMPASS_CONVERSION;
+ values[2] = compass[2] * COMPASS_CONVERSION;
if (hal_out.compass_status & INV_NEW_DATA)
status = 1;
else
status = 0;
- hal_out.compass_status = 0;
return status;
}
-static void inv_get_rotation(float r[3][3])
-{
- long rot[9];
- float conv = 1.f / (1L<<30);
-
- inv_quaternion_to_rotation(hal_out.nav_quat, rot);
- r[0][0] = rot[0]*conv;
- r[0][1] = rot[1]*conv;
- r[0][2] = rot[2]*conv;
- r[1][0] = rot[3]*conv;
- r[1][1] = rot[4]*conv;
- r[1][2] = rot[5]*conv;
- r[2][0] = rot[6]*conv;
- r[2][1] = rot[7]*conv;
- r[2][2] = rot[8]*conv;
-}
-
-static void google_orientation(float *g)
-{
- float rad2deg = (float)(180.0 / M_PI);
- float R[3][3];
-
- inv_get_rotation(R);
-
- g[0] = atan2f(-R[1][0], R[0][0]) * rad2deg;
- g[1] = atan2f(-R[2][1], R[2][2]) * rad2deg;
- g[2] = asinf ( R[2][0]) * rad2deg;
- if (g[0] < 0)
- g[0] += 360;
-}
-
/** This corresponds to Sensor.TYPE_ORIENTATION. All values are angles in degrees.
* @param[out] values Length 3, Degrees.<br>
@@ -309,29 +241,78 @@ static void google_orientation(float *g)
int inv_get_sensor_type_orientation(float *values, int8_t *accuracy,
inv_time_t * timestamp)
{
- *accuracy = (int8_t) hal_out.accuracy_quat;
+ long t1, t2, t3;
+ long q00, q01, q02, q03, q11, q12, q13, q22, q23, q33;
+
+ *accuracy = hal_out.accuracy_mag;
*timestamp = hal_out.nav_timestamp;
- google_orientation(values);
+ q00 = inv_q29_mult(hal_out.nav_quat[0], hal_out.nav_quat[0]);
+ q01 = inv_q29_mult(hal_out.nav_quat[0], hal_out.nav_quat[1]);
+ q02 = inv_q29_mult(hal_out.nav_quat[0], hal_out.nav_quat[2]);
+ q03 = inv_q29_mult(hal_out.nav_quat[0], hal_out.nav_quat[3]);
+ q11 = inv_q29_mult(hal_out.nav_quat[1], hal_out.nav_quat[1]);
+ q12 = inv_q29_mult(hal_out.nav_quat[1], hal_out.nav_quat[2]);
+ q13 = inv_q29_mult(hal_out.nav_quat[1], hal_out.nav_quat[3]);
+ q22 = inv_q29_mult(hal_out.nav_quat[2], hal_out.nav_quat[2]);
+ q23 = inv_q29_mult(hal_out.nav_quat[2], hal_out.nav_quat[3]);
+ q33 = inv_q29_mult(hal_out.nav_quat[3], hal_out.nav_quat[3]);
+
+ /* X component of the Ybody axis in World frame */
+ t1 = q12 - q03;
+
+ /* Y component of the Ybody axis in World frame */
+ t2 = q22 + q00 - (1L << 30);
+ values[0] = atan2f((float) t1, (float) t2) * 180.f / (float) M_PI;
+ if (values[0] < 0)
+ values[0] += 360;
+
+ /* Z component of the Ybody axis in World frame */
+ t3 = q23 + q01;
+ values[1] =
+ -atan2f((float) t3,
+ sqrtf((float) t1 * t1 +
+ (float) t2 * t2)) * 180.f / (float) M_PI;
+ /* Z component of the Zbody axis in World frame */
+ t2 = q33 + q00 - (1L << 30);
+ if (t2 < 0) {
+ if (values[1] >= 0)
+ values[1] = 180.f - values[1];
+ else
+ values[1] = -180.f - values[1];
+ }
+
+ /* X component of the Xbody axis in World frame */
+ t1 = q11 + q00 - (1L << 30);
+ /* Y component of the Xbody axis in World frame */
+ t2 = q12 + q03;
+ /* Z component of the Xbody axis in World frame */
+ t3 = q13 - q02;
+ //values[2] = atan2f((float)t3,sqrtf((float)t1*t1+(float)t2*t2))*180.f/(float)M_PI;
+
+ values[2] =
+ -(atan2f((float)(q33 + q00 - (1L << 30)), (float)(q13 - q02)) *
+ 180.f / (float) M_PI - 90);
+ if (values[2] >= 90)
+ values[2] = 180 - values[2];
+
+ if (values[2] < -90)
+ values[2] = -180 - values[2];
return hal_out.nine_axis_status;
}
/** Main callback to generate HAL outputs. Typically not called by library users.
-* @param[in] sensor_cal Input variable to take sensor data whenever there is new
+* @param[in] sensor_cal Input variable to take sensor data whenever there is new
* sensor data.
* @return Returns INV_SUCCESS if successful or an error code if not.
*/
inv_error_t inv_generate_hal_outputs(struct inv_sensor_cal_t *sensor_cal)
{
int use_sensor = 0;
- long sr = 1000;
- long compass[3];
- int8_t accuracy;
- int i;
+ long sr;
(void) sensor_cal;
-
- inv_get_quaternion_set(hal_out.nav_quat, &hal_out.accuracy_quat,
+ inv_get_quaternion_set(hal_out.nav_quat, &hal_out.accuracy_mag,
&hal_out.nav_timestamp);
hal_out.gyro_status = sensor_cal->gyro.status;
hal_out.accel_status = sensor_cal->accel.status;
@@ -355,65 +336,26 @@ inv_error_t inv_generate_hal_outputs(struct inv_sensor_cal_t *sensor_cal)
use_sensor = 3;
}
- // Only output 9-axis if all 9 sensors are on.
- if (sensor_cal->quat.status & INV_SENSOR_ON) {
- // If quaternion sensor is on, gyros are not required as quaternion already has that part
- if ((sensor_cal->accel.status & sensor_cal->compass.status & INV_SENSOR_ON) == 0) {
- use_sensor = -1;
- }
- } else {
- if ((sensor_cal->gyro.status & sensor_cal->accel.status & sensor_cal->compass.status & INV_SENSOR_ON) == 0) {
- use_sensor = -1;
- }
- }
-
switch (use_sensor) {
+ default:
case 0:
hal_out.nine_axis_status = (sensor_cal->gyro.status & INV_NEW_DATA) ? 1 : 0;
- hal_out.nav_timestamp = sensor_cal->gyro.timestamp;
+ hal_out.nav_timestamp = sensor_cal->gyro.timestamp;
break;
case 1:
hal_out.nine_axis_status = (sensor_cal->accel.status & INV_NEW_DATA) ? 1 : 0;
- hal_out.nav_timestamp = sensor_cal->accel.timestamp;
+ hal_out.nav_timestamp = sensor_cal->accel.timestamp;
break;
case 2:
hal_out.nine_axis_status = (sensor_cal->compass.status & INV_NEW_DATA) ? 1 : 0;
- hal_out.nav_timestamp = sensor_cal->compass.timestamp;
+ hal_out.nav_timestamp = sensor_cal->compass.timestamp;
break;
case 3:
hal_out.nine_axis_status = (sensor_cal->quat.status & INV_NEW_DATA) ? 1 : 0;
- hal_out.nav_timestamp = sensor_cal->quat.timestamp;
- break;
- default:
- hal_out.nine_axis_status = 0; // Don't output quaternion related info
+ hal_out.nav_timestamp = sensor_cal->quat.timestamp;
break;
}
- /* Converts fixed point to uT. Fixed point has 1 uT = 2^16.
- * So this is: 1 / 2^16*/
- #define COMPASS_CONVERSION 1.52587890625e-005f
-
- inv_get_compass_set(compass, &accuracy, &(hal_out.mag_timestamp) );
- hal_out.accuracy_mag = (int ) accuracy;
-
- for (i=0; i<3; i++) {
- if ((sensor_cal->compass.status & (INV_NEW_DATA | INV_CONTIGUOUS)) ==
- INV_NEW_DATA ) {
- // set the state variables to match output with input
- inv_calc_state_to_match_output(&hal_out.lp_filter[i], (float ) compass[i]);
- }
-
- if ((sensor_cal->compass.status & (INV_NEW_DATA | INV_RAW_DATA)) ==
- (INV_NEW_DATA | INV_RAW_DATA) ) {
-
- hal_out.compass_float[i] = inv_biquad_filter_process(&hal_out.lp_filter[i],
- (float ) compass[i]) * COMPASS_CONVERSION;
-
- } else if ((sensor_cal->compass.status & INV_NEW_DATA) == INV_NEW_DATA ) {
- hal_out.compass_float[i] = (float ) compass[i] * COMPASS_CONVERSION;
- }
-
- }
return INV_SUCCESS;
}
@@ -440,9 +382,6 @@ inv_error_t inv_start_hal_outputs(void)
INV_GYRO_NEW | INV_ACCEL_NEW | INV_MAG_NEW);
return result;
}
-/* file name: lowPassFilterCoeff_1_6.c */
-float compass_low_pass_filter_coeff[5] =
-{+2.000000000000f, +1.000000000000f, -1.279632424998f, +0.477592250073f, +0.049489956269f};
/** Initializes hal outputs class. This is called automatically by the
* enable function. It may be called any time the feature is enabled, but
@@ -451,12 +390,7 @@ float compass_low_pass_filter_coeff[5] =
*/
inv_error_t inv_init_hal_outputs(void)
{
- int i;
memset(&hal_out, 0, sizeof(hal_out));
- for (i=0; i<3; i++) {
- inv_init_biquad_filter(&hal_out.lp_filter[i], compass_low_pass_filter_coeff);
- }
-
return INV_SUCCESS;
}
@@ -466,8 +400,8 @@ inv_error_t inv_init_hal_outputs(void)
inv_error_t inv_enable_hal_outputs(void)
{
inv_error_t result;
-
- // don't need to check the result for inv_init_hal_outputs
+
+ // don't need to check the result for inv_init_hal_outputs
// since it's always INV_SUCCESS
inv_init_hal_outputs();
@@ -481,7 +415,7 @@ inv_error_t inv_disable_hal_outputs(void)
{
inv_error_t result;
- inv_stop_hal_outputs(); // Ignore error if we have already stopped this
+ inv_stop_hal_outputs(); // Ignore error if we have already stopped this
result = inv_unregister_mpl_start_notification(inv_start_hal_outputs);
return result;
}
diff --git a/libsensors_iio/software/core/mllite/hal_outputs.h b/libsensors_iio/software/core/mllite/hal_outputs.h
index 85e88f3..ed4cb65 100644
--- a/libsensors_iio/software/core/mllite/hal_outputs.h
+++ b/libsensors_iio/software/core/mllite/hal_outputs.h
@@ -19,8 +19,6 @@ extern "C" {
inv_time_t * timestamp);
int inv_get_sensor_type_gyroscope(float *values, int8_t *accuracy,
inv_time_t * timestamp);
- int inv_get_sensor_type_gyroscope_raw(float *values, int8_t *accuracy,
- inv_time_t * timestamp);
int inv_get_sensor_type_magnetic_field(float *values, int8_t *accuracy,
inv_time_t * timestamp);
int inv_get_sensor_type_rotation_vector(float *values, int8_t *accuracy,
diff --git a/libsensors_iio/software/core/mllite/linux/ml_load_dmp.c b/libsensors_iio/software/core/mllite/linux/ml_load_dmp.c
index bdf350f..f0f078c 100644
--- a/libsensors_iio/software/core/mllite/linux/ml_load_dmp.c
+++ b/libsensors_iio/software/core/mllite/linux/ml_load_dmp.c
@@ -30,10 +30,10 @@
#define LOADDMP_LOG MPL_LOGI
#define NUM_LOCAL_KEYS (sizeof(dmpTConfig)/sizeof(dmpTConfig[0]))
-#define DMP_CODE_SIZE 3065
+#define DMP_CODE_SIZE 3060
static const unsigned char dmpMemory[DMP_CODE_SIZE] = {
- /* bank # 0 */
+ /* bank # 0 */
0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00,
0x00, 0x65, 0x00, 0x54, 0xff, 0xef, 0x00, 0x00, 0xfa, 0x80, 0x00, 0x0b, 0x12, 0x82, 0x00, 0x01,
0x03, 0x0c, 0x30, 0xc3, 0x0e, 0x8c, 0x8c, 0xe9, 0x14, 0xd5, 0x40, 0x02, 0x13, 0x71, 0x0f, 0x8e,
@@ -69,15 +69,15 @@ static const unsigned char dmpMemory[DMP_CODE_SIZE] = {
0x00, 0x00, 0x10, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x10, 0x00,
/* bank # 2 */
0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x45, 0x81, 0xff, 0xff, 0xfa, 0x72, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14,
0x00, 0x00, 0x25, 0x4d, 0x00, 0x2f, 0x70, 0x6d, 0x00, 0x00, 0x05, 0xae, 0x00, 0x0c, 0x02, 0xd0,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x00, 0x00, 0x01, 0x3f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x78, 0xa2,
0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0e,
@@ -106,9 +106,9 @@ static const unsigned char dmpMemory[DMP_CODE_SIZE] = {
0xd8, 0xdc, 0xb4, 0xb8, 0xb0, 0xd8, 0xb9, 0xab, 0xf3, 0xf8, 0xfa, 0xb3, 0xb7, 0xbb, 0x8e, 0x9e,
0xae, 0xf1, 0x32, 0xf5, 0x1b, 0xf1, 0xb4, 0xb8, 0xb0, 0x80, 0x97, 0xf1, 0xa9, 0xdf, 0xdf, 0xdf,
0xaa, 0xdf, 0xdf, 0xdf, 0xf2, 0xaa, 0xc5, 0xcd, 0xc7, 0xa9, 0x0c, 0xc9, 0x2c, 0x97, 0x97, 0x97,
- 0x97, 0xf1, 0xa9, 0x89, 0x26, 0x46, 0x66, 0xb2, 0x89, 0x99, 0xa9, 0x2d, 0x55, 0x7d, 0xb0, 0x99,
- 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
- 0x99, 0x99, 0xb0, 0x8a, 0xa8, 0x96, 0x36, 0x56, 0x76, 0xf1, 0xba, 0xa3, 0xb4, 0xb2, 0x80, 0xc0,
+ 0x97, 0xf1, 0xa9, 0x89, 0x26, 0x46, 0x66, 0xb0, 0xb4, 0xba, 0x80, 0xac, 0xde, 0xf2, 0xca, 0xf1,
+ 0xb2, 0x8c, 0x02, 0xa9, 0xb6, 0x98, 0x00, 0x89, 0x0e, 0x16, 0x1e, 0xb8, 0xa9, 0xb4, 0x99, 0x2c,
+ 0x54, 0x7c, 0xb0, 0x8a, 0xa8, 0x96, 0x36, 0x56, 0x76, 0xf1, 0xba, 0xa3, 0xb4, 0xb2, 0x80, 0xc0,
0xb8, 0xa8, 0x97, 0x11, 0xb2, 0x83, 0x98, 0xba, 0xa3, 0xf0, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18,
0xb2, 0xb9, 0xb4, 0x98, 0x83, 0xf1, 0xa3, 0x29, 0x55, 0x7d, 0xba, 0xb5, 0xb1, 0xa3, 0x83, 0x93,
0xf0, 0x00, 0x28, 0x50, 0xf5, 0xb2, 0xb6, 0xaa, 0x83, 0x93, 0x28, 0x54, 0x7c, 0xb9, 0xf1, 0xa3,
@@ -212,32 +212,32 @@ static const unsigned char dmpMemory[DMP_CODE_SIZE] = {
0xdf, 0xd8, 0xf4, 0x16, 0xf1, 0xd8, 0xf8, 0xad, 0x8d, 0x61, 0xd9, 0xf4, 0xf4, 0xac, 0xf5, 0x9c,
0x9c, 0x8d, 0xdf, 0x2b, 0xba, 0xb6, 0xae, 0xfa, 0xf8, 0xf4, 0x0b, 0xd8, 0xf1, 0xae, 0xd0, 0xf8,
0xad, 0x51, 0xda, 0xae, 0xfa, 0xf8, 0xf1, 0xd8, 0xb9, 0xb1, 0xb6, 0xa3, 0x83, 0x9c, 0x08, 0xb9,
- 0xb1, 0x83, 0x9a, 0xb5, 0xaa, 0xc0, 0xfd, 0x30, 0x83, 0xb7, 0x9f, 0x10, 0xb5, 0x8b, 0x93, 0xf2,
- 0x02, 0x02, 0xd1, 0xab, 0xda, 0xde, 0xd8, 0xd8, 0xb1, 0xb9, 0xf3, 0x8b, 0xa3, 0x91, 0xb6, 0x09,
- 0xb4, 0xd9, 0xab, 0xde, 0xb0, 0x87, 0x9c, 0xb9, 0xa3, 0xdd, 0xf1, 0xb3, 0x8b, 0x8b, 0x8b, 0x8b,
- 0x8b, 0xb0, 0x87, 0xa3, 0xa3, 0xa3, 0xa3, 0xb4, 0x90, 0x80, 0xf2, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
- 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xf1, 0x87, 0xb5, 0x9a, 0xa3, 0xf3, 0x9b, 0xa3, 0xa3, 0xdc, 0xba,
- 0xac, 0xdf, 0xb9, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
- 0xa3, 0xa3, 0xa3, 0xd8, 0xd8, 0xd8, 0xbb, 0xb3, 0xb7, 0xf1, 0xaa, 0xf9, 0xda, 0xff, 0xd9, 0x80,
- 0x9a, 0xaa, 0x28, 0xb4, 0x80, 0x98, 0xa7, 0x20, 0xb7, 0x97, 0x87, 0xa8, 0x66, 0x88, 0xf0, 0x79,
- 0x51, 0xf1, 0x90, 0x2c, 0x87, 0x0c, 0xa7, 0x81, 0x97, 0x62, 0x93, 0xf0, 0x71, 0x71, 0x60, 0x85,
+ 0xb1, 0x83, 0x9a, 0xb5, 0xaa, 0xc0, 0xfd, 0x30, 0x8b, 0x93, 0xf2, 0x02, 0x02, 0xd1, 0xab, 0xda,
+ 0xde, 0xd8, 0xd8, 0xb1, 0xb9, 0xf3, 0x8b, 0xa3, 0x91, 0xb6, 0x09, 0xb4, 0xd9, 0xab, 0xde, 0xb0,
+ 0x87, 0x9c, 0xb9, 0xa3, 0xdd, 0xf1, 0xb3, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0xb0, 0x87, 0xa3, 0xa3,
+ 0xa3, 0xa3, 0xb4, 0x90, 0x80, 0xf2, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+ 0xf1, 0x87, 0xb5, 0x9a, 0xa3, 0xf3, 0x9b, 0xa3, 0xa3, 0xdc, 0xba, 0xac, 0xdf, 0xb9, 0xa3, 0xa3,
+ 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xd8, 0xd8,
+ 0xd8, 0xbb, 0xb3, 0xb7, 0xf1, 0xaa, 0xf9, 0xda, 0xff, 0xd9, 0x80, 0x9a, 0xaa, 0x28, 0xb4, 0x80,
+ 0x98, 0xa7, 0x20, 0xb7, 0x97, 0x87, 0xa8, 0x66, 0x88, 0xf0, 0x79, 0x51, 0xf1, 0x90, 0x2c, 0x87,
+ 0x0c, 0xa7, 0x81, 0x97, 0x62, 0x93, 0xf0, 0x71, 0x71, 0x60, 0x85, 0x94, 0x01, 0x29, 0x51, 0x79,
/* bank # 11 */
- 0x94, 0x01, 0x29, 0x51, 0x79, 0x90, 0xa5, 0xf1, 0x28, 0x4c, 0x6c, 0x87, 0x0c, 0x95, 0x18, 0x85,
- 0x78, 0xa3, 0x83, 0x90, 0x28, 0x4c, 0x6c, 0x88, 0x6c, 0xd8, 0xf3, 0xa2, 0x82, 0x00, 0xf2, 0x10,
- 0xa8, 0x92, 0x19, 0x80, 0xa2, 0xf2, 0xd9, 0x26, 0xd8, 0xf1, 0x88, 0xa8, 0x4d, 0xd9, 0x48, 0xd8,
- 0x96, 0xa8, 0x39, 0x80, 0xd9, 0x3c, 0xd8, 0x95, 0x80, 0xa8, 0x39, 0xa6, 0x86, 0x98, 0xd9, 0x2c,
- 0xda, 0x87, 0xa7, 0x2c, 0xd8, 0xa8, 0x89, 0x95, 0x19, 0xa9, 0x80, 0xd9, 0x38, 0xd8, 0xa8, 0x89,
- 0x39, 0xa9, 0x80, 0xda, 0x3c, 0xd8, 0xa8, 0x2e, 0xa8, 0x39, 0x90, 0xd9, 0x0c, 0xd8, 0xa8, 0x95,
- 0x31, 0x98, 0xd9, 0x0c, 0xd8, 0xa8, 0x09, 0xd9, 0xff, 0xd8, 0x01, 0xda, 0xff, 0xd8, 0x95, 0x39,
- 0xa9, 0xda, 0x26, 0xff, 0xd8, 0x90, 0xa8, 0x0d, 0x89, 0x99, 0xa8, 0x10, 0x80, 0x98, 0x21, 0xda,
- 0x2e, 0xd8, 0x89, 0x99, 0xa8, 0x31, 0x80, 0xda, 0x2e, 0xd8, 0xa8, 0x86, 0x96, 0x31, 0x80, 0xda,
- 0x2e, 0xd8, 0xa8, 0x87, 0x31, 0x80, 0xda, 0x2e, 0xd8, 0xa8, 0x82, 0x92, 0xf3, 0x41, 0x80, 0xf1,
- 0xd9, 0x2e, 0xd8, 0xa8, 0x82, 0xf3, 0x19, 0x80, 0xf1, 0xd9, 0x2e, 0xd8, 0x82, 0xac, 0xf3, 0xc0,
- 0xa2, 0x80, 0x22, 0xf1, 0xa6, 0x2e, 0xa7, 0x2e, 0xa9, 0x22, 0x98, 0xa8, 0x29, 0xda, 0xac, 0xde,
- 0xff, 0xd8, 0xa2, 0xf2, 0x2a, 0xf1, 0xa9, 0x2e, 0x82, 0x92, 0xa8, 0xf2, 0x31, 0x80, 0xa6, 0x96,
- 0xf1, 0xd9, 0x00, 0xac, 0x8c, 0x9c, 0x0c, 0x30, 0xac, 0xde, 0xd0, 0xde, 0xff, 0xd8, 0x8c, 0x9c,
- 0xac, 0xd0, 0x10, 0xac, 0xde, 0x80, 0x92, 0xa2, 0xf2, 0x4c, 0x82, 0xa8, 0xf1, 0xca, 0xf2, 0x35,
- 0xf1, 0x96, 0x88, 0xa6, 0xd9, 0x00, 0xd8, 0xf1, 0xff
+ 0x90, 0xa5, 0xf1, 0x28, 0x4c, 0x6c, 0x87, 0x0c, 0x95, 0x18, 0x85, 0x78, 0xa3, 0x83, 0x90, 0x28,
+ 0x4c, 0x6c, 0x88, 0x6c, 0xd8, 0xf3, 0xa2, 0x82, 0x00, 0xf2, 0x10, 0xa8, 0x92, 0x19, 0x80, 0xa2,
+ 0xf2, 0xd9, 0x26, 0xd8, 0xf1, 0x88, 0xa8, 0x4d, 0xd9, 0x48, 0xd8, 0x96, 0xa8, 0x39, 0x80, 0xd9,
+ 0x3c, 0xd8, 0x95, 0x80, 0xa8, 0x39, 0xa6, 0x86, 0x98, 0xd9, 0x2c, 0xda, 0x87, 0xa7, 0x2c, 0xd8,
+ 0xa8, 0x89, 0x95, 0x19, 0xa9, 0x80, 0xd9, 0x38, 0xd8, 0xa8, 0x89, 0x39, 0xa9, 0x80, 0xda, 0x3c,
+ 0xd8, 0xa8, 0x2e, 0xa8, 0x39, 0x90, 0xd9, 0x0c, 0xd8, 0xa8, 0x95, 0x31, 0x98, 0xd9, 0x0c, 0xd8,
+ 0xa8, 0x09, 0xd9, 0xff, 0xd8, 0x01, 0xda, 0xff, 0xd8, 0x95, 0x39, 0xa9, 0xda, 0x26, 0xff, 0xd8,
+ 0x90, 0xa8, 0x0d, 0x89, 0x99, 0xa8, 0x10, 0x80, 0x98, 0x21, 0xda, 0x2e, 0xd8, 0x89, 0x99, 0xa8,
+ 0x31, 0x80, 0xda, 0x2e, 0xd8, 0xa8, 0x86, 0x96, 0x31, 0x80, 0xda, 0x2e, 0xd8, 0xa8, 0x87, 0x31,
+ 0x80, 0xda, 0x2e, 0xd8, 0xa8, 0x82, 0x92, 0xf3, 0x41, 0x80, 0xf1, 0xd9, 0x2e, 0xd8, 0xa8, 0x82,
+ 0xf3, 0x19, 0x80, 0xf1, 0xd9, 0x2e, 0xd8, 0x82, 0xac, 0xf3, 0xc0, 0xa2, 0x80, 0x22, 0xf1, 0xa6,
+ 0x2e, 0xa7, 0x2e, 0xa9, 0x22, 0x98, 0xa8, 0x29, 0xda, 0xac, 0xde, 0xff, 0xd8, 0xa2, 0xf2, 0x2a,
+ 0xf1, 0xa9, 0x2e, 0x82, 0x92, 0xa8, 0xf2, 0x31, 0x80, 0xa6, 0x96, 0xf1, 0xd9, 0x00, 0xac, 0x8c,
+ 0x9c, 0x0c, 0x30, 0xac, 0xde, 0xd0, 0xde, 0xff, 0xd8, 0x8c, 0x9c, 0xac, 0xd0, 0x10, 0xac, 0xde,
+ 0x80, 0x92, 0xa2, 0xf2, 0x4c, 0x82, 0xa8, 0xf1, 0xca, 0xf2, 0x35, 0xf1, 0x96, 0x88, 0xa6, 0xd9,
+ 0x00, 0xd8, 0xf1, 0xff
};
#define DMP_VERSION (dmpMemory)
diff --git a/libsensors_iio/software/core/mllite/linux/ml_stored_data.c b/libsensors_iio/software/core/mllite/linux/ml_stored_data.c
index b4c4249..c5cf2e6 100644
--- a/libsensors_iio/software/core/mllite/linux/ml_stored_data.c
+++ b/libsensors_iio/software/core/mllite/linux/ml_stored_data.c
@@ -21,12 +21,13 @@
#include <stdio.h>
-#include "log.h"
#undef MPL_LOG_TAG
#define MPL_LOG_TAG "MPL-storeload"
+
#include "ml_stored_data.h"
#include "storage_manager.h"
+#include "log.h"
#include "mlos.h"
#define LOADCAL_DEBUG 0
@@ -37,40 +38,26 @@
#define STORECAL_LOG MPL_LOGI
#define LOADCAL_LOG MPL_LOGI
-inv_error_t inv_read_cal(unsigned char **calData, size_t *bytesRead)
+inv_error_t inv_read_cal(unsigned char *cal, size_t len)
{
FILE *fp;
+ int bytesRead;
inv_error_t result = INV_SUCCESS;
- size_t fsize;
fp = fopen(MLCAL_FILE,"rb");
if (fp == NULL) {
MPL_LOGE("Cannot open file \"%s\" for read\n", MLCAL_FILE);
return INV_ERROR_FILE_OPEN;
}
-
- // obtain file size
- fseek (fp, 0 , SEEK_END);
- fsize = ftell (fp);
- rewind (fp);
-
- *calData = (unsigned char *)inv_malloc(fsize);
- if (*calData==NULL) {
- MPL_LOGE("Could not allocate buffer of %d bytes - "
- "aborting\n", fsize);
- fclose(fp);
- return INV_ERROR_MEMORY_EXAUSTED;
- }
-
- *bytesRead = fread(*calData, 1, fsize, fp);
- if (*bytesRead != fsize) {
- MPL_LOGE("bytes read (%d) don't match file size (%d)\n",
- *bytesRead, fsize);
+ bytesRead = fread(cal, 1, len, fp);
+ if (bytesRead != len) {
+ MPL_LOGE("bytes read (%d) don't match requested length (%d)\n",
+ bytesRead, len);
result = INV_ERROR_FILE_READ;
goto read_cal_end;
}
else {
- MPL_LOGI("Bytes read = %d", *bytesRead);
+ MPL_LOGI("Bytes read = %d", bytesRead);
}
read_cal_end:
@@ -274,18 +261,31 @@ inv_error_t inv_store_cal(unsigned char *calData, size_t length)
*/
inv_error_t inv_load_calibration(void)
{
- unsigned char *calData= NULL;
+ unsigned char *calData;
inv_error_t result = 0;
- size_t bytesRead = 0;
+ size_t length;
+
+ inv_get_mpl_state_size(&length);
+ if (length <= 0) {
+ MPL_LOGE("Could not get file calibration length - "
+ "error %d - aborting\n", result);
+ return result;
+ }
- result = inv_read_cal(&calData, &bytesRead);
+ calData = (unsigned char *)inv_malloc(length);
+ if (!calData) {
+ MPL_LOGE("Could not allocate buffer of %d bytes - "
+ "aborting\n", length);
+ return INV_ERROR_MEMORY_EXAUSTED;
+ }
+
+ result = inv_read_cal(calData, length);
if(result != INV_SUCCESS) {
MPL_LOGE("Could not load cal file - "
"aborting\n");
- goto free_mem_n_exit;
}
- result = inv_load_mpl_states(calData, bytesRead);
+ result = inv_load_mpl_states(calData, length);
if (result != INV_SUCCESS) {
MPL_LOGE("Could not load the calibration data - "
"error %d - aborting\n", result);
@@ -294,7 +294,7 @@ inv_error_t inv_load_calibration(void)
free_mem_n_exit:
inv_free(calData);
- return result;
+ return INV_SUCCESS;
}
/**
@@ -345,7 +345,7 @@ inv_error_t inv_store_calibration(void)
free_mem_n_exit:
inv_free(calData);
- return result;
+ return INV_SUCCESS;
}
/**
diff --git a/libsensors_iio/software/core/mllite/linux/ml_stored_data.h b/libsensors_iio/software/core/mllite/linux/ml_stored_data.h
index 115b34c..336f081 100644
--- a/libsensors_iio/software/core/mllite/linux/ml_stored_data.h
+++ b/libsensors_iio/software/core/mllite/linux/ml_stored_data.h
@@ -36,7 +36,7 @@ inv_error_t inv_store_calibration(void);
/*
Internal APIs
*/
-inv_error_t inv_read_cal(unsigned char **, size_t *);
+inv_error_t inv_read_cal(unsigned char *cal, size_t len);
inv_error_t inv_write_cal(unsigned char *cal, size_t len);
inv_error_t inv_load_cal_V0(unsigned char *calData, size_t len);
inv_error_t inv_load_cal_V1(unsigned char *calData, size_t len);
diff --git a/libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.c b/libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.c
index eca57c3..5636a02 100644
--- a/libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.c
+++ b/libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.c
@@ -5,6 +5,7 @@
#include <ctype.h>
#define MPU_SYSFS_ABS_PATH "/sys/class/invensense/mpu"
+#define CHIP_NUM 4
enum PROC_SYSFS_CMD {
CMD_GET_SYSFS_PATH,
CMD_GET_DMP_PATH,
@@ -14,13 +15,7 @@ enum PROC_SYSFS_CMD {
CMD_GET_DEVICE_NODE
};
static char sysfs_path[100];
-static char *chip_name[] = {
- "ITG3500",
- "MPU6050",
- "MPU9150",
- "MPU3050",
- "MPU6500"
-};
+static char *chip_name[CHIP_NUM] = {"ITG3500", "MPU6050", "MPU9150", "MPU3050"};
static int chip_ind;
static int initialized =0;
static int status = 0;
@@ -32,8 +27,6 @@ static int iio_dev_num = 0;
#define FORMAT_SCAN_ELEMENTS_DIR "%s/scan_elements"
#define FORMAT_TYPE_FILE "%s_type"
-#define CHIP_NUM ARRAY_SIZE(chip_name)
-
static const char *iio_dir = "/sys/bus/iio/devices/";
/**
@@ -100,7 +93,7 @@ int find_type_by_name(const char *name, const char *type)
*/
static int parsing_proc_input(int mode, char *name){
const char input[] = "/proc/bus/input/devices";
- char line[4096], d;
+ char line[100], d;
char tmp[100];
FILE *fp;
int i, j, result, find_flag;
@@ -401,7 +394,7 @@ inv_error_t inv_get_input_number(const char *name, int *num)
*/
inv_error_t inv_get_iio_trigger_path(const char *name)
{
- if (process_sysfs_request(CMD_GET_TRIGGER_PATH, (char *)name) < 0)
+ if (process_sysfs_request(CMD_GET_TRIGGER_PATH, name) < 0)
return INV_ERROR_NOT_OPENED;
else
return INV_SUCCESS;
@@ -416,7 +409,7 @@ inv_error_t inv_get_iio_trigger_path(const char *name)
*/
inv_error_t inv_get_iio_device_node(const char *name)
{
- if (process_sysfs_request(CMD_GET_DEVICE_NODE, (char *)name) < 0)
+ if (process_sysfs_request(CMD_GET_DEVICE_NODE, name) < 0)
return INV_ERROR_NOT_OPENED;
else
return INV_SUCCESS;
diff --git a/libsensors_iio/software/core/mllite/linux/mlos.h b/libsensors_iio/software/core/mllite/linux/mlos.h
index d4f8912..287025f 100644
--- a/libsensors_iio/software/core/mllite/linux/mlos.h
+++ b/libsensors_iio/software/core/mllite/linux/mlos.h
@@ -10,7 +10,6 @@
#ifndef __KERNEL__
#include <stdio.h>
#endif
-#include <pthread.h>
#include "mltypes.h"
@@ -19,7 +18,7 @@ extern "C" {
#endif
#if defined(LINUX) || defined(__KERNEL__)
-typedef pthread_mutex_t* HANDLE;
+typedef unsigned int HANDLE;
#endif
/* ------------ */
diff --git a/libsensors_iio/software/core/mllite/linux/mlos_linux.c b/libsensors_iio/software/core/mllite/linux/mlos_linux.c
index 5424508..75f062e 100644
--- a/libsensors_iio/software/core/mllite/linux/mlos_linux.c
+++ b/libsensors_iio/software/core/mllite/linux/mlos_linux.c
@@ -1,14 +1,13 @@
/*
$License:
- Copyright (C) 2012 InvenSense Corporation, All Rights Reserved.
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
$
*/
-
/*******************************************************************************
*
* $Id: mlos_linux.c 5629 2011-06-11 03:13:08Z mcaramello $
*
- ******************************************************************************/
+ *******************************************************************************/
/**
* @defgroup MLOS
@@ -17,7 +16,7 @@
* @{
* @file mlos.c
* @brief OS Interface.
- */
+**/
/* ------------- */
/* - Includes. - */
@@ -27,10 +26,11 @@
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
-#include <errno.h>
#include "stdint_invensense.h"
+
#include "mlos.h"
+#include <errno.h>
/* -------------- */
@@ -39,14 +39,14 @@
/**
* @brief Allocate space
- * @param num_bytes number of bytes
+ * @param numBytes number of bytes
* @return pointer to allocated space
- */
-void *inv_malloc(unsigned int num_bytes)
+**/
+void *inv_malloc(unsigned int numBytes)
{
// Allocate space.
- void *alloc_ptr = malloc(num_bytes);
- return alloc_ptr;
+ void *allocPtr = malloc(numBytes);
+ return allocPtr;
}
@@ -54,11 +54,12 @@ void *inv_malloc(unsigned int num_bytes)
* @brief Free allocated space
* @param ptr pointer to space to deallocate
* @return error code.
- */
+**/
inv_error_t inv_free(void *ptr)
{
- if (ptr)
- free(ptr);
+ // Deallocate space.
+ free(ptr);
+
return INV_SUCCESS;
}
@@ -95,10 +96,10 @@ inv_error_t inv_create_mutex(HANDLE *mutex)
inv_error_t inv_lock_mutex(HANDLE mutex)
{
int res;
- pthread_mutex_t *pm = (pthread_mutex_t *)mutex;
+ pthread_mutex_t *pm = (pthread_mutex_t*)mutex;
res = pthread_mutex_lock(pm);
- if(res == -1)
+ if(res == -1)
return INV_ERROR_OS_LOCK_FAILED;
return INV_SUCCESS;
@@ -109,11 +110,11 @@ inv_error_t inv_lock_mutex(HANDLE mutex)
* @brief Mutex unlock function
* @param mutex mutex handle
* @return error code.
- */
+**/
inv_error_t inv_unlock_mutex(HANDLE mutex)
{
int res;
- pthread_mutex_t *pm = (pthread_mutex_t *)mutex;
+ pthread_mutex_t *pm = (pthread_mutex_t*)mutex;
res = pthread_mutex_unlock(pm);
if(res == -1)
@@ -130,7 +131,7 @@ inv_error_t inv_unlock_mutex(HANDLE mutex)
*/
FILE *inv_fopen(char *filename)
{
- FILE *fp = fopen(filename, "r");
+ FILE *fp = fopen(filename,"r");
return fp;
}
@@ -153,21 +154,22 @@ void inv_fclose(FILE *fp)
inv_error_t inv_destroy_mutex(HANDLE handle)
{
int error;
- pthread_mutex_t *pm = (pthread_mutex_t *)handle;
+ pthread_mutex_t *pm = (pthread_mutex_t*)handle;
error = pthread_mutex_destroy(pm);
- if (error)
+ if (error) {
return errno;
+ }
free((void*) handle);
-
+
return INV_SUCCESS;}
/**
* @brief Sleep function.
*/
-void inv_sleep(int m_secs)
+void inv_sleep(int mSecs)
{
- usleep(m_secs * 1000);
+ usleep(mSecs*1000);
}
@@ -180,11 +182,13 @@ unsigned long inv_get_tick_count()
{
struct timeval tv;
- if (gettimeofday(&tv, NULL) != 0)
+ if (gettimeofday(&tv, NULL) !=0)
return 0;
return (long)((tv.tv_sec * 1000000LL + tv.tv_usec) / 1000LL);
}
-/** @} */
+ /**********************/
+ /** @} */ /* defgroup */
+/**********************/
diff --git a/libsensors_iio/software/core/mllite/message_layer.c b/libsensors_iio/software/core/mllite/message_layer.c
index d266d80..8317957 100644
--- a/libsensors_iio/software/core/mllite/message_layer.c
+++ b/libsensors_iio/software/core/mllite/message_layer.c
@@ -1,59 +1,59 @@
-/*
- $License:
- Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
- See included License.txt for License information.
- $
- */
-/**
- * @defgroup Message_Layer message_layer
- * @brief Motion Library - Message Layer
- * Holds Low Occurance messages
- *
- * @{
- * @file message_layer.c
- * @brief Holds Low Occurance Messages.
- */
-#include "message_layer.h"
-#include "log.h"
-
-struct message_holder_t {
- long message;
-};
-
-static struct message_holder_t mh;
-
-/** Sets a message.
-* @param[in] set The flags to set.
-* @param[in] clear Before setting anything this will clear these messages,
-* which is useful for mutually exclusive messages such
-* a motion or no motion message.
-* @param[in] level Level of the messages. It starts at 0, and may increase
-* in the future to allow more messages if the bit storage runs out.
-*/
-void inv_set_message(long set, long clear, int level)
-{
- if (level == 0) {
- mh.message &= ~clear;
- mh.message |= set;
- }
-}
-
-/** Returns Message Flags for Level 0 Messages.
-* Levels are to allow expansion of more messages in the future.
-* @param[in] clear If set, will clear the message. Typically this will be set
-* for one reader, so that you don't get the same message over and over.
-* @return bit field to corresponding message.
-*/
-long inv_get_message_level_0(int clear)
-{
- long msg;
- msg = mh.message;
- if (clear) {
- mh.message = 0;
- }
- return msg;
-}
-
-/**
- * @}
- */
+/*
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+/**
+ * @defgroup Message_Layer message_layer
+ * @brief Motion Library - Message Layer
+ * Holds Low Occurance messages
+ *
+ * @{
+ * @file message_layer.c
+ * @brief Holds Low Occurance Messages.
+ */
+#include "message_layer.h"
+#include "log.h"
+
+struct message_holder_t {
+ long message;
+};
+
+static struct message_holder_t mh;
+
+/** Sets a message.
+* @param[in] set The flags to set.
+* @param[in] clear Before setting anything this will clear these messages,
+* which is useful for mutually exclusive messages such
+* a motion or no motion message.
+* @param[in] level Level of the messages. It starts at 0, and may increase
+* in the future to allow more messages if the bit storage runs out.
+*/
+void inv_set_message(long set, long clear, int level)
+{
+ if (level == 0) {
+ mh.message &= ~clear;
+ mh.message |= set;
+ }
+}
+
+/** Returns Message Flags for Level 0 Messages.
+* Levels are to allow expansion of more messages in the future.
+* @param[in] clear If set, will clear the message. Typically this will be set
+* for one reader, so that you don't get the same message over and over.
+* @return bit field to corresponding message.
+*/
+long inv_get_message_level_0(int clear)
+{
+ long msg;
+ msg = mh.message;
+ if (clear) {
+ mh.message = 0;
+ }
+ return msg;
+}
+
+/**
+ * @}
+ */
diff --git a/libsensors_iio/software/core/mllite/message_layer.h b/libsensors_iio/software/core/mllite/message_layer.h
index e6d90d5..df0c0e2 100644
--- a/libsensors_iio/software/core/mllite/message_layer.h
+++ b/libsensors_iio/software/core/mllite/message_layer.h
@@ -1,35 +1,35 @@
-/*
- $License:
- Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
- See included License.txt for License information.
- $
- */
-#ifndef INV_MESSAGE_LAYER_H__
-#define INV_MESSAGE_LAYER_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- /* Level 0 Type Messages */
- /** A motion event has occured */
-#define INV_MSG_MOTION_EVENT (0x01)
- /** A no motion event has occured */
-#define INV_MSG_NO_MOTION_EVENT (0x02)
- /** A setting of the gyro bias has occured */
-#define INV_MSG_NEW_GB_EVENT (0x04)
- /** A setting of the compass bias has occured */
-#define INV_MSG_NEW_CB_EVENT (0x08)
- /** A setting of the accel bias has occured */
-#define INV_MSG_NEW_AB_EVENT (0x10)
-
- void inv_set_message(long set, long clear, int level);
- long inv_get_message_level_0(int clear);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // INV_MESSAGE_LAYER_H__
+/*
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+#ifndef INV_MESSAGE_LAYER_H__
+#define INV_MESSAGE_LAYER_H__
+
+#include "mltypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Level 0 Type Messages */
+ /** A motion event has occured */
+#define INV_MSG_MOTION_EVENT (0x01)
+ /** A no motion event has occured */
+#define INV_MSG_NO_MOTION_EVENT (0x02)
+ /** A setting of the gyro bias has occured */
+#define INV_MSG_NEW_GB_EVENT (0x04)
+ /** A setting of the compass bias has occured */
+#define INV_MSG_NEW_CB_EVENT (0x08)
+ /** A setting of the accel bias has occured */
+#define INV_MSG_NEW_AB_EVENT (0x10)
+
+ void inv_set_message(long set, long clear, int level);
+ long inv_get_message_level_0(int clear);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // INV_MESSAGE_LAYER_H__
diff --git a/libsensors_iio/software/core/mllite/ml_math_func.c b/libsensors_iio/software/core/mllite/ml_math_func.c
index cce0381..86c4b41 100644
--- a/libsensors_iio/software/core/mllite/ml_math_func.c
+++ b/libsensors_iio/software/core/mllite/ml_math_func.c
@@ -655,52 +655,6 @@ double inv_vector_norm(const float *x)
{
return sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2]);
}
-
-void inv_init_biquad_filter(inv_biquad_filter_t *pFilter, float *pBiquadCoeff) {
- int i;
- // initial state to zero
- pFilter->state[0] = 0;
- pFilter->state[1] = 0;
-
- // set up coefficients
- for (i=0; i<5; i++) {
- pFilter->c[i] = pBiquadCoeff[i];
- }
-}
-
-void inv_calc_state_to_match_output(inv_biquad_filter_t *pFilter, float input)
-{
- pFilter->input = input;
- pFilter->output = input;
- pFilter->state[0] = input / (1 + pFilter->c[2] + pFilter->c[3]);
- pFilter->state[1] = pFilter->state[0];
-}
-
-float inv_biquad_filter_process(inv_biquad_filter_t *pFilter, float input) {
- float stateZero;
-
- pFilter->input = input;
- // calculate the new state;
- stateZero = pFilter->input - pFilter->c[2]*pFilter->state[0]
- - pFilter->c[3]*pFilter->state[1];
-
- pFilter->output = stateZero + pFilter->c[0]*pFilter->state[0]
- + pFilter->c[1]*pFilter->state[1];
-
- // update the output and state
- pFilter->output = pFilter->output * pFilter->c[4];
- pFilter->state[1] = pFilter->state[0];
- pFilter->state[0] = stateZero;
- return pFilter->output;
-}
-
-void inv_get_cross_product_vec(float *cgcross, float compass[3], float grav[3]) {
-
- cgcross[0] = (float)compass[1] * grav[2] - (float)compass[2] * grav[1];
- cgcross[1] = (float)compass[2] * grav[0] - (float)compass[0] * grav[2];
- cgcross[2] = (float)compass[0] * grav[1] - (float)compass[1] * grav[0];
-}
-
/**
* @}
*/
diff --git a/libsensors_iio/software/core/mllite/ml_math_func.h b/libsensors_iio/software/core/mllite/ml_math_func.h
index 535d849..916de0a 100644
--- a/libsensors_iio/software/core/mllite/ml_math_func.h
+++ b/libsensors_iio/software/core/mllite/ml_math_func.h
@@ -24,13 +24,6 @@
extern "C" {
#endif
- typedef struct {
- float state[4];
- float c[5];
- float input;
- float output;
- } inv_biquad_filter_t;
-
static inline float inv_q30_to_float(long q30)
{
return (float) q30 / ((float)(1L << 30));
@@ -109,11 +102,6 @@ extern "C" {
double quaternion_to_rotation_angle(const long *quat);
double inv_vector_norm(const float *x);
- void inv_init_biquad_filter(inv_biquad_filter_t *pFilter, float *pBiquadCoeff);
- float inv_biquad_filter_process(inv_biquad_filter_t *pFilter, float input);
- void inv_calc_state_to_match_output(inv_biquad_filter_t *pFilter, float input);
- void inv_get_cross_product_vec(float *cgcross, float compass[3], float grav[3]);
-
#ifdef __cplusplus
}
#endif
diff --git a/libsensors_iio/software/core/mllite/mlmath.c b/libsensors_iio/software/core/mllite/mlmath.c
new file mode 100644
index 0000000..5eb4264
--- /dev/null
+++ b/libsensors_iio/software/core/mllite/mlmath.c
@@ -0,0 +1,68 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+/*******************************************************************************
+ *
+ * $Id: mlmath.c 5629 2011-06-11 03:13:08Z mcaramello $
+ *
+ *******************************************************************************/
+
+#include <math.h>
+
+double ml_asin(double x)
+{
+ return asin(x);
+}
+
+double ml_atan(double x)
+{
+ return atan(x);
+}
+
+double ml_atan2(double x, double y)
+{
+ return atan2(x, y);
+}
+
+double ml_log(double x)
+{
+ return log(x);
+}
+
+double ml_sqrt(double x)
+{
+ return sqrt(x);
+}
+
+double ml_ceil(double x)
+{
+ return ceil(x);
+}
+
+double ml_floor(double x)
+{
+ return floor(x);
+}
+
+double ml_cos(double x)
+{
+ return cos(x);
+}
+
+double ml_sin(double x)
+{
+ return sin(x);
+}
+
+double ml_acos(double x)
+{
+ return acos(x);
+}
+
+double ml_pow(double x, double y)
+{
+ return pow(x, y);
+}
diff --git a/libsensors_iio/software/core/mllite/mpl.c b/libsensors_iio/software/core/mllite/mpl.c
index ec87fc0..231cbfd 100644
--- a/libsensors_iio/software/core/mllite/mpl.c
+++ b/libsensors_iio/software/core/mllite/mpl.c
@@ -1,72 +1,72 @@
-/*
- $License:
- Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
- See included License.txt for License information.
- $
- */
-/**
- * @defgroup MPL mpl
- * @brief Motion Library - Start Point
- * Initializes MPL.
- *
- * @{
- * @file mpl.c
- * @brief MPL start point.
- */
-
-#include "storage_manager.h"
-#include "log.h"
-#include "mpl.h"
-#include "start_manager.h"
-#include "data_builder.h"
-#include "results_holder.h"
-#include "mlinclude.h"
-
-/**
- * @brief Initializes the MPL. Should be called first and once
- * @return Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_init_mpl(void)
-{
- inv_init_storage_manager();
-
- /* initialize the start callback manager */
- INV_ERROR_CHECK(inv_init_start_manager());
-
- /* initialize the data builder */
- INV_ERROR_CHECK(inv_init_data_builder());
-
- INV_ERROR_CHECK(inv_enable_results_holder());
-
- return INV_SUCCESS;
-}
-
-const char ml_ver[] = "InvenSense MPL 5.1.2";
-
-/**
- * @brief used to get the MPL version.
- * @param version a string where the MPL version gets stored.
- * @return INV_SUCCESS if successful or a non-zero error code otherwise.
- */
-inv_error_t inv_get_version(char **version)
-{
- INVENSENSE_FUNC_START;
- /* cast out the const */
- *version = (char *)&ml_ver;
- return INV_SUCCESS;
-}
-
-/**
- * @brief Starts the MPL. Typically called after inv_init_mpl() or after a
- * inv_stop_mpl() to start the MPL back up an running.
- * @return INV_SUCCESS if successful or a non-zero error code otherwise.
- */
-inv_error_t inv_start_mpl(void)
-{
- INV_ERROR_CHECK(inv_execute_mpl_start_notification());
- return INV_SUCCESS;
-}
-
-/**
- * @}
- */
+/*
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+/**
+ * @defgroup MPL mpl
+ * @brief Motion Library - Start Point
+ * Initializes MPL.
+ *
+ * @{
+ * @file mpl.c
+ * @brief MPL start point.
+ */
+
+#include "storage_manager.h"
+#include "log.h"
+#include "mpl.h"
+#include "start_manager.h"
+#include "data_builder.h"
+#include "results_holder.h"
+#include "mlinclude.h"
+
+/**
+ * @brief Initializes the MPL. Should be called first and once
+ * @return Returns INV_SUCCESS if successful or an error code if not.
+ */
+inv_error_t inv_init_mpl(void)
+{
+ inv_init_storage_manager();
+
+ /* initialize the start callback manager */
+ INV_ERROR_CHECK(inv_init_start_manager());
+
+ /* initialize the data builder */
+ INV_ERROR_CHECK(inv_init_data_builder());
+
+ INV_ERROR_CHECK(inv_enable_results_holder());
+
+ return INV_SUCCESS;
+}
+
+const char ml_ver[] = "InvenSense MPL 5.0.1";
+
+/**
+ * @brief used to get the MPL version.
+ * @param version a string where the MPL version gets stored.
+ * @return INV_SUCCESS if successful or a non-zero error code otherwise.
+ */
+inv_error_t inv_get_version(char **version)
+{
+ INVENSENSE_FUNC_START;
+ /* cast out the const */
+ *version = (char *)&ml_ver;
+ return INV_SUCCESS;
+}
+
+/**
+ * @brief Starts the MPL. Typically called after inv_init_mpl() or after a
+ * inv_stop_mpl() to start the MPL back up an running.
+ * @return INV_SUCCESS if successful or a non-zero error code otherwise.
+ */
+inv_error_t inv_start_mpl(void)
+{
+ INV_ERROR_CHECK(inv_execute_mpl_start_notification());
+ return INV_SUCCESS;
+}
+
+/**
+ * @}
+ */
diff --git a/libsensors_iio/software/core/mllite/results_holder.c b/libsensors_iio/software/core/mllite/results_holder.c
index df58f40..97ffdec 100644
--- a/libsensors_iio/software/core/mllite/results_holder.c
+++ b/libsensors_iio/software/core/mllite/results_holder.c
@@ -13,16 +13,13 @@
* @file results_holder.c
* @brief Results Holder for HAL.
*/
-
-#include <string.h>
-
#include "results_holder.h"
+#include "log.h"
#include "ml_math_func.h"
#include "mlmath.h"
#include "start_manager.h"
#include "data_builder.h"
#include "message_layer.h"
-#include "log.h"
// These 2 status bits are used to control when the 9 axis quaternion is updated
#define INV_COMPASS_CORRECTION_SET 1
@@ -37,7 +34,6 @@ struct results_t {
long mag_scale[3]; /**< scale factor to apply to magnetic field reading */
long compass_correction[4]; /**< quaternion going from gyro,accel quaternion to 9 axis */
int acc_state; /**< Describes accel state */
- int got_accel_bias; /**< Flag describing if accel bias is known */
long compass_bias_error[3]; /**< Error Squared */
unsigned char motion_state;
unsigned int motion_state_counter; /**< Incremented for each no motion event in a row */
@@ -322,24 +318,6 @@ inv_error_t inv_enable_results_holder()
return result;
}
-/** Sets state of if we know the accel bias.
- * @return return 1 if we know the accel bias, 0 if not.
- * it is set with inv_set_accel_bias_found()
- */
-int inv_got_accel_bias()
-{
- return rh.got_accel_bias;
-}
-
-/** Sets whether we know the accel bias
- * @param[in] state Set to 1 if we know the accel bias.
- * Can be retrieved with inv_got_accel_bias()
- */
-void inv_set_accel_bias_found(int state)
-{
- rh.got_accel_bias = state;
-}
-
/** Sets state of if we know the compass bias.
* @return return 1 if we know the compass bias, 0 if not.
* it is set with inv_set_compass_bias_found()
diff --git a/libsensors_iio/software/core/mllite/results_holder.h b/libsensors_iio/software/core/mllite/results_holder.h
index 09da24e..a60d7f0 100644
--- a/libsensors_iio/software/core/mllite/results_holder.h
+++ b/libsensors_iio/software/core/mllite/results_holder.h
@@ -70,10 +70,6 @@ inv_error_t inv_get_linear_accel_float(float *data);
void inv_set_heading_confidence_interval(float ci);
float inv_get_heading_confidence_interval(void);
-int inv_got_accel_bias();
-void inv_set_accel_bias_found(int state);
-
-
#ifdef __cplusplus
}
#endif
diff --git a/libsensors_iio/software/core/mllite/start_manager.c b/libsensors_iio/software/core/mllite/start_manager.c
index 3e082d4..fb758e7 100644
--- a/libsensors_iio/software/core/mllite/start_manager.c
+++ b/libsensors_iio/software/core/mllite/start_manager.c
@@ -1,105 +1,105 @@
-/*
- $License:
- Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
- See included License.txt for License information.
- $
- */
-
-/*******************************************************************************
- *
- * $Id:$
- *
- ******************************************************************************/
-/**
- * @defgroup Start_Manager start_manager
- * @brief Motion Library - Start Manager
- * Start Manager
- *
- * @{
- * @file start_manager.c
- * @brief This handles all the callbacks when inv_start_mpl() is called.
- */
-
-
-#include <string.h>
-#include "log.h"
-#include "start_manager.h"
-
-typedef inv_error_t (*inv_start_cb_func)();
-struct inv_start_cb_t {
- int num_cb;
- inv_start_cb_func start_cb[INV_MAX_START_CB];
-};
-
-static struct inv_start_cb_t inv_start_cb;
-
-/** Initilize the start manager. Typically called by inv_start_mpl();
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_init_start_manager(void)
-{
- memset(&inv_start_cb, 0, sizeof(inv_start_cb));
- return INV_SUCCESS;
-}
-
-/** Removes a callback from start notification
-* @param[in] start_cb function to remove from start notification
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_unregister_mpl_start_notification(inv_error_t (*start_cb)(void))
-{
- int kk;
-
- for (kk=0; kk<inv_start_cb.num_cb; ++kk) {
- if (inv_start_cb.start_cb[kk] == start_cb) {
- // Found the match
- if (kk != (inv_start_cb.num_cb-1)) {
- memmove(&inv_start_cb.start_cb[kk],
- &inv_start_cb.start_cb[kk+1],
- (inv_start_cb.num_cb-kk-1)*sizeof(inv_start_cb_func));
- }
- inv_start_cb.num_cb--;
- return INV_SUCCESS;
- }
- }
- return INV_ERROR_INVALID_PARAMETER;
-}
-
-/** Register a callback to receive when inv_start_mpl() is called.
-* @param[in] start_cb Function callback that will be called when inv_start_mpl() is
-* called.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_register_mpl_start_notification(inv_error_t (*start_cb)(void))
-{
- if (inv_start_cb.num_cb >= INV_MAX_START_CB)
- return INV_ERROR_INVALID_PARAMETER;
-
- inv_start_cb.start_cb[inv_start_cb.num_cb] = start_cb;
- inv_start_cb.num_cb++;
- return INV_SUCCESS;
-}
-
-/** Callback all the functions that want to be notified when inv_start_mpl() was
-* called.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_execute_mpl_start_notification(void)
-{
- inv_error_t result,first_error;
- int kk;
-
- first_error = INV_SUCCESS;
-
- for (kk = 0; kk < inv_start_cb.num_cb; ++kk) {
- result = inv_start_cb.start_cb[kk]();
- if (result && (first_error == INV_SUCCESS)) {
- first_error = result;
- }
- }
- return first_error;
-}
-
-/**
- * @}
- */
+/*
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+
+/*******************************************************************************
+ *
+ * $Id:$
+ *
+ ******************************************************************************/
+/**
+ * @defgroup Start_Manager start_manager
+ * @brief Motion Library - Start Manager
+ * Start Manager
+ *
+ * @{
+ * @file start_manager.c
+ * @brief This handles all the callbacks when inv_start_mpl() is called.
+ */
+
+
+#include <string.h>
+#include "log.h"
+#include "start_manager.h"
+
+typedef inv_error_t (*inv_start_cb_func)();
+struct inv_start_cb_t {
+ int num_cb;
+ inv_start_cb_func start_cb[INV_MAX_START_CB];
+};
+
+static struct inv_start_cb_t inv_start_cb;
+
+/** Initilize the start manager. Typically called by inv_start_mpl();
+* @return Returns INV_SUCCESS if successful or an error code if not.
+*/
+inv_error_t inv_init_start_manager(void)
+{
+ memset(&inv_start_cb, 0, sizeof(inv_start_cb));
+ return INV_SUCCESS;
+}
+
+/** Removes a callback from start notification
+* @param[in] start_cb function to remove from start notification
+* @return Returns INV_SUCCESS if successful or an error code if not.
+*/
+inv_error_t inv_unregister_mpl_start_notification(inv_error_t (*start_cb)(void))
+{
+ int kk;
+
+ for (kk=0; kk<inv_start_cb.num_cb; ++kk) {
+ if (inv_start_cb.start_cb[kk] == start_cb) {
+ // Found the match
+ if (kk != (inv_start_cb.num_cb-1)) {
+ memmove(&inv_start_cb.start_cb[kk],
+ &inv_start_cb.start_cb[kk+1],
+ (inv_start_cb.num_cb-kk-1)*sizeof(inv_start_cb_func));
+ }
+ inv_start_cb.num_cb--;
+ return INV_SUCCESS;
+ }
+ }
+ return INV_ERROR_INVALID_PARAMETER;
+}
+
+/** Register a callback to receive when inv_start_mpl() is called.
+* @param[in] start_cb Function callback that will be called when inv_start_mpl() is
+* called.
+* @return Returns INV_SUCCESS if successful or an error code if not.
+*/
+inv_error_t inv_register_mpl_start_notification(inv_error_t (*start_cb)(void))
+{
+ if (inv_start_cb.num_cb >= INV_MAX_START_CB)
+ return INV_ERROR_INVALID_PARAMETER;
+
+ inv_start_cb.start_cb[inv_start_cb.num_cb] = start_cb;
+ inv_start_cb.num_cb++;
+ return INV_SUCCESS;
+}
+
+/** Callback all the functions that want to be notified when inv_start_mpl() was
+* called.
+* @return Returns INV_SUCCESS if successful or an error code if not.
+*/
+inv_error_t inv_execute_mpl_start_notification(void)
+{
+ inv_error_t result,first_error;
+ int kk;
+
+ first_error = INV_SUCCESS;
+
+ for (kk = 0; kk < inv_start_cb.num_cb; ++kk) {
+ result = inv_start_cb.start_cb[kk]();
+ if (result && (first_error == INV_SUCCESS)) {
+ first_error = result;
+ }
+ }
+ return first_error;
+}
+
+/**
+ * @}
+ */
diff --git a/libsensors_iio/software/core/mllite/storage_manager.c b/libsensors_iio/software/core/mllite/storage_manager.c
index 3e4e619..4b92bfc 100644
--- a/libsensors_iio/software/core/mllite/storage_manager.c
+++ b/libsensors_iio/software/core/mllite/storage_manager.c
@@ -4,7 +4,6 @@
See included License.txt for License information.
$
*/
-
/**
* @defgroup Storage_Manager storage_manager
* @brief Motion Library - Stores Data for functions.
@@ -14,9 +13,6 @@
* @file storage_manager.c
* @brief Load and Store Manager.
*/
-
-#include <string.h>
-
#include "storage_manager.h"
#include "log.h"
#include "ml_math_func.h"
diff --git a/libsensors_iio/software/core/mpl/accel_auto_cal.h b/libsensors_iio/software/core/mpl/accel_auto_cal.h
index 6641a7f..5a53213 100644
--- a/libsensors_iio/software/core/mpl/accel_auto_cal.h
+++ b/libsensors_iio/software/core/mpl/accel_auto_cal.h
@@ -1,38 +1,38 @@
-/*
- $License:
- Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
- See included License.txt for License information.
- $
- */
-
-/*******************************************************************************
- *
- * $Id$
- *
- ******************************************************************************/
-
-#ifndef MLDMP_ACCEL_AUTO_CALIBRATION_H__
-#define MLDMP_ACCEL_AUTO_CALIBRATION_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inv_error_t inv_enable_in_use_auto_calibration(void);
-inv_error_t inv_disable_in_use_auto_calibration(void);
-inv_error_t inv_stop_in_use_auto_calibration(void);
-inv_error_t inv_start_in_use_auto_calibration(void);
-inv_error_t inv_in_use_auto_calibration_is_enabled(unsigned char *is_enabled);
-inv_error_t inv_init_in_use_auto_calibration(void);
-void inv_init_accel_maxmin(void);
-void inv_record_good_accel_maxmin(void);
-int inv_get_accel_bias_stage();
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // MLDMP_ACCEL_AUTO_CALIBRATION_H__
-
+/*
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+
+/*******************************************************************************
+ *
+ * $Id$
+ *
+ ******************************************************************************/
+
+#ifndef MLDMP_ACCEL_AUTO_CALIBRATION_H__
+#define MLDMP_ACCEL_AUTO_CALIBRATION_H__
+
+#include "mltypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+inv_error_t inv_enable_in_use_auto_calibration(void);
+inv_error_t inv_disable_in_use_auto_calibration(void);
+inv_error_t inv_stop_in_use_auto_calibration(void);
+inv_error_t inv_start_in_use_auto_calibration(void);
+inv_error_t inv_in_use_auto_calibration_is_enabled(unsigned char *is_enabled);
+inv_error_t inv_init_in_use_auto_calibration(void);
+void inv_init_accel_maxmin(void);
+void inv_record_good_accel_maxmin(void);
+int inv_get_accel_bias_stage();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLDMP_ACCEL_AUTO_CALIBRATION_H__
+
diff --git a/libsensors_iio/software/core/mpl/adv_func.h b/libsensors_iio/software/core/mpl/adv_func.h
new file mode 100644
index 0000000..3f8595f
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/adv_func.h
@@ -0,0 +1,30 @@
+/*
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+
+/******************************************************************************
+ *
+ * $Id$
+ *
+ *****************************************************************************/
+
+#ifndef MLDMP_ADVFUNC_H__
+#define MLDMP_ADVFUNC_H__
+#include "mltypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ float inv_compass_angle(const long *compass, const long *grav, const float *quat);
+ inv_error_t inv_set_dmp_quaternion(long *q);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // MLDMP_ADVFUNC_H__
diff --git a/libsensors_iio/software/core/mpl/auto_calibration.h b/libsensors_iio/software/core/mpl/auto_calibration.h
new file mode 100644
index 0000000..3dd9827
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/auto_calibration.h
@@ -0,0 +1,33 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+
+/******************************************************************************
+ *
+ * $Id$
+ *
+ *****************************************************************************/
+
+#ifndef MLDMP_IN_USE_AUTO_CALIBRATION_H__
+#define MLDMP_IN_USE_AUTO_CALIBRATION_H__
+
+#include "mltypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+inv_error_t inv_enable_in_use_auto_calibration(void);
+inv_error_t inv_disable_in_use_auto_calibration(void);
+inv_error_t inv_in_use_auto_calibration_is_enabled(unsigned char *is_enabled);
+inv_error_t inv_init_in_use_auto_calibration(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // MLDMP_IN_USE_AUTO_CALIBRATION_H__
+
diff --git a/libsensors_iio/software/core/mpl/build/android/libmplmpu.so b/libsensors_iio/software/core/mpl/build/android/libmplmpu.so
index 5e74a60..116b618 100644
--- a/libsensors_iio/software/core/mpl/build/android/libmplmpu.so
+++ b/libsensors_iio/software/core/mpl/build/android/libmplmpu.so
Binary files differ
diff --git a/libsensors_iio/software/core/mpl/build/android/shared.mk b/libsensors_iio/software/core/mpl/build/android/shared.mk
index 2e15205..79cf9c1 100644
--- a/libsensors_iio/software/core/mpl/build/android/shared.mk
+++ b/libsensors_iio/software/core/mpl/build/android/shared.mk
@@ -16,7 +16,6 @@ MPL_DIR = $(INV_ROOT)/software/core/mpl
include $(INV_ROOT)/software/build/android/common.mk
CFLAGS += $(CMDLINE_CFLAGS)
-CFLAGS += $(ANDROID_COMPILE)
CFLAGS += -Wall
CFLAGS += -fpic
CFLAGS += -nostdlib
@@ -44,6 +43,11 @@ LLINK += -ldl
LFLAGS += $(CMDLINE_LFLAGS)
LFLAGS += -shared
LFLAGS += -Wl,-soname,$(LIBRARY)
+LFLAGS += -nostdlib
+LFLAGS += -fpic
+LFLAGS += -Wl,-T,$(ANDROID_ROOT)/build/core/armelf.xsc
+LFLAGS += -Wl,--gc-sections
+LFLAGS += -Wl,--no-whole-archive
LFLAGS += -Wl,-shared,-Bsymbolic
LFLAGS += $(ANDROID_LINK)
LFLAGS += -Wl,-rpath,$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib:$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/system/lib
diff --git a/libsensors_iio/software/core/mpl/build/android/static.mk b/libsensors_iio/software/core/mpl/build/android/static.mk
new file mode 100644
index 0000000..6ad45de
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/build/android/static.mk
@@ -0,0 +1,110 @@
+MLLITE_LIB_NAME = mllite
+LIBRARY = $(LIB_PREFIX)$(MLLITE_LIB_NAME).$(STATIC_LIB_EXT)
+
+MK_NAME = $(notdir $(CURDIR)/$(firstword $(MAKEFILE_LIST)))
+
+OBJFOLDER = $(CURDIR)/obj
+
+CROSS = arm-none-linux-gnueabi-
+COMP= $(CROSS)gcc
+LINK= $(CROSS)ar cr
+
+MLLITE_DIR = $(MLSDK_ROOT)/mllite
+MPL_DIR = $(MLSDK_ROOT)/mldmp
+MLPLATFORM_DIR = $(MLSDK_ROOT)/platform
+
+include $(MLSDK_ROOT)/Android-common.mk
+
+CFLAGS += $(CMDLINE_CFLAGS)
+CFLAGS += -Wall -fpic
+CFLAGS += -mthumb-interwork -fno-exceptions -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -fmessage-length=0
+CFLAGS += -DNDEBUG
+CFLAGS += -D_REENTRANT -DLINUX -DANDROID
+CFLAGS += -I$(MLLITE_DIR)
+CFLAGS += -I$(MLPLATFORM_DIR)/include
+CFLAGS += -I$(MLSDK_ROOT)/mlutils
+CFLAGS += -I$(MLSDK_ROOT)/mlapps/common
+CFLAGS += $(MLSDK_INCLUDES)
+CFLAGS += $(MLSDK_DEFINES)
+
+VPATH += $(MLLITE_DIR)
+VPATH += $(MLSDK_ROOT)/mlutils
+VPATH += $(MLLITE_DIR)/accel
+VPATH += $(MLLITE_DIR)/compass
+VPATH += $(MLLITE_DIR)/pressure
+VPATH += $(MLLITE_DIR)/mlapps/common
+
+####################################################################################################
+## sources
+
+ML_LIBS = $(MLPLATFORM_DIR)/linux/$(LIB_PREFIX)$(MLPLATFORM_LIB_NAME).$(STATIC_LIB_EXT)
+
+ML_SOURCES += $(MLLITE_DIR)/mldl_cfg_mpu.c
+ML_SOURCES += $(MLLITE_DIR)/mldl_cfg_init_linux.c
+ML_SOURCES += $(MLLITE_DIR)/accel.c
+ML_SOURCES += $(MLLITE_DIR)/compass.c
+ML_SOURCES += $(MLLITE_DIR)/compass_supervisor.c
+ML_SOURCES += $(MLLITE_DIR)/compass_supervisor_adv_callbacks.c
+ML_SOURCES += $(MLLITE_DIR)/key0_96.c
+ML_SOURCES += $(MLLITE_DIR)/pressure.c
+ML_SOURCES += $(MLLITE_DIR)/ml.c
+ML_SOURCES += $(MLLITE_DIR)/ml_invobj.c
+ML_SOURCES += $(MLLITE_DIR)/ml_init.c
+ML_SOURCES += $(MLLITE_DIR)/mlarray_lite.c
+ML_SOURCES += $(MLLITE_DIR)/mlarray_adv.c
+ML_SOURCES += $(MLLITE_DIR)/mlarray_legacy.c
+ML_SOURCES += $(MLLITE_DIR)/mlBiasNoMotion.c
+ML_SOURCES += $(MLLITE_DIR)/mlFIFO.c
+ML_SOURCES += $(MLLITE_DIR)/mlFIFOHW.c
+ML_SOURCES += $(MLLITE_DIR)/mlMathFunc.c
+ML_SOURCES += $(MLLITE_DIR)/mlcontrol.c
+ML_SOURCES += $(MLLITE_DIR)/mldl.c
+ML_SOURCES += $(MLLITE_DIR)/mldmp.c
+ML_SOURCES += $(MLLITE_DIR)/dmpDefault.c
+ML_SOURCES += $(MLLITE_DIR)/mlstates.c
+ML_SOURCES += $(MLLITE_DIR)/mlsupervisor.c
+ML_SOURCES += $(MLLITE_DIR)/ml_stored_data.c
+ML_SOURCES += $(MLLITE_DIR)/ustore_manager.c
+ML_SOURCES += $(MLLITE_DIR)/ustore_mlsl_io.c
+ML_SOURCES += $(MLLITE_DIR)/ustore_adv_fusion_delegate.c
+ML_SOURCES += $(MLLITE_DIR)/ustore_lite_fusion_delegate.c
+ML_SOURCES += $(MLLITE_DIR)/temp_comp_legacy.c
+ML_SOURCES += $(MLLITE_DIR)/mlSetGyroBias.c
+ML_SOURCES += $(MLSDK_ROOT)/mlutils/checksum.c
+ML_SOURCES += $(MLSDK_ROOT)/mlutils/mputest.c
+ML_SOURCES += $(MLLITE_DIR)/mldl_print_cfg.c
+ifeq ($(MPU_NAME),MPU3050)
+ML_SOURCES += $(MLSDK_ROOT)/mlutils/mpu3050test.c
+else
+ML_SOURCES += $(MLSDK_ROOT)/mlutils/mpu6050test.c
+endif
+
+ML_OBJS := $(addsuffix .o,$(ML_SOURCES))
+ML_OBJS_DST = $(addprefix $(OBJFOLDER)/,$(addsuffix .o, $(notdir $(ML_SOURCES))))
+
+####################################################################################################
+## rules
+
+.PHONY: all clean cleanall
+
+all: $(LIBRARY) $(MK_NAME)
+
+$(LIBRARY) : $(OBJFOLDER) $(ML_OBJS_DST) $(ML_LIBS) $(MK_NAME)
+ @$(call echo_in_colors, "\n<linking $(LIBRARY) with objects $(ML_OBJS_DST)\n")
+ $(LINK) $(LIBRARY) $(ML_OBJS_DST)
+ $(CROSS)ranlib $(LIBRARY)
+
+$(OBJFOLDER) :
+ @$(call echo_in_colors, "\n<creating object's folder 'obj/'>\n")
+ mkdir obj
+
+$(ML_OBJS_DST) : $(OBJFOLDER)/%.c.o : %.c $(MK_NAME)
+ @$(call echo_in_colors, "\n<compile $< to $(OBJFOLDER)/$(notdir $@)>\n")
+ $(COMP) $(CFLAGS) $(ANDROID_INCLUDES) $(KERNEL_INCLUDES) $(MLSDK_INCLUDES) -o $@ -c $<
+
+clean :
+ rm -fR $(OBJFOLDER)
+
+cleanall :
+ rm -fR $(LIBRARY) $(OBJFOLDER)
+
diff --git a/libsensors_iio/software/core/mpl/fast_no_motion.h b/libsensors_iio/software/core/mpl/fast_no_motion.h
index 24bc0d5..2a33093 100644
--- a/libsensors_iio/software/core/mpl/fast_no_motion.h
+++ b/libsensors_iio/software/core/mpl/fast_no_motion.h
@@ -28,14 +28,12 @@ extern "C" {
void inv_set_default_number_of_samples(int N);
inv_error_t inv_fast_nomot_is_enabled(unsigned char *is_enabled);
inv_error_t inv_update_fast_nomot(long *gyro);
-
- void inv_get_fast_nomot_accel_param(long *cntr, long long *param);
- void inv_get_fast_nomot_compass_param(long *cntr, long long *param);
- void inv_set_fast_nomot_accel_threshold(long long thresh);
- void inv_set_fast_nomot_compass_threshold(long long thresh);
- void int_set_fast_nomot_gyro_threshold(long long thresh);
-
- void inv_fnm_debug_print(void);
+
+ void inv_get_fast_nomot_accel_param(long *cntr, float *param);
+ void inv_get_fast_nomot_compass_param(long *cntr, float *param);
+ void inv_set_fast_nomot_accel_threshold(float thresh);
+ void inv_set_fast_nomot_compass_threshold(float thresh);
+ void int_set_fast_nomot_gyro_threshold(float thresh);
#ifdef __cplusplus
}
diff --git a/libsensors_iio/software/core/mpl/fusion_9axis.h b/libsensors_iio/software/core/mpl/fusion_9axis.h
index 1ba1ebb..616694a 100644
--- a/libsensors_iio/software/core/mpl/fusion_9axis.h
+++ b/libsensors_iio/software/core/mpl/fusion_9axis.h
@@ -26,8 +26,6 @@ extern "C" {
inv_error_t inv_disable_9x_sensor_fusion(void);
inv_error_t inv_start_9x_sensor_fusion(void);
inv_error_t inv_stop_9x_sensor_fusion(void);
- inv_error_t inv_9x_fusion_set_mag_fb(double fb);
- inv_error_t inv_9x_fusion_enable_jitter_reduction(int en);
#ifdef __cplusplus
}
diff --git a/libsensors_iio/software/core/mpl/interpolator.h b/libsensors_iio/software/core/mpl/interpolator.h
new file mode 100644
index 0000000..5eb571d
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/interpolator.h
@@ -0,0 +1,103 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+#ifndef INTERPOLATOR_H
+#define INTERPOLATOR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//#include "mltypes.h"
+
+ /* ------------ */
+ /* - Defines. - */
+ /* ------------ */
+
+#define MAX_INTERPOLATION (20)
+
+typedef struct {
+ long x[2];
+ long y[4];
+} tInterpolate2;
+typedef struct {
+ long x[2];
+ long y[6];
+} tInterpolate3;
+typedef struct {
+ long x[5];
+ long y[10];
+ int idx1;
+} tInterpolate5;
+typedef struct {
+ tInterpolate2 state1;
+ tInterpolate2 state2;
+} tInterpolate4;
+typedef struct {
+ tInterpolate3 state1;
+ tInterpolate2 state2;
+} tInterpolate6;
+typedef struct {
+ tInterpolate2 state1;
+ tInterpolate4 state2;
+} tInterpolate8;
+typedef struct {
+ tInterpolate3 state1;
+ tInterpolate3 state2;
+} tInterpolate9;
+typedef struct {
+ tInterpolate5 state1;
+ tInterpolate2 state2;
+} tInterpolate10;
+typedef struct {
+ tInterpolate4 state1;
+ tInterpolate3 state2;
+} tInterpolate12;
+typedef struct {
+ tInterpolate5 state1;
+ tInterpolate3 state2;
+} tInterpolate15;
+typedef struct {
+ tInterpolate2 state1;
+ tInterpolate8 state2;
+} tInterpolate16;
+typedef struct {
+ tInterpolate9 state1;
+ tInterpolate2 state2;
+} tInterpolate18;
+typedef struct {
+ tInterpolate10 state1;
+ tInterpolate2 state2;
+} tInterpolate20;
+
+typedef union {
+ tInterpolate2 u2;
+ tInterpolate3 u3;
+ tInterpolate4 u4;
+ tInterpolate5 u5;
+ tInterpolate6 u6;
+ tInterpolate8 u8;
+ tInterpolate9 u9;
+ tInterpolate10 u10;
+ tInterpolate12 u12;
+ tInterpolate15 u15;
+ tInterpolate16 u16;
+ tInterpolate18 u18;
+ tInterpolate20 u20;
+} tInterpolateState;
+
+ /* --------------------- */
+ /* - Function p-types. - */
+ /* --------------------- */
+int inv_get_interp_amount( int x );
+int inv_interpolate( int amount, long input, long *output, tInterpolateState *state );
+long inv_fxmult( long x, long y );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* INTERPOLATOR_H */
diff --git a/libsensors_iio/software/core/mpl/inv_log.h b/libsensors_iio/software/core/mpl/inv_log.h
new file mode 100644
index 0000000..972844b
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/inv_log.h
@@ -0,0 +1,7 @@
+#include "mltypes.h"
+#ifndef INV_INV_LOG_H__
+#define INV_INV_LOG_H__
+
+#define INV_LOGE(s)
+
+#endif // INV_INV_LOG_H__
diff --git a/libsensors_iio/software/core/mpl/inv_math.h b/libsensors_iio/software/core/mpl/inv_math.h
index 175511a..6620bbf 100644
--- a/libsensors_iio/software/core/mpl/inv_math.h
+++ b/libsensors_iio/software/core/mpl/inv_math.h
@@ -1,8 +1,8 @@
-/* math.h has many functions and defines that are not consistent across
-* platforms. This address that */
-
-#ifdef _WINDOWS
-#define _USE_MATH_DEFINES
-#endif
-
-#include <math.h>
+/* math.h has many functions and defines that are not consistent across
+* platforms. This address that */
+
+#ifdef _WINDOWS
+#define _USE_MATH_DEFINES
+#endif
+
+#include <math.h>
diff --git a/libsensors_iio/software/core/mpl/invensense_adv.h b/libsensors_iio/software/core/mpl/invensense_adv.h
index 12932c9..9e59c18 100644
--- a/libsensors_iio/software/core/mpl/invensense_adv.h
+++ b/libsensors_iio/software/core/mpl/invensense_adv.h
@@ -28,4 +28,3 @@
#include "quaternion_supervisor.h"
#include "mag_disturb.h"
#include "quat_accuracy_monitor.h"
-#include "shake.h"
diff --git a/libsensors_iio/software/core/mpl/mlsetinterrupts.h b/libsensors_iio/software/core/mpl/mlsetinterrupts.h
new file mode 100644
index 0000000..a81dabb
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/mlsetinterrupts.h
@@ -0,0 +1,23 @@
+/*
+ $License:
+ Copyright (c) 2008 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+
+#ifndef MLSETINTERRUPT_H
+#define MLSETINTERRUPT_H
+
+#include "mltypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* DEPRECATED - Scheduled for removal. Do not use */
+ inv_error_t MLSetInterrupts(unsigned short interrupts);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MLSETINTERRUPT_H */
diff --git a/libsensors_iio/software/core/mpl/mlsupervisor_9axis.h b/libsensors_iio/software/core/mpl/mlsupervisor_9axis.h
new file mode 100644
index 0000000..3779381
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/mlsupervisor_9axis.h
@@ -0,0 +1,57 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+
+/******************************************************************************
+ *
+ * $Id: mlsupervisor_9axis.h 6123 2011-09-30 18:21:11Z mcaramello $
+ *
+ *****************************************************************************/
+
+#ifndef MLDMP_MLSUPERVISOR_H__
+#define MLDMP_MLSUPERVISOR_H__
+
+#include "mltypes.h"
+
+//#include "temp_comp.h"
+
+struct inv_fusion_t {
+ int compassCount;
+ long quat[4];
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+inv_error_t inv_enable_9x_fusion(void);
+inv_error_t inv_disable_9x_fusion(void);
+
+inv_error_t inv_enable_9x_fusion_legacy(void);
+inv_error_t inv_disable_9x_fusion_legacy(void);
+
+inv_error_t inv_enable_9x_fusion_new(void);
+inv_error_t inv_disable_9x_fusion_new(void);
+
+inv_error_t inv_enable_9x_fusion_basic(void);
+inv_error_t inv_disable_9x_fusion_basic(void);
+
+inv_error_t inv_enable_9x_fusion_external(void);
+inv_error_t inv_disable_9x_fusion_external(void);
+
+inv_error_t inv_enable_maintain_heading(void);
+inv_error_t inv_disable_maintain_heading(void);
+
+void inv_set_compass_state(long compassState, long accState,
+ unsigned long deltaTime,
+ int magDisturb, int gotBias,
+ int *new_state,
+ int *new_accuracy);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLDMP_MLSUPERVISOR_H__
diff --git a/libsensors_iio/software/core/mpl/motion_no_motion.h b/libsensors_iio/software/core/mpl/motion_no_motion.h
index 188c78b..01cf1c0 100644
--- a/libsensors_iio/software/core/mpl/motion_no_motion.h
+++ b/libsensors_iio/software/core/mpl/motion_no_motion.h
@@ -1,28 +1,28 @@
-/*
- $License:
- Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
- See included License.txt for License information.
- $
+/*
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
*/
-#ifndef INV_MOTION_NO_MOTION_H__
-#define INV_MOTION_NO_MOTION_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inv_error_t inv_enable_motion_no_motion(void);
-inv_error_t inv_disable_motion_no_motion(void);
-inv_error_t inv_init_motion_no_motion(void);
-inv_error_t inv_start_motion_no_motion(void);
-inv_error_t inv_stop_motion_no_motion(void);
-
-inv_error_t inv_set_no_motion_time(long time_ms);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // INV_MOTION_NO_MOTION_H__
+#ifndef INV_MOTION_NO_MOTION_H__
+#define INV_MOTION_NO_MOTION_H__
+
+#include "mltypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+inv_error_t inv_enable_motion_no_motion(void);
+inv_error_t inv_disable_motion_no_motion(void);
+inv_error_t inv_init_motion_no_motion(void);
+inv_error_t inv_start_motion_no_motion(void);
+inv_error_t inv_stop_motion_no_motion(void);
+
+inv_error_t inv_set_no_motion_time(long time_ms);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // INV_MOTION_NO_MOTION_H__
diff --git a/libsensors_iio/software/core/mpl/orientation.h b/libsensors_iio/software/core/mpl/orientation.h
new file mode 100644
index 0000000..ab4e45e
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/orientation.h
@@ -0,0 +1,42 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+#ifndef MLDMP_ORIENTATION_H__
+#define MLDMP_ORIENTATION_H__
+
+#include "mltypes.h"
+/*******************************************************************************/
+/* Orientations */
+/*******************************************************************************/
+
+#define INV_X_UP 0x01
+#define INV_X_DOWN 0x02
+#define INV_Y_UP 0x04
+#define INV_Y_DOWN 0x08
+#define INV_Z_UP 0x10
+#define INV_Z_DOWN 0x20
+#define INV_ORIENTATION_ALL 0x3F
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ inv_error_t inv_enable_orientation(void);
+ inv_error_t inv_disable_orientation(void);
+ inv_error_t inv_set_orientation(int orientation);
+ inv_error_t inv_set_orientation_cb(void (*callback)(unsigned short));
+ inv_error_t inv_get_orientation(int *orientation);
+ inv_error_t inv_get_orientation_state(int * state);
+ inv_error_t inv_set_orientation_interrupt(unsigned char on);
+ inv_error_t inv_set_orientation_thresh(float angle,
+ float hysteresis,
+ unsigned long time,
+ unsigned int axis);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLDMP_ORIENTATION_H__
diff --git a/libsensors_iio/software/core/mpl/progressive_no_motion.h b/libsensors_iio/software/core/mpl/progressive_no_motion.h
new file mode 100644
index 0000000..99333e3
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/progressive_no_motion.h
@@ -0,0 +1,39 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+
+/******************************************************************************
+ *
+ * $Id:$
+ *
+ *****************************************************************************/
+
+#ifndef MLDMP_PROG_NO_MOTION_H__
+#define MLDMP_PROG_NO_MOTION_H__
+
+#include "mltypes.h"
+
+#define PROG_NO_MOTION 1
+#define PROG_MOTION 2
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* APIs */
+inv_error_t inv_enable_prog_no_motion(void);
+inv_error_t inv_disable_prog_no_motion(void);
+
+/* internal use */
+int inv_get_prog_no_motion_enabled(void);
+void inv_get_prog_no_motion_bias_changed(void);
+int inv_get_prog_no_motion_state(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // MLDMP_PROG_NO_MOTION_H__
diff --git a/libsensors_iio/software/core/mpl/quat_accuracy_monitor.h b/libsensors_iio/software/core/mpl/quat_accuracy_monitor.h
index 5ee0573..2cf7a50 100644
--- a/libsensors_iio/software/core/mpl/quat_accuracy_monitor.h
+++ b/libsensors_iio/software/core/mpl/quat_accuracy_monitor.h
@@ -1,71 +1,70 @@
-/*
- quat_accuracy_monitor.h
- $License:
- Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
- See included License.txt for License information.
- $
- */
-
-/*******************************************************************************
- *
- * $Id:$
- *
- ******************************************************************************/
-
-#ifndef QUAT_ACCURARCY_MONITOR_H__
-#define QUAT_ACCURARCY_MONITOR_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-enum accuracy_signal_type_e {
- TYPE_NAV_QUAT,
- TYPE_GAM_QUAT,
- TYPE_NAV_QUAT_ADVANCED,
- TYPE_GAM_QUAT_ADVANCED,
- TYPE_NAV_QUAT_BASIC,
- TYPE_GAM_QUAT_BASIC,
- TYPE_MAG,
- TYPE_GYRO,
- TYPE_ACCEL,
-};
-
-inv_error_t inv_init_quat_accuracy_monitor(void);
-
-void set_accuracy_threshold(enum accuracy_signal_type_e type, double threshold);
-double get_accuracy_threshold(enum accuracy_signal_type_e type);
-void set_accuracy_weight(enum accuracy_signal_type_e type, int weight);
-int get_accuracy_weight(enum accuracy_signal_type_e type);
-
-int8_t get_accuracy_accuracy(enum accuracy_signal_type_e type);
-
-void inv_reset_quat_accuracy(void);
-double get_6axis_correction_term(void);
-double get_9axis_correction_term(void);
-int get_9axis_accuracy_state();
-
-void set_6axis_error_average(double value);
-double get_6axis_error_bound(void);
-double get_compass_correction(void);
-double get_9axis_error_bound(void);
-
-float get_confidence_interval(void);
-void set_compass_uncertainty(float value);
-
-inv_error_t inv_enable_quat_accuracy_monitor(void);
-inv_error_t inv_disable_quat_accuracy_monitor(void);
-inv_error_t inv_start_quat_accuracy_monitor(void);
-inv_error_t inv_stop_quat_accuracy_monitor(void);
-
-double get_compassNgravity(void);
-double get_init_compassNgravity(void);
-
-float inv_heading_accuracy_check(float orient[3], float *heading, int8_t *accuracy);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // QUAT_ACCURARCY_MONITOR_H__
+/*
+ quat_accuracy_monitor.h
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+
+/*******************************************************************************
+ *
+ * $Id:$
+ *
+ ******************************************************************************/
+
+#ifndef QUAT_ACCURARCY_MONITOR_H__
+#define QUAT_ACCURARCY_MONITOR_H__
+
+#include "mltypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+enum accuracy_signal_type_e {
+ TYPE_NAV_QUAT,
+ TYPE_GAM_QUAT,
+ TYPE_NAV_QUAT_ADVANCED,
+ TYPE_GAM_QUAT_ADVANCED,
+ TYPE_NAV_QUAT_BASIC,
+ TYPE_GAM_QUAT_BASIC,
+ TYPE_MAG,
+ TYPE_GYRO,
+ TYPE_ACCEL,
+};
+
+inv_error_t inv_init_quat_accuracy_monitor(void);
+
+void set_accuracy_threshold(enum accuracy_signal_type_e type, double threshold);
+double get_accuracy_threshold(enum accuracy_signal_type_e type);
+void set_accuracy_weight(enum accuracy_signal_type_e type, int weight);
+int get_accuracy_weight(enum accuracy_signal_type_e type);
+
+int8_t get_accuracy_accuracy(enum accuracy_signal_type_e type);
+
+void inv_reset_quat_accuracy(void);
+double get_6axis_correction_term(void);
+double get_9axis_correction_term(void);
+int get_9axis_accuracy_state();
+
+void set_6axis_error_average(double value);
+double get_6axis_error_bound(void);
+double get_compass_correction(void);
+double get_9axis_error_bound(void);
+
+float get_confidence_interval(void);
+void set_compass_uncertainty(float value);
+
+inv_error_t inv_enable_quat_accuracy_monitor(void);
+inv_error_t inv_disable_quat_accuracy_monitor(void);
+inv_error_t inv_start_quat_accuracy_monitor(void);
+inv_error_t inv_stop_quat_accuracy_monitor(void);
+
+double get_compassNgravity(void);
+double get_init_compassNgravity(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // QUAT_ACCURARCY_MONITOR_H__
diff --git a/libsensors_iio/software/core/mpl/quaternion_supervisor.h b/libsensors_iio/software/core/mpl/quaternion_supervisor.h
index 722c0d9..532e8af 100644
--- a/libsensors_iio/software/core/mpl/quaternion_supervisor.h
+++ b/libsensors_iio/software/core/mpl/quaternion_supervisor.h
@@ -1,27 +1,26 @@
-/*
- $License:
- Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
- See included License.txt for License information.
- $
- */
-#ifndef INV_QUATERNION_SUPERVISOR_H__
-#define INV_QUATERNION_SUPERVISOR_H__
-
-#include "mltypes.h"
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inv_error_t inv_enable_quaternion(void);
-inv_error_t inv_disable_quaternion(void);
-inv_error_t inv_init_quaternion(void);
-inv_error_t inv_start_quaternion(void);
-void inv_set_quaternion(long *quat);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // INV_QUATERNION_SUPERVISOR_H__
+/*
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+#ifndef INV_QUATERNION_SUPERVISOR_H__
+#define INV_QUATERNION_SUPERVISOR_H__
+
+#include "mltypes.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+inv_error_t inv_enable_quaternion(void);
+inv_error_t inv_disable_quaternion(void);
+inv_error_t inv_init_quaternion(void);
+inv_error_t inv_start_quaternion(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // INV_QUATERNION_SUPERVISOR_H__
diff --git a/libsensors_iio/software/core/mpl/sensor_moments.h b/libsensors_iio/software/core/mpl/sensor_moments.h
new file mode 100644
index 0000000..73eb363
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/sensor_moments.h
@@ -0,0 +1,42 @@
+/*
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+
+/******************************************************************************
+ *
+ * $Id$
+ *
+ *****************************************************************************/
+
+#ifndef MLDMP_SENSOR_MOMENTS_H__
+#define MLDMP_SENSOR_MOMENTS_H__
+
+#include "mltypes.h"
+
+enum moment_ord {
+ SECOND_ORD=0,
+ THIRD_ORD,
+ FOURTH_ORD,
+ MAX_ORD
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ inv_error_t inv_enable_sm(void);
+ inv_error_t inv_disable_sm(void);
+ inv_error_t inv_sm_record_data(float sample, void *sensor);
+ inv_error_t inv_sm_update_evt_act_state(int motion);
+ void *inv_init_sm(enum moment_ord);
+ float inv_sm_get_filtered_data(void *sensor);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MLDMP_SENSOR_MOMENTS_H__
+
diff --git a/libsensors_iio/software/core/mpl/shake.h b/libsensors_iio/software/core/mpl/shake.h
deleted file mode 100644
index 8775a4c..0000000
--- a/libsensors_iio/software/core/mpl/shake.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- $License:
- Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
- See included License.txt for License information.
- $
- */
-#ifndef INV_SHAKE_H__
-#define INV_SHAKE_H__
-
-#include "mltypes.h"
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- /* ------------ */
- /* - Defines. - */
- /* ------------ */
-
- #define STATE_ZERO 0
- #define STATE_INIT_1 1
- #define STATE_INIT_2 2
- #define STATE_DETECT 3
-
- struct t_shake_config_params {
- long shake_time_min_ms;
- long shake_time_max_ms;
- long shake_time_min;
- long shake_time_max;
- unsigned char shake_time_set;
- long shake_time_saved;
- float shake_deriv_thr;
- int zero_cross_thr;
- float accel_delta_min;
- float accel_delta_max;
- unsigned char interp_enable;
- };
-
- struct t_shake_state_params {
- unsigned char state;
- float accel_peak_high;
- float accel_peak_low;
- float accel_range;
- int num_zero_cross;
- short curr_shake_time;
- int deriv_major_change;
- int deriv_major_sign;
- float accel_buffer[200];
- float delta_buffer[200];
- };
-
- struct t_shake_data_params {
- float accel_prev;
- float accel_curr;
- float delta_prev;
- float delta_curr;
- float delta_prev_buffer;
- };
-
- struct t_shake_results {
- //unsigned char shake_int;
- int shake_number;
- };
-
- struct t_shake_cb {
- void (*shake_callback)(struct t_shake_results *shake_results);
- };
-
-
- /* --------------------- */
- /* - Function p-types. - */
- /* --------------------- */
- inv_error_t inv_enable_shake(void);
- inv_error_t inv_disable_shake(void);
- inv_error_t inv_init_shake(void);
- inv_error_t inv_start_shake(void);
- int inv_set_shake_cb(void (*callback)(struct t_shake_results *shake_results));
- void inv_config_shake_time_params(long sample_time_ms);
- void inv_set_shake_accel_delta_min(float accel_g);
- void inv_set_shake_accel_delta_max(float accel_g);
- void inv_set_shake_zero_cross_thresh(int num_zero_cross);
- void inv_set_shake_deriv_thresh(float shake_deriv_thresh);
- void inv_set_shake_time_min_ms(long time_ms);
- void inv_set_shake_time_max_ms(long time_ms);
- void inv_enable_shake_data_interpolation(unsigned char en);
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // INV_SHAKE__ \ No newline at end of file
diff --git a/libsensors_iio/software/core/mpl/state_storage.h b/libsensors_iio/software/core/mpl/state_storage.h
new file mode 100644
index 0000000..c1eb47b
--- /dev/null
+++ b/libsensors_iio/software/core/mpl/state_storage.h
@@ -0,0 +1,25 @@
+/*
+ $License:
+ Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
+ See included License.txt for License information.
+ $
+ */
+#ifndef INV_STATE_STORAGE_H__
+#define INV_STATE_STORAGE_H__
+
+#include "mltypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+inv_error_t inv_store_data(const void *data, size_t size, unsigned long module,
+ unsigned long version);
+inv_error_t inv_load_data(void *data, size_t size, unsigned long module,
+ unsigned long version);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // INV_STATE_STORAGE_H__
diff --git a/libsensors_iio/software/simple_apps/common/external_hardware.h b/libsensors_iio/software/simple_apps/common/external_hardware.h
new file mode 100644
index 0000000..55e3b20
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/external_hardware.h
@@ -0,0 +1,156 @@
+/*
+ Accelerometer
+*/
+#define get_accel_slave_descr NULL
+
+#ifdef CONFIG_MPU_SENSORS_ADXL34X /* ADI accelerometer */
+struct ext_slave_descr *adxl34x_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr adxl34x_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_BMA150 /* Bosch accelerometer */
+struct ext_slave_descr *bma150_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr bma150_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_BMA222 /* Bosch 222 accelerometer */
+struct ext_slave_descr *bma222_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr bma222_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_BMA250 /* Bosch accelerometer */
+struct ext_slave_descr *bma250_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr bma250_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_KXSD9 /* Kionix accelerometer */
+struct ext_slave_descr *kxsd9_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr kxsd9_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_KXTF9 /* Kionix accelerometer */
+struct ext_slave_descr *kxtf9_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr kxtf9_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_LIS331DLH /* ST accelerometer */
+struct ext_slave_descr *lis331_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr lis331_get_slave_descr
+#endif
+
+
+#ifdef CONFIG_MPU_SENSORS_LIS3DH /* ST accelerometer */
+struct ext_slave_descr *lis3dh_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr lis3dh_get_slave_descr
+#endif
+
+/* ST accelerometer in LSM303DLx combo */
+#if defined CONFIG_MPU_SENSORS_LSM303DLX_A
+struct ext_slave_descr *lsm303dlx_a_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr lsm303dlx_a_get_slave_descr
+#endif
+
+/* MPU6050 Accel */
+#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
+ defined CONFIG_MPU_SENSORS_MPU6050B1
+struct ext_slave_descr *mpu6050_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr mpu6050_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_MMA8450 /* Freescale accelerometer */
+struct ext_slave_descr *mma8450_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr mma8450_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_MMA845X /* Freescale accelerometer */
+struct ext_slave_descr *mma845x_get_slave_descr(void);
+#undef get_accel_slave_descr
+#define get_accel_slave_descr mma845x_get_slave_descr
+#endif
+
+
+/*
+ Compass
+*/
+#define get_compass_slave_descr NULL
+
+#ifdef CONFIG_MPU_SENSORS_AK8975 /* AKM compass */
+struct ext_slave_descr *ak8975_get_slave_descr(void);
+#undef get_compass_slave_descr
+#define get_compass_slave_descr ak8975_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_AMI30X /* AICHI Steel AMI304/305 compass */
+struct ext_slave_descr *ami30x_get_slave_descr(void);
+#undef get_compass_slave_descr
+#define get_compass_slave_descr ami30x_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_AMI306 /* AICHI Steel AMI306 compass */
+struct ext_slave_descr *ami306_get_slave_descr(void);
+#undef get_compass_slave_descr
+#define get_compass_slave_descr ami306_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_HMC5883 /* Honeywell compass */
+struct ext_slave_descr *hmc5883_get_slave_descr(void);
+#undef get_compass_slave_descr
+#define get_compass_slave_descr hmc5883_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_MMC314X /* MEMSIC compass */
+struct ext_slave_descr *mmc314x_get_slave_descr(void);
+#undef get_compass_slave_descr
+#define get_compass_slave_descr mmc314x_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_LSM303DLX_M /* ST compass */
+struct ext_slave_descr *lsm303dlx_m_get_slave_descr(void);
+#undef get_compass_slave_descr
+#define get_compass_slave_descr lsm303dlx_m_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_YAS529 /* Yamaha compass */
+struct ext_slave_descr *yas529_get_slave_descr(void);
+#undef get_compass_slave_descr
+#define get_compass_slave_descr yas529_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_YAS530 /* Yamaha compass */
+struct ext_slave_descr *yas530_get_slave_descr(void);
+#undef get_compass_slave_descr
+#define get_compass_slave_descr yas530_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_HSCDTD002B /* Alps HSCDTD002B compass */
+struct ext_slave_descr *hscdtd002b_get_slave_descr(void);
+#undef get_compass_slave_descr
+#define get_compass_slave_descr hscdtd002b_get_slave_descr
+#endif
+
+#ifdef CONFIG_MPU_SENSORS_HSCDTD004A /* Alps HSCDTD004A compass */
+struct ext_slave_descr *hscdtd004a_get_slave_descr(void);
+#undef get_compass_slave_descr
+#define get_compass_slave_descr hscdtd004a_get_slave_descr
+#endif
+/*
+ Pressure
+*/
+#define get_pressure_slave_descr NULL
+
+#ifdef CONFIG_MPU_SENSORS_BMA085 /* BMA pressure */
+struct ext_slave_descr *bma085_get_slave_descr(void);
+#undef get_pressure_slave_descr
+#define get_pressure_slave_descr bma085_get_slave_descr
+#endif
diff --git a/libsensors_iio/software/simple_apps/common/fopenCMake.c b/libsensors_iio/software/simple_apps/common/fopenCMake.c
new file mode 100644
index 0000000..2936109
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/fopenCMake.c
@@ -0,0 +1,56 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+/******************************************************************************
+ *
+ * $Id: fopenCMake.c 5629 2011-06-11 03:13:08Z mcaramello $
+ *
+ *****************************************************************************/
+
+#include <string.h>
+
+#include "fopenCMake.h"
+#include "path_configure.h"
+
+/**
+ * @brief Replacement for fopen that concatenates the location of the
+ * source tree onto the filename path.
+ * It looks in 3 locations:
+ * - in the current directory,
+ * - then it looks in "..",
+ * - lastly in the define UNITTEST_SOURCE_DIR which
+ * gets defined by CMake.
+ * @param filename
+ * Filename relative to base of source directory.
+ * @param prop
+ * Second argument to fopen.
+ */
+FILE *fopenCMake(const char *filename, const char *prop)
+{
+ char path[150];
+ FILE *file;
+
+ // Look first in current directory
+ file = fopen(filename, prop);
+ if (file == NULL) {
+ // Now look in ".."
+#ifdef WIN32
+ strcpy(path, "..\\");
+#else
+ strcpy(path, "../");
+#endif
+ strcat(path, filename);
+ file = fopen(path, prop);
+ if (file == NULL) {
+ // Now look in definition by CMake
+ strcpy(path, PATH_SOURCE_DIR);
+ strcat(path, filename);
+ file = fopen(path, prop);
+ }
+ }
+ return file;
+}
+
+
diff --git a/libsensors_iio/software/simple_apps/common/fopenCMake.h b/libsensors_iio/software/simple_apps/common/fopenCMake.h
new file mode 100644
index 0000000..c5eba39
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/fopenCMake.h
@@ -0,0 +1,21 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+#ifndef FOPEN_CMAKE_H__
+#define FOPEN_CMAKE_H__
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+FILE *fopenCMake( const char *filename, const char *prop );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // FOPEN_CMAKE_H__
diff --git a/libsensors_iio/software/simple_apps/common/gestureMenu.c b/libsensors_iio/software/simple_apps/common/gestureMenu.c
new file mode 100644
index 0000000..2a9487c
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/gestureMenu.c
@@ -0,0 +1,725 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+
+/******************************************************************************
+ * $Id: gestureMenu.c 5705 2011-06-28 19:32:29Z nroyer $
+ *****************************************************************************/
+
+#define _USE_MATH_DEFINES
+#include <stdio.h>
+#include <stddef.h>
+#include <math.h>
+#include <string.h>
+
+#include "ml.h"
+#include "mlmath.h"
+#include "gesture.h"
+#include "orientation.h"
+#include "gestureMenu.h"
+#include "fifo.h"
+
+#undef MPL_LOG_TAG
+#define MPL_LOG_TAG "gest"
+#include "log.h"
+#include "mldl_cfg.h"
+
+static unsigned long sensors[] = {
+ INV_NINE_AXIS,
+ INV_THREE_AXIS_GYRO,
+ INV_DMP_PROCESSOR | INV_THREE_AXIS_ACCEL,
+ INV_THREE_AXIS_ACCEL,
+ INV_DMP_PROCESSOR | INV_THREE_AXIS_COMPASS,
+ INV_THREE_AXIS_COMPASS,
+ INV_SIX_AXIS_GYRO_ACCEL,
+ INV_DMP_PROCESSOR | INV_SIX_AXIS_ACCEL_COMPASS,
+ INV_SIX_AXIS_ACCEL_COMPASS,
+};
+
+static char *sensors_string[] = {
+ "INV_NINE_AXIS",
+ "INV_THREE_AXIS_GYRO",
+ "INV_DMP_PROCESSOR | INV_THREE_AXIS_ACCEL",
+ "INV_THREE_AXIS_ACCEL",
+ "INV_DMP_PROCESSOR | INV_THREE_AXIS_COMPASS",
+ "INV_THREE_AXIS_COMPASS",
+ "INV_SIX_AXIS_GYRO_ACCEL",
+ "INV_DMP_PROCESSOR | INV_SIX_AXIS_ACCEL_COMPASS",
+ "INV_SIX_AXIS_ACCEL_COMPASS",
+};
+
+/**
+ * Prints the menu with the current thresholds
+ *
+ * @param params The parameters to print
+ */
+void PrintGestureMenu(tGestureMenuParams const * const params)
+{
+ MPL_LOGI("Press h at any time to re-display this menu\n");
+ MPL_LOGI("TAP PARAMETERS:\n");
+ MPL_LOGI(" Use LEFT and RIGHT arrows to adjust Tap Time \n\n");
+ MPL_LOGI(" j : Increase X threshold : %5d\n",
+ params->xTapThreshold);
+ MPL_LOGI(" J (Shift-j): Decrease X threshold\n");
+ MPL_LOGI(" k : Increase Y threshold : %5d\n",
+ params->yTapThreshold);
+ MPL_LOGI(" K (Shift-k): Decrease Y threshold\n");
+ MPL_LOGI(" i : Increase Z threshold : %5d\n",
+ params->zTapThreshold);
+ MPL_LOGI(" I (Shift-i): Decrease Z threshold\n");
+ MPL_LOGI(" l : Increase tap time : %5d\n",
+ params->tapTime);
+ MPL_LOGI(" L (Shift-l): Decrease tap time\n");
+ MPL_LOGI(" o : Increase next tap time : %5d\n",
+ params->nextTapTime);
+ MPL_LOGI(" O (Shift-o): Increase next tap time\n");
+ MPL_LOGI(" u : Increase max Taps : %5d\n",
+ params->maxTaps);
+ MPL_LOGI(" U (Shift-u): Increase max Taps\n");
+
+ MPL_LOGI("SHAKE PARAMETERS:\n");
+ MPL_LOGI(" x : Increase X threshold : %5d\n",
+ params->xShakeThresh);
+ MPL_LOGI(" X (Shift-x): Decrease X threshold\n");
+ MPL_LOGI(" y : Increase Y threshold : %5d\n",
+ params->yShakeThresh);
+ MPL_LOGI(" Y (Shift-y): Decrease Y threshold\n");
+ MPL_LOGI(" z : Increase Z threshold : %5d\n",
+ params->zShakeThresh);
+ MPL_LOGI(" Z (Shift-z): Decrease Z threshold\n");
+ MPL_LOGI(" s : Toggle Shake Function : %5d\n",
+ params->shakeFunction);
+ MPL_LOGI(" t : Increase Shake Time : %5d\n",
+ params->shakeTime);
+ MPL_LOGI(" T (Shift-T): Decrease Shake Time\n");
+ MPL_LOGI(" n : Increase Next Shake Time : %5d\n",
+ params->nextShakeTime);
+ MPL_LOGI(" N (Shift-n): Decrease Next Shake Time\n");
+ MPL_LOGI(" m : Increase max Shakes : %5d\n",
+ params->maxShakes);
+ MPL_LOGI(" M (Shift-m): Decrease max Shakes\n");
+ MPL_LOGI("SNAP PARAMETERS:\n");
+ MPL_LOGI(" p : Increase Pitch threshold : %5d\n",
+ params->xSnapThresh);
+ MPL_LOGI(" P (Shift-p): Decrease Pitch threshold\n");
+ MPL_LOGI(" r : Increase Roll threshold : %5d\n",
+ params->ySnapThresh);
+ MPL_LOGI(" R (Shift-r): Decrease Roll threshold\n");
+ MPL_LOGI(" a : Increase yAw threshold : %5d\n",
+ params->zSnapThresh);
+ MPL_LOGI(" A (Shift-a): Decrease yAw threshold\n");
+ MPL_LOGI("YAW ROTATION PARAMETERS:\n");
+ MPL_LOGI(" e : Increase yaW Rotate time : %5d\n",
+ params->yawRotateTime);
+ MPL_LOGI(" E (Shift-r): Decrease yaW Rotate time\n");
+ MPL_LOGI(" w : Increase yaW Rotate threshold : %5d\n",
+ params->yawRotateThreshold);
+ MPL_LOGI(" W (Shift-w): Decrease yaW Rotate threshold\n");
+ MPL_LOGI("ORIENTATION PARAMETER:\n");
+ MPL_LOGI(" d : Increase orientation angle threshold : %5f\n",
+ params->orientationThreshold);
+ MPL_LOGI(" D (Shift-d): Decrease orientation angle threshold\n");
+ MPL_LOGI("FIFO RATE:\n");
+ MPL_LOGI(" f : Increase fifo divider : %5d\n",
+ inv_get_fifo_rate());
+ MPL_LOGI(" F (Shift-f): Decrease fifo divider\n");
+ MPL_LOGI("REQUESTED SENSORS:\n");
+ MPL_LOGI(" S (Shift-s): Toggle in use sensors : %s\n",
+ sensors_string[params->sensorsIndex]);
+ MPL_LOGI(" F (Shift-f): Decrease fifo divider\n");
+
+ /* V,v, B,b, Q,q, C,c, G,g, are available letters upper and lowercase */
+ /* S is available */
+
+ MPL_LOGI("\n\n");
+}
+
+/**
+ * Handles a keyboard input and updates an appropriate threshold, prints then
+ * menu or returns false if the character is not processed.
+ *
+ * @param params The parameters to modify if the thresholds are updated
+ * @param ch The input character
+ *
+ * @return true if the character was processed, false otherwise
+ */
+inv_error_t GestureMenuProcessChar(tGestureMenuParams * const params, char ch)
+{
+ int result = INV_SUCCESS;
+ /* Dynamic keyboard processing */
+
+ switch (ch) {
+ case 'j':
+ params->xTapThreshold += 20;
+ // Intentionally fall through
+ case 'J': {
+ params->xTapThreshold -= 10;
+ if (params->xTapThreshold < 0) params->xTapThreshold = 0;
+ result = inv_set_tap_threshold(INV_TAP_AXIS_X, params->xTapThreshold);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("MLSetTapThresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_tap_threshold(INV_TAP_AXIS_X, %d)\n",
+ params->xTapThreshold);
+ } break;
+ case 'k':
+ params->yTapThreshold += 20;
+ // Intentionally fall through
+ case 'K': {
+ params->yTapThreshold -= 10;
+ if (params->yTapThreshold < 0) params->yTapThreshold = 0;
+ result = inv_set_tap_threshold(INV_TAP_AXIS_Y, params->yTapThreshold);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("MLSetTapThresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_tap_threshold(INV_TAP_AXIS_Y, %d)\n",
+ params->yTapThreshold);
+ } break;
+ case 'i':
+ params->zTapThreshold += 20;
+ // Intentionally fall through
+ case 'I': {
+ params->zTapThreshold -= 10;
+ if (params->zTapThreshold < 0) params->zTapThreshold = 0;
+ result = inv_set_tap_threshold(INV_TAP_AXIS_Z, params->zTapThreshold);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("MLSetTapThresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_tap_threshold(INV_TAP_AXIS_Z, %d)\n",
+ params->zTapThreshold);
+ } break;
+
+ case 'l':
+ params->tapTime += 20;
+ // Intentionally fall through
+ case 'L': {
+ params->tapTime -= 10;
+ if (params->tapTime < 0) params->tapTime = 0;
+ result = inv_set_next_tap_time(params->tapTime);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_next_tap_time returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_next_tap_time(%d)\n", params->tapTime);
+ } break;
+ case 'o':
+ params->nextTapTime += 20;
+ // Intentionally fall through
+ case 'O': {
+ params->nextTapTime -= 10;
+ if (params->nextTapTime < 0) params->nextTapTime = 0;
+ result = MLSetNextTapTime(params->nextTapTime);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("MLSetNextTapTime returned :%d\n", result);
+ }
+ MPL_LOGI("MLSetNextTapTime(%d)\n", params->nextTapTime);
+ } break;
+ case 'u':
+ params->maxTaps += 2;
+ // Intentionally fall through
+ case 'U': {
+ params->maxTaps -= 1;
+ if (params->maxTaps < 0) params->maxTaps = 0;
+ result = inv_set_max_taps(params->maxTaps);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_max_taps returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_max_taps(%d)\n", params->maxTaps);
+ } break;
+ case 's': {
+ int shakeParam;
+ params->shakeFunction = (params->shakeFunction + 1) % 2;
+ switch (params->shakeFunction)
+ {
+ case 0:
+ shakeParam = INV_NO_RETRACTION;
+ MPL_LOGE("inv_set_shake_func(INV_NO_RETRACTION)\n");
+ break;
+ case 1:
+ shakeParam = INV_RETRACTION;
+ MPL_LOGI("inv_set_shake_func(INV_RETRACTION)\n");
+ break;
+ };
+ result = inv_set_shake_func(shakeParam);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_shake_func returned :%d\n", result);
+ }
+ } break;
+ case 'x':
+ params->xShakeThresh += 200;
+ // Intentionally fall through
+ case 'X': {
+ params->xShakeThresh -= 100;
+ result = inv_set_shake_thresh(INV_PITCH_SHAKE, params->xShakeThresh);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_shake_thresh(INV_PITCH_SHAKE, %d)\n", params->xShakeThresh);
+ } break;
+ case 'y':
+ params->yShakeThresh += 200;
+ // Intentionally fall through
+ case 'Y': {
+ params->yShakeThresh -= 100;
+ result = inv_set_shake_thresh(INV_ROLL_SHAKE, params->yShakeThresh);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_shake_thresh(INV_ROLL_SHAKE, %d)\n", params->yShakeThresh);
+ } break;
+ case 'z':
+ params->zShakeThresh += 200;
+ // Intentionally fall through
+ case 'Z':{
+ params->zShakeThresh -= 100;
+ result = inv_set_shake_thresh(INV_YAW_SHAKE, params->zShakeThresh);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_shake_thresh(INV_YAW_SHAKE, %d)\n",params->zShakeThresh);
+ } break;
+ case 'r':
+ params->ySnapThresh += 20;
+ // Intentionally fall through
+ case 'R': {
+ params->ySnapThresh -= 10;
+ result = inv_set_hard_shake_thresh(INV_ROLL_SHAKE, params->ySnapThresh);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_hard_shake_thresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_hard_shake_thresh(INV_ROLL_SHAKE, %d)\n",params->ySnapThresh);
+ } break;
+ case 'p':
+ params->xSnapThresh += 20;
+ // Intentionally fall through
+ case 'P': {
+ params->xSnapThresh -= 10;
+ result = inv_set_hard_shake_thresh(INV_PITCH_SHAKE, params->xSnapThresh);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_hard_shake_thresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_hard_shake_thresh(INV_PITCH_SHAKE, %d)\n",
+ params->xSnapThresh);
+ } break;
+ case 'a':
+ params->zSnapThresh += 20;
+ case 'A': {
+ params->zSnapThresh -= 10;
+ result = inv_set_hard_shake_thresh(INV_YAW_SHAKE, params->zSnapThresh);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_hard_shake_thresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_hard_shake_thresh(INV_YAW_SHAKE, %d)\n",params->zSnapThresh);
+ } break;
+
+ case 't':
+ params->shakeTime += 20;
+ case 'T':{
+ params->shakeTime -= 10;
+ result = inv_set_shake_time(params->shakeTime);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_shake_time returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_shake_time(%d)\n", params->shakeTime);
+ } break;
+ case 'n':
+ params->nextShakeTime += 20;
+ case 'N':{
+ params->nextShakeTime -= 10;
+ result = inv_set_next_shake_time(params->nextShakeTime);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_next_shake_time returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_next_shake_time(%d)\n", params->nextShakeTime);
+ } break;
+ case 'm':
+ params->maxShakes += 2;
+ case 'M':{
+ params->maxShakes -= 1;
+ result = inv_set_max_shakes(INV_SHAKE_ALL, params->maxShakes);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_max_shakes returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_max_shakes(%d)\n", params->maxShakes);
+ } break;
+ case 'e':
+ params->yawRotateTime += 20;
+ case 'E':{
+ params->yawRotateTime -= 10;
+ result = inv_set_yaw_rotate_time(params->yawRotateTime);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_yaw_rotate_time returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_yaw_rotate_time(%d)\n", params->yawRotateTime);
+ } break;
+ case 'w':
+ params->yawRotateThreshold += 2;
+ case 'W':{
+ params->yawRotateThreshold -= 1;
+ result = inv_set_yaw_rotate_thresh(params->yawRotateThreshold);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_yaw_rotate_thresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_yaw_rotate_thresh(%d)\n", params->yawRotateThreshold);
+ } break;
+ case 'c':
+ params->shakeRejectValue += 0.20f;
+ case 'C':{
+ params->shakeRejectValue -= 0.10f;
+ result = inv_set_tap_shake_reject(params->shakeRejectValue);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_tap_shake_reject returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_tap_shake_reject(%f)\n", params->shakeRejectValue);
+ } break;
+ case 'd':
+ params->orientationThreshold += 10;
+ case 'D':{
+ params->orientationThreshold -= 5;
+ if (params->orientationThreshold > 90) {
+ params->orientationThreshold = 90;
+ }
+
+ if (params->orientationThreshold < 0 ) {
+ params->orientationThreshold = 0;
+ }
+
+ result = inv_set_orientation_thresh(params->orientationThreshold,
+ 5, 80,
+ INV_X_AXIS | INV_Y_AXIS | INV_Z_AXIS);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_orientation_thresh returned :%d\n", result);
+ }
+ MPL_LOGI("inv_set_orientation_thresh(%f, %d, %d,"
+ " INV_X_AXIS | INV_Y_AXIS | INV_Z_AXIS)\n",
+ params->orientationThreshold, 5, 80);
+ } break;
+ case 'f':
+ result = inv_set_fifo_rate(inv_get_fifo_rate() + 1);
+ MPL_LOGI("inv_set_fifo_rate(%d)\n",inv_get_fifo_rate());
+ break;
+ case 'F':
+ {
+ unsigned short newRate = inv_get_fifo_rate();
+ if (newRate > 0)
+ newRate--;
+ result = inv_set_fifo_rate(newRate);
+ MPL_LOGI("inv_set_fifo_rate(%d)\n",inv_get_fifo_rate());
+ break;
+ }
+ case 'S':
+ params->sensorsIndex++;
+ if (params->sensorsIndex >= ARRAY_SIZE(sensors)) {
+ params->sensorsIndex = 0;
+ }
+ result = inv_set_mpu_sensors(
+ sensors[params->sensorsIndex] & params->available_sensors);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ MPL_LOGI("%d = inv_set_mpu_sensors(%s)\n", result,
+ sensors_string[params->sensorsIndex]);
+ break;
+ case 'h':
+ case 'H': {
+ PrintGestureMenu(params);
+ } break;
+ default: {
+ result = INV_ERROR;
+ } break;
+ };
+ return result;
+}
+
+/**
+ * Initializes the tGestureMenuParams to a set of defaults.
+ *
+ * @param params The parameters to initialize.
+ */
+void GestureMenuSetDefaults(tGestureMenuParams * const params)
+{
+ params->xTapThreshold = 100;
+ params->yTapThreshold = 100;
+ params->zTapThreshold = 100;
+ params->tapTime = 100;
+ params->nextTapTime = 600;
+ params->maxTaps = 2;
+ params->shakeRejectValue = 0.8f;
+ params->xShakeThresh = 750;
+ params->yShakeThresh = 750;
+ params->zShakeThresh = 750;
+ params->xSnapThresh = 160;
+ params->ySnapThresh = 320;
+ params->zSnapThresh = 160;
+ params->shakeTime = 100;
+ params->nextShakeTime = 1000;
+ params->shakeFunction = 0;
+ params->maxShakes = 3;
+ params->yawRotateTime = 80;
+ params->yawRotateThreshold = 70;
+ params->orientationThreshold = 60;
+ params->sensorsIndex = 0;
+ params->available_sensors = INV_NINE_AXIS;
+}
+
+void GestureMenuSetAvailableSensors(tGestureMenuParams * const params,
+ unsigned long available_sensors)
+{
+ params->available_sensors = available_sensors;
+}
+/**
+ * Call the appropriate MPL set threshold functions and checkes the error codes
+ *
+ * @param params The parametrs to use in setting the thresholds
+ *
+ * @return INV_SUCCESS or the first error code encountered.
+ */
+inv_error_t GestureMenuSetMpl(tGestureMenuParams const * const params)
+{
+ inv_error_t result = INV_SUCCESS;
+
+ result = inv_set_tap_threshold(INV_TAP_AXIS_X, params->xTapThreshold);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_tap_threshold returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_tap_threshold(INV_TAP_AXIS_Y, params->yTapThreshold);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_tap_threshold returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_tap_threshold(INV_TAP_AXIS_Z, params->zTapThreshold);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_tap_threshold returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_next_tap_time(params->tapTime);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_next_tap_time returned :%d\n", result);
+ return result;
+ }
+ result = MLSetNextTapTime(params->nextTapTime);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("MLSetNextTapTime returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_max_taps(params->maxTaps);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_max_taps returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_tap_shake_reject(params->shakeRejectValue);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_tap_shake_reject returned :%d\n", result);
+ return result;
+ }
+
+ //Set up shake gesture
+ result = inv_set_shake_func(params->shakeFunction);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_shake_func returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_shake_thresh(INV_ROLL_SHAKE, params->xShakeThresh);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_shake_thresh(INV_PITCH_SHAKE, params->yShakeThresh);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_shake_thresh(INV_YAW_SHAKE, params->zShakeThresh);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_shake_thresh returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_shake_time(params->shakeTime);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_shake_time returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_next_shake_time(params->nextShakeTime);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_next_shake_time returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_max_shakes(INV_SHAKE_ALL,params->maxShakes);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_max_shakes returned :%d\n", result);
+ return result;
+ }
+
+ // Yaw rotate settings
+ result = inv_set_yaw_rotate_time(params->yawRotateTime);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_yaw_rotate_time returned :%d\n", result);
+ return result;
+ }
+ result = inv_set_yaw_rotate_thresh(params->yawRotateThreshold);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_yaw_rotate_thresh returned :%d\n", result);
+ return result;
+ }
+
+ // Orientation settings
+ result = inv_set_orientation_thresh(params->orientationThreshold, 5, 80,
+ INV_X_AXIS | INV_Y_AXIS | INV_Z_AXIS);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("inv_set_orientation_thresh returned: %d\n", result);
+ return result;
+ }
+
+ // Requested Sensors
+ result = inv_set_mpu_sensors(
+ sensors[params->sensorsIndex] & params->available_sensors);
+ if (INV_SUCCESS != result) {
+ MPL_LOGE("MLSetMPUSesnors returned: %d %lx\n", result,
+ sensors[params->sensorsIndex] & params->available_sensors);
+ return result;
+ }
+
+ return INV_SUCCESS;
+}
+
+void PrintGesture(tGesture* gesture)
+{
+ float speed;
+ char type[1024];
+ switch (gesture->type)
+ {
+ case INV_TAP:
+ {
+ if (gesture->meta < 0) {
+ snprintf(type,sizeof(type),"-");
+ } else {
+ snprintf(type,sizeof(type),"+");
+ }
+
+ switch (ABS(gesture->meta))
+ {
+ case 1:
+ strcat(type,"X");
+ break;
+ case 2:
+ strcat(type,"Y");
+ break;
+ case 3:
+ strcat(type,"Z");
+ break;
+ default:
+ strcat(type,"ERROR");
+ break;
+ };
+ MPL_LOGI("TAP: %s %2d, X: %6d Y: %6d Z: %6d XY: %6.2f, YZ: %6.2f, XZ: %6.2f\n",
+ type,
+ gesture->num,
+ gesture->strength,
+ gesture->speed,
+ gesture->reserved,
+ (180 / M_PI) * atan2(
+ (float)gesture->strength, (float)gesture->speed),
+ (180 / M_PI) * atan2(
+ (float)gesture->speed, (float)gesture->reserved),
+ (180 / M_PI) * atan2(
+ (float)gesture->strength, (float)gesture->reserved)
+ );
+ }
+ break;
+ case INV_ROLL_SHAKE:
+ case INV_PITCH_SHAKE:
+ case INV_YAW_SHAKE:
+ {
+ if (gesture->strength){
+ snprintf(type, sizeof(type), "Snap : ");
+ } else {
+ snprintf(type, sizeof(type), "Shake: ");
+ }
+
+ if (gesture->meta==0) {
+ strcat(type, "+");
+ } else {
+ strcat(type, "-");
+ }
+
+ if (gesture->type == INV_ROLL_SHAKE) {
+ strcat(type, "Roll ");
+ } else if (gesture->type == INV_PITCH_SHAKE) {
+ strcat(type, "Pitch ");
+ } else if (gesture->type == INV_YAW_SHAKE) {
+ strcat(type, "Yaw ");
+ }
+
+ speed = (float)gesture->speed +
+ (float)(gesture->reserved / (float)(1 << 16));
+ MPL_LOGI("%s:%3d (speed: %8.2f)\n",type, gesture->num, speed);
+ }
+ break;
+ case INV_YAW_IMAGE_ROTATE:
+ {
+ if (gesture->meta == 0) {
+ snprintf(type, sizeof(type), "Positive ");
+ } else {
+ snprintf(type, sizeof(type), "Negative ");
+ }
+ MPL_LOGI("%s Yaw Image Rotation\n", type);
+ }
+ break;
+ default:
+ MPL_LOGE("Unknown Gesture received\n");
+ break;
+ }
+}
+
+/**
+ * Prints the new or current orientation using MPL_LOGI and remembers the last
+ * orientation to print orientation flips.
+ *
+ * @param orientation the new or current orientation. 0 to reset.
+ */
+void PrintOrientation(unsigned short orientation)
+{
+ // Determine if it was a flip
+ static int sLastOrientation = 0;
+ int flip = orientation | sLastOrientation;
+
+ if ((INV_X_UP | INV_X_DOWN) == flip) {
+ MPL_LOGI("Flip about the X Axis: \n");
+ } else if ((INV_Y_UP | INV_Y_DOWN) == flip) {
+ MPL_LOGI("Flip about the Y axis: \n");
+ } else if ((INV_Z_UP | INV_Z_DOWN) == flip) {
+ MPL_LOGI("Flip about the Z axis: \n");
+ }
+ sLastOrientation = orientation;
+
+ switch (orientation) {
+ case INV_X_UP:
+ MPL_LOGI("X Axis is up\n");
+ break;
+ case INV_X_DOWN:
+ MPL_LOGI("X Axis is down\n");
+ break;
+ case INV_Y_UP:
+ MPL_LOGI("Y Axis is up\n");
+ break;
+ case INV_Y_DOWN:
+ MPL_LOGI("Y Axis is down\n");
+ break;
+ case INV_Z_UP:
+ MPL_LOGI("Z Axis is up\n");
+ break;
+ case INV_Z_DOWN:
+ MPL_LOGI("Z Axis is down\n");
+ break;
+ case 0:
+ break; /* Not an error. Resets sLastOrientation */
+ default:
+ MPL_LOGE("%s: Unreconized orientation %hx\n", __func__, orientation);
+ break;
+ }
+}
+
+
diff --git a/libsensors_iio/software/simple_apps/common/gestureMenu.h b/libsensors_iio/software/simple_apps/common/gestureMenu.h
new file mode 100644
index 0000000..8f804e1
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/gestureMenu.h
@@ -0,0 +1,75 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+/***************************************************************************** *
+ * $Id: gestureMenu.h 5705 2011-06-28 19:32:29Z nroyer $
+ ******************************************************************************/
+/**
+ * @defgroup
+ * @brief
+ *
+ * @{
+ * @file gestureMenu.h
+ * @brief
+ *
+ *
+ */
+
+#ifndef __GESTUREMENU_H__
+#define __GESTUREMENU_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************/
+ typedef struct sGestureMenuParams {
+ /* Tap Params */
+ int xTapThreshold;
+ int yTapThreshold;
+ int zTapThreshold;
+ int tapTime;
+ int nextTapTime;
+ int maxTaps;
+ float shakeRejectValue;
+
+ /* Shake Params */
+ int xShakeThresh;
+ int yShakeThresh;
+ int zShakeThresh;
+ int xSnapThresh;
+ int ySnapThresh;
+ int zSnapThresh;
+ int shakeTime;
+ int nextShakeTime;
+ int shakeFunction;
+ int maxShakes;
+
+ /* Yaw rotate params */
+ int yawRotateTime;
+ int yawRotateThreshold;
+
+ /* Orientation */
+ float orientationThreshold;
+ int sensorsIndex;
+ unsigned long available_sensors;
+ } tGestureMenuParams;
+
+ void PrintGestureMenu(tGestureMenuParams const * const params) ;
+ inv_error_t GestureMenuProcessChar(tGestureMenuParams * const params,char ch);
+ void PrintGesture(gesture_t* gesture);
+ void PrintOrientation(unsigned short orientation);
+ void GestureMenuSetDefaults(tGestureMenuParams * const params);
+ void GestureMenuSetAvailableSensors(tGestureMenuParams * const params,
+ unsigned long available_sensors);
+ inv_error_t GestureMenuSetMpl(tGestureMenuParams const * const params);
+
+/******************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __GESTUREMENU_H__
diff --git a/libsensors_iio/software/simple_apps/common/helper.c b/libsensors_iio/software/simple_apps/common/helper.c
new file mode 100644
index 0000000..4d634bd
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/helper.c
@@ -0,0 +1,110 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+/*******************************************************************************
+ *
+ * $Id: helper.c 4367 2010-12-21 03:02:55Z prao $
+ *
+ *******************************************************************************/
+
+#include <stdio.h>
+#ifdef _WIN32
+#include <windows.h>
+#include <conio.h>
+#endif
+#ifdef LINUX
+#include <sys/select.h>
+#endif
+#include <time.h>
+#include <string.h>
+
+#include "ml.h"
+#include "slave.h"
+#include "mldl.h"
+#include "mltypes.h"
+#include "mlstates.h"
+#include "compass.h"
+
+#include "mlsl.h"
+#include "ml.h"
+
+#include "helper.h"
+#include "mlsetup.h"
+#include "fopenCMake.h"
+#include "int.h"
+#include "mlos.h"
+
+#include "log.h"
+#undef MPL_LOG_TAG
+#define MPL_LOG_TAG "MPL-helper"
+
+#ifdef AIO
+extern inv_error_t MLSLSetYamahaCompassDataMode(unsigned char mode);
+#endif
+
+// Keyboard hit function
+int ConsoleKbhit(void)
+{
+#ifdef _WIN32
+ return _kbhit();
+#else
+ struct timeval tv;
+ fd_set read_fd;
+
+ tv.tv_sec=0;
+ tv.tv_usec=0;
+ FD_ZERO(&read_fd);
+ FD_SET(0,&read_fd);
+
+ if(select(1, &read_fd, NULL, NULL, &tv) == -1)
+ return 0;
+
+ if(FD_ISSET(0,&read_fd))
+ return 1;
+
+ return 0;
+#endif
+}
+
+char ConsoleGetChar(void) {
+#ifdef _WIN32
+ return _getch();
+#else
+ return getchar();
+#endif
+}
+struct mpuirq_data** InterruptPoll(int *handles, int numHandles, long tv_sec, long tv_usec)
+{
+ struct mpuirq_data **data;
+ void *tmp;
+ int ii;
+ const int irq_data_size = sizeof(**data) * numHandles +
+ sizeof(*data) * numHandles;
+
+ tmp = (void *)inv_malloc(irq_data_size);
+ memset(tmp, 0, irq_data_size);
+ data = (struct mpuirq_data **)tmp;
+ for (ii = 0; ii < numHandles; ii++) {
+ data[ii] = (struct mpuirq_data *)((unsigned long)tmp +
+ (sizeof(*data) * numHandles) + sizeof(**data) * ii);
+ }
+
+ if (IntProcess(handles, numHandles, data, tv_sec, tv_usec) > 0) {
+ for (ii = 0; ii < numHandles; ii++) {
+ if (data[ii]->interruptcount) {
+ inv_interrupt_handler(ii);
+ }
+ }
+ }
+
+ /* Return data incase the application needs to look at the timestamp or
+ other part of the data */
+ return data;
+}
+
+void InterruptPollDone(struct mpuirq_data ** data)
+{
+ inv_free(data);
+}
diff --git a/libsensors_iio/software/simple_apps/common/helper.h b/libsensors_iio/software/simple_apps/common/helper.h
new file mode 100644
index 0000000..b2da520
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/helper.h
@@ -0,0 +1,103 @@
+/*
+ $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
diff --git a/libsensors_iio/software/simple_apps/common/mlerrorcode.c b/libsensors_iio/software/simple_apps/common/mlerrorcode.c
new file mode 100644
index 0000000..25b0df6
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/mlerrorcode.c
@@ -0,0 +1,96 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+
+/******************************************************************************
+ *
+ * $Id: mlerrorcode.c 5629 2011-06-11 03:13:08Z mcaramello $
+ *
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+
+#include "mltypes.h"
+#include "mlerrorcode.h"
+
+#define ERROR_CODE_CASE(CODE) \
+ case CODE: \
+ return #CODE \
+
+/**
+ * @brief return a string containing the label assigned to the error code.
+ *
+ * @param errorcode
+ * The errorcode value of which the label has to be returned.
+ *
+ * @return A string containing the error code label.
+ */
+char* MLErrorCode(inv_error_t errorcode)
+{
+ switch(errorcode) {
+ ERROR_CODE_CASE(INV_SUCCESS);
+ ERROR_CODE_CASE(INV_ERROR);
+ ERROR_CODE_CASE(INV_ERROR_INVALID_PARAMETER);
+ ERROR_CODE_CASE(INV_ERROR_FEATURE_NOT_ENABLED);
+ ERROR_CODE_CASE(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ ERROR_CODE_CASE(INV_ERROR_DMP_NOT_STARTED);
+ ERROR_CODE_CASE(INV_ERROR_DMP_STARTED);
+ ERROR_CODE_CASE(INV_ERROR_NOT_OPENED);
+ ERROR_CODE_CASE(INV_ERROR_OPENED);
+ ERROR_CODE_CASE(INV_ERROR_INVALID_MODULE);
+ ERROR_CODE_CASE(INV_ERROR_MEMORY_EXAUSTED);
+ ERROR_CODE_CASE(INV_ERROR_DIVIDE_BY_ZERO);
+ ERROR_CODE_CASE(INV_ERROR_ASSERTION_FAILURE);
+ ERROR_CODE_CASE(INV_ERROR_FILE_OPEN);
+ ERROR_CODE_CASE(INV_ERROR_FILE_READ);
+ ERROR_CODE_CASE(INV_ERROR_FILE_WRITE);
+
+ ERROR_CODE_CASE(INV_ERROR_SERIAL_CLOSED);
+ ERROR_CODE_CASE(INV_ERROR_SERIAL_OPEN_ERROR);
+ ERROR_CODE_CASE(INV_ERROR_SERIAL_READ);
+ ERROR_CODE_CASE(INV_ERROR_SERIAL_WRITE);
+ ERROR_CODE_CASE(INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED);
+
+ ERROR_CODE_CASE(INV_ERROR_SM_TRANSITION);
+ ERROR_CODE_CASE(INV_ERROR_SM_IMPROPER_STATE);
+
+ ERROR_CODE_CASE(INV_ERROR_FIFO_OVERFLOW);
+ ERROR_CODE_CASE(INV_ERROR_FIFO_FOOTER);
+ ERROR_CODE_CASE(INV_ERROR_FIFO_READ_COUNT);
+ ERROR_CODE_CASE(INV_ERROR_FIFO_READ_DATA);
+ ERROR_CODE_CASE(INV_ERROR_MEMORY_SET);
+
+ ERROR_CODE_CASE(INV_ERROR_LOG_MEMORY_ERROR);
+ ERROR_CODE_CASE(INV_ERROR_LOG_OUTPUT_ERROR);
+
+ ERROR_CODE_CASE(INV_ERROR_OS_BAD_PTR);
+ ERROR_CODE_CASE(INV_ERROR_OS_BAD_HANDLE);
+ ERROR_CODE_CASE(INV_ERROR_OS_CREATE_FAILED);
+ ERROR_CODE_CASE(INV_ERROR_OS_LOCK_FAILED);
+
+ ERROR_CODE_CASE(INV_ERROR_COMPASS_DATA_OVERFLOW);
+ ERROR_CODE_CASE(INV_ERROR_COMPASS_DATA_UNDERFLOW);
+ ERROR_CODE_CASE(INV_ERROR_COMPASS_DATA_NOT_READY);
+ ERROR_CODE_CASE(INV_ERROR_COMPASS_DATA_ERROR);
+
+ ERROR_CODE_CASE(INV_ERROR_CALIBRATION_LOAD);
+ ERROR_CODE_CASE(INV_ERROR_CALIBRATION_STORE);
+ ERROR_CODE_CASE(INV_ERROR_CALIBRATION_LEN);
+ ERROR_CODE_CASE(INV_ERROR_CALIBRATION_CHECKSUM);
+
+ default:
+ {
+ #define UNKNOWN_ERROR_CODE 1234
+ return ERROR_NAME(UNKNOWN_ERROR_CODE);
+ break;
+ }
+
+ }
+}
+
+/**
+ * @}
+ */
diff --git a/libsensors_iio/software/simple_apps/common/mlerrorcode.h b/libsensors_iio/software/simple_apps/common/mlerrorcode.h
new file mode 100644
index 0000000..9a35792
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/mlerrorcode.h
@@ -0,0 +1,86 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+/*******************************************************************************
+ *
+ * $Id: mltypes.h 3680 2010-09-04 03:13:32Z mcaramello $
+ *
+ *******************************************************************************/
+
+#ifndef _MLERRORCODE_H_
+#define _MLERRORCODE_H_
+
+#include "mltypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ Defines
+*/
+#define CALL_N_CHECK(f) { \
+ unsigned int r35uLt = f; \
+ if(INV_SUCCESS != r35uLt) { \
+ MPL_LOGE("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) { \
+ MPL_LOGE("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) do { \
+ unsigned int r35uLt = f; \
+ if(INV_SUCCESS != r35uLt) { \
+ MPL_LOGE("Error in file %s, line %d : %s returned code %s (#%d)\n", \
+ __FILE__, __LINE__, #f, MLErrorCode(r35uLt), r35uLt); \
+ return; \
+ } \
+ } while(0)
+
+#define CALL_CHECK_N_EXIT(f) { \
+ unsigned int r35uLt = f; \
+ if(INV_SUCCESS != r35uLt) { \
+ MPL_LOGE("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) { \
+ MPL_LOGE("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) { \
+ MPL_LOGE("Error in file %s, line %d : %s returned code %s (#%d)\n", \
+ __FILE__, __LINE__, #f, MLErrorCode(r35uLt), r35uLt); \
+ goto label; \
+ } \
+}
+
+char* MLErrorCode(inv_error_t errorcode);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/libsensors_iio/software/simple_apps/common/mlsetup.c b/libsensors_iio/software/simple_apps/common/mlsetup.c
new file mode 100644
index 0000000..f11bce9
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/mlsetup.c
@@ -0,0 +1,1722 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+/******************************************************************************
+ *
+ * $Id: mlsetup.c 6113 2011-09-29 23:40:55Z jcalizo $
+ *
+ *****************************************************************************/
+#undef MPL_LOG_NDEBUG
+#ifdef UNITTESTING
+#define MPL_LOG_NDEBUG 1
+#else
+#define MPL_LOG_NDEBUG 0
+#endif
+
+/**
+ * @defgroup MLSETUP
+ * @brief The Motion Library external slaves setup override suite.
+ *
+ * Use these APIs to override the kernel/default settings in the
+ * corresponding data structures for gyros, accel, and compass.
+ *
+ * @{
+ * @file mlsetup.c
+ * @brief The Motion Library external slaves setup override suite.
+ */
+
+/* ------------------ */
+/* - Include Files. - */
+/* ------------------ */
+
+/*
+ Defines
+*/
+/* these have to appear before inclusion of mpu.h */
+#define CONFIG_MPU_SENSORS_KXSD9 y // Kionix accel
+#define CONFIG_MPU_SENSORS_KXTF9 y // Kionix accel
+#define CONFIG_MPU_SENSORS_LIS331DLH y // ST accelerometer
+#define CONFIG_MPU_SENSORS_LSM303DLX_A y // ST accelerometer in LSM303DLx combo
+#define CONFIG_MPU_SENSORS_LIS3DH y // ST accelerometer
+#define CONFIG_MPU_SENSORS_BMA150 y // Bosch 150 accelerometer
+#define CONFIG_MPU_SENSORS_BMA222 y // Bosch 222 accelerometer
+#define CONFIG_MPU_SENSORS_BMA250 y // Bosch 250 accelerometer
+#define CONFIG_MPU_SENSORS_ADXL34X y // AD 345 or 346 accelerometer
+#define CONFIG_MPU_SENSORS_MMA8450 y // Freescale MMA8450 accelerometer
+#define CONFIG_MPU_SENSORS_MMA845X y // Freescale MMA845X accelerometer
+#if defined CONFIG_MPU_SENSORS_MPU6050A2 || defined CONFIG_MPU_SENSORS_MPU6050B1
+#define CONFIG_MPU_SENSORS_MPU6050_ACCEL y // Invensense MPU6050 built-in accelerometer
+#endif
+
+#define CONFIG_MPU_SENSORS_AK8975 y // AKM compass
+#define CONFIG_MPU_SENSORS_AMI30X y // AICHI AMI304/305 compass
+#define CONFIG_MPU_SENSORS_AMI306 y // AICHI AMI306 compass
+#define CONFIG_MPU_SENSORS_HMC5883 y // Honeywell compass
+#define CONFIG_MPU_SENSORS_LSM303DLX_M y // ST compass in LSM303DLx combo
+#define CONFIG_MPU_SENSORS_YAS529 y // Yamaha compass
+#define CONFIG_MPU_SENSORS_YAS530 y // Yamaha compass
+#define CONFIG_MPU_SENSORS_MMC314X y // MEMSIC compass
+#define CONFIG_MPU_SENSORS_HSCDTD002B y // ALPS compass
+#define CONFIG_MPU_SENSORS_HSCDTD004A y // ALPS HSCDTD004A compass
+
+#define CONFIG_MPU_SENSORS_BMA085 y // Bosch 085 pressure
+
+#include "external_hardware.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "slave.h"
+#include "compass.h"
+#include "log.h"
+#undef MPL_LOG_TAG
+#define MPL_LOG_TAG "MPL-mlsetup"
+
+#include "linux/mpu.h"
+
+#include "mlsetup.h"
+
+#ifdef LINUX
+#include "errno.h"
+#endif
+
+/* Override these structures from mldl.c */
+extern struct ext_slave_descr g_slave_accel;
+extern struct ext_slave_descr g_slave_compass;
+//extern struct ext_slave_descr g_slave_pressure;
+/* Platform Data */
+//extern struct mpu_platform_data g_pdata;
+extern struct ext_slave_platform_data g_pdata_slave_accel;
+extern struct ext_slave_platform_data g_pdata_slave_compass;
+//extern struct ext_slave_platform_data g_pdata_slave_pressure;
+signed char g_gyro_orientation[9];
+
+/*
+ Typedefs
+*/
+typedef void tSetupFuncAccel(void);
+typedef void tSetupFuncCompass(void);
+typedef void tSetupFuncPressure(void);
+
+#ifdef LINUX
+#include <sys/ioctl.h>
+#endif
+
+/*********************************************************************
+ Dragon - PLATFORM_ID_DRAGON_PROTOTYPE
+*********************************************************************/
+/**
+ * @internal
+ * @brief performs a 180' rotation around Z axis to reflect
+ * usage of the multi sensor board (MSB) with the
+ * beagleboard
+ * @note assumes well formed mounting matrix, with only
+ * one 1 for each row.
+ */
+static void Rotate180DegAroundZAxis(signed char matrix[])
+{
+ int ii;
+ for(ii=0; ii<6; ii++) {
+ matrix[ii] = -matrix[ii];
+ }
+}
+
+/**
+ * @internal
+ * Sets the orientation based on the position of the mounting. For different
+ * devices the relative position to pin 1 will be different.
+ *
+ * Positions are:
+ * - 0-3 are Z up
+ * - 4-7 are Z down
+ * - 8-11 are Z right
+ * - 12-15 are Z left
+ * - 16-19 are Z front
+ * - 20-23 are Z back
+ *
+ * @param position The position of the orientation
+ * @param orientation the location to store the new oreintation
+ */
+static inv_error_t SetupOrientation(unsigned int position,
+ signed char *orientation)
+{
+ memset(orientation, 0, 9);
+ switch (position){
+ case 0:
+ /*-------------------------*/
+ orientation[0] = +1;
+ orientation[4] = +1;
+ orientation[8] = +1;
+ break;
+ case 1:
+ /*-------------------------*/
+ orientation[1] = +1;
+ orientation[3] = -1;
+ orientation[8] = +1;
+ break;
+ case 2:
+ /*-------------------------*/
+ orientation[0] = -1;
+ orientation[4] = -1;
+ orientation[8] = +1;
+ break;
+ case 3:
+ /*-------------------------*/
+ orientation[1] = -1;
+ orientation[3] = +1;
+ orientation[8] = +1;
+ break;
+ case 4:
+ /*-------------------------*/
+ orientation[0] = -1;
+ orientation[4] = +1;
+ orientation[8] = -1;
+ break;
+ case 5:
+ /*-------------------------*/
+ orientation[1] = -1;
+ orientation[3] = -1;
+ orientation[8] = -1;
+ break;
+ case 6:
+ /*-------------------------*/
+ orientation[0] = +1;
+ orientation[4] = -1;
+ orientation[8] = -1;
+ break;
+ case 7:
+ /*-------------------------*/
+ orientation[1] = +1;
+ orientation[3] = +1;
+ orientation[8] = -1;
+ break;
+ case 8:
+ /*-------------------------*/
+ orientation[2] = +1;
+ orientation[3] = +1;
+ orientation[7] = +1;
+ break;
+ case 9:
+ /*-------------------------*/
+ orientation[2] = +1;
+ orientation[4] = +1;
+ orientation[6] = -1;
+ break;
+ case 10:
+ orientation[2] = +1;
+ orientation[3] = -1;
+ orientation[7] = -1;
+ break;
+ case 11:
+ orientation[2] = +1;
+ orientation[4] = -1;
+ orientation[6] = +1;
+ break;
+ case 12:
+ orientation[2] = -1;
+ orientation[3] = -1;
+ orientation[7] = +1;
+ break;
+ case 13:
+ orientation[2] = -1;
+ orientation[4] = -1;
+ orientation[6] = -1;
+ break;
+ case 14:
+ orientation[2] = -1;
+ orientation[3] = +1;
+ orientation[7] = -1;
+ break;
+ case 15:
+ orientation[2] = -1;
+ orientation[4] = +1;
+ orientation[6] = +1;
+ break;
+ case 16:
+ orientation[0] = -1;
+ orientation[5] = +1;
+ orientation[7] = +1;
+ break;
+ case 17:
+ orientation[1] = -1;
+ orientation[5] = +1;
+ orientation[6] = -1;
+ break;
+ case 18:
+ orientation[0] = +1;
+ orientation[5] = -1;
+ orientation[7] = -1;
+ break;
+ case 19:
+ orientation[1] = -1;
+ orientation[5] = +1;
+ orientation[6] = +1;
+ break;
+ case 20:
+ orientation[0] = +1;
+ orientation[5] = -1;
+ orientation[7] = +1;
+ break;
+ case 21:
+ orientation[1] = -1;
+ orientation[5] = -1;
+ orientation[6] = +1;
+ break;
+ case 22:
+ orientation[0] = -1;
+ orientation[5] = -1;
+ orientation[7] = -1;
+ break;
+ case 23:
+ orientation[1] = +1;
+ orientation[5] = -1;
+ orientation[6] = -1;
+ break;
+ default:
+ MPL_LOGE("Invalid position %d\n", position);
+ LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
+ return INV_ERROR_INVALID_PARAMETER;
+ }
+
+ return INV_SUCCESS;
+}
+
+static void PrintMountingOrientation(
+ const char * header, signed char *orientation)
+{
+ MPL_LOGV("%s:\n", header);
+ MPL_LOGV("\t[[%3d, %3d, %3d]\n",
+ orientation[0], orientation[1], orientation[2]);
+ MPL_LOGV("\t [%3d, %3d, %3d]\n",
+ orientation[3], orientation[4], orientation[5]);
+ MPL_LOGV("\t [%3d, %3d, %3d]]\n",
+ orientation[6], orientation[7], orientation[8]);
+}
+
+/*****************************
+ * Accel Setup Functions *
+ *****************************/
+
+static inv_error_t SetupAccelSTLIS331Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ case PLATFORM_ID_SPIDER_PROTOTYPE:
+ position = 5;
+ break;
+ case PLATFORM_ID_ST_6AXIS:
+ position = 0;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *lis331_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_LIS331;
+ return INV_SUCCESS;
+}
+
+static inv_error_t SetupAccelSTLIS3DHCalibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ case PLATFORM_ID_SPIDER_PROTOTYPE:
+ position = 1;
+ break;
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ position = 3;
+ break;
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *lis3dh_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_LIS3DH;
+ return result;
+}
+
+static inv_error_t SetupAccelKionixKXSD9Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 7;
+ break;
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *kxsd9_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_KXSD9;
+ return result;
+}
+
+static inv_error_t SetupAccelKionixKXTF9Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB_EVB:
+ position =0;
+ break;
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ case PLATFORM_ID_SPIDER_PROTOTYPE:
+ position = 7;
+ break;
+#ifdef WIN32
+ case PLATFORM_ID_DONGLE:
+ position = 1;
+ break;
+#endif
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ position = 1;
+ break;
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *kxtf9_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_KXTF9;
+ return result;
+}
+
+static inv_error_t SetupAccelLSM303Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ position = 3;
+ break;
+ case PLATFORM_ID_MSB_V2:
+ position = 1;
+ break;
+ case PLATFORM_ID_MSB_10AXIS:
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *lsm303dlx_a_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_LSM303;
+ return result;
+}
+
+static inv_error_t SetupAccelBMA150Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 6;
+ break;
+#ifdef WIN32
+ case PLATFORM_ID_DONGLE:
+ position = 3;
+ break;
+#endif
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *bma150_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_BMA150;
+ return result;
+}
+
+static inv_error_t SetupAccelBMA222Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 0;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *bma222_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_BMA222;
+ return result;
+}
+
+static inv_error_t SetupAccelBMA250Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ position = 0;
+ break;
+ case PLATFORM_ID_SPIDER_PROTOTYPE:
+ position = 3;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *bma250_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_BMA250;
+ return result;
+}
+
+static inv_error_t SetupAccelADXL34XCalibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 6;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *adxl34x_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_ADXL34X;
+ return result;
+}
+
+
+static inv_error_t SetupAccelMMA8450Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 5;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *mma8450_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_MMA8450;
+ return result;
+}
+
+
+static inv_error_t SetupAccelMMA845XCalibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 5;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_accel.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_accel = *mma845x_get_slave_descr();
+#endif
+ g_pdata_slave_accel.address = ACCEL_SLAVEADDR_MMA845X;
+ return result;
+}
+
+
+/**
+ * @internal
+ * Sets up the orientation matrix according to how the gyro was
+ * mounted.
+ *
+ * @param platforId Platform identification for mounting information
+ * @return INV_SUCCESS or non-zero error code
+ */
+static inv_error_t SetupAccelMPU6050Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ case PLATFORM_ID_MANTIS_MSB:
+ position = 6;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_DRAGON_USB_DONGLE:
+ position = 1;
+ break;
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ case PLATFORM_ID_MANTIS_EVB:
+ position = 0;
+ break;
+ case PLATFORM_ID_MSB_V3:
+ position = 2;
+ break;
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ return INV_ERROR_INVALID_PARAMETER;
+ };
+
+ SetupOrientation(position, g_pdata_slave_accel.orientation);
+ /* Interrupt */
+#ifndef LINUX
+#if defined CONFIG_MPU_SENSORS_MPU6050A2 || defined CONFIG_MPU_SENSORS_MPU6050B1
+ // g_slave_accel = // fixme *mpu6050_get_slave_descr();
+#endif
+#endif
+ g_pdata_slave_accel.address = 0x68;
+ return result;
+}
+
+/*****************************
+ Compass Setup Functions
+******************************/
+static inv_error_t SetupCompassAKM8975Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ case PLATFORM_ID_MANTIS_MSB:
+ position = 2;
+ break;
+#ifdef WIN32
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ position = 4;
+ break;
+#endif
+ case PLATFORM_ID_SPIDER_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ position = 7;
+ break;
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V3:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ position = 6;
+ break;
+ case PLATFORM_ID_DRAGON_USB_DONGLE:
+ case PLATFORM_ID_MSB_EVB:
+ position = 5;
+ break;
+ case PLATFORM_ID_MANTIS_EVB:
+ position = 4;
+ break;
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_compass = *ak8975_get_slave_descr();
+#endif
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_AKM;
+ return result;
+}
+
+static inv_error_t SetupCompassMMCCalibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 7;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_compass = *mmc314x_get_slave_descr();
+#endif
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_MMC314X;
+ return result;
+}
+
+static inv_error_t SetupCompassAMI304Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 4;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_AMI304;
+#ifndef LINUX
+ g_slave_compass = *ami30x_get_slave_descr();
+#endif
+ return result;
+}
+
+static inv_error_t SetupCompassAMI306Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ case PLATFORM_ID_SPIDER_PROTOTYPE:
+ position = 3;
+ break;
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ position = 1;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_compass = *ami306_get_slave_descr();
+#endif
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_AMI306;
+ return result;
+}
+
+static inv_error_t SetupCompassHMC5883Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 6;
+ break;
+#ifdef WIN32
+ case PLATFORM_ID_DONGLE:
+ position = 2;
+ break;
+#endif
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_compass = *hmc5883_get_slave_descr();
+#endif
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_HMC5883;
+ return result;
+}
+
+
+static inv_error_t SetupCompassLSM303DLHCalibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 1;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ };
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+#ifndef LINUX
+ g_slave_compass = *lsm303dlx_m_get_slave_descr();
+ g_slave_compass.id = COMPASS_ID_LSM303DLH;
+#endif
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_HMC5883;
+ return result;
+}
+
+static inv_error_t SetupCompassLSM303DLMCalibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ position = 8;
+ break;
+ case PLATFORM_ID_MSB_V2:
+ position = 12;
+ break;
+ case PLATFORM_ID_MSB_10AXIS:
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ };
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_compass = *lsm303dlx_m_get_slave_descr();
+ g_slave_compass.id = COMPASS_ID_LSM303DLM;
+#endif
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_HMC5883;
+ return result;
+}
+
+static inv_error_t SetupCompassYAS530Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ position = 1;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_compass = *yas530_get_slave_descr();
+#endif
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_YAS530;
+ return result;
+}
+
+static inv_error_t SetupCompassYAS529Calibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 6;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_compass = *yas529_get_slave_descr();
+#endif
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_YAS529;
+ return result;
+}
+
+
+static inv_error_t SetupCompassHSCDTD002BCalibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 2;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_compass = *hscdtd002b_get_slave_descr();
+#endif
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_HSCDTD00XX;
+ return result;
+}
+
+static inv_error_t SetupCompassHSCDTD004ACalibration(unsigned short platformId)
+{
+ inv_error_t result = INV_SUCCESS;
+ unsigned int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ position = 1;
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_MANTIS_MSB:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
+ return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+ result = SetupOrientation(position, g_pdata_slave_compass.orientation);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+#ifndef LINUX
+ g_slave_compass = *hscdtd004a_get_slave_descr();
+#endif
+ g_pdata_slave_compass.address = COMPASS_SLAVEADDR_HSCDTD00XX;
+ return result;
+}
+
+
+/*****************************
+ Pressure Setup Functions
+******************************/
+#if 0
+static inv_error_t SetupPressureBMA085Calibration(unsigned short platformId)
+{
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ memset(g_pdata_slave_pressure.orientation, 0, sizeof(g_pdata_slave_pressure.orientation));
+
+ g_pdata_slave_pressure.bus = EXT_SLAVE_BUS_PRIMARY;
+#ifndef LINUX
+ g_slave_pressure = *bma085_get_slave_descr();
+#endif
+ g_pdata_slave_pressure.address = PRESSURE_SLAVEADDR_BMA085;
+ return INV_SUCCESS;
+}
+#endif
+/**
+ * @internal
+ * Sets up the orientation matrix according to how the part was
+ * mounted.
+ *
+ * @param platforId Platform identification for mounting information
+ * @return INV_SUCCESS or non-zero error code
+ */
+static inv_error_t SetupAccelCalibration(unsigned short platformId,
+ unsigned short accelId)
+{
+ /*---- setup the accels ----*/
+ switch(accelId) {
+ case ACCEL_ID_LSM303DLX:
+ SetupAccelLSM303Calibration(platformId);
+ break;
+ case ACCEL_ID_LIS331:
+ SetupAccelSTLIS331Calibration(platformId);
+ break;
+ case ACCEL_ID_KXSD9:
+ SetupAccelKionixKXSD9Calibration(platformId);
+ break;
+ case ACCEL_ID_KXTF9:
+ SetupAccelKionixKXTF9Calibration(platformId);
+ break;
+ case ACCEL_ID_BMA150:
+ SetupAccelBMA150Calibration(platformId);
+ break;
+ case ACCEL_ID_BMA222:
+ SetupAccelBMA222Calibration(platformId);
+ break;
+ case ACCEL_ID_BMA250:
+ SetupAccelBMA250Calibration(platformId);
+ break;
+ case ACCEL_ID_ADXL34X:
+ SetupAccelADXL34XCalibration(platformId);
+ break;
+ case ACCEL_ID_MMA8450:
+ SetupAccelMMA8450Calibration(platformId);
+ break;
+ case ACCEL_ID_MMA845X:
+ SetupAccelMMA845XCalibration(platformId);
+ break;
+ case ACCEL_ID_LIS3DH:
+ SetupAccelSTLIS3DHCalibration(platformId);
+ break;
+ case ACCEL_ID_MPU6050:
+ SetupAccelMPU6050Calibration(platformId);
+ break;
+ case ID_INVALID:
+ break;
+ default:
+ LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
+ return INV_ERROR_INVALID_PARAMETER;
+ }
+
+ if (accelId != ID_INVALID && accelId != ACCEL_ID_MPU6050) {
+ g_pdata_slave_accel.bus = EXT_SLAVE_BUS_SECONDARY;
+ } else if (accelId != ACCEL_ID_MPU6050) {
+ g_pdata_slave_accel.bus = EXT_SLAVE_BUS_PRIMARY;
+ }
+
+#ifndef WIN32
+ if (accelId != ID_INVALID)
+ Rotate180DegAroundZAxis(g_pdata_slave_accel.orientation);
+#endif
+
+ return INV_SUCCESS;
+}
+
+/**
+ * @internal
+ * Sets up the orientation matrix according to how the part was
+ * mounted.
+ *
+ * @param platforId Platform identification for mounting information
+ * @return INV_SUCCESS or non-zero error code
+ */
+inv_error_t SetupCompassCalibration(unsigned short platformId,
+ unsigned short compassId)
+{
+ /*---- setup the compass ----*/
+ switch(compassId) {
+ case COMPASS_ID_AK8975:
+ SetupCompassAKM8975Calibration(platformId);
+ break;
+ case COMPASS_ID_AMI30X:
+ SetupCompassAMI304Calibration(platformId);
+ break;
+ case COMPASS_ID_AMI306:
+ SetupCompassAMI306Calibration(platformId);
+ break;
+ case COMPASS_ID_LSM303DLH:
+ SetupCompassLSM303DLHCalibration(platformId);
+ break;
+ case COMPASS_ID_LSM303DLM:
+ SetupCompassLSM303DLMCalibration(platformId);
+ break;
+ case COMPASS_ID_HMC5883:
+ SetupCompassHMC5883Calibration(platformId);
+ break;
+ case COMPASS_ID_YAS529:
+ SetupCompassYAS529Calibration(platformId);
+ break;
+ case COMPASS_ID_YAS530:
+ SetupCompassYAS530Calibration(platformId);
+ break;
+ case COMPASS_ID_MMC314X:
+ SetupCompassMMCCalibration(platformId);
+ break;
+ case COMPASS_ID_HSCDTD002B:
+ SetupCompassHSCDTD002BCalibration(platformId);
+ break;
+ case COMPASS_ID_HSCDTD004A:
+ SetupCompassHSCDTD004ACalibration(platformId);
+ break;
+ case ID_INVALID:
+ break;
+ default:
+ if (INV_ERROR_INVALID_PARAMETER) {
+ LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
+ return INV_ERROR_INVALID_PARAMETER;
+ }
+ break;
+ }
+
+ if (platformId == PLATFORM_ID_MSB_V2_MANTIS ||
+ platformId == PLATFORM_ID_MANTIS_MSB ||
+ platformId == PLATFORM_ID_MANTIS_USB_DONGLE ||
+ platformId == PLATFORM_ID_MANTIS_PROTOTYPE ||
+ platformId == PLATFORM_ID_DRAGON_PROTOTYPE) {
+ switch (compassId) {
+ case ID_INVALID:
+ g_pdata_slave_compass.bus = EXT_SLAVE_BUS_INVALID;
+ break;
+ case COMPASS_ID_AK8975:
+ case COMPASS_ID_AMI306:
+ g_pdata_slave_compass.bus = EXT_SLAVE_BUS_SECONDARY;
+ break;
+ default:
+ g_pdata_slave_compass.bus = EXT_SLAVE_BUS_PRIMARY;
+ };
+ } else {
+ g_pdata_slave_compass.bus = EXT_SLAVE_BUS_PRIMARY;
+ }
+
+#ifndef WIN32
+ if (compassId != ID_INVALID)
+ Rotate180DegAroundZAxis(g_pdata_slave_compass.orientation);
+#endif
+
+ return INV_SUCCESS;
+}
+
+/**
+ * @internal
+ * Sets up the orientation matrix according to how the part was
+ * mounted.
+ *
+ * @param platforId Platform identification for mounting information
+ * @return INV_SUCCESS or non-zero error code
+ */
+#if 0
+inv_error_t SetupPressureCalibration(unsigned short platformId,
+ unsigned short pressureId)
+{
+ inv_error_t result = INV_SUCCESS;
+ /*---- setup the compass ----*/
+ switch(pressureId) {
+ case PRESSURE_ID_BMA085:
+ result = SetupPressureBMA085Calibration(platformId);
+ break;
+ default:
+ if (INV_ERROR_INVALID_PARAMETER) {
+ LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
+ return INV_ERROR_INVALID_PARAMETER;
+ }
+ };
+
+ return result;
+}
+#endif
+/**
+ * @internal
+ * Sets up the orientation matrix according to how the gyro was
+ * mounted.
+ *
+ * @param platforId Platform identification for mounting information
+ * @return INV_SUCCESS or non-zero error code
+ */
+static inv_error_t SetupGyroCalibration(unsigned short platformId)
+{
+ int position;
+ MPL_LOGV("Calibrating '%s'\n", __func__);
+
+ /* Orientation */
+ switch (platformId) {
+ case PLATFORM_ID_SPIDER_PROTOTYPE:
+ position = 2;
+ break;
+ case PLATFORM_ID_MSB:
+ case PLATFORM_ID_MSB_10AXIS:
+ case PLATFORM_ID_MANTIS_MSB:
+#ifndef WIN32
+ position = 4;
+#else
+ position = 6;
+#endif
+ break;
+ case PLATFORM_ID_DONGLE:
+ case PLATFORM_ID_MANTIS_USB_DONGLE:
+ position = 1;
+ break;
+ case PLATFORM_ID_DRAGON_USB_DONGLE:
+ position = 3;
+ break;
+ case PLATFORM_ID_MANTIS_PROTOTYPE:
+ case PLATFORM_ID_DRAGON_PROTOTYPE:
+ case PLATFORM_ID_ST_6AXIS:
+ case PLATFORM_ID_MSB_V2:
+ case PLATFORM_ID_MSB_V2_MANTIS:
+#ifndef WIN32
+ position = 2;
+#else
+ position = 0;
+#endif
+ break;
+ case PLATFORM_ID_MANTIS_EVB:
+ case PLATFORM_ID_MSB_EVB:
+ position = 0;
+ break;
+ case PLATFORM_ID_MSB_V3:
+ position = 2;
+ break;
+ default:
+ MPL_LOGE("Unsupported platform %d\n", platformId);
+ return INV_ERROR_INVALID_PARAMETER;
+ };
+
+ SetupOrientation(position, g_gyro_orientation);
+
+ return INV_SUCCESS;
+}
+
+/**
+ * @brief Setup the Hw orientation and full scale.
+ * @param platfromId
+ * an user defined Id to distinguish the Hw platform in
+ * use from others.
+ * @param accelId
+ * the accelerometer specific id, as specified in the MPL.
+ * @param compassId
+ * the compass specific id, as specified in the MPL.
+ * @return INV_SUCCESS or a non-zero error code.
+ */
+inv_error_t SetupPlatform(
+ unsigned short platformId,
+ unsigned short accelId,
+ unsigned short compassId)
+{
+ int result;
+
+ memset(&g_slave_accel, 0, sizeof(g_slave_accel));
+ memset(&g_slave_compass, 0, sizeof(g_slave_compass));
+// memset(&g_slave_pressure, 0, sizeof(g_slave_pressure));
+// memset(&g_pdata, 0, sizeof(g_pdata));
+
+#ifdef LINUX
+ /* On Linux initialize the global platform data with the driver defaults */
+ {
+ void *mpu_handle;
+ int ii;
+
+ struct ext_slave_descr *slave[EXT_SLAVE_NUM_TYPES];
+ struct ext_slave_platform_data *pdata_slave[EXT_SLAVE_NUM_TYPES];
+ slave[EXT_SLAVE_TYPE_GYROSCOPE] = NULL;
+ slave[EXT_SLAVE_TYPE_ACCEL] = &g_slave_accel;
+ slave[EXT_SLAVE_TYPE_COMPASS] = &g_slave_compass;
+ //slave[EXT_SLAVE_TYPE_PRESSURE] = &g_slave_pressure;
+
+ pdata_slave[EXT_SLAVE_TYPE_GYROSCOPE] = NULL;
+ pdata_slave[EXT_SLAVE_TYPE_ACCEL] = &g_pdata_slave_accel;
+ pdata_slave[EXT_SLAVE_TYPE_COMPASS] = &g_pdata_slave_compass;
+ //pdata_slave[EXT_SLAVE_TYPE_PRESSURE] = &g_pdata_slave_pressure;
+
+ MPL_LOGI("Getting the MPU_GET_PLATFORM_DATA\n");
+ result = inv_serial_open("/dev/mpu",&mpu_handle);
+ if (result) {
+ MPL_LOGE("MPU_GET_PLATFORM_DATA failed %d\n", result);
+ }
+ for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
+ if (!slave[ii])
+ continue;
+ slave[ii]->type = ii;
+ result = ioctl((int)mpu_handle, MPU_GET_EXT_SLAVE_DESCR,
+ slave[ii]);
+ if (result)
+ result = errno;
+ if(result == INV_ERROR_INVALID_MODULE) {
+ slave[ii] = NULL;
+ result = 0;
+ } else if (result) {
+ LOG_RESULT_LOCATION(result);
+ LOG_RESULT_LOCATION(INV_ERROR_INVALID_MODULE);
+ return result;
+ }
+ }
+ //result = ioctl((int)mpu_handle, MPU_GET_MPU_PLATFORM_DATA, &g_pdata);
+ if (result) {
+ result = errno;
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
+ if (!pdata_slave[ii])
+ continue;
+ pdata_slave[ii]->type = ii;
+ result = ioctl(
+ (int)mpu_handle, MPU_GET_EXT_SLAVE_PLATFORM_DATA,
+ pdata_slave[ii]);
+ if (result)
+ result = errno;
+ if (result == INV_ERROR_INVALID_MODULE) {
+ pdata_slave[ii] = NULL;
+ result = 0;
+ } else if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ }
+ if (result) {
+ MPL_LOGE("MPU_GET_PLATFORM_DATA failed %d\n", result);
+ }
+ inv_serial_close(mpu_handle);
+ }
+#endif
+
+ result = SetupGyroCalibration(platformId);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ PrintMountingOrientation("Gyroscope", g_gyro_orientation);
+ result = SetupAccelCalibration(platformId, accelId);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ PrintMountingOrientation("Accelerometer", g_pdata_slave_accel.orientation);
+ result = SetupCompassCalibration(platformId, compassId);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ PrintMountingOrientation("Compass", g_pdata_slave_compass.orientation);
+#if 0
+ if (platformId == PLATFORM_ID_MSB_10AXIS) {
+ result = SetupPressureCalibration(platformId, PRESSURE_ID_BMA085);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ PrintMountingOrientation("Pressure", g_pdata_slave_pressure.orientation);
+ }
+#endif
+#ifdef LINUX
+ /* On Linux override the orientation, level shifter etc */
+ {
+ void *mpu_handle;
+ int ii;
+ struct ext_slave_descr *slave[EXT_SLAVE_NUM_TYPES];
+ struct ext_slave_platform_data *pdata_slave[EXT_SLAVE_NUM_TYPES];
+ slave[EXT_SLAVE_TYPE_GYROSCOPE] = NULL;
+ slave[EXT_SLAVE_TYPE_ACCEL] = &g_slave_accel;
+ slave[EXT_SLAVE_TYPE_COMPASS] = &g_slave_compass;
+ //slave[EXT_SLAVE_TYPE_PRESSURE] = &g_slave_pressure;
+
+ pdata_slave[EXT_SLAVE_TYPE_GYROSCOPE] = NULL;
+ pdata_slave[EXT_SLAVE_TYPE_ACCEL] = &g_pdata_slave_accel;
+ pdata_slave[EXT_SLAVE_TYPE_COMPASS] = &g_pdata_slave_compass;
+ //pdata_slave[EXT_SLAVE_TYPE_PRESSURE] = &g_pdata_slave_pressure;
+
+ MPL_LOGI("Setting the MPU_SET_PLATFORM_DATA\n");
+ result = inv_serial_open("/dev/mpu",&mpu_handle);
+ if (result) {
+ MPL_LOGE("MPU_SET_PLATFORM_DATA failed %d\n", result);
+ }
+ for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
+ if (!slave[ii])
+ continue;
+ slave[ii]->type = ii;
+ result = ioctl((int)mpu_handle, MPU_SET_EXT_SLAVE_PLATFORM_DATA,
+ slave[ii]);
+ if (result)
+ result = errno;
+ if (result == INV_ERROR_INVALID_MODULE) {
+ slave[ii] = NULL;
+ result = 0;
+ } else if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ }
+ //result = ioctl((int)mpu_handle, MPU_SET_MPU_PLATFORM_DATA, &g_pdata);
+ if (result) {
+ result = errno;
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
+ if (!pdata_slave[ii])
+ continue;
+ pdata_slave[ii]->type = ii;
+ result = ioctl((int)mpu_handle, MPU_SET_EXT_SLAVE_PLATFORM_DATA,
+ pdata_slave[ii]);
+ if (result)
+ result = errno;
+ if (result == INV_ERROR_INVALID_MODULE) {
+ pdata_slave[ii] = NULL;
+ result = 0;
+ } else if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ }
+ if (result) {
+ MPL_LOGE("MPU_SET_PLATFORM_DATA failed %d\n", result);
+ }
+ inv_serial_close(mpu_handle);
+ }
+#endif
+ return INV_SUCCESS;
+}
+
+/**
+ * @}
+ */
+
+
diff --git a/libsensors_iio/software/simple_apps/common/mlsetup.h b/libsensors_iio/software/simple_apps/common/mlsetup.h
new file mode 100644
index 0000000..06fa9f4
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/mlsetup.h
@@ -0,0 +1,52 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+
+/*******************************************************************************
+ *
+ * $Id: mlsetup.h 6101 2011-09-29 00:30:33Z kkatingari $
+ *
+ *******************************************************************************/
+
+#ifndef MLSETUP_H
+#define MLSETUP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "linux/mpu.h"
+#include "mltypes.h"
+
+ enum mpu_platform_id {
+ PLATFORM_ID_INVALID = ID_INVALID, // 0
+ PLATFORM_ID_MSB, // (0x0001) MSB (Multi sensors board)
+ PLATFORM_ID_ST_6AXIS, // (0x0002) 6 Axis with ST accelerometer
+ PLATFORM_ID_DONGLE, // (0x0003) 9 Axis USB dongle with
+ PLATFORM_ID_MANTIS_PROTOTYPE, // (0x0004) Mantis prototype board
+ PLATFORM_ID_MANTIS_MSB, // (0x0005) MSB with Mantis
+ PLATFORM_ID_MANTIS_USB_DONGLE,// (0x0006) Mantis and AKM on USB dongle.
+ PLATFORM_ID_MSB_10AXIS, // (0x0007) MSB with pressure sensor
+ PLATFORM_ID_DRAGON_PROTOTYPE, // (0x0008) Dragon prototype board
+ PLATFORM_ID_MSB_V2, // (0x0009) Version 2 MSB
+ PLATFORM_ID_MSB_V2_MANTIS, // (0x000A) Version 2 MSB with mantis
+ PLATFORM_ID_MANTIS_EVB, // (0x000B) Mantis EVB (shipped to cust.)
+ PLATFORM_ID_DRAGON_USB_DONGLE,// (0x000C) Dragon USB Dongle with Mantis Rev C
+ PLATFORM_ID_MSB_EVB, // (0X000D) MSB with 3050.
+ PLATFORM_ID_SPIDER_PROTOTYPE,
+ PLATFORM_ID_MSB_V3,
+
+ NUM_PLATFORM_IDS
+ };
+ // Main entry APIs
+inv_error_t SetupPlatform(unsigned short platformId,
+ unsigned short accelSelection,
+ unsigned short compassSelection);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MLSETUP_H */
diff --git a/libsensors_iio/software/simple_apps/common/slave.h b/libsensors_iio/software/simple_apps/common/slave.h
new file mode 100644
index 0000000..7b40a8c
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/common/slave.h
@@ -0,0 +1,176 @@
+/*
+ $License:
+ Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
+ $
+ */
+/*******************************************************************************
+ *
+ * $Id: slave.h 5732 2011-07-07 01:11:34Z vbhatt $
+ *
+ *******************************************************************************/
+
+#ifndef SLAVE_H
+#define SLAVE_H
+
+/**
+ * @addtogroup SLAVEDL
+ *
+ * @{
+ * @file slave.h
+ * @brief Top level descriptions for Accelerometer support
+ *
+ */
+
+#include "mltypes.h"
+#include "linux/mpu.h"
+
+ /* ------------ */
+ /* - Defines. - */
+ /* ------------ */
+
+/*--- default accel support - selection ---*/
+#define ACCEL_ST_LIS331 0
+#define ACCEL_KIONIX_KXTF9 1
+#define ACCEL_BOSCH 0
+#define ACCEL_ADI 0
+
+#define ACCEL_SLAVEADDR_INVALID 0x00
+
+#define ACCEL_SLAVEADDR_LIS331 0x18
+#define ACCEL_SLAVEADDR_LSM303 0x18
+#define ACCEL_SLAVEADDR_LIS3DH 0x18
+#define ACCEL_SLAVEADDR_KXSD9 0x18
+#define ACCEL_SLAVEADDR_KXTF9 0x0F
+#define ACCEL_SLAVEADDR_BMA150 0x38
+#define ACCEL_SLAVEADDR_BMA222 0x08
+#define ACCEL_SLAVEADDR_BMA250 0x18
+#define ACCEL_SLAVEADDR_ADXL34X 0x53
+#define ACCEL_SLAVEADDR_ADXL34X_ALT 0x1D /* alternative addr */
+#define ACCEL_SLAVEADDR_MMA8450 0x1C
+#define ACCEL_SLAVEADDR_MMA845X 0x1C
+
+#define ACCEL_SLAVEADDR_INVENSENSE 0x68
+/*
+ Define default accelerometer to use if no selection is made
+*/
+#if ACCEL_ST_LIS331
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_LIS331
+#define DEFAULT_ACCEL_ID ACCEL_ID_LIS331
+#endif
+
+#if ACCEL_ST_LSM303
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_LSM303
+#define DEFAULT_ACCEL_ID ACCEL_ID_LSM303DLX
+#endif
+
+#if ACCEL_KIONIX_KXSD9
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_KXSD9
+#define DEFAULT_ACCEL_ID ACCEL_ID_KXSD9
+#endif
+
+#if ACCEL_KIONIX_KXTF9
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_KXTF9
+#define DEFAULT_ACCEL_ID ACCEL_ID_KXTF9
+#endif
+
+#if ACCEL_BOSCH
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_BMA150
+#define DEFAULT_ACCEL_ID ACCEL_ID_BMA150
+#endif
+
+#if ACCEL_BMA222
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_BMA222
+#define DEFAULT_ACCEL_ID ACCEL_ID_BMA222
+#endif
+
+#if ACCEL_BOSCH
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_BMA250
+#define DEFAULT_ACCEL_ID ACCEL_ID_BMA250
+#endif
+
+#if ACCEL_ADI
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_ADXL34X
+#define DEFAULT_ACCEL_ID ACCEL_ID_ADXL34X
+#endif
+
+#if ACCEL_MMA8450
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_MMA8450
+#define DEFAULT_ACCEL_ID ACCEL_ID_MMA8450
+#endif
+
+#if ACCEL_MMA845X
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_MMA845X
+#define DEFAULT_ACCEL_ID ACCEL_ID_MMA845X
+#endif
+
+/*--- if no default accelerometer was selected ---*/
+#ifndef DEFAULT_ACCEL_SLAVEADDR
+#define DEFAULT_ACCEL_SLAVEADDR ACCEL_SLAVEADDR_INVALID
+#endif
+
+#define USE_COMPASS_AICHI 0
+#define USE_COMPASS_AKM 0
+#define USE_COMPASS_YAS529 0
+#define USE_COMPASS_YAS530 0
+#define USE_COMPASS_HMC5883 0
+#define USE_COMPASS_MMC314X 0
+#define USE_COMPASS_HSCDTD002B 0
+#define USE_COMPASS_HSCDTD004A 0
+
+#define COMPASS_SLAVEADDR_INVALID 0x00
+#define COMPASS_SLAVEADDR_AKM_BASE 0x0C
+#define COMPASS_SLAVEADDR_AKM 0x0E
+#define COMPASS_SLAVEADDR_AMI304 0x0E
+#define COMPASS_SLAVEADDR_AMI305 0x0F /*Slave address for AMI 305/306*/
+#define COMPASS_SLAVEADDR_AMI306 0x0E /*Slave address for AMI 305/306*/
+#define COMPASS_SLAVEADDR_YAS529 0x2E
+#define COMPASS_SLAVEADDR_YAS530 0x2E
+#define COMPASS_SLAVEADDR_HMC5883 0x1E
+#define COMPASS_SLAVEADDR_MMC314X 0x30
+#define COMPASS_SLAVEADDR_HSCDTD00XX 0x0C
+
+/*
+ Define default compass to use if no selection is made
+*/
+ #if USE_COMPASS_AKM
+ #define DEFAULT_COMPASS_TYPE COMPASS_ID_AK8975
+ #endif
+
+ #if USE_COMPASS_AICHI
+ #define DEFAULT_COMPASS_TYPE COMPASS_ID_AMI30X
+ #endif
+
+ #if USE_COMPASS_YAS529
+ #define DEFAULT_COMPASS_TYPE COMPASS_ID_YAS529
+ #endif
+
+ #if USE_COMPASS_YAS530
+ #define DEFAULT_COMPASS_TYPE COMPASS_ID_YAS530
+ #endif
+
+ #if USE_COMPASS_HMC5883
+ #define DEFAULT_COMPASS_TYPE COMPASS_ID_HMC5883
+ #endif
+
+#if USE_COMPASS_MMC314X
+#define DEFAULT_COMPASS_TYPE COMPASS_ID_MMC314X
+#endif
+
+#if USE_COMPASS_HSCDTD002B
+#define DEFAULT_COMPASS_TYPE COMPASS_ID_HSCDTD002B
+#endif
+
+#if USE_COMPASS_HSCDTD004A
+#define DEFAULT_COMPASS_TYPE COMPASS_ID_HSCDTD004A
+#endif
+
+#ifndef DEFAULT_COMPASS_TYPE
+#define DEFAULT_COMPASS_TYPE ID_INVALID
+#endif
+
+
+#endif // SLAVE_H
+
+/**
+ * @}
+ */
diff --git a/libsensors_iio/software/simple_apps/console/linux/build/android/consoledmp-shared b/libsensors_iio/software/simple_apps/console/linux/build/android/consoledmp-shared
new file mode 100644
index 0000000..228abf7
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/console/linux/build/android/consoledmp-shared
Binary files differ
diff --git a/libsensors_iio/software/simple_apps/mpu_iio/build/android/shared.mk b/libsensors_iio/software/simple_apps/console/linux/build/android/shared.mk
index cd79cfa..b1d881c 100644
--- a/libsensors_iio/software/simple_apps/mpu_iio/build/android/shared.mk
+++ b/libsensors_iio/software/simple_apps/console/linux/build/android/shared.mk
@@ -1,4 +1,4 @@
-EXEC = inv_mpu_iio$(SHARED_APP_SUFFIX)
+EXEC = consoledmp$(SHARED_APP_SUFFIX)
MK_NAME = $(notdir $(CURDIR)/$(firstword $(MAKEFILE_LIST)))
@@ -8,15 +8,16 @@ LINK ?= $(CROSS)gcc
OBJFOLDER = $(CURDIR)/obj
-INV_ROOT = ../../../../..
+INV_ROOT = ../../../../../..
APP_DIR = $(CURDIR)/../..
MLLITE_DIR = $(INV_ROOT)/software/core/mllite
+COMMON_DIR = $(INV_ROOT)/software/simple_apps/common
MPL_DIR = $(INV_ROOT)/software/core/mpl
+HAL_DIR = $(INV_ROOT)/software/core/HAL
include $(INV_ROOT)/software/build/android/common.mk
CFLAGS += $(CMDLINE_CFLAGS)
-CFLAGS += $(ANDROID_COMPILE)
CFLAGS += -Wall
CFLAGS += -fpic
CFLAGS += -nostdlib
@@ -48,8 +49,20 @@ LLINK += -lstdc++
LLINK += -llog
LLINK += -lz
+PRE_LFLAGS := -Wl,-T,$(ANDROID_ROOT)/build/core/armelf.x
+PRE_LFLAGS += $(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib/crtend_android.o
+PRE_LFLAGS += $(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib/crtbegin_dynamic.o
+
LFLAGS += $(CMDLINE_LFLAGS)
-LFLAGS += $(ANDROID_LINK_EXECUTABLE)
+LFLAGS += -nostdlib
+LFLAGS += -fpic
+LFLAGS += -Wl,--gc-sections
+LFLAGS += -Wl,--no-whole-archive
+LFLAGS += -Wl,-dynamic-linker,/system/bin/linker
+LFLAGS += $(ANDROID_LINK)
+ifneq ($(PRODUCT),panda)
+LFLAGS += -rdynamic
+endif
LRPATH = -Wl,-rpath,$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib:$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/system/lib
@@ -74,7 +87,7 @@ all: $(EXEC) $(MK_NAME)
$(EXEC) : $(OBJFOLDER) $(INV_OBJS_DST) $(INV_LIBS) $(MK_NAME)
@$(call echo_in_colors, "\n<linking $(EXEC) with objects $(INV_OBJS_DST) $(PREBUILT_OBJS) and libraries $(INV_LIBS)\n")
- $(LINK) $(INV_OBJS_DST) -o $(EXEC) $(LFLAGS) $(LLINK) $(INV_LIBS) $(LLINK) $(LRPATH)
+ $(LINK) $(PRE_LFLAGS) $(INV_OBJS_DST) -o $(EXEC) $(LFLAGS) $(LLINK) $(INV_LIBS) $(LLINK) $(LRPATH)
$(OBJFOLDER) :
@$(call echo_in_colors, "\n<creating object's folder 'obj/'>\n")
diff --git a/libsensors_iio/software/simple_apps/console/linux/build/filelist.mk b/libsensors_iio/software/simple_apps/console/linux/build/filelist.mk
new file mode 100644
index 0000000..b01fdfb
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/console/linux/build/filelist.mk
@@ -0,0 +1,23 @@
+#### filelist.mk for console_test ####
+
+# helper headers
+HEADERS := $(COMMON_DIR)/external_hardware.h
+HEADERS += $(COMMON_DIR)/fopenCMake.h
+HEADERS += $(COMMON_DIR)/helper.h
+HEADERS += $(COMMON_DIR)/mlerrorcode.h
+HEADERS += $(COMMON_DIR)/mlsetup.h
+HEADERS += $(COMMON_DIR)/slave.h
+
+HEADERS += $(HAL_DIR)/include/mlos.h
+HEADERS += $(HAL_DIR)/include/inv_sysfs_utils.h
+
+# sources
+SOURCES := $(APP_DIR)/console_test.c
+
+# helper sources
+SOURCES += $(HAL_DIR)/linux/inv_sysfs_utils.c
+SOURCES += $(HAL_DIR)/linux/mlos_linux.c
+
+INV_SOURCES += $(SOURCES)
+
+VPATH += $(APP_DIR) $(COMMON_DIR) $(HAL_DIR)/linux
diff --git a/libsensors_iio/software/simple_apps/console/linux/console_test.c b/libsensors_iio/software/simple_apps/console/linux/console_test.c
new file mode 100644
index 0000000..e15b20d
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/console/linux/console_test.c
@@ -0,0 +1,742 @@
+/*******************************************************************************
+ * $Id: $
+ ******************************************************************************/
+
+/*******************************************************************************
+ *
+ * Copyright (c) 2011 InvenSense Corporation, All Rights Reserved.
+ *
+ ******************************************************************************/
+//#include <linux/conio.h>
+//#include <fcntl.h>
+//#include <termios.h>
+//#include <unistd.h>
+
+//#if 0
+#include <stdio.h>
+#include <time.h>
+#include <sys/select.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <poll.h>
+#include <stdlib.h>
+#include <linux/input.h>
+
+#include "log.h"
+#undef MPL_LOG_TAG
+#define MPL_LOG_TAG "console_test"
+
+#include "mlos.h"
+#include "invensense.h"
+#include "invensense_adv.h"
+#include "inv_sysfs_utils.h"
+#include "ml_stored_data.h"
+#include "ml_math_func.h"
+#include "ml_load_dmp.h"
+/*#else
+#include <unistd.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <features.h>
+#include <dirent.h>
+#include <string.h>
+#include <poll.h>
+#include <stddef.h>
+#include <linux/input.h>
+#include <time.h>
+#include <linux/time.h>
+#include "inv_sysfs_utils.h"
+#include "invensense.h"
+#include "invensense_adv.h"
+#include "ml_stored_data.h"
+#include "ml_math_func.h"
+#include "ml_load_dmp.h"
+#include "log.h"
+#endif*/
+
+/* TODO: add devices as needed. */
+#define ITG3500 (0)
+#define MPU6050 (1)
+#define BMA250 (2)
+#define NUM_DEVICES (ITG3500 + MPU6050 + BMA250)
+
+#define DEVICE MPU6050
+#define DMP_IMAGE dmp_firmware_200_latest
+#define SIX_AXES 6
+#define NINE_AXES 9
+
+#if 0
+struct input_event {
+ struct timeval time;
+ __u16 type;
+ __u16 code;
+ __s32 value;
+};
+#endif
+
+/* TODO: Add paths to other attributes.
+ * TODO: Input device paths depend on the module installation order.
+ */
+const struct inv_sysfs_names_s filenames[NUM_DEVICES] = {
+ { /* ITG3500 */
+ .buffer = "/dev/input/event0",
+ .enable = "/sys/bus/i2c/devices/4-0068/inv_gyro/fifo_enable",
+ .raw_data = "/sys/bus/i2c/devices/4-0068/inv_gyro/raw_gyro",
+ .temperature = "/sys/bus/i2c/devices/4-0068/inv_gyro/temperature",
+ .fifo_rate = "/sys/bus/i2c/devices/4-0068/inv_gyro/fifo_rate",
+ .power_state = "/sys/bus/i2c/devices/4-0068/inv_gyro/power_state",
+ .fsr = "/sys/bus/i2c/devices/4-0068/inv_gyro/FSR",
+ .lpf = "/sys/bus/i2c/devices/4-0068/inv_gyro/lpf",
+ .scale = "/sys/bus/i2c/devices/4-0068/inv_gyro/gyro_scale",
+ .temp_scale = "/sys/bus/i2c/devices/4-0068/inv_gyro/temp_scale",
+ .temp_offset = "/sys/bus/i2c/devices/4-0068/inv_gyro/temp_offset",
+ .self_test = "/sys/bus/i2c/devices/4-0068/inv_gyro/self_test",
+ .accel_en = NULL,
+ .accel_fifo_en = NULL,
+ .accel_fs = NULL,
+ .clock_source = NULL,
+ .early_suspend_en = NULL,
+ .firmware_loaded = NULL,
+ .gyro_en = NULL,
+ .gyro_fifo_en = NULL,
+ .key = NULL,
+ .raw_accel = NULL,
+ .reg_dump = NULL,
+ .tap_on = NULL,
+ .dmp_firmware = NULL
+ },
+
+ { /* MPU6050 */
+ .buffer = "/dev/input/event0",
+ .enable = "/sys/class/invensense/mpu/enable",
+ .raw_data = "/sys/class/invensense/mpu/raw_gyro",
+ .temperature = "/sys/class/invensense/mpu/temperature",
+ .fifo_rate = "/sys/class/invensense/mpu/fifo_rate",
+ .power_state = "/sys/class/invensense/mpu/power_state",
+ .fsr = "/sys/class/invensense/mpu/FSR",
+ .lpf = "/sys/class/invensense/mpu/lpf",
+ .scale = "/sys/class/invensense/mpu/gyro_scale",
+ .temp_scale = "/sys/class/invensense/mpu/temp_scale",
+ .temp_offset = "/sys/class/invensense/mpu/temp_offset",
+ .self_test = "/sys/class/invensense/mpu/self_test",
+ .accel_en = "/sys/class/invensense/mpu/accl_enable",
+ .accel_fifo_en = "/sys/class/invensense/mpu/accl_fifo_enable",
+ .accel_fs = "/sys/class/invensense/mpu/accl_fs",
+ .clock_source = "/sys/class/invensense/mpu/clock_source",
+ .early_suspend_en = "/sys/class/invensense/mpu/early_suspend_enable",
+ .firmware_loaded = "/sys/class/invensense/mpu/firmware_loaded",
+ .gyro_en = "/sys/class/invensense/mpu/gyro_enable",
+ .gyro_fifo_en = "/sys/class/invensense/mpu/gyro_fifo_enable",
+ .key = "/sys/class/invensense/mpu/key",
+ .raw_accel = "/sys/class/invensense/mpu/raw_accl",
+ .reg_dump = "/sys/class/invensense/mpu/reg_dump",
+ .tap_on = "/sys/class/invensense/mpu/tap_on",
+ .dmp_firmware = "/sys/class/invensense/mpu/dmp_firmware"
+ },
+
+ { /* BMA250 */
+ .buffer = "/dev/input/input/event1",
+ .enable = "/sys/devices/virtual/input/input1/enable",
+ .raw_data = "/sys/devices/virtual/input/input1/value",
+ .temperature = NULL,
+ .fifo_rate = NULL,
+ .power_state = NULL,
+ .fsr = NULL,
+ .lpf = NULL,
+ .scale = NULL,
+ .temp_scale = NULL,
+ .temp_offset = NULL,
+ .self_test = NULL,
+ .accel_en = NULL,
+ .accel_fifo_en = NULL,
+ .accel_fs = NULL,
+ .clock_source = NULL,
+ .early_suspend_en = NULL,
+ .firmware_loaded = NULL,
+ .gyro_en = NULL,
+ .gyro_fifo_en = NULL,
+ .key = NULL,
+ .raw_accel = NULL,
+ .reg_dump = NULL,
+ .tap_on = NULL,
+ .dmp_firmware = NULL
+ }
+};
+
+static void (*s_func_cb) (void);
+
+int inv_read_data(char *names, char *data)
+{
+ char str[8];
+ int count;
+ short s_data;
+
+ count = inv_sysfs_read((char*)names, sizeof(str), str);
+ if (count < 0)
+ return count;
+ count = sscanf(str, "%hd", &s_data);
+ *data = s_data;
+ if (count < 1)
+ return -EAGAIN;
+ return count;
+
+}
+
+void fifoCB(void)
+{
+ if (1) {
+ float gyro[3];
+ float accel[3];
+ float orient[3];
+ float rv[3];
+
+ int8_t accuracy;
+ inv_time_t timestamp;
+
+ printf("/*************************************************\n");
+ inv_get_sensor_type_gyroscope(gyro, &accuracy, &timestamp);
+ printf("Gyro %13.6f %13.4f %13.4f %5d %9lld\n",
+ gyro[0],
+ gyro[1],
+ gyro[2],
+ accuracy,
+ timestamp);
+
+ inv_get_sensor_type_accelerometer(accel, &accuracy, &timestamp);
+ printf("Accel %13.6f %13.4f %13.4f %5d %9lld\n",
+ accel[0],
+ accel[1],
+ accel[2],
+ accuracy,
+ timestamp);
+
+ inv_get_sensor_type_rotation_vector(rv, &accuracy, &timestamp);
+ printf("RV %7.3f %7.3f %7.3f %5d %9lld\n",
+ rv[0],rv[1],rv[2],accuracy,timestamp);
+
+ inv_get_sensor_type_orientation(orient, &accuracy, &timestamp);
+ printf("Orientation %7.3f %7.3f %7.3f %5d %9lld\n",
+ orient[0],orient[1],orient[2],accuracy,timestamp);
+ printf("/*************************************************\n");
+ }
+}
+
+unsigned short orient;
+signed char g_gyro_orientation[9] = {1, 0, 0,
+ 0, 1, 0,
+ 0, 0, 1};
+
+signed char g_accel_orientation[9] = {-1, 0, 0,
+ 0, -1, 0,
+ 0, 0, 1};
+float scale;
+float range;
+long sens;
+
+
+
+short mTempOffset = 0;
+short mTempScale = 0;
+bool mFirstRead = 1;
+
+/******************* FUNCTIONS *******************************/
+#if 0
+static unsigned short inv_row_2_scale(const signed char *row)
+{
+ unsigned short b;
+
+ if (row[0] > 0)
+ b = 0;
+ else if (row[0] < 0)
+ b = 4;
+ else if (row[1] > 0)
+ b = 1;
+ else if (row[1] < 0)
+ b = 5;
+ else if (row[2] > 0)
+ b = 2;
+ else if (row[2] < 0)
+ b = 6;
+ else
+ b = 7; // error
+ return b;
+}
+#endif
+
+inv_error_t inv_set_fifo_processed_callback(void (*func_cb)(void))
+{
+ s_func_cb = func_cb;
+ return INV_SUCCESS;
+}
+
+/**
+ * @brief Keyboard hit function.
+ */
+int kbhit(void)
+{
+#if 1
+ struct timeval tv;
+ fd_set read_fd;
+
+ tv.tv_sec=0;
+ tv.tv_usec=0;
+ FD_ZERO(&read_fd);
+ FD_SET(0,&read_fd);
+
+ if (select(1, &read_fd, NULL, NULL, &tv) == -1)
+ return 0;
+
+ if (FD_ISSET(0,&read_fd))
+ return 1;
+
+ return 0;
+#else
+ struct timeval tv;
+ fd_set rdfs;
+
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+
+ FD_ZERO(&rdfs);
+ FD_SET (STDIN_FILENO, &rdfs);
+
+ select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
+ return FD_ISSET(STDIN_FILENO, &rdfs);
+#endif
+}
+
+inv_error_t inv_constructor_default_enable()
+{
+ inv_error_t result;
+
+ result = inv_enable_quaternion();
+ if (result) {
+ if (result == INV_ERROR_NOT_AUTHORIZED) {
+ LOGE("Enable Quaternion failed: not authorized");
+ }
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ result = inv_enable_motion_no_motion();
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ result = inv_enable_gyro_tc();
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ result = inv_enable_hal_outputs();
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ result = inv_enable_9x_sensor_fusion();
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+ return result;
+}
+
+int read_attribute_sensor(int fd, char *data, unsigned int size)
+{
+ int count = 0;
+ if (fd >=0) {
+ count = read(fd, data, size);
+ if(count < 0) {
+ MPL_LOGE("read fails with error code=%d", count);
+ }
+ close(fd);
+ }
+ return count;
+}
+
+int inv_read_temperature(long long *data)
+{
+ int count = 0;
+ int fd;
+
+ if(mFirstRead) {
+ char buf[4];
+ fd = open(filenames[ITG3500].temp_scale, O_RDONLY);
+ if(fd < 0) {
+ MPL_LOGE("errors opening tempscale");
+ return -1;
+ }
+
+ memset(buf, 0, sizeof(buf));
+
+ count = read_attribute_sensor(fd, buf, sizeof(buf));
+ if(count < 0) {
+ MPL_LOGE("errors reading temp_scale");
+ return -1;
+ }
+
+ count = sscanf(buf, "%hd", &mTempScale);
+ if(count < 1)
+ return -1;
+ MPL_LOGI("temp scale = %d", mTempScale);
+
+ fd = open(filenames[ITG3500].temp_offset, O_RDONLY);
+ if(fd < 0) {
+ MPL_LOGE("errors opening tempoffset");
+ return -1;
+ }
+
+ memset(buf, 0, sizeof(buf));
+
+ count = read_attribute_sensor(fd, buf, sizeof(buf));
+ if(count < 0) {
+ MPL_LOGE("errors reading temp_offset");
+ return -1;
+ }
+
+ count = sscanf(buf, "%hd", &mTempOffset);
+ if(count < 1)
+ return -1;
+ MPL_LOGI("temp offset = %d", mTempOffset);
+
+ mFirstRead = false;
+ }
+
+ char raw_buf[25];
+ short raw;
+ long long timestamp;
+ fd = open(filenames[ITG3500].temperature, O_RDONLY);
+ if(fd < 0) {
+ MPL_LOGE("errors opening temperature");
+ return -1;
+ }
+
+ memset(raw_buf, 0, sizeof(raw_buf));
+
+ count = read_attribute_sensor(fd, raw_buf, sizeof(raw_buf));
+ if(count < 0) {
+ MPL_LOGE("errors reading temperature");
+ return -1;
+ }
+ count = sscanf(raw_buf, "%hd%lld", &raw, &timestamp);
+ if(count < -1)
+ return -1;
+ MPL_LOGI("temperature raw = %d, timestamp = %lld", raw, timestamp);
+ MPL_LOGI("temperature offset = %d", mTempOffset);
+ MPL_LOGI("temperature scale = %d", mTempScale);
+ int adjuster = 35 + ((raw-mTempOffset)/mTempScale);
+ MPL_LOGI("pre-scaled temperature = %d", adjuster);
+ MPL_LOGI("adjusted temperature = %d", adjuster*65536);
+ //data[0] = adjuster * 65536;
+ data[0] = (35 + ((raw - mTempOffset) / mTempScale)) * 65536.f;
+ data[1] = timestamp;
+ return 0;
+}
+
+int self_test(void)
+{
+ int err = 0;
+ char str[50];
+ char x[9], y[9], z[9];
+ char pass[2];
+ int fd;
+
+ fd = open((char*)filenames[DEVICE].self_test, O_RDONLY);
+ if(fd < 0) {
+ return fd;
+ }
+ memset(str, 0, sizeof(str));
+ err = read_attribute_sensor(fd, str, sizeof(str));
+ if(err < 0) {
+ return err;
+ }
+ MPL_LOGI("self_test result: %s", str);
+ printf("Self test result: %s ", str);
+ err = sscanf(str, "%[^','],%[^','],%[^','],%[^',']", x, y, z, pass);
+ if(err < 1) {
+ return err;
+ }
+ MPL_LOGI("Bias : X:Y:Z (%ld, %ld, %ld)", atol(x), atol(y), atol(z));
+ //printf("Bias : X:Y:Z (%ld, %ld, %ld)", atol(x), atol(y), atol(z));
+ if (atoi(pass)) {
+ MPL_LOGI("Result : PASS (1)");
+ printf("----> PASS (1)\n");
+ } else {
+ MPL_LOGI("Result : FAIL (0)");
+ printf("----> FAIL (0)\n");
+ }
+ return err;
+}
+
+/*******************************************************************************
+ ******************************* MAIN ******************************************
+ ******************************************************************************/
+
+/**
+ * @brief Main function
+ */
+int main(int argc, char *argv[])
+{
+ int key = 0;
+ int ready;
+ long accel[3];
+ short gyro[3];
+ long long timestamp = 0;
+ inv_error_t result;
+
+ char data;
+ unsigned char i;
+ int fd, bytes_read;
+ struct pollfd pfd;
+ unsigned long long time_stamp;
+ unsigned int time_H;
+ struct input_event ev[100];
+#ifdef INV_PLAYBACK_DBG
+ int logging = false;
+ FILE *logfile = NULL;
+#endif
+
+ result = inv_init_mpl();
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ }
+
+ // Master Enabling. This also turns on power_state
+ if (inv_sysfs_write((char *)filenames[DEVICE].enable, 1) < 0)
+ printf("ERR- Failed to enable event generation\n");
+ else {
+ inv_read_data((char *)filenames[DEVICE].enable, &data);
+ printf("Event enable= %d\n", data);
+ }
+
+ // Power ON - No need after master enable above but do it anyway
+ if (inv_sysfs_write((char *)filenames[DEVICE].power_state, 1) < 0)
+ printf("ERR- Failed to set power state=1\n");
+ else {
+ inv_read_data((char *)filenames[DEVICE].power_state, &data);
+ printf("Power state: %d\n", data);
+ }
+
+ // Turn on tap
+ if (inv_sysfs_write((char *)filenames[DEVICE].tap_on, 1) < 0) {
+ printf("ERR- Failed to enable Tap On\n");
+ }
+ else {
+ inv_read_data((char *)filenames[DEVICE].tap_on, &data);
+ printf("Tap-on: %d\n", data);
+ }
+
+ // Program DMP code. No longer required to enable tap-on first
+ if ((result =
+ inv_sysfs_write((char *)filenames[DEVICE].firmware_loaded, 0)) < 0) {
+ printf("ERR- Failed to initiate DMP re-programming %d\n",result);
+ } else {
+ if ((fd = open(filenames[DEVICE].dmp_firmware, O_WRONLY)) < 0 ) {
+ printf("ERR- Failed file open to write DMP\n");
+ close(fd);
+ exit(0);
+ } else {
+ // Program 200Hz version
+ //result = write(fd, DMP_IMAGE, sizeof(DMP_IMAGE));
+ //printf("Downloaded %d byte(s) to DMP\n", result);
+ result = inv_load_dmp(fd);
+ //LOG_RESULT_LOCATION(result);
+ close(fd);
+ }
+ }
+
+ // Query DMP running. For now check by 'firmware_loaded' status
+ if (inv_read_data((char *)filenames[DEVICE].firmware_loaded, &data) < 0) {
+ printf("ERR- Failed to read 'firmware_loaded'\n");
+ } else {
+ printf("Firmware Loaded/ DMP running: %d\n", data);
+ }
+
+ inv_set_fifo_processed_callback(fifoCB);
+ result = inv_constructor_default_enable();
+ result = inv_start_mpl();
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ return result;
+ } else {
+ printf ("MPL started\n");
+ }
+
+ /* Gyro Setup */
+ orient = inv_orientation_matrix_to_scalar(g_gyro_orientation);
+ inv_set_gyro_orientation_and_scale(orient,2000L<<15);
+
+ /* Accel Setup */
+ orient = inv_orientation_matrix_to_scalar(g_accel_orientation);
+ /* NOTE: sens expected to be 2 (FSR) * 1L<<15 for 16 bit hardware data.
+ * The BMA250 only uses a 10 bit ADC, so we shift the data by 6 bits.
+ * 2 * 1L<<15 * 1<<6 == 1LL<<22
+ */
+ inv_set_accel_orientation_and_scale(orient, 1LL<<22);
+
+ // Enable Gyro
+ if (inv_sysfs_write((char *)filenames[DEVICE].gyro_en, 1) <0)
+ printf("ERR- Failed to enable Gyro\n");
+ else {
+ inv_read_data((char *)filenames[DEVICE].gyro_en, &data);
+ printf("Gyro enable: %d\n", data);
+ }
+
+ // Enable Accel
+ if (inv_sysfs_write((char *)filenames[DEVICE].accel_en, 1) <0)
+ printf("ERR- Failed to enable Accel\n");
+ else {
+ inv_read_data((char *)filenames[DEVICE].accel_en, &data);
+ printf("Accel enable: %d\n", data);
+ }
+
+ // polling for data
+ fd = open(filenames[DEVICE].buffer, O_RDONLY);
+ if(fd < 0) {
+ MPL_LOGE("Cannot open device event buffer");
+ }
+
+ pfd.fd = fd;
+ pfd.events = POLLIN;
+
+ while (1) {
+
+ result = kbhit();
+ if (result) {
+ key = getchar();
+ } else {
+ key = 0;
+ }
+ if (key == 'l') {
+ MPL_LOGI(" 'l' - load calibration file");
+ inv_load_calibration();
+ }
+ if (key == 't') {
+ MPL_LOGI(" 't' - self test");
+ self_test();
+ }
+ if (key == 'q') {
+ MPL_LOGI(" 'q' - store calibration file");
+ inv_store_calibration();
+ break;
+ }
+#ifdef INV_PLAYBACK_DBG
+ if (key == 's') {
+ if (!logging) {
+ MPL_LOGI(" 's' - toggle logging on");
+ logfile = fopen("/data/playback.bin", "wb");
+ if (logfile) {
+ inv_turn_on_data_logging(logfile);
+ logging = true;
+ } else {
+ MPL_LOGI("Error : "
+ "cannot open log file '/data/playback.bin'");
+ }
+ } else {
+ MPL_LOGI(" 's' - toggle logging off");
+ inv_turn_off_data_logging();
+ fclose(logfile);
+ logging = false;
+ }
+ break;
+ }
+#endif
+
+ ready = poll(&pfd, 1, 100);
+ if (ready) {
+ bytes_read = read_attribute_sensor(fd, (char *)ev,
+ sizeof(struct input_event) * SIX_AXES);
+ //bytes_read= read(fd, &ev, sizeof(struct input_event) * SIX_AXES);
+ if (bytes_read > 0) {
+ int executed;
+
+ for (i = 0; i < bytes_read / sizeof(struct input_event); i++) {
+ if (ev[i].type == EV_REL) {
+ switch (ev[i].code) {
+ case REL_X:
+ printf("REL_X\n");
+ gyro[0]= ev[i].value; //Gyro X
+ printf("Gyro X:%5d ", gyro[0]);
+ break;
+ case REL_Y:
+ printf("REL_Y\n");
+ gyro[1]= ev[i].value; //Gyro Y
+ printf("Gyro Y:%5d ", gyro[1]);
+ break;
+ case REL_Z:
+ printf("REL_Z\n");
+ gyro[2]= ev[i].value; //Gyro Z
+ printf("Gyro Z:%5d ", gyro[2]);
+ break;
+ case REL_RX:
+ printf("REL_RX\n");
+ accel[0]= ev[i].value; //Accel X
+ printf("Accl X:%5ld ", accel[0]);
+ break;
+ case REL_RY:
+ printf("REL_RY\n");
+ accel[1]= ev[i].value; //Accel Y
+ printf("Accl Y:%5ld ", accel[1]);
+ break;
+ case REL_RZ:
+ printf("REL_RZ\n");
+ accel[2]= ev[i].value; //Accel Z
+ printf("Accl Z:%5ld ", accel[2]);
+ break;
+ case REL_MISC:
+ time_H= ev[i].value;
+ break;
+ case REL_WHEEL:
+ time_stamp = ((unsigned long long)(time_H) << 32) +
+ (unsigned int)ev[i].value;
+ break;
+ default:
+ printf("ERR- Un-recognized event code: %5d ", ev[i].code);
+ break;
+ }
+ } else {
+#if 0
+ clock_gettime(CLOCK_MONOTONIC, &timer);
+ curr_time= timer.tv_nsec + timer.tv_sec * 1000000000LL;
+ printf("Curr time= %lld, Dev time stamp= %lld, Time diff= %d ms\n", curr_time, time_stamp, (curr_time-time_stamp)/1000000LL);
+#endif
+ }
+ }
+
+ // build & process gyro + accel data
+ result = inv_build_gyro(gyro, (inv_time_t)timestamp, &executed);
+ if (result) {
+ LOG_RESULT_LOCATION(result);
+ } else if ((result = inv_build_accel(accel, 0,
+ (inv_time_t)timestamp,
+ &executed))) {
+ LOG_RESULT_LOCATION(result);
+ }
+ if (executed) {
+ printf("Exec on data Ok\n");
+ s_func_cb();
+ }
+
+ } else {
+ //printf ("ERR- No data!\n");
+ }
+
+ } else { MPL_LOGV("Device not ready"); }
+ }
+ close(fd);
+
+#ifdef INV_PLAYBACK_DBG
+ if (logging) {
+ inv_turn_off_data_logging();
+ fclose(logfile);
+ }
+#endif
+
+ return 0;
+}
diff --git a/libsensors_iio/software/simple_apps/gesture_test/build/android/inv_gesture_test-shared b/libsensors_iio/software/simple_apps/gesture_test/build/android/inv_gesture_test-shared
deleted file mode 100644
index ede049d..0000000
--- a/libsensors_iio/software/simple_apps/gesture_test/build/android/inv_gesture_test-shared
+++ /dev/null
Binary files differ
diff --git a/libsensors_iio/software/simple_apps/gesture_test/build/filelist.mk b/libsensors_iio/software/simple_apps/gesture_test/build/filelist.mk
deleted file mode 100644
index 75d93cf..0000000
--- a/libsensors_iio/software/simple_apps/gesture_test/build/filelist.mk
+++ /dev/null
@@ -1,11 +0,0 @@
-#### filelist.mk for inv_gesture_test ####
-
-# headers
-#HEADERS +=
-
-# sources
-SOURCES := $(APP_DIR)/inv_gesture_test.c
-
-INV_SOURCES += $(SOURCES)
-
-VPATH += $(APP_DIR)
diff --git a/libsensors_iio/software/simple_apps/gesture_test/inv_gesture_test.c b/libsensors_iio/software/simple_apps/gesture_test/inv_gesture_test.c
deleted file mode 100644
index d38d478..0000000
--- a/libsensors_iio/software/simple_apps/gesture_test/inv_gesture_test.c
+++ /dev/null
@@ -1,535 +0,0 @@
-/**
- * Gesture Test application for Invensense's MPU6/9xxx (w/ DMP).
- */
-
-#include <unistd.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <stdlib.h>
-#include <features.h>
-#include <dirent.h>
-#include <string.h>
-#include <poll.h>
-#include <stddef.h>
-#include <linux/input.h>
-#include <time.h>
-#include <linux/time.h>
-#include <unistd.h>
-#include <termios.h>
-
-#include "invensense.h"
-#include "ml_math_func.h"
-#include "storage_manager.h"
-#include "ml_stored_data.h"
-#include "ml_sysfs_helper.h"
-
-#define DEBUG_PRINT /* Uncomment to print Gyro & Accel read from Driver */
-
-#define MAX_SYSFS_NAME_LEN (100)
-#define MAX_SYSFS_ATTRB (sizeof(struct sysfs_attrbs) / sizeof(char*))
-
-#define FLICK_UPPER_THRES 3147790
-#define FLICK_LOWER_THRES -3147790
-#define FLICK_COUNTER 50
-#define POLL_TIME 2000 // 2sec
-
-#define FALSE 0
-#define TRUE 1
-
-char *sysfs_names_ptr;
-
-struct sysfs_attrbs {
- char *enable;
- char *power_state;
- char *dmp_on;
- char *dmp_int_on;
- char *self_test;
- char *dmp_firmware;
- char *firmware_loaded;
- char *display_orientation_on;
- char *orientation_on;
- char *event_flick;
- char *event_display_orientation;
- char *event_orientation;
- char *event_tap;
- char *flick_axis;
- char *flick_counter;
- char *flick_int_on;
- char *flick_lower;
- char *flick_upper;
- char *flick_message_on;
- char *tap_min_count;
- char *tap_on;
- char *tap_threshold;
- char *tap_time;
-} mpu;
-
-enum {
- tap,
- flick,
- gOrient,
- orient,
- numDMPFeatures
-};
-
-struct pollfd pfd[numDMPFeatures];
-
-/*******************************************************************************
- * DMP Feature Supported Functions
- ******************************************************************************/
-
-int read_sysfs_int(char *filename, int *var)
-{
- int res=0;
- FILE *fp;
-
- fp = fopen(filename, "r");
- if (fp!=NULL) {
- fscanf(fp, "%d\n", var);
- fclose(fp);
- } else {
- MPL_LOGE("ERR open file to read");
- res= -1;
- }
- return res;
-}
-
-int write_sysfs_int(char *filename, int data)
-{
- int res=0;
- FILE *fp;
-
- fp = fopen(filename, "w");
- if (fp!=NULL) {
- fprintf(fp, "%d\n", data);
- fclose(fp);
- } else {
- MPL_LOGE("ERR open file to write");
- res= -1;
- }
- return res;
-}
-
-/**************************************************
- This _kbhit() function is courtesy from Web
-***************************************************/
-int _kbhit() {
- static const int STDIN = 0;
- static bool initialized = false;
-
- if (! initialized) {
- // Use termios to turn off line buffering
- struct termios term;
- tcgetattr(STDIN, &term);
- term.c_lflag &= ~ICANON;
- tcsetattr(STDIN, TCSANOW, &term);
- setbuf(stdin, NULL);
- initialized = true;
- }
-
- int bytesWaiting;
- ioctl(STDIN, FIONREAD, &bytesWaiting);
- return bytesWaiting;
-}
-
-int inv_init_sysfs_attributes(void)
-{
- unsigned char i = 0;
- char sysfs_path[MAX_SYSFS_NAME_LEN];
- char *sptr;
- char **dptr;
-
- sysfs_names_ptr =
- (char*)malloc(sizeof(char[MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN]));
- sptr = sysfs_names_ptr;
- if (sptr != NULL) {
- dptr = (char**)&mpu;
- do {
- *dptr++ = sptr;
- sptr += sizeof(char[MAX_SYSFS_NAME_LEN]);
- } while (++i < MAX_SYSFS_ATTRB);
- } else {
- MPL_LOGE("couldn't alloc mem for sysfs paths");
- return -1;
- }
-
- // get proper (in absolute/relative) IIO path & build MPU's sysfs paths
- inv_get_sysfs_path(sysfs_path);
-
- sprintf(mpu.enable, "%s%s", sysfs_path, "/buffer/enable");
- sprintf(mpu.power_state, "%s%s", sysfs_path, "/power_state");
- sprintf(mpu.dmp_on,"%s%s", sysfs_path, "/dmp_on");
- sprintf(mpu.dmp_int_on, "%s%s", sysfs_path, "/dmp_int_on");
- sprintf(mpu.self_test, "%s%s", sysfs_path, "/self_test");
- sprintf(mpu.dmp_firmware, "%s%s", sysfs_path, "/dmp_firmware");
- sprintf(mpu.firmware_loaded, "%s%s", sysfs_path, "/firmware_loaded");
- sprintf(mpu.display_orientation_on, "%s%s", sysfs_path, "/display_orientation_on");
- sprintf(mpu.orientation_on, "%s%s", sysfs_path, "/orientation_on");
- sprintf(mpu.event_flick, "%s%s", sysfs_path, "/event_flick");
- sprintf(mpu.event_display_orientation, "%s%s", sysfs_path, "/event_display_orientation");
- sprintf(mpu.event_orientation, "%s%s", sysfs_path, "/event_orientation");
- sprintf(mpu.event_tap, "%s%s", sysfs_path, "/event_tap");
- sprintf(mpu.flick_axis, "%s%s", sysfs_path, "/flick_axis");
- sprintf(mpu.flick_counter, "%s%s", sysfs_path, "/flick_counter");
- sprintf(mpu.flick_int_on, "%s%s", sysfs_path, "/flick_int_on");
- sprintf(mpu.flick_lower, "%s%s", sysfs_path, "/flick_lower");
- sprintf(mpu.flick_upper, "%s%s", sysfs_path, "/flick_upper");
- sprintf(mpu.flick_message_on, "%s%s", sysfs_path, "/flick_message_on");
- sprintf(mpu.tap_min_count, "%s%s", sysfs_path, "/tap_min_count");
- sprintf(mpu.tap_on, "%s%s", sysfs_path, "/tap_on");
- sprintf(mpu.tap_threshold, "%s%s", sysfs_path, "/tap_threshold");
- sprintf(mpu.tap_time, "%s%s", sysfs_path, "/tap_time");
-
-#if 0
- // test print sysfs paths
- dptr = (char**)&mpu;
- for (i = 0; i < MAX_SYSFS_ATTRB; i++) {
- MPL_LOGE("sysfs path: %s", *dptr++);
- }
-#endif
- return 0;
-}
-
-int DmpFWloaded()
-{
- int res;
- read_sysfs_int(mpu.firmware_loaded, &res);
- return res;
-}
-
-int enable_flick(int en)
-{
- int res=0;
- int flickUpper=0, flickLower=0, flickCounter=0;
-
- if (write_sysfs_int(mpu.flick_int_on, en) < 0) {
- printf("GT:ERR-can't write 'flick_int_on'");
- res= -1;
- }
-
- if (en) {
- flickUpper= FLICK_UPPER_THRES;
- flickLower= FLICK_LOWER_THRES;
- flickCounter= FLICK_COUNTER;
- }
-
- if (write_sysfs_int(mpu.flick_upper, flickUpper) < 0) {
- printf("GT:ERR-can't write 'flick_upper'");
- res= -1;
- }
-
- if (write_sysfs_int(mpu.flick_lower, flickLower) < 0) {
- printf("GT:ERR-can't write 'flick_lower'");
- res= -1;
- }
-
- if (write_sysfs_int(mpu.flick_counter, flickCounter) < 0) {
- printf("GT:ERR-can't write 'flick_counter'");
- res= -1;
- }
-
- if (write_sysfs_int(mpu.flick_message_on, 0) < 0) {
- printf("GT:ERR-can't write 'flick_message_on'");
- res= -1;
- }
-
- if (write_sysfs_int(mpu.flick_axis, 0) < 0) {
- printf("GT:ERR_can't write 'flick_axis'");
- res= -1;
- }
-
- return res;
-}
-
-int enable_tap(int en)
-{
- if (write_sysfs_int(mpu.tap_on, en) < 0) {
- printf("GT:ERR-can't write 'tap_on'");
- return -1;
- }
-
- return 0;
-}
-
-int enable_displ_orient(int en)
-{
- if (write_sysfs_int(mpu.display_orientation_on, en) < 0) {
- printf("GT:ERR-can't write 'display_orientation_en'");
- return -1;
- }
-
- return 0;
-}
-
-int enable_orient(int en)
-{
- if (write_sysfs_int(mpu.orientation_on, en) < 0) {
- printf("GT:ERR-can't write 'orientation_on'");
- return -1;
- }
-
- return 0;
-}
-
-int flickHandler()
-{
- FILE *fp;
- int data;
-
-#ifdef DEBUG_PRINT
- printf("GT:Flick Handler\n");
-#endif
-
- fp = fopen(mpu.event_flick, "rt");
- fscanf(fp, "%d\n", &data);
- fclose (fp);
-
- printf("Flick= %x\n", data);
-
- return 0;
-}
-
-int tapHandler()
-{
- FILE *fp;
- int tap, tap_dir, tap_num;
-
- fp = fopen(mpu.event_tap, "rt");
- fscanf(fp, "%d\n", &tap);
- fclose(fp);
-
- tap_dir = tap/8;
- tap_num = tap%8 + 1;
-
-#ifdef DEBUG_PRINT
- printf("GT:Tap Handler **\n");
- printf("Tap= %x\n", tap);
- printf("Tap Dir= %x\n", tap_dir);
- printf("Tap Num= %x\n", tap_num);
-#endif
-
- switch (tap_dir) {
- case 1:
- printf("Tap Axis->X Pos\n");
- break;
- case 2:
- printf("Tap Axis->X Neg\n");
- break;
- case 3:
- printf("Tap Axis->Y Pos\n");
- break;
- case 4:
- printf("Tap Axis->Y Neg\n");
- break;
- case 5:
- printf("Tap Axis->Z Pos\n");
- break;
- case 6:
- printf("Tap Axis->Z Neg\n");
- break;
- default:
- printf("Tap Axis->Unknown\n");
- break;
- }
-
- return 0;
-}
-
-int googleOrientHandler()
-{
- FILE *fp;
- int orient;
-
-#ifdef DEBUG_PRINT
- printf("GT:Google Orient Handler\n");
-#endif
-
- fp = fopen(mpu.event_display_orientation, "rt");
- fscanf(fp, "%d\n", &orient);
- fclose(fp);
-
- printf("Google Orient-> %d\n", orient);
-
- return 0;
-}
-
-int orientHandler()
-{
- FILE *fp;
- int orient;
-
- fp = fopen(mpu.event_orientation, "rt");
- fscanf(fp, "%d\n", &orient);
- fclose(fp);
-
-#ifdef DEBUG_PRINT
- printf("GT:Reg Orient Handler\n");
-#endif
-
- if (orient & 0x01)
- printf("Orient->X Up\n");
-
- if (orient & 0x02)
- printf("Orient->X Down\n");
-
- if (orient & 0x04)
- printf("Orient->Y Up\n");
-
- if (orient & 0x08)
- printf("Orient->Y Down\n");
-
- if (orient & 0x10)
- printf("Orient->Z Up\n");
-
- if (orient & 0x20)
- printf("Orient->Z Down\n");
-
- if (orient & 0x40)
- printf("Orient->Flip\n");
-
- return 0;
-}
-
-int enableDMPFeatures(int en)
-{
- int res= -1;
-
- if (DmpFWloaded())
- {
- /* Currently there's no info regarding DMP's supported features/capabilities */
- /* An error in enabling features below could be an indication of the feature */
- /* not supported in current loaded DMP firmware */
-
- enable_flick(en);
- enable_tap(en);
- enable_displ_orient(en);
- enable_orient(en);
- res= 0;
- }
-
- return res;
-}
-
-int initFds()
-{
- int i;
-
- for (i=0; i< numDMPFeatures; i++) {
- switch(i) {
- case tap:
- pfd[i].fd = open(mpu.event_tap, O_RDONLY | O_NONBLOCK);
- break;
-
- case flick:
- pfd[i].fd = open(mpu.event_flick, O_RDONLY | O_NONBLOCK);
- break;
-
- case gOrient:
- pfd[i].fd = open(mpu.event_display_orientation, O_RDONLY | O_NONBLOCK);
- break;
-
- case orient:
- pfd[i].fd = open(mpu.event_orientation, O_RDONLY | O_NONBLOCK);
- break;
-
- default:
- pfd[i].fd = -1;
- }
-
- pfd[i].events = POLLPRI|POLLERR,
- pfd[i].revents = 0;
-#ifdef DEBUG_PRINT
- printf("GT:pfd[%d].fd= %d\n", i, pfd[i].fd);
-#endif
- }
-
- return 0;
-}
-
-int closeFds()
-{
- int i;
- for (i = 0; i < numDMPFeatures; i++) {
- if (!pfd[i].fd)
- close(pfd[i].fd);
- }
- return 0;
-}
-
-/*******************************************************************************
- * M a i n S e l f T e s t
- ******************************************************************************/
-
-int main(int argc, char **argv)
-{
- char data[4];
- int i, res= 0;
-
- res = inv_init_sysfs_attributes();
- if (res) {
- printf("GT:ERR-Can't allocate mem");
- return -1;
- }
-
- /* On Gesture/DMP supported features */
- enableDMPFeatures(1);
-
- /* init Fds to poll for Gesture data */
- initFds();
-
- /* prompt user to make gesture and how to stop program */
- printf("\n**Please make Gesture to see data. Press any key to stop Prog**\n\n");
-
- do {
- for (i=0; i< numDMPFeatures; i++) {
- read(pfd[i].fd, data, 4);
- }
-
- poll(pfd, numDMPFeatures, POLL_TIME);
-
- for (i=0; i< numDMPFeatures; i++) {
- if(pfd[i].revents != 0) {
- switch(i) {
- case tap:
- tapHandler();
- break;
-
- case flick:
- flickHandler();
- break;
-
- case gOrient:
- googleOrientHandler();
- break;
-
- case orient:
- orientHandler();
- break;
-
- default:
- printf("GT:ERR-Not supported");
- break;
- }
- pfd[i].revents= 0; //no need. reset anyway
- }
- }
-
- } while (!_kbhit());
-
- /* Off DMP features */
- enableDMPFeatures(0);
-
- /* release resources */
- closeFds();
- if (sysfs_names_ptr) {
- free(sysfs_names_ptr);
- }
-
- printf("\nThank You!\n");
-
- return res;
-}
-
diff --git a/libsensors_iio/software/simple_apps/input_sub/build/android/input_gyro-shared b/libsensors_iio/software/simple_apps/input_sub/build/android/input_gyro-shared
new file mode 100644
index 0000000..5d52b21
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/input_sub/build/android/input_gyro-shared
Binary files differ
diff --git a/libsensors_iio/software/simple_apps/gesture_test/build/android/shared.mk b/libsensors_iio/software/simple_apps/input_sub/build/android/shared.mk
index 7655e4d..7f6cc43 100644
--- a/libsensors_iio/software/simple_apps/gesture_test/build/android/shared.mk
+++ b/libsensors_iio/software/simple_apps/input_sub/build/android/shared.mk
@@ -1,4 +1,4 @@
-EXEC = inv_gesture_test$(SHARED_APP_SUFFIX)
+EXEC = input_gyro$(SHARED_APP_SUFFIX)
MK_NAME = $(notdir $(CURDIR)/$(firstword $(MAKEFILE_LIST)))
@@ -11,7 +11,9 @@ OBJFOLDER = $(CURDIR)/obj
INV_ROOT = ../../../../..
APP_DIR = $(CURDIR)/../..
MLLITE_DIR = $(INV_ROOT)/software/core/mllite
+COMMON_DIR = $(INV_ROOT)/software/simple_apps/common
MPL_DIR = $(INV_ROOT)/software/core/mpl
+HAL_DIR = $(INV_ROOT)/software/core/HAL
include $(INV_ROOT)/software/build/android/common.mk
@@ -47,8 +49,20 @@ LLINK += -lstdc++
LLINK += -llog
LLINK += -lz
+PRE_LFLAGS := -Wl,-T,$(ANDROID_ROOT)/build/core/armelf.x
+PRE_LFLAGS += $(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib/crtend_android.o
+PRE_LFLAGS += $(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib/crtbegin_dynamic.o
+
LFLAGS += $(CMDLINE_LFLAGS)
-LFLAGS += $(ANDROID_LINK_EXECUTABLE)
+LFLAGS += -nostdlib
+LFLAGS += -fpic
+LFLAGS += -Wl,--gc-sections
+LFLAGS += -Wl,--no-whole-archive
+LFLAGS += -Wl,-dynamic-linker,/system/bin/linker
+LFLAGS += $(ANDROID_LINK)
+ifneq ($(PRODUCT),panda)
+LFLAGS += -rdynamic
+endif
LRPATH = -Wl,-rpath,$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib:$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/system/lib
@@ -73,7 +87,7 @@ all: $(EXEC) $(MK_NAME)
$(EXEC) : $(OBJFOLDER) $(INV_OBJS_DST) $(INV_LIBS) $(MK_NAME)
@$(call echo_in_colors, "\n<linking $(EXEC) with objects $(INV_OBJS_DST) $(PREBUILT_OBJS) and libraries $(INV_LIBS)\n")
- $(LINK) $(INV_OBJS_DST) -o $(EXEC) $(LFLAGS) $(LLINK) $(INV_LIBS) $(LLINK) $(LRPATH)
+ $(LINK) $(PRE_LFLAGS) $(INV_OBJS_DST) -o $(EXEC) $(LFLAGS) $(LLINK) $(INV_LIBS) $(LLINK) $(LRPATH)
$(OBJFOLDER) :
@$(call echo_in_colors, "\n<creating object's folder 'obj/'>\n")
diff --git a/libsensors_iio/software/simple_apps/input_sub/build/filelist.mk b/libsensors_iio/software/simple_apps/input_sub/build/filelist.mk
new file mode 100644
index 0000000..0936212
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/input_sub/build/filelist.mk
@@ -0,0 +1,13 @@
+#### filelist.mk for input_gyro ####
+
+# helper headers
+HEADERS := $(MPL_DIR)/authenticate.h
+#HEADERS +=
+
+# sources
+SOURCES := $(APP_DIR)/test_input_gyro.c
+
+INV_SOURCES += $(SOURCES)
+
+#VPATH += $(APP_DIR) $(COMMON_DIR) $(HAL_DIR)/linux
+VPATH += $(APP_DIR)
diff --git a/libsensors_iio/software/simple_apps/input_sub/test_input_gyro.c b/libsensors_iio/software/simple_apps/input_sub/test_input_gyro.c
new file mode 100644
index 0000000..6fa9aab
--- /dev/null
+++ b/libsensors_iio/software/simple_apps/input_sub/test_input_gyro.c
@@ -0,0 +1,485 @@
+/*
+ * input interface testing
+ */
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/input.h>
+#include <linux/config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "linux/ml_sysfs_helper.h"
+#include "authenticate.h"
+#include "ml_load_dmp.h"
+
+#if 0
+struct input_event {
+ struct timeval time;
+ __u16 type;
+ __u16 code;
+ __s32 value;
+};
+#endif
+
+void HandleOrient(int orient)
+{
+ if (orient & 0x01)
+ printf("INV_X_UP\n");
+ if (orient & 0x02)
+ printf("INV_X_DOWN\n");
+ if (orient & 0x04)
+ printf("INV_Y_UP\n");
+ if (orient & 0x08)
+ printf("INV_Y_DOWN\n");
+ if (orient & 0x10)
+ printf("INV_Z_UP\n");
+ if (orient & 0x20)
+ printf("INV_Z_DOWN\n");
+ if (orient & 0x40)
+ printf("INV_ORIENTATION_FLIP\n");
+}
+
+void HandleTap(int tap)
+{
+ int tap_dir = tap/8;
+ int tap_num = tap%8 + 1;
+
+ switch (tap_dir) {
+ case 1:
+ printf("INV_TAP_AXIS_X_POS\n");
+ break;
+ case 2:
+ printf("INV_TAP_AXIS_X_NEG\n");
+ break;
+ case 3:
+ printf("INV_TAP_AXIS_Y_POS\n");
+ break;
+ case 4:
+ printf("INV_TAP_AXIS_Y_NEG\n");
+ break;
+ case 5:
+ printf("INV_TAP_AXIS_Z_POS\n");
+ break;
+ case 6:
+ printf("INV_TAP_AXIS_Z_NEG\n");
+ break;
+ default:
+ break;
+ }
+ printf("Tap number: %d\n", tap_num);
+}
+
+static void read_compass(int event_number)
+{
+ int ev_size, ret_byte, ii;
+ int fd = -1;
+ struct input_event ev[10];
+ char name[64];
+ char file_name[64];
+ unsigned int RX;
+ unsigned long long time0, time1, time2;
+ struct timespec tsp;
+ ev_size = sizeof(struct input_event);
+ sprintf(file_name, "/dev/input/event%d", event_number);
+ if ((fd = open(file_name, O_RDONLY)) < 0 ) {
+ printf("fail to open compass\n");
+ return;
+ }
+
+ /* NOTE: Use this to pass device name to HAL. */
+ ioctl (fd, EVIOCGNAME (sizeof (name)), name);
+ printf ("Reading From : (%s)\n", name);
+ while (1) {
+ clock_gettime(CLOCK_MONOTONIC, &tsp);
+ /*read compass data here */
+ if(fd > 0){
+ ret_byte = read(fd, ev, ev_size);
+ } else {
+ ret_byte = -1;
+ }
+ time0 = tsp.tv_nsec/1000000 + tsp.tv_sec * 1000LL;
+ if (ret_byte < 0)
+ continue;
+ for (ii = 0; ii < ret_byte/ev_size; ii++) {
+ if(EV_REL != ev[ii].type) {
+ time2 = ev[ii].time.tv_usec/1000 + ev[ii].time.tv_sec * 1000LL;
+ printf("mono=%lldms, diff=%d\n", time2, (int)(time1-time0));
+ continue;
+ }
+ switch (ev[ii].code) {
+ case REL_X:
+ printf("CX:%5d ", ev[ii].value);
+ break;
+ case REL_Y:
+ printf("CY:%5d ", ev[ii].value);
+ break;
+ case REL_Z:
+ printf("CZ:%5d ", ev[ii].value);
+ break;
+ case REL_MISC:
+ RX = ev[ii].value;
+ break;
+ case REL_WHEEL:
+ time1 = ((unsigned long long)(RX)<<32) + (unsigned int)ev[ii].value;
+ time1 = time1/1000000;
+ printf("time1: %lld ", time1);
+ break;
+ default:
+ printf("GES?: %5d ", ev[ii].code);
+ break;
+ }
+ }
+ }
+ close(fd);
+}
+
+static void read_gesture(int num)
+{
+ int ev_size, ret_byte, ii;
+ int fd = -1;
+ struct input_event ev[10];
+ char name[64];
+ char file_name[64];
+ unsigned long long time;
+ struct timespec tsp;
+ ev_size = sizeof(struct input_event);
+ sprintf(file_name, "/dev/input/event%d", num);
+ MPL_LOGI("%s\n", file_name);
+ if ((fd = open(file_name, O_RDONLY)) < 0 ) {
+ printf("fail to open gusture.\n");
+ return;
+ }
+
+ /* NOTE: Use this to pass device name to HAL. */
+ ioctl (fd, EVIOCGNAME (sizeof (name)), name);
+ printf ("Reading From : (%s)\n", name);
+ while(1){
+ clock_gettime(CLOCK_MONOTONIC, &tsp);
+ if(fd > 0){
+ ret_byte = read(fd, ev, ev_size);
+ } else {
+ ret_byte = -1;
+ }
+ time = tsp.tv_nsec + tsp.tv_sec * 1000000000LL;
+ //printf("retbyte=%d, ev3=%d\n", ret_byte, ev_size*3);
+ if (ret_byte < 0)
+ continue;
+ for (ii = 0; ii < ret_byte/ev_size; ii++) {
+ if(EV_REL != ev[ii].type) {
+ time = ev[ii].time.tv_usec + ev[ii].time.tv_sec * 1000000LL;
+ printf("mono=%lld\n", time);
+ continue;
+ }
+ switch (ev[ii].code) {
+ case REL_RX:
+ printf("GESX:%5x\n", ev[ii].value);
+ HandleTap(ev[ii].value);
+ break;
+ case REL_RY:
+ printf("GESY:%5x\n", ev[ii].value);
+ HandleOrient(ev[ii].value);
+ break;
+ case REL_RZ:
+ printf("FLICK:%5x\n", ev[ii].value);
+ break;
+ default:
+ printf("?: %5d ", ev[ii].code);
+ break;
+ }
+ }
+ }
+}
+
+static void read_gyro_accel(int num)
+{
+ int ev_size, ret_byte, ii;
+ int fd = -1;
+ unsigned int RX;
+ struct input_event ev[10];
+ char name[64];
+ char file_name[64];
+ unsigned long long time0, time1, time2;
+ struct timespec tsp;
+ ev_size = sizeof(struct input_event);
+ sprintf(file_name, "/dev/input/event%d", num);
+ if ((fd = open(file_name, O_RDONLY)) < 0 ) {
+ printf("fail to open gyro/accel\n");
+ return;
+ }
+
+ /* NOTE: Use this to pass device name to HAL. */
+ ioctl (fd, EVIOCGNAME (sizeof (name)), name);
+ printf ("Reading From : (%s)\n", name);
+ while (1){
+ //usleep(20000);
+ ret_byte = read(fd, ev, ev_size);
+ if (ret_byte < 0)
+ continue;
+ //ret_byte = 0;
+
+ for (ii = 0; ii < ret_byte/ev_size; ii++) {
+ if(EV_REL != ev[ii].type) {
+ time0 = ev[ii].time.tv_usec/1000 + ev[ii].time.tv_sec * 1000LL;
+ printf("T: %lld diff=%d ", time0, (int)(time1 - time0));
+ clock_gettime(CLOCK_MONOTONIC, &tsp);
+ time2 = tsp.tv_nsec/1000000 + tsp.tv_sec * 1000LL;
+ printf("mono=%lld, diff2=%d\n", time2, (int)(time1 - time2));
+ continue;
+ }
+ switch (ev[ii].code) {
+ case REL_X:
+ printf("GX:%5d ", ev[ii].value);
+ break;
+ case REL_Y:
+ printf("GY:%5d ", ev[ii].value);
+ break;
+ case REL_Z:
+ printf("GZ:%5d ", ev[ii].value);
+ break;
+ case REL_RX:
+ printf("AX:%5d ", ev[ii].value);
+ break;
+ case REL_RY:
+ printf("AY:%5d ", ev[ii].value);
+ break;
+ case REL_RZ:
+ printf("AZ:%5d ", ev[ii].value);
+ break;
+ case REL_MISC:
+ RX = ev[ii].value;
+ break;
+ case REL_WHEEL:
+ time1 = ((unsigned long long)(RX)<<32) + (unsigned int)ev[ii].value;
+ time1 = time1/1000000;
+ printf("time1: %lld ", time1);
+ break;
+ default:
+ printf("?: %5d ", ev[ii].code);
+ break;
+ }
+ }
+ }
+ close(fd);
+}
+int inv_sysfs_write(char *filename, long data)
+{
+ FILE *fp;
+ int count;
+
+ if (!filename)
+ return -1;
+ fp = fopen(filename, "w");
+ if (!fp)
+ return -errno;
+ count = fprintf(fp, "%ld", data);
+ fclose(fp);
+ return count;
+}
+int inv_sysfs_read(char *filename, long num_bytes, char *data)
+{
+ FILE *fp;
+ int count;
+
+ if (!filename)
+ return -1;
+ fp = fopen(filename, "r");
+ if (!fp)
+ return -errno;
+ count = fread(data, 1, num_bytes, fp);
+ fclose(fp);
+ return count;
+}
+
+void enable_flick(char *p)
+{
+ char sysfs_file[200];
+ printf("flick:%s\n", p);
+ sprintf(sysfs_file, "%s/flick_int_on", p);
+ inv_sysfs_write(sysfs_file, 1);
+ sprintf(sysfs_file, "%s/flick_upper", p);
+ inv_sysfs_write(sysfs_file, 3147790);
+ sprintf(sysfs_file, "%s/flick_lower", p);
+ inv_sysfs_write(sysfs_file, -3147790);
+ sprintf(sysfs_file, "%s/flick_counter", p);
+ inv_sysfs_write(sysfs_file, 50);
+ sprintf(sysfs_file, "%s/flick_message_on", p);
+ inv_sysfs_write(sysfs_file, 0);
+ sprintf(sysfs_file, "%s/flick_axis", p);
+ inv_sysfs_write(sysfs_file, 2);
+}
+
+void setup_dmp(char *sysfs_path)
+{
+ char sysfs_file[200];
+ char firmware_loaded[200], dmp_path[200];
+ char dd[10];
+
+ inv_get_dmpfile(dmp_path);
+ sprintf(sysfs_file, "%s/fifo_rate", sysfs_path);
+ inv_sysfs_write(sysfs_file, 200);
+ sprintf(sysfs_file, "%s/FSR", sysfs_path);
+ inv_sysfs_write(sysfs_file, 2000);
+ sprintf(sysfs_file, "%s/accl_fs", sysfs_path);
+ inv_sysfs_write(sysfs_file, 4);
+ /*
+ sprintf(firmware_loaded, "%s/%s", sysfs_path, "firmware_loaded");
+ printf("%s\n", firmware_loaded);
+ inv_sysfs_write(firmware_loaded, 0);
+ inv_sysfs_read(firmware_loaded, 1, dd);
+ printf("beforefirmware_loaded=%c\n", dd[0]);
+
+ if ((fd = open(dmp_path, O_WRONLY)) < 0 ) {
+ perror("dmp fail");
+ }
+ inv_load_dmp(fd);
+ close(fd);
+ */
+ inv_sysfs_read(firmware_loaded, 1, dd);
+ printf("firmware_loaded=%c\n", dd[0]);
+}
+void read_pedometer(char *sysfs_path){
+ int steps;
+ char sysfs_file[200];
+ char dd[4];
+ sprintf(sysfs_file, "%s/pedometer_steps", sysfs_path);
+ inv_sysfs_read(sysfs_file, 4, dd);
+ steps = dd[0] << 8 | dd[1];
+ printf("fff=%d\n", steps);
+}
+/* The running sequence:
+ "input_gyro 2 &".
+ This will setup the dmp firmware and let it run on background.
+ tap and flick will work at this time.
+ To see accelerometer data and gyro data.
+ type :
+ "input_gyro ".
+ This will print out gyro data and accelerometer data
+ To see Compass data
+ type:
+ "input_gyro 1" */
+
+int main(int argc, char *argv[])
+{
+ unsigned int RX, i, sel;
+ unsigned char key[16];
+ struct timeval tv;
+ struct timespec tsp0, tsp1, tsp2, tsp3;
+ int event_num;
+ char sysfs_path[200];
+ char chip_name[20];
+ char sysfs_file[200];
+ if (INV_SUCCESS != inv_check_key()) {
+ printf("key check fail\n");
+ exit(0);
+ }else
+ printf("key authenticated\n");
+
+ for(i=0;i<16;i++){
+ key[i] = 0xff;
+ }
+ RX = inv_get_sysfs_key(key);
+ if(RX == INV_SUCCESS){
+ for(i=0;i<16;i++){
+ printf("%d, ", key[i]);
+ }
+ printf("\n");
+ }else{
+ printf("get key failed\n");
+ }
+ memset(sysfs_path, 0, 200);
+ memset(sysfs_file, 0, 200);
+ memset(chip_name, 0, 20);
+ inv_get_sysfs_path(sysfs_path);
+ inv_get_chip_name(chip_name);
+ printf("sysfs path: %s\n", sysfs_path);
+ printf("chip name: %s\n", chip_name);
+ /*set up driver*/
+ sprintf(sysfs_file, "%s/enable", sysfs_path);
+ inv_sysfs_write(sysfs_file, 0);
+ sprintf(sysfs_file, "%s/power_state", sysfs_path);
+ inv_sysfs_write(sysfs_file, 1);
+ if ((getuid ()) != 0)
+ printf ("You are not root! This may not work...\n");
+
+ if(argc ==2 )
+ sel = argv[1][0] - 0x30;
+ else
+ sel = 0;
+ switch(sel){
+ case 0:
+ printf("-------------------------------\n");
+ printf("--- log gyro and accel data ---\n");
+ printf("-------------------------------\n");
+ sprintf(sysfs_file, "%s/enable", sysfs_path);
+ inv_sysfs_write(sysfs_file, 1);
+ if(inv_get_handler_number(chip_name, &event_num) < 0)
+ printf("mpu not installed\n");
+ else
+ read_gyro_accel(event_num);
+ break;
+
+ case 1:
+ printf("------------------------\n");
+ printf("--- log compass data ---\n");
+ printf("------------------------\n");
+ sprintf(sysfs_file, "%s/compass_enable", sysfs_path);
+ inv_sysfs_write(sysfs_file, 1);
+ sprintf(sysfs_file, "%s/enable", sysfs_path);
+ inv_sysfs_write(sysfs_file, 1);
+ if(inv_get_handler_number("INV_COMPASS", &event_num) < 0)
+ printf("compass is not enabled\n");
+ else
+ read_compass(event_num);
+ break;
+
+ case 2:
+ printf("--------------------\n");
+ printf("--- log gestures ---\n");
+ printf("--------------------\n");
+ setup_dmp(sysfs_path);
+ enable_flick(sysfs_path);
+ sprintf(sysfs_file, "%s/tap_on", sysfs_path);
+ inv_sysfs_write(sysfs_file, 1);
+ sprintf(sysfs_file, "%s/enable", sysfs_path);
+ inv_sysfs_write(sysfs_file, 1);
+ if(inv_get_handler_number("INV_DMP", &event_num) < 0)
+ printf("DMP not enabled\n");
+ else
+ read_gesture(event_num);
+ break;
+
+ case 3:
+ printf("-----------------\n");
+ printf("--- pedometer ---\n");
+ printf("-----------------\n");
+ read_pedometer(sysfs_path);
+ break;
+
+ default:
+ printf("error choice\n");
+ break;
+ }
+
+ gettimeofday(&tv, NULL);
+ clock_gettime(CLOCK_MONOTONIC, &tsp1);
+ clock_gettime(CLOCK_REALTIME, &tsp0);
+
+ clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tsp2);
+ clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tsp3);
+ //printf("id=%d, %d, %d, %d\n", CLOCK_MONOTONIC, CLOCK_REALTIME,
+ // CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID);
+ //printf("sec0=%lu , nsec=%ld\n", tsp0.tv_sec, tsp0.tv_nsec);
+ //printf("sec1=%lu , nsec=%ld\n", tsp1.tv_sec, tsp1.tv_nsec);
+ //printf("sec=%lu , nsec=%ld\n", tsp2.tv_sec, tsp2.tv_nsec);
+ //printf("sec=%lu , nsec=%ld\n", tsp3.tv_sec, tsp3.tv_nsec);
+
+ //ioctl (fd, EVIOCGNAME (sizeof (name)), name);
+ //printf ("Reading From : %s (%s)\n", argv[1], name);
+
+
+ return 0;
+}
+
diff --git a/libsensors_iio/software/simple_apps/mpu_iio/build/android/inv_mpu_iio-shared b/libsensors_iio/software/simple_apps/mpu_iio/build/android/inv_mpu_iio-shared
deleted file mode 100644
index 14ca523..0000000
--- a/libsensors_iio/software/simple_apps/mpu_iio/build/android/inv_mpu_iio-shared
+++ /dev/null
Binary files differ
diff --git a/libsensors_iio/software/simple_apps/mpu_iio/build/filelist.mk b/libsensors_iio/software/simple_apps/mpu_iio/build/filelist.mk
deleted file mode 100644
index 8a3977a..0000000
--- a/libsensors_iio/software/simple_apps/mpu_iio/build/filelist.mk
+++ /dev/null
@@ -1,12 +0,0 @@
-#### filelist.mk for mpu_iio ####
-
-# headers
-#HEADERS += $(HAL_DIR)/include/inv_sysfs_utils.h
-HEADERS += $(APP_DIR)/iio_utils.h
-
-# sources
-SOURCES := $(APP_DIR)/mpu_iio.c
-
-INV_SOURCES += $(SOURCES)
-
-VPATH += $(APP_DIR) $(COMMON_DIR) $(HAL_DIR)/linux
diff --git a/libsensors_iio/software/simple_apps/mpu_iio/iio_utils.h b/libsensors_iio/software/simple_apps/mpu_iio/iio_utils.h
deleted file mode 100644
index 773ff2c..0000000
--- a/libsensors_iio/software/simple_apps/mpu_iio/iio_utils.h
+++ /dev/null
@@ -1,643 +0,0 @@
-/* IIO - useful set of util functionality
- *
- * Copyright (c) 2008 Jonathan Cameron
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- */
-
-/* Made up value to limit allocation sizes */
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <dirent.h>
-
-#define IIO_MAX_NAME_LENGTH 30
-
-#define FORMAT_SCAN_ELEMENTS_DIR "%s/scan_elements"
-#define FORMAT_TYPE_FILE "%s_type"
-
-const char *iio_dir = "/sys/bus/iio/devices/";
-
-/**
- * iioutils_break_up_name() - extract generic name from full channel name
- * @full_name: the full channel name
- * @generic_name: the output generic channel name
- **/
-static int iioutils_break_up_name(const char *full_name,
- char **generic_name)
-{
- char *current;
- char *w, *r;
- char *working;
- current = strdup(full_name);
- working = strtok(current, "_\0");
- w = working;
- r = working;
-
- while (*r != '\0') {
- if (!isdigit(*r)) {
- *w = *r;
- w++;
- }
- r++;
- }
- *w = '\0';
- *generic_name = strdup(working);
- free(current);
-
- return 0;
-}
-
-/**
- * struct iio_channel_info - information about a given channel
- * @name: channel name
- * @generic_name: general name for channel type
- * @scale: scale factor to be applied for conversion to si units
- * @offset: offset to be applied for conversion to si units
- * @index: the channel index in the buffer output
- * @bytes: number of bytes occupied in buffer output
- * @mask: a bit mask for the raw output
- * @is_signed: is the raw value stored signed
- * @enabled: is this channel enabled
- **/
-struct iio_channel_info {
- char *name;
- char *generic_name;
- float scale;
- float offset;
- unsigned index;
- unsigned bytes;
- unsigned bits_used;
- unsigned shift;
- uint64_t mask;
- unsigned be;
- unsigned is_signed;
- unsigned enabled;
- unsigned location;
-};
-
-/**
- * iioutils_get_type() - find and process _type attribute data
- * @is_signed: output whether channel is signed
- * @bytes: output how many bytes the channel storage occupies
- * @mask: output a bit mask for the raw data
- * @be: big endian
- * @device_dir: the iio device directory
- * @name: the channel name
- * @generic_name: the channel type name
- **/
-inline int iioutils_get_type(unsigned *is_signed,
- unsigned *bytes,
- unsigned *bits_used,
- unsigned *shift,
- uint64_t *mask,
- unsigned *be,
- const char *device_dir,
- const char *name,
- const char *generic_name)
-{
- FILE *sysfsfp;
- int ret;
- DIR *dp;
- char *scan_el_dir, *builtname, *builtname_generic, *filename = 0;
- char signchar, endianchar;
- unsigned padint;
- const struct dirent *ent;
-
- ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_ret;
- }
- ret = asprintf(&builtname, FORMAT_TYPE_FILE, name);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_free_scan_el_dir;
- }
- ret = asprintf(&builtname_generic, FORMAT_TYPE_FILE, generic_name);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_free_builtname;
- }
-
- dp = opendir(scan_el_dir);
- if (dp == NULL) {
- ret = -errno;
- goto error_free_builtname_generic;
- }
- while (ent = readdir(dp), ent != NULL)
- /*
- * Do we allow devices to override a generic name with
- * a specific one?
- */
- if ((strcmp(builtname, ent->d_name) == 0) ||
- (strcmp(builtname_generic, ent->d_name) == 0)) {
- ret = asprintf(&filename,
- "%s/%s", scan_el_dir, ent->d_name);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_closedir;
- }
- sysfsfp = fopen(filename, "r");
- if (sysfsfp == NULL) {
- printf("failed to open %s\n", filename);
- ret = -errno;
- goto error_free_filename;
- }
-
- ret = fscanf(sysfsfp,
- "%ce:%c%u/%u>>%u",
- &endianchar,
- &signchar,
- bits_used,
- &padint, shift);
- if (ret < 0) {
- printf("failed to pass scan type description\n");
- return ret;
- }
- *be = (endianchar == 'b');
- *bytes = padint / 8;
- if (*bits_used == 64)
- *mask = ~0;
- else
- *mask = (1 << *bits_used) - 1;
- if (signchar == 's')
- *is_signed = 1;
- else
- *is_signed = 0;
- fclose(sysfsfp);
- free(filename);
-
- filename = 0;
- }
-error_free_filename:
- if (filename)
- free(filename);
-error_closedir:
- closedir(dp);
-error_free_builtname_generic:
- free(builtname_generic);
-error_free_builtname:
- free(builtname);
-error_free_scan_el_dir:
- free(scan_el_dir);
-error_ret:
- return ret;
-}
-
-inline int iioutils_get_param_float(float *output,
- const char *param_name,
- const char *device_dir,
- const char *name,
- const char *generic_name)
-{
- FILE *sysfsfp;
- int ret;
- DIR *dp;
- char *builtname, *builtname_generic;
- char *filename = NULL;
- const struct dirent *ent;
-
- ret = asprintf(&builtname, "%s_%s", name, param_name);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_ret;
- }
- ret = asprintf(&builtname_generic,
- "%s_%s", generic_name, param_name);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_free_builtname;
- }
- dp = opendir(device_dir);
- if (dp == NULL) {
- ret = -errno;
- goto error_free_builtname_generic;
- }
- while (ent = readdir(dp), ent != NULL)
- if ((strcmp(builtname, ent->d_name) == 0) ||
- (strcmp(builtname_generic, ent->d_name) == 0)) {
- ret = asprintf(&filename,
- "%s/%s", device_dir, ent->d_name);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_closedir;
- }
- sysfsfp = fopen(filename, "r");
- if (!sysfsfp) {
- ret = -errno;
- goto error_free_filename;
- }
- fscanf(sysfsfp, "%f", output);
- break;
- }
-error_free_filename:
- if (filename)
- free(filename);
-error_closedir:
- closedir(dp);
-error_free_builtname_generic:
- free(builtname_generic);
-error_free_builtname:
- free(builtname);
-error_ret:
- return ret;
-}
-
-/**
- * bsort_channel_array_by_index() - reorder so that the array is in index order
- *
- **/
-
-inline void bsort_channel_array_by_index(struct iio_channel_info **ci_array,
- int cnt)
-{
-
- struct iio_channel_info temp;
- int x, y;
-
- for (x = 0; x < cnt; x++)
- for (y = 0; y < (cnt - 1); y++)
- if ((*ci_array)[y].index > (*ci_array)[y+1].index) {
- temp = (*ci_array)[y + 1];
- (*ci_array)[y + 1] = (*ci_array)[y];
- (*ci_array)[y] = temp;
- }
-}
-
-/**
- * build_channel_array() - function to figure out what channels are present
- * @device_dir: the IIO device directory in sysfs
- * @
- **/
-inline int build_channel_array(const char *device_dir,
- struct iio_channel_info **ci_array,
- int *counter)
-{
- DIR *dp;
- FILE *sysfsfp;
- int count, i;
- struct iio_channel_info *current;
- int ret;
- const struct dirent *ent;
- char *scan_el_dir;
- char *filename;
-
- *counter = 0;
- ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_ret;
- }
- dp = opendir(scan_el_dir);
- if (dp == NULL) {
- ret = -errno;
- goto error_free_name;
- }
- while (ent = readdir(dp), ent != NULL)
- if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"),
- "_en") == 0) {
- ret = asprintf(&filename,
- "%s/%s", scan_el_dir, ent->d_name);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_close_dir;
- }
- sysfsfp = fopen(filename, "r");
- if (sysfsfp == NULL) {
- ret = -errno;
- free(filename);
- goto error_close_dir;
- }
- fscanf(sysfsfp, "%u", &ret);
- printf("%s, %d\n", filename, ret);
- if (ret == 1)
- (*counter)++;
- fclose(sysfsfp);
- free(filename);
- }
- *ci_array = malloc(sizeof(**ci_array) * (*counter));
- if (*ci_array == NULL) {
- ret = -ENOMEM;
- goto error_close_dir;
- }
- closedir(dp);
- dp = opendir(scan_el_dir);
- //seekdir(dp, 0);
- count = 0;
- while (ent = readdir(dp), ent != NULL) {
- if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"),
- "_en") == 0) {
- current = &(*ci_array)[count++];
- ret = asprintf(&filename,
- "%s/%s", scan_el_dir, ent->d_name);
- if (ret < 0) {
- ret = -ENOMEM;
- /* decrement count to avoid freeing name */
- count--;
- goto error_cleanup_array;
- }
- sysfsfp = fopen(filename, "r");
- if (sysfsfp == NULL) {
- free(filename);
- ret = -errno;
- goto error_cleanup_array;
- }
- fscanf(sysfsfp, "%u", &current->enabled);
- fclose(sysfsfp);
-
- if (!current->enabled) {
- free(filename);
- count--;
- continue;
- }
-
- current->scale = 1.0;
- current->offset = 0;
- current->name = strndup(ent->d_name,
- strlen(ent->d_name) -
- strlen("_en"));
- if (current->name == NULL) {
- free(filename);
- ret = -ENOMEM;
- goto error_cleanup_array;
- }
- /* Get the generic and specific name elements */
- ret = iioutils_break_up_name(current->name,
- &current->generic_name);
- if (ret) {
- free(filename);
- goto error_cleanup_array;
- }
- ret = asprintf(&filename,
- "%s/%s_index",
- scan_el_dir,
- current->name);
- if (ret < 0) {
- free(filename);
- ret = -ENOMEM;
- goto error_cleanup_array;
- }
- sysfsfp = fopen(filename, "r");
- fscanf(sysfsfp, "%u", &current->index);
- fclose(sysfsfp);
- free(filename);
- /* Find the scale */
- ret = iioutils_get_param_float(&current->scale,
- "scale",
- device_dir,
- current->name,
- current->generic_name);
- if (ret < 0)
- goto error_cleanup_array;
- ret = iioutils_get_param_float(&current->offset,
- "offset",
- device_dir,
- current->name,
- current->generic_name);
- if (ret < 0)
- goto error_cleanup_array;
- ret = iioutils_get_type(&current->is_signed,
- &current->bytes,
- &current->bits_used,
- &current->shift,
- &current->mask,
- &current->be,
- device_dir,
- current->name,
- current->generic_name);
- }
- }
-
- closedir(dp);
- /* reorder so that the array is in index order */
- bsort_channel_array_by_index(ci_array, *counter);
-
- return 0;
-
-error_cleanup_array:
- for (i = count - 1; i >= 0; i--)
- free((*ci_array)[i].name);
- free(*ci_array);
-error_close_dir:
- closedir(dp);
-error_free_name:
- free(scan_el_dir);
-error_ret:
- return ret;
-}
-
-inline int _write_sysfs_int(char *filename, char *basedir, int val, int verify)
-{
- int ret;
- FILE *sysfsfp;
- int test;
- char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
- if (temp == NULL)
- return -ENOMEM;
- sprintf(temp, "%s/%s", basedir, filename);
- sysfsfp = fopen(temp, "w");
- if (sysfsfp == NULL) {
- printf("failed to open %s\n", temp);
- ret = -errno;
- goto error_free;
- }
- fprintf(sysfsfp, "%d", val);
- fclose(sysfsfp);
- if (verify) {
- sysfsfp = fopen(temp, "r");
- if (sysfsfp == NULL) {
- printf("failed to open %s\n", temp);
- ret = -errno;
- goto error_free;
- }
- fscanf(sysfsfp, "%d", &test);
- if (test != val) {
- printf("Possible failure in int write %d to %s%s\n",
- val,
- basedir,
- filename);
- ret = -1;
- }
- }
-error_free:
- free(temp);
- return ret;
-}
-
-int write_sysfs_int(char *filename, char *basedir, int val)
-{
- return _write_sysfs_int(filename, basedir, val, 0);
-}
-
-int write_sysfs_int_and_verify(char *filename, char *basedir, int val)
-{
- return _write_sysfs_int(filename, basedir, val, 1);
-}
-
-int _write_sysfs_string(char *filename, char *basedir, char *val, int verify)
-{
- int ret = 0;
- FILE *sysfsfp;
- char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
- if (temp == NULL) {
- printf("Memory allocation failed\n");
- return -ENOMEM;
- }
- sprintf(temp, "%s/%s", basedir, filename);
- sysfsfp = fopen(temp, "w");
- if (sysfsfp == NULL) {
- printf("Could not open %s\n", temp);
- ret = -errno;
- goto error_free;
- }
- fprintf(sysfsfp, "%s", val);
- fclose(sysfsfp);
- if (verify) {
- sysfsfp = fopen(temp, "r");
- if (sysfsfp == NULL) {
- printf("could not open file to verify\n");
- ret = -errno;
- goto error_free;
- }
- fscanf(sysfsfp, "%s", temp);
- if (strcmp(temp, val) != 0) {
- printf("Possible failure in string write of %s "
- "Should be %s "
- "written to %s\%s\n",
- temp,
- val,
- basedir,
- filename);
- ret = -1;
- }
- }
-error_free:
- free(temp);
-
- return ret;
-}
-
-/**
- * write_sysfs_string_and_verify() - string write, readback and verify
- * @filename: name of file to write to
- * @basedir: the sysfs directory in which the file is to be found
- * @val: the string to write
- **/
-int write_sysfs_string_and_verify(char *filename, char *basedir, char *val)
-{
- return _write_sysfs_string(filename, basedir, val, 1);
-}
-
-int write_sysfs_string(char *filename, char *basedir, char *val)
-{
- return _write_sysfs_string(filename, basedir, val, 0);
-}
-
-int read_sysfs_posint(char *filename, char *basedir)
-{
- int ret;
- FILE *sysfsfp;
- char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
- if (temp == NULL) {
- printf("Memory allocation failed");
- return -ENOMEM;
- }
- sprintf(temp, "%s/%s", basedir, filename);
- sysfsfp = fopen(temp, "r");
- if (sysfsfp == NULL) {
- ret = -errno;
- goto error_free;
- }
- fscanf(sysfsfp, "%d\n", &ret);
- fclose(sysfsfp);
-error_free:
- free(temp);
- return ret;
-}
-
-int read_sysfs_float(char *filename, char *basedir, float *val)
-{
- float ret = 0;
- FILE *sysfsfp;
- char *temp = malloc(strlen(basedir) + strlen(filename) + 2);
- if (temp == NULL) {
- printf("Memory allocation failed");
- return -ENOMEM;
- }
- sprintf(temp, "%s/%s", basedir, filename);
- sysfsfp = fopen(temp, "r");
- if (sysfsfp == NULL) {
- ret = -errno;
- goto error_free;
- }
- fscanf(sysfsfp, "%f\n", val);
- fclose(sysfsfp);
-error_free:
- free(temp);
- return ret;
-}
-int enable(const char *device_dir,
- struct iio_channel_info **ci_array,
- int *counter)
-{
- DIR *dp;
- int ret;
- const struct dirent *ent;
- char *scan_el_dir;
-
- *counter = 0;
- ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_ret;
- }
- dp = opendir(scan_el_dir);
- if (dp == NULL) {
- ret = -errno;
- goto error_free_name;
- }
- while (ent = readdir(dp), ent != NULL)
- if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_en"),
- "_en") == 0) {
- write_sysfs_int_and_verify((char *)ent->d_name, scan_el_dir, 1);
- }
- return 0;
-error_ret:
-error_free_name:
- return -1;
-}
-int disable_q_out(const char *device_dir,
- struct iio_channel_info **ci_array,
- int *counter) {
- DIR *dp;
- int ret;
- const struct dirent *ent;
- char *scan_el_dir;
-
- *counter = 0;
- ret = asprintf(&scan_el_dir, FORMAT_SCAN_ELEMENTS_DIR, device_dir);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_ret;
- }
- dp = opendir(scan_el_dir);
- if (dp == NULL) {
- ret = -errno;
- goto error_free_name;
- }
- while (ent = readdir(dp), ent != NULL)
- if (strncmp(ent->d_name, "in_quaternion", strlen("in_quaternion")) == 0) {
- write_sysfs_int_and_verify((char *)ent->d_name, scan_el_dir, 0);
- }
- return 0;
-error_ret:
-error_free_name:
- return -1;
-
-}
-
diff --git a/libsensors_iio/software/simple_apps/mpu_iio/mpu_iio.c b/libsensors_iio/software/simple_apps/mpu_iio/mpu_iio.c
deleted file mode 100644
index b3d323c..0000000
--- a/libsensors_iio/software/simple_apps/mpu_iio/mpu_iio.c
+++ /dev/null
@@ -1,685 +0,0 @@
-/* Industrialio buffer test code.
- *
- * Copyright (c) 2008 Jonathan Cameron
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- *
- * This program is primarily intended as an example application.
- * Reads the current buffer setup from sysfs and starts a short capture
- * from the specified device, pretty printing the result after appropriate
- * conversion.
- *
- * Command line parameters
- * generic_buffer -n <device_name> -t <trigger_name>
- * If trigger name is not specified the program assumes you want a dataready
- * trigger associated with the device and goes looking for it.
- *
- */
-
-#include <unistd.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <linux/types.h>
-#include <string.h>
-#include <poll.h>
-#include "iio_utils.h"
-#include "ml_load_dmp.h"
-#include "ml_sysfs_helper.h"
-#include "authenticate.h"
-
-#define FLICK_SUPPORTED (0)
-
-/**
- * size_from_channelarray() - calculate the storage size of a scan
- * @channels: the channel info array
- * @num_channels: size of the channel info array
- *
- * Has the side effect of filling the channels[i].location values used
- * in processing the buffer output.
- **/
-int size_from_channelarray(struct iio_channel_info *channels, int num_channels)
-{
- int bytes = 0;
- int i = 0;
- while (i < num_channels) {
- if (bytes % channels[i].bytes == 0)
- channels[i].location = bytes;
- else
- channels[i].location = bytes - bytes%channels[i].bytes
- + channels[i].bytes;
- bytes = channels[i].location + channels[i].bytes;
- i++;
- }
- return bytes;
-}
-
-void print2byte(int input, struct iio_channel_info *info)
-{
- /* shift before conversion to avoid sign extension
- of left aligned data */
- input = input >> info->shift;
- if (info->is_signed) {
- int16_t val = input;
- val &= (1 << info->bits_used) - 1;
- val = (int16_t)(val << (16 - info->bits_used)) >>
- (16 - info->bits_used);
- /*printf("%d, %05f, scale=%05f", val,
- (float)(val + info->offset)*info->scale, info->scale);*/
- printf("%d, ", val);
-
- } else {
- uint16_t val = input;
- val &= (1 << info->bits_used) - 1;
- printf("%05f ", ((float)val + info->offset)*info->scale);
- }
-}
-/**
- * process_scan() - print out the values in SI units
- * @data: pointer to the start of the scan
- * @infoarray: information about the channels. Note
- * size_from_channelarray must have been called first to fill the
- * location offsets.
- * @num_channels: the number of active channels
- **/
-void process_scan(char *data,
- struct iio_channel_info *infoarray,
- int num_channels)
-{
- int k;
- //char *tmp;
- for (k = 0; k < num_channels; k++) {
- switch (infoarray[k].bytes) {
- /* only a few cases implemented so far */
- case 2:
- print2byte(*(uint16_t *)(data + infoarray[k].location),
- &infoarray[k]);
- //tmp = data + infoarray[k].location;
- break;
- case 4:
- if (infoarray[k].is_signed) {
- int32_t val = *(int32_t *)
- (data +
- infoarray[k].location);
- if ((val >> infoarray[k].bits_used) & 1)
- val = (val & infoarray[k].mask) |
- ~infoarray[k].mask;
- /* special case for timestamp */
- printf(" %d ", val);
- }
- break;
- case 8:
- if (infoarray[k].is_signed) {
- int64_t val = *(int64_t *)
- (data +
- infoarray[k].location);
- if ((val >> infoarray[k].bits_used) & 1)
- val = (val & infoarray[k].mask) |
- ~infoarray[k].mask;
- /* special case for timestamp */
- if (infoarray[k].scale == 1.0f &&
- infoarray[k].offset == 0.0f)
- printf(" %lld", val);
- else
- printf("%05f ", ((float)val +
- infoarray[k].offset)*
- infoarray[k].scale);
- }
- break;
- default:
- break;
- }
- }
- printf("\n");
-}
-
-#if FLICK_SUPPORTED /* hide flick, not offially supported */
-void enable_flick(char *p, int on){
- int ret;
- printf("flick:%s\n", p);
- ret = write_sysfs_int_and_verify("flick_int_on", p, on);
- if (ret < 0)
- return;
- ret = write_sysfs_int_and_verify("flick_upper", p, 3147790);
- if (ret < 0)
- return;
- ret = write_sysfs_int_and_verify("flick_lower", p, -3147790);
- if (ret < 0)
- return;
-
- ret = write_sysfs_int_and_verify("flick_counter", p, 50);
- if (ret < 0)
- return;
- ret = write_sysfs_int_and_verify("flick_message_on", p, 0);
- if (ret < 0)
- return;
- ret = write_sysfs_int_and_verify("flick_axis", p, 0);
-}
-#endif
-
-void HandleOrient(int orient)
-{
- if (orient & 0x01)
- printf("INV_X_UP\n");
- if (orient & 0x02)
- printf("INV_X_DOWN\n");
- if (orient & 0x04)
- printf("INV_Y_UP\n");
- if (orient & 0x08)
- printf("INV_Y_DOWN\n");
- if (orient & 0x10)
- printf("INV_Z_UP\n");
- if (orient & 0x20)
- printf("INV_Z_DOWN\n");
- if (orient & 0x40)
- printf("INV_ORIENTATION_FLIP\n");
-}
-
-void HandleTap(int tap)
-{
- int tap_dir = tap/8;
- int tap_num = tap%8 + 1;
-
- switch (tap_dir) {
- case 1:
- printf("INV_TAP_AXIS_X_POS\n");
- break;
- case 2:
- printf("INV_TAP_AXIS_X_NEG\n");
- break;
- case 3:
- printf("INV_TAP_AXIS_Y_POS\n");
- break;
- case 4:
- printf("INV_TAP_AXIS_Y_NEG\n");
- break;
- case 5:
- printf("INV_TAP_AXIS_Z_POS\n");
- break;
- case 6:
- printf("INV_TAP_AXIS_Z_NEG\n");
- break;
- default:
- break;
- }
- printf("Tap number: %d\n", tap_num);
-}
-#define DMP_CODE_SIZE 3060
-void verify_img(char *dmp_path){
- FILE *fp;
- int i;
- char dmp_img[DMP_CODE_SIZE];
- if ((fp = fopen(dmp_path, "rb")) < 0 ) {
- perror("dmp fail");
- }
- i = fread(dmp_img, 1, DMP_CODE_SIZE, fp);
- printf("Result=%d\n", i);
- fclose(fp);
- fp = fopen("/dev/read_img.h", "wt");
- fprintf(fp, "char rec[]={\n");
- for(i=0; i<DMP_CODE_SIZE; i++) {
- fprintf(fp, "0x%02x, ", dmp_img[i]);
- if(((i+1)%16) == 0) {
- fprintf(fp, "\n");
- }
- }
- fprintf(fp, "};\n ");
- fclose(fp);
-}
-
-void setup_dmp(char *dev_path, int p_event){
- char sysfs_path[200];
- char dmp_path[200];
- int ret;
- FILE *fd;
- sprintf(sysfs_path, "%s", dev_path);
- printf("sysfs: %s\n", sysfs_path);
- ret = write_sysfs_int_and_verify("power_state", sysfs_path, 1);
- if (ret < 0)
- return;
-
- ret = write_sysfs_int("in_accel_scale", dev_path, 0);
- if (ret < 0)
- return;
- ret = write_sysfs_int("in_anglvel_scale", dev_path, 2);
- if (ret < 0)
- return;
- ret = write_sysfs_int("sampling_frequency", sysfs_path, 200);
- if (ret < 0)
- return;
- ret = write_sysfs_int_and_verify("firmware_loaded", sysfs_path, 0);
- if (ret < 0)
- return;
- sprintf(dmp_path, "%s/dmp_firmware", dev_path);
- if ((fd = fopen(dmp_path, "wb")) < 0 ) {
- perror("dmp fail");
- }
- inv_load_dmp(fd);
- fclose(fd);
- printf("firmware_loaded=%d\n", read_sysfs_posint("firmware_loaded", sysfs_path));
- ret = write_sysfs_int_and_verify("in_accel_x_offset", sysfs_path, 0xabcd0000);
- ret = write_sysfs_int_and_verify("in_accel_y_offset", sysfs_path, 0xffff0000);
- ret = write_sysfs_int_and_verify("in_accel_z_offset", sysfs_path, 0xcdef0000);
-
- ret = write_sysfs_int_and_verify("dmp_on", sysfs_path, 1);
- if (ret < 0)
- return;
- ret = write_sysfs_int_and_verify("dmp_int_on", sysfs_path, 1);
- if (ret < 0)
- return;
- /* selelct which event to enable and interrupt on/off here */
- //enable_flick(sysfs_path, 1);
- ret = write_sysfs_int_and_verify("tap_on", sysfs_path, 1);
- if (ret < 0)
- return;
- ret = write_sysfs_int_and_verify("display_orientation_on", sysfs_path, 1);
- if (ret < 0)
- return;
- ret = write_sysfs_int_and_verify("orientation_on", sysfs_path, 1);
- if (ret < 0)
- return;
- printf("rate\n");
- ret = write_sysfs_int_and_verify("dmp_output_rate", sysfs_path, 25);
- if (ret < 0)
- return;
- ret = write_sysfs_int_and_verify("dmp_event_int_on", sysfs_path, p_event);
- if (ret < 0)
- return;
- //verify_img(dmp_path);
-}
-
-void get_dmp_event(char *dev_dir_name)
-{
- char file_name[100];
- int i;
-#if FLICK_SUPPORTED /* hide flick, not offially supported */
- int fp_tap, fp_orient, fp_disp, fp_flick;
- const int n_gest = 6;
-#else
- int fp_tap, fp_orient, fp_disp, fp_motion;
- //int fp_no_motion;
- const int n_gest = 4;
-#endif
- int data;
- char d[6];
- FILE *fp;
- struct pollfd pfd[4];
- printf("%s\n", dev_dir_name);
- while(1) {
- sprintf(file_name, "%s/event_tap", dev_dir_name);
- fp_tap = open(file_name, O_RDONLY | O_NONBLOCK);
- sprintf(file_name, "%s/event_orientation", dev_dir_name);
- fp_orient = open(file_name, O_RDONLY | O_NONBLOCK);
- sprintf(file_name, "%s/event_display_orientation", dev_dir_name);
- fp_disp = open(file_name, O_RDONLY | O_NONBLOCK);
-
- //sprintf(file_name, "%s/event_accel_motion", dev_dir_name);
- sprintf(file_name, "%s/event_accel_wom", dev_dir_name);
- fp_motion = open(file_name, O_RDONLY | O_NONBLOCK);
- //sprintf(file_name, "%s/event_accel_no_motion", dev_dir_name);
- //fp_no_motion = open(file_name, O_RDONLY | O_NONBLOCK);
-#if FLICK_SUPPORTED /* hide flick, not offially supported */
- sprintf(file_name, "%s/event_flick", dev_dir_name);
- fp_flick = open(file_name, O_RDONLY | O_NONBLOCK);
-#endif
-
- pfd[0].fd = fp_tap;
- pfd[0].events = POLLPRI|POLLERR,
- pfd[0].revents = 0;
-
- pfd[1].fd = fp_orient;
- pfd[1].events = POLLPRI|POLLERR,
- pfd[1].revents = 0;
-
- pfd[2].fd = fp_disp;
- pfd[2].events = POLLPRI|POLLERR,
- pfd[2].revents = 0;
-
- pfd[3].fd = fp_motion;
- pfd[3].events = POLLPRI|POLLERR,
- pfd[3].revents = 0;
-
- //pfd[4].fd = fp_no_motion;
- //pfd[4].events = POLLPRI|POLLERR,
- //pfd[4].revents = 0;
-
-#if FLICK_SUPPORTED /* hide flick, not offially supported */
- pfd[5].fd = fp_flick;
- pfd[5].events = POLLPRI|POLLERR,
- pfd[5].revents = 0;
-#endif
-
- read(fp_tap, d, 4);
- read(fp_orient, d, 4);
- read(fp_disp, d, 4);
- read(fp_motion, d, 4);
- //read(fp_no_motion, d, 4);
-#if FLICK_SUPPORTED /* hide flick, not offially supported */
- read(fp_flick, d, 4);
-#endif
-
- poll(pfd, n_gest, -1);
- close(fp_tap);
- close(fp_orient);
- close(fp_disp);
- close(fp_motion);
- //close(fp_no_motion);
-#if FLICK_SUPPORTED /* hide flick, not offially supported */
- close(fp_flick);
-#endif
- for (i = 0; i < ARRAY_SIZE(pfd); i++) {
- if(pfd[i].revents != 0) {
- switch (i){
- case 0:
- sprintf(file_name, "%s/event_tap", dev_dir_name);
- fp = fopen(file_name, "rt");
- fscanf(fp, "%d\n", &data);
- printf("tap=%x\n", data);
- HandleTap(data);
- fclose(fp);
- break;
- case 1:
- sprintf(file_name, "%s/event_orientation", dev_dir_name);
- fp = fopen(file_name, "rt");
- fscanf(fp, "%d\n", &data);
- printf("orient=%x\n", data);
- HandleOrient(data);
- fclose(fp);
- break;
- case 2:
- sprintf(file_name, "%s/event_display_orientation", dev_dir_name);
- fp = fopen(file_name, "rt");
- fscanf(fp, "%d\n", &data);
- printf("display_orient=%x\n", data);
- fclose(fp);
- break;
- case 3:
- sprintf(file_name, "%s/event_accel_wom", dev_dir_name);
- fp = fopen(file_name, "rt");
- fscanf(fp, "%d\n", &data);
- printf("motion=%x\n", data);
- fclose(fp);
- break;
- case 4:
- sprintf(file_name, "%s/event_accel_no_motion", dev_dir_name);
- fp = fopen(file_name, "rt");
- fscanf(fp, "%d\n", &data);
- printf("No motion=%x\n", data);
- fclose(fp);
- break;
-
-#if FLICK_SUPPORTED /* hide flick, not offially supported */
- case 5:
- sprintf(file_name, "%s/event_flick", dev_dir_name);
- fp = fopen(file_name, "rt");
- fscanf(fp, "%d\n", &data);
- printf("flick=%x\n", data);
- fclose(fp);
- break;
-#endif
- }
- }
- }
- }
-}
-
-
-int main(int argc, char **argv)
-{
- unsigned long num_loops = 2;
- unsigned long timedelay = 100000;
- unsigned long buf_len = 128;
-
- int ret, c, i, j, toread;
- int fp;
-
- int num_channels;
- char *trigger_name = NULL;
- char *dev_dir_name, *buf_dir_name;
-
- int datardytrigger = 1;
- char *data;
- int read_size;
- int dev_num, trig_num;
- char *buffer_access;
- int scan_size;
- int noevents = 0;
- int p_event = 0, nodmp = 0;
- char *dummy;
- char chip_name[10];
- char device_name[10];
- char sysfs[100];
-
- struct iio_channel_info *infoarray;
- /* -r means no DMP is enabled (raw) -> should be used for mpu3050.
- -p means no print of data */
- /* when using -p, 1 means orientation, 2 means tap, 3 means flick */
- while ((c = getopt(argc, argv, "l:w:c:pret:")) != -1) {
- switch (c) {
- case 't':
- trigger_name = optarg;
- datardytrigger = 0;
- break;
- case 'e':
- noevents = 1;
- break;
- case 'p':
- p_event = 1;
- break;
- case 'r':
- nodmp = 1;
- break;
- case 'c':
- num_loops = strtoul(optarg, &dummy, 10);
- break;
- case 'w':
- timedelay = strtoul(optarg, &dummy, 10);
- break;
- case 'l':
- buf_len = strtoul(optarg, &dummy, 10);
- break;
- case '?':
- return -1;
- }
- }
- inv_get_sysfs_path(sysfs);
- printf("sss:::%s\n", sysfs);
- if (inv_get_chip_name(chip_name) != INV_SUCCESS) {
- printf("get chip name fail\n");
- exit(0);
- }
- printf("chip_name=%s\n", chip_name);
- if (INV_SUCCESS != inv_check_key())
- printf("key check fail\n");
- else
- printf("key authenticated\n");
-
- for (i=0; i<strlen(chip_name); i++) {
- device_name[i] = tolower(chip_name[i]);
- }
- device_name[strlen(chip_name)] = '\0';
- printf("device name: %s\n", device_name);
-
- /* Find the device requested */
- dev_num = find_type_by_name(device_name, "iio:device");
- if (dev_num < 0) {
- printf("Failed to find the %s\n", device_name);
- ret = -ENODEV;
- goto error_ret;
- }
- printf("iio device number being used is %d\n", dev_num);
- asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num);
- if (trigger_name == NULL) {
- /*
- * Build the trigger name. If it is device associated it's
- * name is <device_name>_dev[n] where n matches the device
- * number found above
- */
- ret = asprintf(&trigger_name,
- "%s-dev%d", device_name, dev_num);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_ret;
- }
- }
- ret = write_sysfs_int("buffer/enable", dev_dir_name, 0);
-
- ret = write_sysfs_int_and_verify("power_state", dev_dir_name, 1);
- ret = write_sysfs_int_and_verify("gyro_enable", dev_dir_name, 1);
- ret = write_sysfs_int_and_verify("accl_enable", dev_dir_name, 1);
- ret = write_sysfs_int_and_verify("compass_enable", dev_dir_name, 1);
-/*
- ret = write_sysfs_int_and_verify("zero_motion_on", dev_dir_name, 1);
- ret = write_sysfs_int_and_verify("zero_motion_dur", dev_dir_name, 12);
- ret = write_sysfs_int_and_verify("zero_motion_threshold", dev_dir_name, 13);
-
- ret = write_sysfs_int_and_verify("motion_on", dev_dir_name, 1);
- ret = write_sysfs_int_and_verify("motion_dur", dev_dir_name, 1);
- ret = write_sysfs_int_and_verify("motion_threshold", dev_dir_name, 1);
-*/
- ret = write_sysfs_int_and_verify("accel_wom_on", dev_dir_name, 1);
- ret = write_sysfs_int_and_verify("accel_wom_threshold", dev_dir_name, 100);
- /* Verify the trigger exists */
- trig_num = find_type_by_name(trigger_name, "trigger");
- if (trig_num < 0) {
- printf("Failed to find the trigger %s\n", trigger_name);
- ret = -ENODEV;
- goto error_free_triggername;
- }
- printf("iio trigger number being used is %d\n", trig_num);
- /*
- * Parse the files in scan_elements to identify what channels are
- * present
- */
- ret = 0;
- ret = enable(dev_dir_name, &infoarray, &num_channels);
- if (ret) {
- printf("error enable\n");
- goto error_free_triggername;
- }
- if (!nodmp)
- setup_dmp(dev_dir_name, p_event);
-
- /*
- * Construct the directory name for the associated buffer.
- * As we know that the lis3l02dq has only one buffer this may
- * be built rather than found.
- */
- ret = asprintf(&buf_dir_name, "%siio:device%d/buffer", iio_dir, dev_num);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_free_triggername;
- }
- printf("%s %s\n", dev_dir_name, trigger_name);
-
- /* Set the device trigger to be the data rdy trigger found above */
- ret = write_sysfs_string_and_verify("trigger/current_trigger",
- dev_dir_name,
- trigger_name);
- if (ret < 0) {
- printf("Failed to write current_trigger file\n");
- goto error_free_buf_dir_name;
- }
- /* Setup ring buffer parameters */
- /* length must be even number because iio_store_to_sw_ring is expecting
- half pointer to be equal to the read pointer, which is impossible
- when buflen is odd number. This is actually a bug in the code */
- ret = write_sysfs_int("length", buf_dir_name, buf_len*2);
- if (ret < 0)
- goto exit_here;
- ret = write_sysfs_int_and_verify("gyro_enable", dev_dir_name, 1);
- ret = write_sysfs_int_and_verify("accl_enable", dev_dir_name, 1);
- //ret = write_sysfs_int_and_verify("compass_enable", dev_dir_name, 0);
- if (nodmp == 0) {
- ret = write_sysfs_int_and_verify("quaternion_on", dev_dir_name, 1);
- } else {
- ret = disable_q_out(dev_dir_name, &infoarray, &num_channels);
- ret = write_sysfs_int_and_verify("dmp_on", dev_dir_name, 0);
- }
- ret = build_channel_array(dev_dir_name, &infoarray, &num_channels);
- if (ret) {
- printf("Problem reading scan element information\n");
- goto exit_here;
- }
-
- /* Enable the buffer */
- ret = write_sysfs_int("enable", buf_dir_name, 1);
- if (ret < 0)
- goto exit_here;
- scan_size = size_from_channelarray(infoarray, num_channels);
- data = malloc(scan_size*buf_len);
- if (!data) {
- ret = -ENOMEM;
- goto exit_here;
- }
-
- ret = asprintf(&buffer_access,
- "/dev/iio:device%d",
- dev_num);
- if (ret < 0) {
- ret = -ENOMEM;
- goto error_free_data;
- }
- if (p_event) {
- get_dmp_event(dev_dir_name);
- goto error_free_buffer_access;
- }
- /* Attempt to open non blocking the access dev */
- fp = open(buffer_access, O_RDONLY | O_NONBLOCK);
- if (fp == -1) { /*If it isn't there make the node */
- printf("Failed to open %s\n", buffer_access);
- ret = -errno;
- goto error_free_buffer_access;
- }
- /* Wait for events 10 times */
- for (j = 0; j < num_loops; j++) {
- if (!noevents) {
- struct pollfd pfd = {
- .fd = fp,
- .events = POLLIN,
- };
- poll(&pfd, 1, -1);
- toread = 1;
- if ((j%128)==0)
- usleep(timedelay);
-
- } else {
- usleep(timedelay);
- toread = 1;
- }
- read_size = read(fp,
- data,
- toread*scan_size);
- if (read_size == -EAGAIN) {
- printf("nothing available\n");
- continue;
- }
- if (0 == p_event) {
- for (i = 0; i < read_size/scan_size; i++)
- process_scan(data + scan_size*i,
- infoarray,
- num_channels);
- }
- }
- close(fp);
-error_free_buffer_access:
- free(buffer_access);
-error_free_data:
- free(data);
-exit_here:
- /* Stop the ring buffer */
- ret = write_sysfs_int("enable", buf_dir_name, 0);
-
-error_free_buf_dir_name:
- free(buf_dir_name);
-error_free_triggername:
- if (datardytrigger)
- free(trigger_name);
-error_ret:
- return ret;
-}
diff --git a/libsensors_iio/software/simple_apps/self_test/build/android/inv_self_test-shared b/libsensors_iio/software/simple_apps/self_test/build/android/inv_self_test-shared
index 01d1425..33c9eef 100644
--- a/libsensors_iio/software/simple_apps/self_test/build/android/inv_self_test-shared
+++ b/libsensors_iio/software/simple_apps/self_test/build/android/inv_self_test-shared
Binary files differ
diff --git a/libsensors_iio/software/simple_apps/self_test/build/android/shared.mk b/libsensors_iio/software/simple_apps/self_test/build/android/shared.mk
index ed5fbf6..3a055cc 100644
--- a/libsensors_iio/software/simple_apps/self_test/build/android/shared.mk
+++ b/libsensors_iio/software/simple_apps/self_test/build/android/shared.mk
@@ -18,7 +18,6 @@ HAL_DIR = $(INV_ROOT)/software/core/HAL
include $(INV_ROOT)/software/build/android/common.mk
CFLAGS += $(CMDLINE_CFLAGS)
-CFLAGS += $(ANDROID_COMPILE)
CFLAGS += -Wall
CFLAGS += -fpic
CFLAGS += -nostdlib
@@ -50,8 +49,20 @@ LLINK += -lstdc++
LLINK += -llog
LLINK += -lz
+PRE_LFLAGS := -Wl,-T,$(ANDROID_ROOT)/build/core/armelf.x
+PRE_LFLAGS += $(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib/crtend_android.o
+PRE_LFLAGS += $(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib/crtbegin_dynamic.o
+
LFLAGS += $(CMDLINE_LFLAGS)
-LFLAGS += $(ANDROID_LINK_EXECUTABLE)
+LFLAGS += -nostdlib
+LFLAGS += -fpic
+LFLAGS += -Wl,--gc-sections
+LFLAGS += -Wl,--no-whole-archive
+LFLAGS += -Wl,-dynamic-linker,/system/bin/linker
+LFLAGS += $(ANDROID_LINK)
+ifneq ($(PRODUCT),panda)
+LFLAGS += -rdynamic
+endif
LRPATH = -Wl,-rpath,$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib:$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/system/lib
@@ -76,7 +87,7 @@ all: $(EXEC) $(MK_NAME)
$(EXEC) : $(OBJFOLDER) $(INV_OBJS_DST) $(INV_LIBS) $(MK_NAME)
@$(call echo_in_colors, "\n<linking $(EXEC) with objects $(INV_OBJS_DST) $(PREBUILT_OBJS) and libraries $(INV_LIBS)\n")
- $(LINK) $(INV_OBJS_DST) -o $(EXEC) $(LFLAGS) $(LLINK) $(INV_LIBS) $(LLINK) $(LRPATH)
+ $(LINK) $(PRE_LFLAGS) $(INV_OBJS_DST) -o $(EXEC) $(LFLAGS) $(LLINK) $(INV_LIBS) $(LLINK) $(LRPATH)
$(OBJFOLDER) :
@$(call echo_in_colors, "\n<creating object's folder 'obj/'>\n")
diff --git a/libsensors_iio/software/simple_apps/self_test/inv_self_test.c b/libsensors_iio/software/simple_apps/self_test/inv_self_test.c
index 2fe2cff..4f9996c 100644
--- a/libsensors_iio/software/simple_apps/self_test/inv_self_test.c
+++ b/libsensors_iio/software/simple_apps/self_test/inv_self_test.c
@@ -22,19 +22,13 @@
#include "ml_math_func.h"
#include "storage_manager.h"
#include "ml_stored_data.h"
-#include "ml_sysfs_helper.h"
#ifndef ABS
#define ABS(x)(((x) >= 0) ? (x) : -(x))
#endif
-//#define DEBUG_PRINT /* Uncomment to print Gyro & Accel read from Driver */
-
-#define MAX_SYSFS_NAME_LEN (100)
-#define MAX_SYSFS_ATTRB (sizeof(struct sysfs_attrbs) / sizeof(char*))
-
/** Change this key if the data being stored by this file changes */
-#define INV_DB_SAVE_KEY 53395
+#define INV_DB_SAVE_KEY 53394
#define FALSE 0
#define TRUE 1
@@ -44,29 +38,26 @@
#define COMPASS_PASS_STATUS_BIT 0x04
typedef union {
- long l;
+ long l;
int i;
} bias_dtype;
-char *sysfs_names_ptr;
-
-struct sysfs_attrbs {
+struct inv_sysfs_names_s {
char *enable;
char *power_state;
- char *dmp_on;
- char *dmp_int_on;
char *self_test;
char *temperature;
- char *gyro_enable;
- char *gyro_x_bias;
- char *gyro_y_bias;
- char *gyro_z_bias;
- char *accel_enable;
- char *accel_x_bias;
- char *accel_y_bias;
- char *accel_z_bias;
- char *compass_enable;
-} mpu;
+ char *accl_bias;
+};
+
+const struct inv_sysfs_names_s mpu= {
+ /* MPU6050 & MPU9150 */
+ .enable = "/sys/class/invensense/mpu/enable",
+ .power_state = "/sys/class/invensense/mpu/power_state",
+ .self_test = "/sys/class/invensense/mpu/self_test",
+ .temperature = "/sys/class/invensense/mpu/temperature",
+ .accl_bias = "/sys/class/invensense/mpu/accl_bias"
+};
struct inv_db_save_t {
/** Compass Bias in Chip Frame in Hardware units scaled by 2^16 */
@@ -80,123 +71,46 @@ struct inv_db_save_t {
/** Temperature when accel bias was stored. */
long accel_temp;
long gyro_temp_slope[3];
- /** Sensor Accuracy */
- int gyro_accuracy;
- int accel_accuracy;
- int compass_accuracy;
};
static struct inv_db_save_t save_data;
-/** This function receives the data that was stored in non-volatile memory
- between power off */
+/** This function receives the data that was stored in non-volatile memory between power off */
static inv_error_t inv_db_load_func(const unsigned char *data)
{
memcpy(&save_data, data, sizeof(save_data));
return INV_SUCCESS;
}
-/** This function returns the data to be stored in non-volatile memory between
- power off */
+/** This function returns the data to be stored in non-volatile memory between power off */
static inv_error_t inv_db_save_func(unsigned char *data)
{
memcpy(data, &save_data, sizeof(save_data));
return INV_SUCCESS;
}
-/** read a sysfs entry that represents an integer */
-int read_sysfs_int(char *filename, int *var)
+int inv_sysfs_write(char *filename, long data)
{
- int res=0;
FILE *fp;
+ int count;
- fp = fopen(filename, "r");
- if (fp != NULL) {
- fscanf(fp, "%d\n", var);
- fclose(fp);
- } else {
- MPL_LOGE("inv_self_test: ERR open file to read");
- res= -1;
- }
- return res;
-}
-
-/** write a sysfs entry that represents an integer */
-int write_sysfs_int(char *filename, int data)
-{
- int res=0;
- FILE *fp;
-
- fp = fopen(filename, "w");
- if (fp!=NULL) {
- fprintf(fp, "%d\n", data);
- fclose(fp);
- } else {
- MPL_LOGE("inv_self_test: ERR open file to write");
- res= -1;
- }
- return res;
-}
-
-int inv_init_sysfs_attributes(void)
-{
- unsigned char i = 0;
- char sysfs_path[MAX_SYSFS_NAME_LEN];
- char *sptr;
- char **dptr;
-
- sysfs_names_ptr =
- (char*)malloc(sizeof(char[MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN]));
- sptr = sysfs_names_ptr;
- if (sptr != NULL) {
- dptr = (char**)&mpu;
- do {
- *dptr++ = sptr;
- sptr += sizeof(char[MAX_SYSFS_NAME_LEN]);
- } while (++i < MAX_SYSFS_ATTRB);
- } else {
- MPL_LOGE("inv_self_test: couldn't alloc mem for sysfs paths");
+ if (!filename)
return -1;
- }
-
- // get proper (in absolute/relative) IIO path & build MPU's sysfs paths
- inv_get_sysfs_path(sysfs_path);
-
- sprintf(mpu.enable, "%s%s", sysfs_path, "/buffer/enable");
- sprintf(mpu.power_state, "%s%s", sysfs_path, "/power_state");
- sprintf(mpu.dmp_on,"%s%s", sysfs_path, "/dmp_on");
- sprintf(mpu.self_test, "%s%s", sysfs_path, "/self_test");
- sprintf(mpu.temperature, "%s%s", sysfs_path, "/temperature");
-
- sprintf(mpu.gyro_enable, "%s%s", sysfs_path, "/gyro_enable");
- sprintf(mpu.gyro_x_bias, "%s%s", sysfs_path, "/in_anglvel_x_calibbias");
- sprintf(mpu.gyro_y_bias, "%s%s", sysfs_path, "/in_anglvel_y_calibbias");
- sprintf(mpu.gyro_z_bias, "%s%s", sysfs_path, "/in_anglvel_z_calibbias");
-
- sprintf(mpu.accel_enable, "%s%s", sysfs_path, "/accl_enable");
- sprintf(mpu.accel_x_bias, "%s%s", sysfs_path, "/in_accel_x_calibbias");
- sprintf(mpu.accel_y_bias, "%s%s", sysfs_path, "/in_accel_y_calibbias");
- sprintf(mpu.accel_z_bias, "%s%s", sysfs_path, "/in_accel_z_calibbias");
-
- sprintf(mpu.compass_enable, "%s%s", sysfs_path, "/compass_enable");
-
-#if 0
- // test print sysfs paths
- dptr = (char**)&mpu;
- for (i = 0; i < MAX_SYSFS_ATTRB; i++) {
- MPL_LOGE("inv_self_test: sysfs path: %s", *dptr++);
- }
-#endif
- return 0;
+ fp = fopen(filename, "w");
+ if (!fp)
+ return -errno;
+ count = fprintf(fp, "%ld", data);
+ fclose(fp);
+ return count;
}
-/*******************************************************************************
- * M a i n S e l f T e s t
- ******************************************************************************/
+/**
+ * Main Self test
+ */
int main(int argc, char **argv)
{
FILE *fptr;
- int self_test_status = 0;
+ int self_test_status;
inv_error_t result;
bias_dtype gyro_bias[3];
bias_dtype accel_bias[3];
@@ -205,133 +119,76 @@ int main(int argc, char **argv)
int axis_sign = 1;
unsigned char *buffer;
long timestamp;
- int temperature = 0;
- bool compass_present = TRUE;
-
- result = inv_init_sysfs_attributes();
- if (result)
- return -1;
+ int temperature=0;
+ // Initialize storage manager
inv_init_storage_manager();
// Clear out data.
memset(&save_data, 0, sizeof(save_data));
- memset(gyro_bias, 0, sizeof(gyro_bias));
- memset(accel_bias, 0, sizeof(accel_bias));
+ memset(gyro_bias,0, sizeof(gyro_bias));
+ memset(accel_bias,0, sizeof(accel_bias));
// Register packet to be saved.
- result = inv_register_load_store(
- inv_db_load_func, inv_db_save_func,
- sizeof(save_data), INV_DB_SAVE_KEY);
+ result = inv_register_load_store(inv_db_load_func, inv_db_save_func,
+ sizeof(save_data),
+ INV_DB_SAVE_KEY);
// Power ON MPUxxxx chip
- if (write_sysfs_int(mpu.power_state, 1) < 0) {
- printf("Self-Test:ERR-Failed to set power state=1\n");
+ if (inv_sysfs_write(mpu.power_state, 1) <0) {
+ printf("ERR- Failed to set power state=1\n");
} else {
// Note: Driver turns on power automatically when self-test invoked
}
- // Disable Master enable
- if (write_sysfs_int(mpu.enable, 0) < 0) {
- printf("Self-Test:ERR-Failed to disable master enable\n");
- }
-
- // Disable DMP
- if (write_sysfs_int(mpu.dmp_on, 0) < 0) {
- printf("Self-Test:ERR-Failed to disable DMP\n");
- }
-
- // Enable Accel
- if (write_sysfs_int(mpu.accel_enable, 1) < 0) {
- printf("Self-Test:ERR-Failed to enable accel\n");
- }
-
- // Enable Gyro
- if (write_sysfs_int(mpu.gyro_enable, 1) < 0) {
- printf("Self-Test:ERR-Failed to enable gyro\n");
- }
-
- // Enable Compass
- if (write_sysfs_int(mpu.compass_enable, 1) < 0) {
-#ifdef DEBUG_PRINT
- printf("Self-Test:ERR-Failed to enable compass\n");
-#endif
- compass_present= FALSE;
- }
-
fptr = fopen(mpu.self_test, "r");
- if (!fptr) {
- printf("Self-Test:ERR-Couldn't invoke self-test\n");
- result = -1;
- goto free_sysfs_storage;
- }
-
- // Invoke self-test
- fscanf(fptr, "%d", &self_test_status);
- if (compass_present == TRUE) {
- printf("Self-Test:Self test result- "
- "Gyro passed= %x, Accel passed= %x, Compass passed= %x\n",
- (self_test_status & GYRO_PASS_STATUS_BIT),
- (self_test_status & ACCEL_PASS_STATUS_BIT) >> 1,
- (self_test_status & COMPASS_PASS_STATUS_BIT) >> 2);
- } else {
- printf("Self-Test:Self test result- "
- "Gyro passed= %x, Accel passed= %x\n",
- (self_test_status & GYRO_PASS_STATUS_BIT),
- (self_test_status & ACCEL_PASS_STATUS_BIT) >> 1);
- }
- fclose(fptr);
-
- if (self_test_status & GYRO_PASS_STATUS_BIT) {
- // Read Gyro Bias
- if (read_sysfs_int(mpu.gyro_x_bias, &gyro_bias[0].i) < 0 ||
- read_sysfs_int(mpu.gyro_y_bias, &gyro_bias[1].i) < 0 ||
- read_sysfs_int(mpu.gyro_z_bias, &gyro_bias[2].i) < 0) {
- memset(gyro_bias, 0, sizeof(gyro_bias));
- printf("Self-Test:Failed to read Gyro bias\n");
- } else {
- save_data.gyro_accuracy = 3;
-#ifdef DEBUG_PRINT
- printf("Self-Test:Gyro bias[0..2]= [%d %d %d]\n",
- gyro_bias[0].i, gyro_bias[1].i, gyro_bias[2].i);
-#endif
+ if (fptr != NULL) {
+ // Invoke self-test and read gyro bias
+ fscanf(fptr, "%d,%d,%d,%d",
+ &gyro_bias[0].i, &gyro_bias[1].i, &gyro_bias[2].i, &self_test_status);
+
+ printf("Self-Test:Self test result- Gyro passed= %x, Accel passed= %x, Compass passed= %x\n",
+ (self_test_status & GYRO_PASS_STATUS_BIT),
+ (self_test_status & ACCEL_PASS_STATUS_BIT) >>1,
+ (self_test_status & COMPASS_PASS_STATUS_BIT) >>2);
+ printf("Self-Test:Gyro bias data[0..2] read from Driver= [%d %d %d]\n",gyro_bias[0].i, gyro_bias[1].i, gyro_bias[2].i);
+ fclose(fptr);
+
+ if (!(self_test_status & GYRO_PASS_STATUS_BIT)) {
+ // Reset gyro bias data if gyro self-test failed
+ memset(gyro_bias,0, sizeof(gyro_bias));
+ printf("Self-Test:Failed Gyro self-test\n");
}
- } else {
- printf("Self-Test:Failed Gyro self-test\n");
- }
- if (self_test_status & ACCEL_PASS_STATUS_BIT) {
- // Read Accel Bias
- if (read_sysfs_int(mpu.accel_x_bias, &accel_bias[0].i) < 0 ||
- read_sysfs_int(mpu.accel_y_bias, &accel_bias[1].i) < 0 ||
- read_sysfs_int(mpu.accel_z_bias, &accel_bias[2].i) < 0) {
- memset(accel_bias,0, sizeof(accel_bias));
- printf("Self-Test:Failed to read Accel bias\n");
+ if (self_test_status & ACCEL_PASS_STATUS_BIT) {
+ // Read Accel Bias
+ fptr= fopen(mpu.accl_bias, "r");
+ if (fptr != NULL) {
+ fscanf(fptr, "%d,%d,%d", &accel_bias[0].i, &accel_bias[1].i, &accel_bias[2].i);
+ printf("Self-Test:Accel bias data[0..2] read from Driver= [%d %d %d]\n", accel_bias[0].i, accel_bias[1].i, accel_bias[2].i);
+ fclose(fptr);
+ } else {
+ printf("Self-Test:ERR-Couldn't read accel bias\n");
+ }
} else {
- save_data.accel_accuracy = 3;
-#ifdef DEBUG_PRINT
- printf("Self-Test:Accel bias[0..2]= [%d %d %d]\n",
- accel_bias[0].i, accel_bias[1].i, accel_bias[2].i);
-#endif
- }
- } else {
- printf("Self-Test:Failed Accel self-test\n");
- }
-
- if (!(self_test_status & (GYRO_PASS_STATUS_BIT | ACCEL_PASS_STATUS_BIT))) {
- printf("Self-Test:Failed Gyro and Accel self-test, "
- "nothing left to do\n");
- result = -1;
- goto free_sysfs_storage;
- }
+ memset(accel_bias,0, sizeof(accel_bias));
+ printf("Self-Test:Failed Accel self-test\n");
+ }
- // Read temperature
- fptr= fopen(mpu.temperature, "r");
- if (fptr != NULL) {
- fscanf(fptr,"%d %ld", &temperature, &timestamp);
- fclose(fptr);
+ // Read temperature
+ if (self_test_status & (GYRO_PASS_STATUS_BIT|ACCEL_PASS_STATUS_BIT))
+ {
+ fptr= fopen(mpu.temperature, "r");
+ if (fptr != NULL) {
+ fscanf(fptr,"%d %ld", &temperature, &timestamp);
+ fclose(fptr);
+ } else {
+ printf("Self-Test:ERR-Couldn't read temperature\n");
+ }
+ }
+
} else {
- printf("Self-Test:ERR-Couldn't read temperature\n");
+ printf("Self-Test:ERR-Couldn't invoke self-test\n");
}
// When we read gyro bias, the bias is in raw units scaled by 1000.
@@ -368,16 +225,12 @@ int main(int argc, char **argv)
save_data.accel_bias[2] = (long)(accel_bias[2].l * 65536.f / 1000.f * 4.f);
#if 1
- printf("Self-Test:Saved Accel bias[0..2]= [%ld %ld %ld]\n",
- save_data.accel_bias[0], save_data.accel_bias[1],
- save_data.accel_bias[2]);
- printf("Self-Test:Saved Gyro bias[0..2]= [%ld %ld %ld]\n",
- save_data.gyro_bias[0], save_data.gyro_bias[1],
- save_data.gyro_bias[2]);
- printf("Self-Test:Gyro temperature @ time stored %ld\n",
- save_data.gyro_temp);
- printf("Self-Test:Accel temperature @ time stored %ld\n",
- save_data.accel_temp);
+ printf("Self-Test:Saved Accel bias[0..2]= [%ld %ld %ld]\n", save_data.accel_bias[0],
+ save_data.accel_bias[1], save_data.accel_bias[2]);
+ printf("Self-Test:Saved Gyro bias[0..2]= [%ld %ld %ld]\n", save_data.gyro_bias[0],
+ save_data.gyro_bias[1], save_data.gyro_bias[2]);
+ printf("Self-Test:Gyro temperature @ time stored %ld\n", save_data.gyro_temp);
+ printf("Self-Test:Accel temperature @ time stored %ld\n", save_data.accel_temp);
#endif
// Get size of packet to store.
@@ -387,30 +240,25 @@ int main(int argc, char **argv)
buffer = (unsigned char *)malloc(packet_sz + 10);
if (buffer == NULL) {
printf("Self-Test:Can't allocate buffer\n");
- result = -1;
- goto free_sysfs_storage;
+ return -1;
}
- // Store the data
result = inv_save_mpl_states(buffer, packet_sz);
if (result) {
- result = -1;
+ result= -1;
} else {
fptr= fopen(MLCAL_FILE, "wb+");
if (fptr != NULL) {
fwrite(buffer, 1, packet_sz, fptr);
fclose(fptr);
} else {
- printf("Self-Test:ERR- Can't open calibration file to write - %s\n",
+ printf("Self-Test:ERR- Can't open calibration file to write - %s\n",
MLCAL_FILE);
- result = -1;
+ result= -1;
}
}
free(buffer);
-
-free_sysfs_storage:
- free(sysfs_names_ptr);
return result;
}