/*
** Copyright (c) 2007 by Silicon Laboratories
**
** $Id: si_voice_timer_intf.h 2005 2010-06-03 21:01:04Z nizajerk $
**
** si_voice_timer_intf.h
** System specific functions header file
**
** Author(s): 
** laj
**
** Distributed by: 
** Silicon Laboratories, Inc
**
** File Description:
** This is the header file for the system specific functions like timer functions.
**
**
*/


#ifndef TIMER_INTF_H
#define TIMER_INTF_H

/** @addtogroup PROSLIC_CUSTOMER_APIS
 * @{
 * @defgroup PROSLIC_CUSTOMER_TIMER Customer implemented timer functions
 * This section has documentation related to timers: delays and timestamps.  The void * is a customer
 * supplied timer data structure that the user specifies in @ref SiVoice_setControlInterfaceTimerObj. 
 * These functions need to be associated with the functions documented in @ref SIVOICE_TIMER
 *
 * @note For the majority of implementations, the only function that is required is the delay function.
 *
 * @{
 */

/** 
 * @brief
 * System time delay function pointer 
 * 
 * @param[in] hTimer - the system timer object
 * @param[in] timeInMS - number of mSec to suspend the task/thread executing.
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
*/

typedef int (*system_delay_fptr) (void *hTimer, int timeInMs);

/**
 * @brief
 * System time elapsed function pointer
 *
 * @details
 * This function combined with @ref system_getTime_fptr function allow one to determine
 * the time elapsed between the two event times.
 *
 * The example psuedo code below shows how one may see this function used in conjunction with
 * the function pointed by @ref system_getTime_fptr to do some processing while waiting
 * for a time to expire.
 *
 * @code
 * my_timer_obj time_now;
 *
 * getTime(my_prosclic_obj->timer_obj_ptr, (void *)(&time_now));
 * 
 *  Some events occur here...
 * 
 * do
 * {
 *     time_elapsed(my_proslic_obj->timer_obj_ptr,(void *)(&time_now), &elapsed_time_mSec);
 *     
 *     Do something here...
 *
 *  }while(elapsed_time_mSec < Desired delay);
 *
 * Change state...
 *
 * @endcode
 *
 * @param[in] *hTimer - the system timer object
 * @param[in] *startTime - the time object returned by @ref system_getTime_fptr - the "start time" of the event.
 * @param[out] *timeInMs - the time in mSec between the "start time" and the current time.
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 * @sa system_getTime_fptr
*/

typedef int (*system_timeElapsed_fptr) (void *hTimer, void *startTime, int *timeInMs);

/**
 * @brief
 * Retrieve system time in mSec resolution.
 *
 * @details
 * This function combined with @ref system_timeElapsed_fptr function allow one to determine
 * the time elapsed between the two event times.
 *
 * @param[in] *hTimer - the system timer object
 * @param[in] *time - the timestamp object needed by @ref system_timeElapsed_fptr
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 * @sa system_timeElapsed_fptr 
*/

typedef int (*system_getTime_fptr) (void *hTimer, void *time);

/** @} 
 * @} */
#endif
