www.pudn.com > MPL.zip > start_manager.c, change:2016-04-15,size:3044b


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