xref: /aosp_15_r20/external/openthread/examples/platforms/simulation/alarm.c (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2016, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker  *  All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker  *
5*cfb92d14SAndroid Build Coastguard Worker  *  Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker  *  modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker  *  1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker  *  2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker  *     documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker  *  3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker  *     names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker  *     derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker  *
16*cfb92d14SAndroid Build Coastguard Worker  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker  *  POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker  */
28*cfb92d14SAndroid Build Coastguard Worker 
29*cfb92d14SAndroid Build Coastguard Worker #include "platform-simulation.h"
30*cfb92d14SAndroid Build Coastguard Worker 
31*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_SIMULATION_VIRTUAL_TIME == 0
32*cfb92d14SAndroid Build Coastguard Worker 
33*cfb92d14SAndroid Build Coastguard Worker #include <stdbool.h>
34*cfb92d14SAndroid Build Coastguard Worker #include <stdio.h>
35*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
36*cfb92d14SAndroid Build Coastguard Worker 
37*cfb92d14SAndroid Build Coastguard Worker #include "utils/code_utils.h"
38*cfb92d14SAndroid Build Coastguard Worker 
39*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
40*cfb92d14SAndroid Build Coastguard Worker #include <signal.h>
41*cfb92d14SAndroid Build Coastguard Worker #include <time.h>
42*cfb92d14SAndroid Build Coastguard Worker 
43*cfb92d14SAndroid Build Coastguard Worker #ifndef OPENTHREAD_CONFIG_MICRO_TIMER_SIGNAL
44*cfb92d14SAndroid Build Coastguard Worker #define OPENTHREAD_CONFIG_MICRO_TIMER_SIGNAL SIGRTMIN
45*cfb92d14SAndroid Build Coastguard Worker #endif
46*cfb92d14SAndroid Build Coastguard Worker 
47*cfb92d14SAndroid Build Coastguard Worker timer_t sMicroTimer;
48*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
49*cfb92d14SAndroid Build Coastguard Worker 
50*cfb92d14SAndroid Build Coastguard Worker #include <openthread/logging.h>
51*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/alarm-micro.h>
52*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/alarm-milli.h>
53*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/diag.h>
54*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/time.h>
55*cfb92d14SAndroid Build Coastguard Worker 
56*cfb92d14SAndroid Build Coastguard Worker #include "lib/platform/exit_code.h"
57*cfb92d14SAndroid Build Coastguard Worker 
58*cfb92d14SAndroid Build Coastguard Worker #define DEFAULT_TIMEOUT_IN_SEC 10 // seconds
59*cfb92d14SAndroid Build Coastguard Worker 
60*cfb92d14SAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_RAW
61*cfb92d14SAndroid Build Coastguard Worker #define OT_SIMULATION_CLOCK_ID CLOCK_MONOTONIC_RAW
62*cfb92d14SAndroid Build Coastguard Worker #else
63*cfb92d14SAndroid Build Coastguard Worker #define OT_SIMULATION_CLOCK_ID CLOCK_MONOTONIC
64*cfb92d14SAndroid Build Coastguard Worker #endif
65*cfb92d14SAndroid Build Coastguard Worker 
66*cfb92d14SAndroid Build Coastguard Worker static bool     sIsMsRunning = false;
67*cfb92d14SAndroid Build Coastguard Worker static uint32_t sMsAlarm     = 0;
68*cfb92d14SAndroid Build Coastguard Worker 
69*cfb92d14SAndroid Build Coastguard Worker static bool     sIsUsRunning = false;
70*cfb92d14SAndroid Build Coastguard Worker static uint32_t sUsAlarm     = 0;
71*cfb92d14SAndroid Build Coastguard Worker 
72*cfb92d14SAndroid Build Coastguard Worker static uint32_t sSpeedUpFactor = 1;
73*cfb92d14SAndroid Build Coastguard Worker 
74*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
microTimerHandler(int aSignal,siginfo_t * aSignalInfo,void * aUserContext)75*cfb92d14SAndroid Build Coastguard Worker static void microTimerHandler(int aSignal, siginfo_t *aSignalInfo, void *aUserContext)
76*cfb92d14SAndroid Build Coastguard Worker {
77*cfb92d14SAndroid Build Coastguard Worker     assert(aSignal == OPENTHREAD_CONFIG_MICRO_TIMER_SIGNAL);
78*cfb92d14SAndroid Build Coastguard Worker     assert(aSignalInfo->si_value.sival_ptr == &sMicroTimer);
79*cfb92d14SAndroid Build Coastguard Worker     (void)aSignal;
80*cfb92d14SAndroid Build Coastguard Worker     (void)aSignalInfo;
81*cfb92d14SAndroid Build Coastguard Worker     (void)aUserContext;
82*cfb92d14SAndroid Build Coastguard Worker }
83*cfb92d14SAndroid Build Coastguard Worker #endif
84*cfb92d14SAndroid Build Coastguard Worker 
isExpired(uint32_t aTime,uint32_t aNow)85*cfb92d14SAndroid Build Coastguard Worker static bool isExpired(uint32_t aTime, uint32_t aNow)
86*cfb92d14SAndroid Build Coastguard Worker {
87*cfb92d14SAndroid Build Coastguard Worker     // Determine whether or not `aTime` is before or same as `aNow`.
88*cfb92d14SAndroid Build Coastguard Worker 
89*cfb92d14SAndroid Build Coastguard Worker     uint32_t diff = aNow - aTime;
90*cfb92d14SAndroid Build Coastguard Worker 
91*cfb92d14SAndroid Build Coastguard Worker     return (diff & (1U << 31)) == 0;
92*cfb92d14SAndroid Build Coastguard Worker }
93*cfb92d14SAndroid Build Coastguard Worker 
calculateDuration(uint32_t aTime,uint32_t aNow)94*cfb92d14SAndroid Build Coastguard Worker static uint32_t calculateDuration(uint32_t aTime, uint32_t aNow)
95*cfb92d14SAndroid Build Coastguard Worker {
96*cfb92d14SAndroid Build Coastguard Worker     // Return the time duration from `aNow` to `aTime` if `aTimer` is
97*cfb92d14SAndroid Build Coastguard Worker     // after `aNow`, otherwise return zero.
98*cfb92d14SAndroid Build Coastguard Worker 
99*cfb92d14SAndroid Build Coastguard Worker     return isExpired(aTime, aNow) ? 0 : aTime - aNow;
100*cfb92d14SAndroid Build Coastguard Worker }
101*cfb92d14SAndroid Build Coastguard Worker 
platformAlarmInit(uint32_t aSpeedUpFactor)102*cfb92d14SAndroid Build Coastguard Worker void platformAlarmInit(uint32_t aSpeedUpFactor)
103*cfb92d14SAndroid Build Coastguard Worker {
104*cfb92d14SAndroid Build Coastguard Worker     sSpeedUpFactor = aSpeedUpFactor;
105*cfb92d14SAndroid Build Coastguard Worker 
106*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
107*cfb92d14SAndroid Build Coastguard Worker     {
108*cfb92d14SAndroid Build Coastguard Worker         struct sigaction sa;
109*cfb92d14SAndroid Build Coastguard Worker 
110*cfb92d14SAndroid Build Coastguard Worker         sa.sa_flags     = SA_SIGINFO;
111*cfb92d14SAndroid Build Coastguard Worker         sa.sa_sigaction = microTimerHandler;
112*cfb92d14SAndroid Build Coastguard Worker         sigemptyset(&sa.sa_mask);
113*cfb92d14SAndroid Build Coastguard Worker 
114*cfb92d14SAndroid Build Coastguard Worker         if (sigaction(OPENTHREAD_CONFIG_MICRO_TIMER_SIGNAL, &sa, NULL) == -1)
115*cfb92d14SAndroid Build Coastguard Worker         {
116*cfb92d14SAndroid Build Coastguard Worker             perror("sigaction");
117*cfb92d14SAndroid Build Coastguard Worker             exit(EXIT_FAILURE);
118*cfb92d14SAndroid Build Coastguard Worker         }
119*cfb92d14SAndroid Build Coastguard Worker 
120*cfb92d14SAndroid Build Coastguard Worker         struct sigevent sev;
121*cfb92d14SAndroid Build Coastguard Worker 
122*cfb92d14SAndroid Build Coastguard Worker         sev.sigev_notify          = SIGEV_SIGNAL;
123*cfb92d14SAndroid Build Coastguard Worker         sev.sigev_signo           = OPENTHREAD_CONFIG_MICRO_TIMER_SIGNAL;
124*cfb92d14SAndroid Build Coastguard Worker         sev.sigev_value.sival_ptr = &sMicroTimer;
125*cfb92d14SAndroid Build Coastguard Worker 
126*cfb92d14SAndroid Build Coastguard Worker         if (-1 == timer_create(CLOCK_MONOTONIC, &sev, &sMicroTimer))
127*cfb92d14SAndroid Build Coastguard Worker         {
128*cfb92d14SAndroid Build Coastguard Worker             perror("timer_create");
129*cfb92d14SAndroid Build Coastguard Worker             exit(EXIT_FAILURE);
130*cfb92d14SAndroid Build Coastguard Worker         }
131*cfb92d14SAndroid Build Coastguard Worker     }
132*cfb92d14SAndroid Build Coastguard Worker #endif
133*cfb92d14SAndroid Build Coastguard Worker }
134*cfb92d14SAndroid Build Coastguard Worker 
135*cfb92d14SAndroid Build Coastguard Worker #if defined(CLOCK_MONOTONIC_RAW) || defined(CLOCK_MONOTONIC)
platformGetNow(void)136*cfb92d14SAndroid Build Coastguard Worker uint64_t platformGetNow(void)
137*cfb92d14SAndroid Build Coastguard Worker {
138*cfb92d14SAndroid Build Coastguard Worker     struct timespec now;
139*cfb92d14SAndroid Build Coastguard Worker     int             err;
140*cfb92d14SAndroid Build Coastguard Worker 
141*cfb92d14SAndroid Build Coastguard Worker     err = clock_gettime(OT_SIMULATION_CLOCK_ID, &now);
142*cfb92d14SAndroid Build Coastguard Worker 
143*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(err == 0, OT_EXIT_ERROR_ERRNO);
144*cfb92d14SAndroid Build Coastguard Worker 
145*cfb92d14SAndroid Build Coastguard Worker     return (uint64_t)now.tv_sec * sSpeedUpFactor * OT_US_PER_S + (uint64_t)now.tv_nsec * sSpeedUpFactor / OT_NS_PER_US;
146*cfb92d14SAndroid Build Coastguard Worker }
147*cfb92d14SAndroid Build Coastguard Worker #else
platformGetNow(void)148*cfb92d14SAndroid Build Coastguard Worker uint64_t platformGetNow(void)
149*cfb92d14SAndroid Build Coastguard Worker {
150*cfb92d14SAndroid Build Coastguard Worker     struct timeval tv;
151*cfb92d14SAndroid Build Coastguard Worker     int            err;
152*cfb92d14SAndroid Build Coastguard Worker 
153*cfb92d14SAndroid Build Coastguard Worker     err = gettimeofday(&tv, NULL);
154*cfb92d14SAndroid Build Coastguard Worker 
155*cfb92d14SAndroid Build Coastguard Worker     assert(err == 0);
156*cfb92d14SAndroid Build Coastguard Worker 
157*cfb92d14SAndroid Build Coastguard Worker     return (uint64_t)tv.tv_sec * sSpeedUpFactor * OT_US_PER_S + (uint64_t)tv.tv_usec * sSpeedUpFactor;
158*cfb92d14SAndroid Build Coastguard Worker }
159*cfb92d14SAndroid Build Coastguard Worker #endif // defined(CLOCK_MONOTONIC_RAW) || defined(CLOCK_MONOTONIC)
160*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliGetNow(void)161*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMilliGetNow(void) { return (uint32_t)(platformGetNow() / OT_US_PER_MS); }
162*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliStartAt(otInstance * aInstance,uint32_t aT0,uint32_t aDt)163*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
164*cfb92d14SAndroid Build Coastguard Worker {
165*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
166*cfb92d14SAndroid Build Coastguard Worker 
167*cfb92d14SAndroid Build Coastguard Worker     sMsAlarm     = aT0 + aDt;
168*cfb92d14SAndroid Build Coastguard Worker     sIsMsRunning = true;
169*cfb92d14SAndroid Build Coastguard Worker }
170*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliStop(otInstance * aInstance)171*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStop(otInstance *aInstance)
172*cfb92d14SAndroid Build Coastguard Worker {
173*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
174*cfb92d14SAndroid Build Coastguard Worker 
175*cfb92d14SAndroid Build Coastguard Worker     sIsMsRunning = false;
176*cfb92d14SAndroid Build Coastguard Worker }
177*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMicroGetNow(void)178*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMicroGetNow(void) { return (uint32_t)platformGetNow(); }
179*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMicroStartAt(otInstance * aInstance,uint32_t aT0,uint32_t aDt)180*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMicroStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
181*cfb92d14SAndroid Build Coastguard Worker {
182*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
183*cfb92d14SAndroid Build Coastguard Worker 
184*cfb92d14SAndroid Build Coastguard Worker     sUsAlarm     = aT0 + aDt;
185*cfb92d14SAndroid Build Coastguard Worker     sIsUsRunning = true;
186*cfb92d14SAndroid Build Coastguard Worker 
187*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
188*cfb92d14SAndroid Build Coastguard Worker     {
189*cfb92d14SAndroid Build Coastguard Worker         struct itimerspec its;
190*cfb92d14SAndroid Build Coastguard Worker         uint32_t          diff = sUsAlarm - otPlatAlarmMicroGetNow();
191*cfb92d14SAndroid Build Coastguard Worker 
192*cfb92d14SAndroid Build Coastguard Worker         its.it_value.tv_sec  = diff / OT_US_PER_S;
193*cfb92d14SAndroid Build Coastguard Worker         its.it_value.tv_nsec = (diff % OT_US_PER_S) * OT_NS_PER_US;
194*cfb92d14SAndroid Build Coastguard Worker 
195*cfb92d14SAndroid Build Coastguard Worker         its.it_interval.tv_sec  = 0;
196*cfb92d14SAndroid Build Coastguard Worker         its.it_interval.tv_nsec = 0;
197*cfb92d14SAndroid Build Coastguard Worker 
198*cfb92d14SAndroid Build Coastguard Worker         if (-1 == timer_settime(sMicroTimer, 0, &its, NULL))
199*cfb92d14SAndroid Build Coastguard Worker         {
200*cfb92d14SAndroid Build Coastguard Worker             perror("otPlatAlarmMicroStartAt timer_settime()");
201*cfb92d14SAndroid Build Coastguard Worker             exit(EXIT_FAILURE);
202*cfb92d14SAndroid Build Coastguard Worker         }
203*cfb92d14SAndroid Build Coastguard Worker     }
204*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
205*cfb92d14SAndroid Build Coastguard Worker }
206*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMicroStop(otInstance * aInstance)207*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMicroStop(otInstance *aInstance)
208*cfb92d14SAndroid Build Coastguard Worker {
209*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
210*cfb92d14SAndroid Build Coastguard Worker 
211*cfb92d14SAndroid Build Coastguard Worker     sIsUsRunning = false;
212*cfb92d14SAndroid Build Coastguard Worker 
213*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
214*cfb92d14SAndroid Build Coastguard Worker     {
215*cfb92d14SAndroid Build Coastguard Worker         struct itimerspec its = {{0, 0}, {0, 0}};
216*cfb92d14SAndroid Build Coastguard Worker 
217*cfb92d14SAndroid Build Coastguard Worker         if (-1 == timer_settime(sMicroTimer, 0, &its, NULL))
218*cfb92d14SAndroid Build Coastguard Worker         {
219*cfb92d14SAndroid Build Coastguard Worker             perror("otPlatAlarmMicroStop timer_settime()");
220*cfb92d14SAndroid Build Coastguard Worker             exit(EXIT_FAILURE);
221*cfb92d14SAndroid Build Coastguard Worker         }
222*cfb92d14SAndroid Build Coastguard Worker     }
223*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
224*cfb92d14SAndroid Build Coastguard Worker }
225*cfb92d14SAndroid Build Coastguard Worker 
platformAlarmUpdateTimeout(struct timeval * aTimeout)226*cfb92d14SAndroid Build Coastguard Worker void platformAlarmUpdateTimeout(struct timeval *aTimeout)
227*cfb92d14SAndroid Build Coastguard Worker {
228*cfb92d14SAndroid Build Coastguard Worker     uint64_t remaining = DEFAULT_TIMEOUT_IN_SEC * OT_US_PER_S; // in usec.
229*cfb92d14SAndroid Build Coastguard Worker 
230*cfb92d14SAndroid Build Coastguard Worker     assert(aTimeout != NULL);
231*cfb92d14SAndroid Build Coastguard Worker 
232*cfb92d14SAndroid Build Coastguard Worker     if (sIsMsRunning)
233*cfb92d14SAndroid Build Coastguard Worker     {
234*cfb92d14SAndroid Build Coastguard Worker         uint32_t msRemaining = calculateDuration(sMsAlarm, otPlatAlarmMilliGetNow());
235*cfb92d14SAndroid Build Coastguard Worker 
236*cfb92d14SAndroid Build Coastguard Worker         remaining = ((uint64_t)msRemaining) * OT_US_PER_MS;
237*cfb92d14SAndroid Build Coastguard Worker     }
238*cfb92d14SAndroid Build Coastguard Worker 
239*cfb92d14SAndroid Build Coastguard Worker     if (sIsUsRunning)
240*cfb92d14SAndroid Build Coastguard Worker     {
241*cfb92d14SAndroid Build Coastguard Worker         uint32_t usRemaining = calculateDuration(sUsAlarm, otPlatAlarmMicroGetNow());
242*cfb92d14SAndroid Build Coastguard Worker 
243*cfb92d14SAndroid Build Coastguard Worker         if (usRemaining < remaining)
244*cfb92d14SAndroid Build Coastguard Worker         {
245*cfb92d14SAndroid Build Coastguard Worker             remaining = usRemaining;
246*cfb92d14SAndroid Build Coastguard Worker         }
247*cfb92d14SAndroid Build Coastguard Worker     }
248*cfb92d14SAndroid Build Coastguard Worker 
249*cfb92d14SAndroid Build Coastguard Worker     if (remaining == 0)
250*cfb92d14SAndroid Build Coastguard Worker     {
251*cfb92d14SAndroid Build Coastguard Worker         aTimeout->tv_sec  = 0;
252*cfb92d14SAndroid Build Coastguard Worker         aTimeout->tv_usec = 0;
253*cfb92d14SAndroid Build Coastguard Worker     }
254*cfb92d14SAndroid Build Coastguard Worker     else
255*cfb92d14SAndroid Build Coastguard Worker     {
256*cfb92d14SAndroid Build Coastguard Worker         remaining /= sSpeedUpFactor;
257*cfb92d14SAndroid Build Coastguard Worker 
258*cfb92d14SAndroid Build Coastguard Worker         if (remaining == 0)
259*cfb92d14SAndroid Build Coastguard Worker         {
260*cfb92d14SAndroid Build Coastguard Worker             remaining = 1;
261*cfb92d14SAndroid Build Coastguard Worker         }
262*cfb92d14SAndroid Build Coastguard Worker 
263*cfb92d14SAndroid Build Coastguard Worker         aTimeout->tv_sec  = (time_t)(remaining / OT_US_PER_S);
264*cfb92d14SAndroid Build Coastguard Worker         aTimeout->tv_usec = remaining % OT_US_PER_S;
265*cfb92d14SAndroid Build Coastguard Worker     }
266*cfb92d14SAndroid Build Coastguard Worker }
267*cfb92d14SAndroid Build Coastguard Worker 
platformAlarmProcess(otInstance * aInstance)268*cfb92d14SAndroid Build Coastguard Worker void platformAlarmProcess(otInstance *aInstance)
269*cfb92d14SAndroid Build Coastguard Worker {
270*cfb92d14SAndroid Build Coastguard Worker     if (sIsMsRunning && isExpired(sMsAlarm, otPlatAlarmMilliGetNow()))
271*cfb92d14SAndroid Build Coastguard Worker     {
272*cfb92d14SAndroid Build Coastguard Worker         sIsMsRunning = false;
273*cfb92d14SAndroid Build Coastguard Worker 
274*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DIAG_ENABLE
275*cfb92d14SAndroid Build Coastguard Worker         if (otPlatDiagModeGet())
276*cfb92d14SAndroid Build Coastguard Worker         {
277*cfb92d14SAndroid Build Coastguard Worker             otPlatDiagAlarmFired(aInstance);
278*cfb92d14SAndroid Build Coastguard Worker         }
279*cfb92d14SAndroid Build Coastguard Worker         else
280*cfb92d14SAndroid Build Coastguard Worker #endif
281*cfb92d14SAndroid Build Coastguard Worker         {
282*cfb92d14SAndroid Build Coastguard Worker             otPlatAlarmMilliFired(aInstance);
283*cfb92d14SAndroid Build Coastguard Worker         }
284*cfb92d14SAndroid Build Coastguard Worker     }
285*cfb92d14SAndroid Build Coastguard Worker 
286*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
287*cfb92d14SAndroid Build Coastguard Worker     if (sIsUsRunning && isExpired(sUsAlarm, otPlatAlarmMicroGetNow()))
288*cfb92d14SAndroid Build Coastguard Worker     {
289*cfb92d14SAndroid Build Coastguard Worker         sIsUsRunning = false;
290*cfb92d14SAndroid Build Coastguard Worker 
291*cfb92d14SAndroid Build Coastguard Worker         otPlatAlarmMicroFired(aInstance);
292*cfb92d14SAndroid Build Coastguard Worker     }
293*cfb92d14SAndroid Build Coastguard Worker #endif
294*cfb92d14SAndroid Build Coastguard Worker }
295*cfb92d14SAndroid Build Coastguard Worker 
otPlatTimeGet(void)296*cfb92d14SAndroid Build Coastguard Worker uint64_t otPlatTimeGet(void) { return platformGetNow(); }
297*cfb92d14SAndroid Build Coastguard Worker 
otPlatTimeGetXtalAccuracy(void)298*cfb92d14SAndroid Build Coastguard Worker uint16_t otPlatTimeGetXtalAccuracy(void) { return 0; }
299*cfb92d14SAndroid Build Coastguard Worker 
300*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_SIMULATION_VIRTUAL_TIME == 0
301