diff options
Diffstat (limited to '6515/libsensors_iio/software/core/mllite/start_manager.c')
-rw-r--r-- | 6515/libsensors_iio/software/core/mllite/start_manager.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/6515/libsensors_iio/software/core/mllite/start_manager.c b/6515/libsensors_iio/software/core/mllite/start_manager.c new file mode 100644 index 0000000..3e082d4 --- /dev/null +++ b/6515/libsensors_iio/software/core/mllite/start_manager.c @@ -0,0 +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; +} + +/** + * @} + */ |