/** * @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 Closes the motion sensor engine. * Does not close the serial communication. To do that, * call MLSerialClose(). * After calling MLDmpClose() another DMP module can be * loaded in the MPL with the corresponding necessary * intialization and configurations, via any of the * MLDmpXXXOpen functions. * * @pre MLDmpOpen() must have been called. * * @code * result = MLDmpClose(); * if (ML_SUCCESS != result) { * // Handle the error case * } * @endcode * * @return ML_SUCCESS, Non-zero error code otherwise. */ tMLError MLDmpClose(void) { INVENSENSE_FUNC_START; tMLError result; tMLError firstError = ML_SUCCESS; if (MLGetState() <= ML_STATE_DMP_CLOSED) return ML_SUCCESS; result = MLDLDmpStop(ML_ALL_SENSORS); ERROR_CHECK_FIRST(firstError, result); result = FIFOClose(); ERROR_CHECK_FIRST(firstError, result); result = MLDLClose(); ERROR_CHECK_FIRST(firstError, result); result = MLStateTransition(ML_STATE_SERIAL_OPENED); ERROR_CHECK_FIRST(firstError, result); return result; }