xref: /btstack/3rd-party/bluedroid/decoder/include/oi_time.h (revision df25739fc3ea5a0a90f0f5925e6461d653697d2e)
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