Home | History | Annotate | Download | only in mllite
      1 /*
      2  $License:
      3     Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
      4     See included License.txt for License information.
      5  $
      6  */
      7 
      8 /*******************************************************************************
      9  *
     10  * $Id:$
     11  *
     12  ******************************************************************************/
     13 /**
     14  *   @defgroup  Start_Manager start_manager
     15  *   @brief     Motion Library - Start Manager
     16  *              Start Manager
     17  *
     18  *   @{
     19  *       @file start_manager.c
     20  *       @brief This handles all the callbacks when inv_start_mpl() is called.
     21  */
     22 
     23 
     24 #include <string.h>
     25 #include "log.h"
     26 #include "start_manager.h"
     27 
     28 typedef inv_error_t (*inv_start_cb_func)();
     29 struct inv_start_cb_t {
     30     int num_cb;
     31     inv_start_cb_func start_cb[INV_MAX_START_CB];
     32 };
     33 
     34 static struct inv_start_cb_t inv_start_cb;
     35 
     36 /** Initilize the start manager. Typically called by inv_start_mpl();
     37 * @return Returns INV_SUCCESS if successful or an error code if not.
     38 */
     39 inv_error_t inv_init_start_manager(void)
     40 {
     41     memset(&inv_start_cb, 0, sizeof(inv_start_cb));
     42     return INV_SUCCESS;
     43 }
     44 
     45 /** Removes a callback from start notification
     46 * @param[in] start_cb function to remove from start notification
     47 * @return Returns INV_SUCCESS if successful or an error code if not.
     48 */
     49 inv_error_t inv_unregister_mpl_start_notification(inv_error_t (*start_cb)(void))
     50 {
     51     int kk;
     52 
     53     for (kk=0; kk<inv_start_cb.num_cb; ++kk) {
     54         if (inv_start_cb.start_cb[kk] == start_cb) {
     55             // Found the match
     56             if (kk != (inv_start_cb.num_cb-1)) {
     57                 memmove(&inv_start_cb.start_cb[kk],
     58                     &inv_start_cb.start_cb[kk+1],
     59                     (inv_start_cb.num_cb-kk-1)*sizeof(inv_start_cb_func));
     60             }
     61             inv_start_cb.num_cb--;
     62             return INV_SUCCESS;
     63         }
     64     }
     65     return INV_ERROR_INVALID_PARAMETER;
     66 }
     67 
     68 /** Register a callback to receive when inv_start_mpl() is called.
     69 * @param[in] start_cb Function callback that will be called when inv_start_mpl() is
     70 *            called.
     71 * @return Returns INV_SUCCESS if successful or an error code if not.
     72 */
     73 inv_error_t inv_register_mpl_start_notification(inv_error_t (*start_cb)(void))
     74 {
     75     if (inv_start_cb.num_cb >= INV_MAX_START_CB)
     76         return INV_ERROR_INVALID_PARAMETER;
     77 
     78     inv_start_cb.start_cb[inv_start_cb.num_cb] = start_cb;
     79     inv_start_cb.num_cb++;
     80     return INV_SUCCESS;
     81 }
     82 
     83 /** Callback all the functions that want to be notified when inv_start_mpl() was
     84 * called.
     85 * @return Returns INV_SUCCESS if successful or an error code if not.
     86 */
     87 inv_error_t inv_execute_mpl_start_notification(void)
     88 {
     89     inv_error_t result,first_error;
     90     int kk;
     91 
     92     first_error = INV_SUCCESS;
     93 
     94     for (kk = 0; kk < inv_start_cb.num_cb; ++kk) {
     95         result = inv_start_cb.start_cb[kk]();
     96         if (result && (first_error == INV_SUCCESS)) {
     97             first_error = result;
     98         }
     99     }
    100     return first_error;
    101 }
    102 
    103 /**
    104  * @}
    105  */
    106