/*****************************************************************************
* File: TIM_bridge.h
*
* Description:
* This file provides a insulation layer between the BridgePoint built-in
* External Enity 'Time' (Key Letters: TIM) and the underlying implementation.
*
* OOA Timer methods:
* Note that in the software architecture there will be a (finite but
* indeterminate) delay between the expiration of a timer and the delivery
* of the associated event to the receiving state machine.
*
* Notice:
* (C) Copyright 1999, 2000 ROX Software, Inc.
* All rights reserved.
*
* This document contains confidential and proprietary information and
* property of ROX Software, Inc. No part of this document may be
* reproduced without the express written permission of ROX Software, Inc.
****************************************************************************/
#ifndef TIM_BRIDGE_H
#define TIM_BRIDGE_H
#ifdef __cplusplus
extern "C" {
#endif
#include "e_types.h"
#include "e_events.h"
/*****************************************************************************
* TIM_create_date
*
* Bridge method to create an analysis specific date instance.
****************************************************************************/
extern Escher_Date_t TIM_create_date( const int day,
const int hour,
const int minute,
const int month,
const int second,
const int year );
/*****************************************************************************
* TIM_current_date
*
* Bridge method to get the current date.
****************************************************************************/
extern Escher_Date_t TIM_current_date( void );
/*****************************************************************************
*
* Bridge methods to get time piece components of a given date.
****************************************************************************/
extern int TIM_get_year ( const Escher_Date_t date );
extern int TIM_get_month ( const Escher_Date_t date );
extern int TIM_get_day ( const Escher_Date_t date );
extern int TIM_get_hour ( const Escher_Date_t date );
extern int TIM_get_minute ( const Escher_Date_t date );
extern int TIM_get_second ( const Escher_Date_t date );
/*****************************************************************************
* TIM_current_clock
*
* Bridge method to get the current clock.
****************************************************************************/
extern Escher_TimeStamp_t TIM_current_clock( void );
/*****************************************************************************
* TIM_timer_start
*
* Starts a (one shot) timer to expire in <expression> microseconds,
* sending the event instance <event> upon expiration.
* Note that upon expiration the timer will be (automatically) deleted.
* Returns the instance handle of the non-recurring timer.
****************************************************************************/
extern Escher_Timer_t * TIM_timer_start( Escher_OoaEvent_s * event,
const Escher_uSec_t expression );
/*****************************************************************************
* TIM_timer_start_recurring
*
* Starts a (recurring) timer to expire in <expression> microseconds,
* sending the event instance <event> upon expiration.
* Upon expiration, the timer will be restarted and fire again in
* <expression> microseconds and (re)generate the event <event>.
* Returns the instance handle of the recurring timer.
****************************************************************************/
extern Escher_Timer_t * TIM_timer_start_recurring( Escher_OoaEvent_s * event,
const Escher_uSec_t expression );
/*****************************************************************************
* TIM_timer_remaining_time
*
* Returns the time remaining (in microseconds) before the timer
* specified by <timer> will expire. If <timer> no longer exists,
* a zero value will be returned. It is important to note that even
* if <timer> no longer exists, a <event> may still be in
* transit (e.g., was generated) from a previous <timer> expiration.
* Respectable analysis must account for this "ships passing" possibility.
****************************************************************************/
extern Escher_uSec_t TIM_timer_remaining_time( const Escher_Timer_t * const timer );
/*****************************************************************************
* TIM_timer_reset_time
*
* This method attempts to set an existing timer handle <timer> to expire
* in <expression> microseconds. If the timer exists (e.g, it has not
* already expired), a 'true' value is returned. If the timer no longer
* exists, a 'false' value is returned. In either case, it is important
* to note that an event may still be in transit (e.g., was already
* generated) from a previous expiration prior to this method invocation.
* Respectable analysis must account for this "ships passing" possibility.
****************************************************************************/
extern bool TIM_timer_reset_time( const Escher_uSec_t expression,
Escher_Timer_t * const timer );
/*****************************************************************************
* TIM_timer_add_time
*
* This method attempts to add <expression> microseconds to the
* timer handle <timer>. If the timer exists (e.g, it has not
* already expired), a 'true' value is returned. If the timer no longer
* exists, a 'false' value is returned. In either case, it is important
* to note that an event may still be in transit (e.g., was already
* generated) from a previous expiration prior to this method invocation.
* Respectable analysis must account for this "ships passing" possibility.
****************************************************************************/
extern bool TIM_timer_add_time( const Escher_uSec_t expression,
Escher_Timer_t * const timer );
/*****************************************************************************
* TIM_timer_cancel
*
* This method attempts to cancel and delete the timer handle specified
* by <timer>. If the timer still exists (e.g, it has not already
* expired), a 'true' value is returned. If the timer no longer exists,
* 'false' value is returned. In either case, it is important
* to note that an event may still be in transit (e.g., was already
* generated) from a previous expiration prior to this method invocation.
* Respectable analysis must account for this "ships passing" possibility.
****************************************************************************/
extern bool TIM_timer_cancel( Escher_Timer_t * const timer );
/*****************************************************************************
* TIM_tick
*
* This provides a periodic tick to give the timer subsystem the
* opportunity to check for expired timers and fire them and their
* respective delayed events. Calling this routine as often as possible
* increases the accuracy and resolution of the delayed event timers. One
* appropriate place to make this call is from UserBackgroundProcessingCallout
* found among the system callout routines.
****************************************************************************/
extern void TIM_tick( void );
/*****************************************************************************
* TIM_init
*
* This method initializes the timer subsystem. It must be called
* during system bring-up. An appropriate place to make this call
* is from UserPreOoaInitializationCallout.
****************************************************************************/
extern void TIM_init( void );
#ifdef __cplusplus
}
#endif
#endif /* TIM_BRIDGE_H */