blob: fb758e79cb8b458314c496bc612cfa6fe636662b [file] [log] [blame]
/*
$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;
}
/**
* @}
*/