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