1*df25739fSMilanka Ringwald /****************************************************************************** 2*df25739fSMilanka Ringwald * 3*df25739fSMilanka Ringwald * Copyright (C) 2014 The Android Open Source Project 4*df25739fSMilanka Ringwald * Copyright 2002 - 2004 Open Interface North America, Inc. All rights reserved. 5*df25739fSMilanka Ringwald * 6*df25739fSMilanka Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 7*df25739fSMilanka Ringwald * you may not use this file except in compliance with the License. 8*df25739fSMilanka Ringwald * You may obtain a copy of the License at: 9*df25739fSMilanka Ringwald * 10*df25739fSMilanka Ringwald * http://www.apache.org/licenses/LICENSE-2.0 11*df25739fSMilanka Ringwald * 12*df25739fSMilanka Ringwald * Unless required by applicable law or agreed to in writing, software 13*df25739fSMilanka Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 14*df25739fSMilanka Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*df25739fSMilanka Ringwald * See the License for the specific language governing permissions and 16*df25739fSMilanka Ringwald * limitations under the License. 17*df25739fSMilanka Ringwald * 18*df25739fSMilanka Ringwald ******************************************************************************/ 19*df25739fSMilanka Ringwald #ifndef _OI_TIME_H 20*df25739fSMilanka Ringwald #define _OI_TIME_H 21*df25739fSMilanka Ringwald /** @file 22*df25739fSMilanka Ringwald * 23*df25739fSMilanka Ringwald * This file provides time type definitions and interfaces to time-related functions. 24*df25739fSMilanka Ringwald * 25*df25739fSMilanka Ringwald * The stack maintains a 64-bit real-time millisecond clock. The choice of 26*df25739fSMilanka Ringwald * milliseconds is for convenience, not accuracy. 27*df25739fSMilanka Ringwald * 28*df25739fSMilanka Ringwald * Timeouts are specified as tenths of seconds in a 32-bit value. Timeout values 29*df25739fSMilanka Ringwald * specified by the Bluetooth specification are usually muliple seconds, so 30*df25739fSMilanka Ringwald * accuracy to a tenth of a second is more than adequate. 31*df25739fSMilanka Ringwald * 32*df25739fSMilanka Ringwald * This file also contains macros to convert between seconds and the Link 33*df25739fSMilanka Ringwald * Manager's 1.28-second units. 34*df25739fSMilanka Ringwald * 35*df25739fSMilanka Ringwald */ 36*df25739fSMilanka Ringwald 37*df25739fSMilanka Ringwald /********************************************************************************** 38*df25739fSMilanka Ringwald $Revision: #1 $ 39*df25739fSMilanka Ringwald ***********************************************************************************/ 40*df25739fSMilanka Ringwald 41*df25739fSMilanka Ringwald #include "oi_stddefs.h" 42*df25739fSMilanka Ringwald 43*df25739fSMilanka Ringwald 44*df25739fSMilanka Ringwald /** \addtogroup Misc Miscellaneous APIs */ 45*df25739fSMilanka Ringwald /**@{*/ 46*df25739fSMilanka Ringwald 47*df25739fSMilanka Ringwald #ifdef __cplusplus 48*df25739fSMilanka Ringwald extern "C" { 49*df25739fSMilanka Ringwald #endif 50*df25739fSMilanka Ringwald 51*df25739fSMilanka Ringwald 52*df25739fSMilanka Ringwald 53*df25739fSMilanka Ringwald /** 54*df25739fSMilanka Ringwald * Within the core stack timeouts are specified in intervals of tenths of seconds 55*df25739fSMilanka Ringwald */ 56*df25739fSMilanka Ringwald 57*df25739fSMilanka Ringwald typedef OI_UINT16 OI_INTERVAL; 58*df25739fSMilanka Ringwald #define OI_INTERVALS_PER_SECOND 10 59*df25739fSMilanka Ringwald #define MSECS_PER_OI_INTERVAL (1000 / OI_INTERVALS_PER_SECOND) 60*df25739fSMilanka Ringwald 61*df25739fSMilanka Ringwald /** maximum interval (54 min 36.7 sec) */ 62*df25739fSMilanka Ringwald #define OI_MAX_INTERVAL 0x7fff 63*df25739fSMilanka Ringwald 64*df25739fSMilanka Ringwald 65*df25739fSMilanka Ringwald /** 66*df25739fSMilanka Ringwald * Macro to convert seconds to OI_INTERVAL time units 67*df25739fSMilanka Ringwald */ 68*df25739fSMilanka Ringwald 69*df25739fSMilanka Ringwald #define OI_SECONDS(n) ((OI_INTERVAL) ((n) * OI_INTERVALS_PER_SECOND)) 70*df25739fSMilanka Ringwald 71*df25739fSMilanka Ringwald /** 72*df25739fSMilanka Ringwald * Macro to convert milliseconds to OI_INTERVAL time units (Rounded Up) 73*df25739fSMilanka Ringwald */ 74*df25739fSMilanka Ringwald 75*df25739fSMilanka Ringwald #define OI_MSECONDS(n) ((OI_INTERVAL) ((n + MSECS_PER_OI_INTERVAL - 1) / MSECS_PER_OI_INTERVAL)) 76*df25739fSMilanka Ringwald 77*df25739fSMilanka Ringwald /** 78*df25739fSMilanka Ringwald * Macro to convert minutes to OI_INTERVAL time units 79*df25739fSMilanka Ringwald */ 80*df25739fSMilanka Ringwald 81*df25739fSMilanka Ringwald #define OI_MINUTES(n) ((OI_INTERVAL) ((n) * OI_SECONDS(60))) 82*df25739fSMilanka Ringwald 83*df25739fSMilanka Ringwald /** Convert an OI_INTERVAL to milliseconds. */ 84*df25739fSMilanka Ringwald #define OI_INTERVAL_TO_MILLISECONDS(i) ((i) * MSECS_PER_OI_INTERVAL) 85*df25739fSMilanka Ringwald 86*df25739fSMilanka Ringwald /** 87*df25739fSMilanka Ringwald * The stack depends on relative not absolute time. Any mapping between the 88*df25739fSMilanka Ringwald * stack's real-time clock and absolute time and date is implementation-dependent. 89*df25739fSMilanka Ringwald */ 90*df25739fSMilanka Ringwald 91*df25739fSMilanka Ringwald typedef struct { 92*df25739fSMilanka Ringwald OI_INT32 seconds; 93*df25739fSMilanka Ringwald OI_INT16 mseconds; 94*df25739fSMilanka Ringwald } OI_TIME; 95*df25739fSMilanka Ringwald 96*df25739fSMilanka Ringwald /** 97*df25739fSMilanka Ringwald * Convert an OI_TIME to milliseconds. 98*df25739fSMilanka Ringwald * 99*df25739fSMilanka Ringwald * @param t the time to convert 100*df25739fSMilanka Ringwald * 101*df25739fSMilanka Ringwald * @return the time in milliseconds 102*df25739fSMilanka Ringwald */ 103*df25739fSMilanka Ringwald OI_UINT32 OI_Time_ToMS(OI_TIME *t); 104*df25739fSMilanka Ringwald 105*df25739fSMilanka Ringwald 106*df25739fSMilanka Ringwald /** 107*df25739fSMilanka Ringwald * This function compares two time values. 108*df25739fSMilanka Ringwald * 109*df25739fSMilanka Ringwald * @param T1 first time to compare. 110*df25739fSMilanka Ringwald * 111*df25739fSMilanka Ringwald * @param T2 second time to compare. 112*df25739fSMilanka Ringwald * 113*df25739fSMilanka Ringwald * @return 114*df25739fSMilanka Ringwald @verbatim 115*df25739fSMilanka Ringwald -1 if t1 < t2 116*df25739fSMilanka Ringwald 0 if t1 = t2 117*df25739fSMilanka Ringwald +1 if t1 > t2 118*df25739fSMilanka Ringwald @endverbatim 119*df25739fSMilanka Ringwald */ 120*df25739fSMilanka Ringwald 121*df25739fSMilanka Ringwald OI_INT16 OI_Time_Compare(OI_TIME *T1, 122*df25739fSMilanka Ringwald OI_TIME *T2); 123*df25739fSMilanka Ringwald 124*df25739fSMilanka Ringwald 125*df25739fSMilanka Ringwald /** 126*df25739fSMilanka Ringwald * This function returns the interval between two times to a granularity of 0.1 seconds. 127*df25739fSMilanka Ringwald * 128*df25739fSMilanka Ringwald * @param Sooner a time value more recent that Later 129*df25739fSMilanka Ringwald * 130*df25739fSMilanka Ringwald * @param Later a time value later than Sooner 131*df25739fSMilanka Ringwald * 132*df25739fSMilanka Ringwald * @note The result is an OI_INTERVAL value so this function only works for time intervals 133*df25739fSMilanka Ringwald * that are less than about 71 minutes. 134*df25739fSMilanka Ringwald * 135*df25739fSMilanka Ringwald * @return the time interval between the two times = (Later - Sooner) 136*df25739fSMilanka Ringwald */ 137*df25739fSMilanka Ringwald 138*df25739fSMilanka Ringwald OI_INTERVAL OI_Time_Interval(OI_TIME *Sooner, 139*df25739fSMilanka Ringwald OI_TIME *Later); 140*df25739fSMilanka Ringwald 141*df25739fSMilanka Ringwald 142*df25739fSMilanka Ringwald 143*df25739fSMilanka Ringwald /** 144*df25739fSMilanka Ringwald * This function returns the interval between two times to a granularity of milliseconds. 145*df25739fSMilanka Ringwald * 146*df25739fSMilanka Ringwald * @param Sooner a time value more recent that Later 147*df25739fSMilanka Ringwald * 148*df25739fSMilanka Ringwald * @param Later a time value later than Sooner 149*df25739fSMilanka Ringwald * 150*df25739fSMilanka Ringwald * @note The result is an OI_UINT32 value so this function only works for time intervals 151*df25739fSMilanka Ringwald * that are less than about 50 days. 152*df25739fSMilanka Ringwald * 153*df25739fSMilanka Ringwald * @return the time interval between the two times = (Later - Sooner) 154*df25739fSMilanka Ringwald */ 155*df25739fSMilanka Ringwald 156*df25739fSMilanka Ringwald OI_UINT32 OI_Time_IntervalMsecs(OI_TIME *Sooner, 157*df25739fSMilanka Ringwald OI_TIME *Later); 158*df25739fSMilanka Ringwald 159*df25739fSMilanka Ringwald 160*df25739fSMilanka Ringwald 161*df25739fSMilanka Ringwald /** 162*df25739fSMilanka Ringwald * This function answers the question, Have we reached or gone past the target time? 163*df25739fSMilanka Ringwald * 164*df25739fSMilanka Ringwald * @param pTargetTime target time 165*df25739fSMilanka Ringwald * 166*df25739fSMilanka Ringwald * @return TRUE means time now is at or past target time 167*df25739fSMilanka Ringwald * FALSE means target time is still some time in the future 168*df25739fSMilanka Ringwald */ 169*df25739fSMilanka Ringwald 170*df25739fSMilanka Ringwald OI_BOOL OI_Time_NowReachedTime(OI_TIME *pTargetTime); 171*df25739fSMilanka Ringwald 172*df25739fSMilanka Ringwald /** 173*df25739fSMilanka Ringwald * Convert seconds to the Link Manager 1.28-second units 174*df25739fSMilanka Ringwald * Approximate by using 1.25 conversion factor. 175*df25739fSMilanka Ringwald */ 176*df25739fSMilanka Ringwald 177*df25739fSMilanka Ringwald #define OI_SECONDS_TO_LM_TIME_UNITS(lmUnits) ((lmUnits)<4?(lmUnits):(lmUnits)-((lmUnits)>>2)) 178*df25739fSMilanka Ringwald 179*df25739fSMilanka Ringwald 180*df25739fSMilanka Ringwald /** 181*df25739fSMilanka Ringwald * Convert Link Manager 1.28-second units to seconds. 182*df25739fSMilanka Ringwald * Approximate by using 1.25 conversion factor. 183*df25739fSMilanka Ringwald */ 184*df25739fSMilanka Ringwald 185*df25739fSMilanka Ringwald #define OI_LM_TIME_UNITS_TO_SECONDS(lmUnits) ((lmUnits) + ((lmUnits)>>2)) 186*df25739fSMilanka Ringwald 187*df25739fSMilanka Ringwald #ifdef __cplusplus 188*df25739fSMilanka Ringwald } 189*df25739fSMilanka Ringwald #endif 190*df25739fSMilanka Ringwald 191*df25739fSMilanka Ringwald /**@}*/ 192*df25739fSMilanka Ringwald 193*df25739fSMilanka Ringwald /* Include for OI_Time_Now() prototype 194*df25739fSMilanka Ringwald * Must be included at end to obtain OI_TIME typedef 195*df25739fSMilanka Ringwald */ 196*df25739fSMilanka Ringwald #include "oi_osinterface.h" 197*df25739fSMilanka Ringwald 198*df25739fSMilanka Ringwald /*****************************************************************************/ 199*df25739fSMilanka Ringwald #endif /* _OI_TIME_H */ 200*df25739fSMilanka Ringwald 201