diff options
Diffstat (limited to 'mlsdk/mllite/ml_mputest.c')
-rw-r--r-- | mlsdk/mllite/ml_mputest.c | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/mlsdk/mllite/ml_mputest.c b/mlsdk/mllite/ml_mputest.c new file mode 100644 index 0000000..d7fc608 --- /dev/null +++ b/mlsdk/mllite/ml_mputest.c @@ -0,0 +1,184 @@ +/* + $License: + Copyright 2011 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. + $ + */ + +/****************************************************************************** + * + * $Id: ml_mputest.c 5641 2011-06-14 02:10:02Z mcaramello $ + * + *****************************************************************************/ + +/** + * @defgroup MPU_SELF_TEST + * @brief C wrapper to integrate the MPU Self Test wrapper in MPL. + * Provides ML name compliant naming and an additional API that + * automates the suspension of normal MPL operations, runs the test, + * and resume. + * + * @{ + * @file ml_mputest.c + * @brief C wrapper to integrate the MPU Self Test wrapper in MPL. + * The main logic of the test and APIs can be found in mputest.c + */ + +#include <stdio.h> +#include <time.h> +#include <string.h> +#include <math.h> +#include <stdlib.h> + +#include "ml_mputest.h" + +#include "mlmath.h" +#include "mlinclude.h" +#include "ml.h" +#include "mlstates.h" +#include "mldl.h" +#include "mldl_cfg.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + Globals +*/ +extern struct mldl_cfg *mputestCfgPtr; +extern signed char g_z_sign; + +/* + Prototypes +*/ +extern inv_error_t inv_factory_calibrate(void *mlsl_handle, + uint_fast8_t provide_result); + +/** + * @brief An MPL wrapper for the main MPU Self Test API inv_factory_calibrate(). + * See inv_factory_calibrate() function for more details. + * + * @pre inv_dmp_open() <b>must</b> have been called to populate the mldl_cfg + * data structure. + * On Windows, SetupPlatform() is also a madatory pre condition to + * ensure the accelerometer is properly configured before running the + * test. + * + * @param mlsl_handle + * serial interface handle to allow serial communication with the + * device, both gyro and accelerometer. + * @param provide_result + * If 1: + * perform and analyze the offset, drive frequency, and noise + * calculation and compare it against set thresholds. Report + * also the final result using a bit-mask like error code as + * described in the inv_test_gyro_xxxx() functions. + * When 0: + * skip the noise and drive frequency calculation and pass/fail + * assessment. It simply calculates the gyro and accel biases. + * NOTE: for MPU6050 devices, this parameter is currently + * ignored. + * + * @return INV_SUCCESS or first non-zero error code otherwise. + */ +inv_error_t inv_self_test_factory_calibrate(void *mlsl_handle, + unsigned char provide_result) +{ + INVENSENSE_FUNC_START; + inv_error_t firstError = INV_SUCCESS; + inv_error_t result; + unsigned char initState = inv_get_state(); + + if (initState < INV_STATE_DMP_OPENED) { + MPL_LOGE("Self Test cannot run before inv_dmp_open()\n"); + return INV_ERROR_SM_IMPROPER_STATE; + } + + /* obtain a pointer to the 'struct mldl_cfg' data structure. */ + mputestCfgPtr = inv_get_dl_config(); + + if(initState == INV_STATE_DMP_STARTED) { + result = inv_dmp_stop(); + ERROR_CHECK_FIRST(firstError, result); + } + + result = inv_factory_calibrate(mlsl_handle, provide_result); + ERROR_CHECK_FIRST(firstError, result); + + if(initState == INV_STATE_DMP_STARTED) { + result = inv_dmp_start(); + ERROR_CHECK_FIRST(firstError, result); + } + + return firstError; +} + +/** + * @brief Runs the MPU test at MPL runtime. + * If the DMP is operating, stops the DMP temporarely, + * runs the MPU Self Test, and re-starts the DMP. + * + * @return INV_SUCCESS or a non-zero error code otherwise. + */ +inv_error_t inv_self_test_run(void) +{ +#ifdef CONFIG_MPU_SENSORS_MPU3050 + return inv_self_test_factory_calibrate(inv_get_serial_handle(), TRUE); +#else + return inv_self_test_factory_calibrate(inv_get_serial_handle(), FALSE); +#endif +} + +/** + * @brief Runs the MPU test for bias correction only at MPL runtime. + * If the DMP is operating, stops the DMP temporarely, + * runs the bias calculation routines, and re-starts the DMP. + * + * @return INV_SUCCESS or a non-zero error code otherwise. + */ +inv_error_t inv_self_test_bias_only(void) +{ + return inv_self_test_factory_calibrate(inv_get_serial_handle(), FALSE); +} + +/** + * @brief Set the orientation of the acceleroemter Z axis as it will be + * expected when running the MPU Self Test. + * Specifies the orientation of the accelerometer Z axis : Z axis + * pointing upwards or downwards. + * @param z_sign + * The sign of the accelerometer Z axis; valid values are +1 and + * -1 for +Z and -Z respectively. Any other value will cause the + * setting to be ignored and an error code to be returned. + * @return INV_SUCCESS or a non-zero error code. + */ +inv_error_t inv_self_test_set_accel_z_orient(signed char z_sign) +{ + if (z_sign != +1 && z_sign != -1) { + return INV_ERROR_INVALID_PARAMETER; + } + g_z_sign = z_sign; + return INV_SUCCESS; +} + + +#ifdef __cplusplus +} +#endif + +/** + * @} + */ + |