/*******************************************************************
 * 							 Pilot Software
 *
 *	Copyright (c) 1995-1997, Palm Computing Inc., All Rights Reserved
 *
 *-------------------------------------------------------------------
 * FileName:
 *		TimePrv.h
 *
 * Description:
 *		Private Time manager functions
 *
 * History:
 *   	1/19/95  roger - Created by Roger Flores
 *
 *
 *******************************************************************/

#ifdef	NON_PORTABLE

#ifndef __TIMEPRV_H__
#define __TIMEPRV_H__


/*******************************************************************
 * Private Time Manager Constants
 *
 *******************************************************************/

// Alarm repeat interval -- once an alarm is triggered, it will
// repeat every timAlarmRepeatSeconds until it is canceled or
// replaced with a new alarm by the Alarm Manager.  This ensures
// that an alarm will not be missed by the Alarm Manager code which
// is executed on some app's UI thread.
#define timAlarmRepeatSeconds		10

// Alarm delta interval -- if the difference between the alarm time and the current time
// is less than this interval, the alarm will be triggered immediately.  This eliminates
// a race condition which occurs when the alarm time is TOO close to the current time.
#define timAlarmMinDeltaSeconds	2



/*******************************************************************
 * Time Manager Globals
 *
 *******************************************************************/
typedef struct TimGlobalsType {

	ULong				rtcHours;				// Added to DragonBall hours to get actual time
	ULong				alarmSeconds;			// alarm time in seconds since 1/1/1904;
													// 0 = none
													
	//-------------------------------------------------------------------------------
	// The following fields are used exclusively to work around a bug in the 0G58E version
	//  of the DragonBall. This bug causes the rtcHourMinSec register in the DragonBall to
	//  occasionally be "out of date" when read and also prevents alarms from going off
	//  if we're in sleep mode. To get around this bug, we use the 1 minute interrupt while
	//  we're in sleep mode to wake up periodically and see if any alarms need to go off and
	//  we use the 1 second interrupt when we're awake to update our own copy of the hours,
	//  minutes and seconds.
	//-------------------------------------------------------------------------------
	Boolean			rtcBugWorkaround;		// true to work around bug in 0G58E version
													//  of dragonball.
	Boolean			rtcBugAsleep;			// true if we're in sleep mode
													
	// Our copy of the time that we maintain through the 1 second and minute interrupts
	ULong				rtcBugAlarm;				// when alarm should be triggerred.
	ULong				rtcBugSeconds;				// seconds since 1/1/1904
														// IMPORTANT: The boolean rtcBugFastMinuteCalc MUST
														//  be cleared whenever rtcBugSeconds is changed!!!!!!!
	ULong				rtcBugLastSeconds;		// seconds after last 1 sec. or min. interrupt.
	Boolean			rtcBugFastMinuteCalc;	// true when current time is on a minute
														//  boundary. Used by TimHandleInterrupt speed up
														//  the next minute calculation.
	} TimGlobalsType;

typedef TimGlobalsType*		TimGlobalsPtr;


/************************************************************
 * Function Prototypes
 *************************************************************/
#ifdef __cplusplus
extern "C" {
#endif

//
// IMPORTANT: TimSetAlarm() and TimGetAlarm() are reserved for use by the
// Alarm Manager!
//

// set an alarm in seconds since 1/1/1904
// (reserved for Alarm Manager use only)
ULong			TimSetAlarm(ULong seconds)
						SYS_TRAP(sysTrapTimSetAlarm);

// get the current alarm setting in seconds since 1/1/1904
// (reserved for Alarm Manager use only)
ULong			TimGetAlarm(void)
						SYS_TRAP(sysTrapTimGetAlarm);
						
Err			TimSleep(Boolean untilReset, Boolean emergency)
						SYS_TRAP(sysTrapTimSleep);

Err			TimWake(void)
						SYS_TRAP(sysTrapTimWake);


//-------------------------------------------------------------------
// Interrupt Service routine
//-------------------------------------------------------------------
void 			TimHandleInterrupt(Boolean periodicUpdate)
						SYS_TRAP(sysTrapTimHandleInterrupt);


#ifdef __cplusplus 
}
#endif




#endif // __TIMEMGR_H__


#endif // NON_PORTABLE
