| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /*
- $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;
- }
- /**
- * @}
- */
|