xref: /aosp_15_r20/external/openthread/src/posix/platform/alarm.cpp (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 "openthread-posix-config.h"
30*cfb92d14SAndroid Build Coastguard Worker #include "platform-posix.h"
31*cfb92d14SAndroid Build Coastguard Worker 
32*cfb92d14SAndroid Build Coastguard Worker #include <assert.h>
33*cfb92d14SAndroid Build Coastguard Worker #include <stdio.h>
34*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
35*cfb92d14SAndroid Build Coastguard Worker #include <time.h>
36*cfb92d14SAndroid Build Coastguard Worker 
37*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/alarm-micro.h>
38*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/alarm-milli.h>
39*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/diag.h>
40*cfb92d14SAndroid Build Coastguard Worker 
41*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
42*cfb92d14SAndroid Build Coastguard Worker 
43*cfb92d14SAndroid Build Coastguard Worker static bool     sIsMsRunning = false;
44*cfb92d14SAndroid Build Coastguard Worker static uint32_t sMsAlarm     = 0;
45*cfb92d14SAndroid Build Coastguard Worker 
46*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
47*cfb92d14SAndroid Build Coastguard Worker static bool     sIsUsRunning = false;
48*cfb92d14SAndroid Build Coastguard Worker static uint32_t sUsAlarm     = 0;
49*cfb92d14SAndroid Build Coastguard Worker #endif
50*cfb92d14SAndroid Build Coastguard Worker 
51*cfb92d14SAndroid Build Coastguard Worker static uint32_t sSpeedUpFactor = 1;
52*cfb92d14SAndroid Build Coastguard Worker 
53*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
54*cfb92d14SAndroid Build Coastguard Worker 
55*cfb92d14SAndroid Build Coastguard Worker #include <signal.h>
56*cfb92d14SAndroid Build Coastguard Worker #include <time.h>
57*cfb92d14SAndroid Build Coastguard Worker 
58*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE && !OPENTHREAD_POSIX_VIRTUAL_TIME
59*cfb92d14SAndroid Build Coastguard Worker static timer_t sMicroTimer;
60*cfb92d14SAndroid Build Coastguard Worker static int     sRealTimeSignal = 0;
61*cfb92d14SAndroid Build Coastguard Worker 
microTimerHandler(int aSignal,siginfo_t * aSignalInfo,void * aUserContext)62*cfb92d14SAndroid Build Coastguard Worker static void microTimerHandler(int aSignal, siginfo_t *aSignalInfo, void *aUserContext)
63*cfb92d14SAndroid Build Coastguard Worker {
64*cfb92d14SAndroid Build Coastguard Worker     assert(aSignal == sRealTimeSignal);
65*cfb92d14SAndroid Build Coastguard Worker     assert(aSignalInfo->si_value.sival_ptr == &sMicroTimer);
66*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aSignal);
67*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aSignalInfo);
68*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aUserContext);
69*cfb92d14SAndroid Build Coastguard Worker }
70*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE && !OPENTHREAD_POSIX_VIRTUAL_TIME
71*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
72*cfb92d14SAndroid Build Coastguard Worker 
73*cfb92d14SAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_RAW
74*cfb92d14SAndroid Build Coastguard Worker #define OT_POSIX_CLOCK_ID CLOCK_MONOTONIC_RAW
75*cfb92d14SAndroid Build Coastguard Worker #else
76*cfb92d14SAndroid Build Coastguard Worker #define OT_POSIX_CLOCK_ID CLOCK_MONOTONIC
77*cfb92d14SAndroid Build Coastguard Worker #endif
78*cfb92d14SAndroid Build Coastguard Worker 
79*cfb92d14SAndroid Build Coastguard Worker #if !OPENTHREAD_POSIX_VIRTUAL_TIME
otPlatTimeGet(void)80*cfb92d14SAndroid Build Coastguard Worker uint64_t otPlatTimeGet(void)
81*cfb92d14SAndroid Build Coastguard Worker {
82*cfb92d14SAndroid Build Coastguard Worker     struct timespec now;
83*cfb92d14SAndroid Build Coastguard Worker 
84*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(clock_gettime(OT_POSIX_CLOCK_ID, &now) == 0, OT_EXIT_FAILURE);
85*cfb92d14SAndroid Build Coastguard Worker 
86*cfb92d14SAndroid Build Coastguard Worker     return static_cast<uint64_t>(now.tv_sec) * OT_US_PER_S + static_cast<uint64_t>(now.tv_nsec) / OT_NS_PER_US;
87*cfb92d14SAndroid Build Coastguard Worker }
88*cfb92d14SAndroid Build Coastguard Worker #endif // !OPENTHREAD_POSIX_VIRTUAL_TIME
89*cfb92d14SAndroid Build Coastguard Worker 
platformAlarmGetNow(void)90*cfb92d14SAndroid Build Coastguard Worker static uint64_t platformAlarmGetNow(void) { return otPlatTimeGet() * sSpeedUpFactor; }
91*cfb92d14SAndroid Build Coastguard Worker 
platformAlarmInit(uint32_t aSpeedUpFactor,int aRealTimeSignal)92*cfb92d14SAndroid Build Coastguard Worker void platformAlarmInit(uint32_t aSpeedUpFactor, int aRealTimeSignal)
93*cfb92d14SAndroid Build Coastguard Worker {
94*cfb92d14SAndroid Build Coastguard Worker     sSpeedUpFactor = aSpeedUpFactor;
95*cfb92d14SAndroid Build Coastguard Worker 
96*cfb92d14SAndroid Build Coastguard Worker     if (aRealTimeSignal == 0)
97*cfb92d14SAndroid Build Coastguard Worker     {
98*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
99*cfb92d14SAndroid Build Coastguard Worker         otLogWarnPlat("Real time signal not enabled, microsecond timers may be inaccurate!");
100*cfb92d14SAndroid Build Coastguard Worker #endif
101*cfb92d14SAndroid Build Coastguard Worker     }
102*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
103*cfb92d14SAndroid Build Coastguard Worker     else if (aRealTimeSignal >= SIGRTMIN && aRealTimeSignal <= SIGRTMAX)
104*cfb92d14SAndroid Build Coastguard Worker     {
105*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE && !OPENTHREAD_POSIX_VIRTUAL_TIME
106*cfb92d14SAndroid Build Coastguard Worker         struct sigaction sa;
107*cfb92d14SAndroid Build Coastguard Worker         struct sigevent  sev;
108*cfb92d14SAndroid Build Coastguard Worker 
109*cfb92d14SAndroid Build Coastguard Worker         sa.sa_flags     = SA_SIGINFO;
110*cfb92d14SAndroid Build Coastguard Worker         sa.sa_sigaction = microTimerHandler;
111*cfb92d14SAndroid Build Coastguard Worker         sigemptyset(&sa.sa_mask);
112*cfb92d14SAndroid Build Coastguard Worker 
113*cfb92d14SAndroid Build Coastguard Worker         VerifyOrDie(sigaction(aRealTimeSignal, &sa, nullptr) != -1, OT_EXIT_ERROR_ERRNO);
114*cfb92d14SAndroid Build Coastguard Worker 
115*cfb92d14SAndroid Build Coastguard Worker         sev.sigev_notify          = SIGEV_SIGNAL;
116*cfb92d14SAndroid Build Coastguard Worker         sev.sigev_signo           = aRealTimeSignal;
117*cfb92d14SAndroid Build Coastguard Worker         sev.sigev_value.sival_ptr = &sMicroTimer;
118*cfb92d14SAndroid Build Coastguard Worker 
119*cfb92d14SAndroid Build Coastguard Worker         VerifyOrDie(timer_create(CLOCK_MONOTONIC, &sev, &sMicroTimer) != -1, OT_EXIT_ERROR_ERRNO);
120*cfb92d14SAndroid Build Coastguard Worker 
121*cfb92d14SAndroid Build Coastguard Worker         sRealTimeSignal = aRealTimeSignal;
122*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE && !OPENTHREAD_POSIX_VIRTUAL_TIME
123*cfb92d14SAndroid Build Coastguard Worker     }
124*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
125*cfb92d14SAndroid Build Coastguard Worker     else
126*cfb92d14SAndroid Build Coastguard Worker     {
127*cfb92d14SAndroid Build Coastguard Worker         DieNow(OT_EXIT_INVALID_ARGUMENTS);
128*cfb92d14SAndroid Build Coastguard Worker     }
129*cfb92d14SAndroid Build Coastguard Worker }
130*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliGetNow(void)131*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMilliGetNow(void) { return (uint32_t)(platformAlarmGetNow() / OT_US_PER_MS); }
132*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliStartAt(otInstance * aInstance,uint32_t aT0,uint32_t aDt)133*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
134*cfb92d14SAndroid Build Coastguard Worker {
135*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
136*cfb92d14SAndroid Build Coastguard Worker 
137*cfb92d14SAndroid Build Coastguard Worker     sMsAlarm     = aT0 + aDt;
138*cfb92d14SAndroid Build Coastguard Worker     sIsMsRunning = true;
139*cfb92d14SAndroid Build Coastguard Worker }
140*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMilliStop(otInstance * aInstance)141*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStop(otInstance *aInstance)
142*cfb92d14SAndroid Build Coastguard Worker {
143*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
144*cfb92d14SAndroid Build Coastguard Worker 
145*cfb92d14SAndroid Build Coastguard Worker     sIsMsRunning = false;
146*cfb92d14SAndroid Build Coastguard Worker }
147*cfb92d14SAndroid Build Coastguard Worker 
148*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
otPlatAlarmMicroGetNow(void)149*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMicroGetNow(void) { return static_cast<uint32_t>(platformAlarmGetNow()); }
150*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMicroStartAt(otInstance * aInstance,uint32_t aT0,uint32_t aDt)151*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMicroStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
152*cfb92d14SAndroid Build Coastguard Worker {
153*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
154*cfb92d14SAndroid Build Coastguard Worker 
155*cfb92d14SAndroid Build Coastguard Worker     sUsAlarm     = aT0 + aDt;
156*cfb92d14SAndroid Build Coastguard Worker     sIsUsRunning = true;
157*cfb92d14SAndroid Build Coastguard Worker 
158*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
159*cfb92d14SAndroid Build Coastguard Worker     if (sRealTimeSignal != 0)
160*cfb92d14SAndroid Build Coastguard Worker     {
161*cfb92d14SAndroid Build Coastguard Worker         struct itimerspec its;
162*cfb92d14SAndroid Build Coastguard Worker         uint32_t          diff = sUsAlarm - otPlatAlarmMicroGetNow();
163*cfb92d14SAndroid Build Coastguard Worker 
164*cfb92d14SAndroid Build Coastguard Worker         its.it_value.tv_sec  = diff / OT_US_PER_S;
165*cfb92d14SAndroid Build Coastguard Worker         its.it_value.tv_nsec = (diff % OT_US_PER_S) * OT_NS_PER_US;
166*cfb92d14SAndroid Build Coastguard Worker 
167*cfb92d14SAndroid Build Coastguard Worker         its.it_interval.tv_sec  = 0;
168*cfb92d14SAndroid Build Coastguard Worker         its.it_interval.tv_nsec = 0;
169*cfb92d14SAndroid Build Coastguard Worker 
170*cfb92d14SAndroid Build Coastguard Worker         if (-1 == timer_settime(sMicroTimer, 0, &its, nullptr))
171*cfb92d14SAndroid Build Coastguard Worker         {
172*cfb92d14SAndroid Build Coastguard Worker             otLogWarnPlat("Failed to update microsecond timer: %s", strerror(errno));
173*cfb92d14SAndroid Build Coastguard Worker         }
174*cfb92d14SAndroid Build Coastguard Worker     }
175*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
176*cfb92d14SAndroid Build Coastguard Worker }
177*cfb92d14SAndroid Build Coastguard Worker 
otPlatAlarmMicroStop(otInstance * aInstance)178*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMicroStop(otInstance *aInstance)
179*cfb92d14SAndroid Build Coastguard Worker {
180*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
181*cfb92d14SAndroid Build Coastguard Worker 
182*cfb92d14SAndroid Build Coastguard Worker     sIsUsRunning = false;
183*cfb92d14SAndroid Build Coastguard Worker 
184*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
185*cfb92d14SAndroid Build Coastguard Worker     if (sRealTimeSignal != 0)
186*cfb92d14SAndroid Build Coastguard Worker     {
187*cfb92d14SAndroid Build Coastguard Worker         struct itimerspec its = {{0, 0}, {0, 0}};
188*cfb92d14SAndroid Build Coastguard Worker 
189*cfb92d14SAndroid Build Coastguard Worker         if (-1 == timer_settime(sMicroTimer, 0, &its, nullptr))
190*cfb92d14SAndroid Build Coastguard Worker         {
191*cfb92d14SAndroid Build Coastguard Worker             otLogWarnPlat("Failed to stop microsecond timer: %s", strerror(errno));
192*cfb92d14SAndroid Build Coastguard Worker         }
193*cfb92d14SAndroid Build Coastguard Worker     }
194*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
195*cfb92d14SAndroid Build Coastguard Worker }
196*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
197*cfb92d14SAndroid Build Coastguard Worker 
platformAlarmUpdateTimeout(struct timeval * aTimeout)198*cfb92d14SAndroid Build Coastguard Worker void platformAlarmUpdateTimeout(struct timeval *aTimeout)
199*cfb92d14SAndroid Build Coastguard Worker {
200*cfb92d14SAndroid Build Coastguard Worker     int64_t  remaining = INT32_MAX;
201*cfb92d14SAndroid Build Coastguard Worker     uint64_t now       = platformAlarmGetNow();
202*cfb92d14SAndroid Build Coastguard Worker 
203*cfb92d14SAndroid Build Coastguard Worker     assert(aTimeout != nullptr);
204*cfb92d14SAndroid Build Coastguard Worker 
205*cfb92d14SAndroid Build Coastguard Worker     if (sIsMsRunning)
206*cfb92d14SAndroid Build Coastguard Worker     {
207*cfb92d14SAndroid Build Coastguard Worker         remaining = (int32_t)(sMsAlarm - (uint32_t)(now / OT_US_PER_MS));
208*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(remaining > 0);
209*cfb92d14SAndroid Build Coastguard Worker         remaining *= OT_US_PER_MS;
210*cfb92d14SAndroid Build Coastguard Worker         remaining -= (now % OT_US_PER_MS);
211*cfb92d14SAndroid Build Coastguard Worker     }
212*cfb92d14SAndroid Build Coastguard Worker 
213*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
214*cfb92d14SAndroid Build Coastguard Worker     if (sIsUsRunning)
215*cfb92d14SAndroid Build Coastguard Worker     {
216*cfb92d14SAndroid Build Coastguard Worker         int32_t usRemaining = (int32_t)(sUsAlarm - (uint32_t)now);
217*cfb92d14SAndroid Build Coastguard Worker 
218*cfb92d14SAndroid Build Coastguard Worker         if (usRemaining < remaining)
219*cfb92d14SAndroid Build Coastguard Worker         {
220*cfb92d14SAndroid Build Coastguard Worker             remaining = usRemaining;
221*cfb92d14SAndroid Build Coastguard Worker         }
222*cfb92d14SAndroid Build Coastguard Worker     }
223*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
224*cfb92d14SAndroid Build Coastguard Worker 
225*cfb92d14SAndroid Build Coastguard Worker exit:
226*cfb92d14SAndroid Build Coastguard Worker     if (remaining <= 0)
227*cfb92d14SAndroid Build Coastguard Worker     {
228*cfb92d14SAndroid Build Coastguard Worker         aTimeout->tv_sec  = 0;
229*cfb92d14SAndroid Build Coastguard Worker         aTimeout->tv_usec = 0;
230*cfb92d14SAndroid Build Coastguard Worker     }
231*cfb92d14SAndroid Build Coastguard Worker     else
232*cfb92d14SAndroid Build Coastguard Worker     {
233*cfb92d14SAndroid Build Coastguard Worker         remaining /= sSpeedUpFactor;
234*cfb92d14SAndroid Build Coastguard Worker 
235*cfb92d14SAndroid Build Coastguard Worker         if (remaining == 0)
236*cfb92d14SAndroid Build Coastguard Worker         {
237*cfb92d14SAndroid Build Coastguard Worker             remaining = 1;
238*cfb92d14SAndroid Build Coastguard Worker         }
239*cfb92d14SAndroid Build Coastguard Worker 
240*cfb92d14SAndroid Build Coastguard Worker         if (remaining < static_cast<int64_t>(aTimeout->tv_sec) * OT_US_PER_S + static_cast<int64_t>(aTimeout->tv_usec))
241*cfb92d14SAndroid Build Coastguard Worker         {
242*cfb92d14SAndroid Build Coastguard Worker             aTimeout->tv_sec  = static_cast<time_t>(remaining / OT_US_PER_S);
243*cfb92d14SAndroid Build Coastguard Worker             aTimeout->tv_usec = static_cast<suseconds_t>(remaining % OT_US_PER_S);
244*cfb92d14SAndroid Build Coastguard Worker         }
245*cfb92d14SAndroid Build Coastguard Worker     }
246*cfb92d14SAndroid Build Coastguard Worker }
247*cfb92d14SAndroid Build Coastguard Worker 
platformAlarmProcess(otInstance * aInstance)248*cfb92d14SAndroid Build Coastguard Worker void platformAlarmProcess(otInstance *aInstance)
249*cfb92d14SAndroid Build Coastguard Worker {
250*cfb92d14SAndroid Build Coastguard Worker     int32_t remaining;
251*cfb92d14SAndroid Build Coastguard Worker 
252*cfb92d14SAndroid Build Coastguard Worker     if (sIsMsRunning)
253*cfb92d14SAndroid Build Coastguard Worker     {
254*cfb92d14SAndroid Build Coastguard Worker         remaining = (int32_t)(sMsAlarm - otPlatAlarmMilliGetNow());
255*cfb92d14SAndroid Build Coastguard Worker 
256*cfb92d14SAndroid Build Coastguard Worker         if (remaining <= 0)
257*cfb92d14SAndroid Build Coastguard Worker         {
258*cfb92d14SAndroid Build Coastguard Worker             sIsMsRunning = false;
259*cfb92d14SAndroid Build Coastguard Worker 
260*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DIAG_ENABLE
261*cfb92d14SAndroid Build Coastguard Worker 
262*cfb92d14SAndroid Build Coastguard Worker             if (otPlatDiagModeGet())
263*cfb92d14SAndroid Build Coastguard Worker             {
264*cfb92d14SAndroid Build Coastguard Worker                 otPlatDiagAlarmFired(aInstance);
265*cfb92d14SAndroid Build Coastguard Worker             }
266*cfb92d14SAndroid Build Coastguard Worker             else
267*cfb92d14SAndroid Build Coastguard Worker #endif
268*cfb92d14SAndroid Build Coastguard Worker             {
269*cfb92d14SAndroid Build Coastguard Worker                 otPlatAlarmMilliFired(aInstance);
270*cfb92d14SAndroid Build Coastguard Worker             }
271*cfb92d14SAndroid Build Coastguard Worker         }
272*cfb92d14SAndroid Build Coastguard Worker     }
273*cfb92d14SAndroid Build Coastguard Worker 
274*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
275*cfb92d14SAndroid Build Coastguard Worker 
276*cfb92d14SAndroid Build Coastguard Worker     if (sIsUsRunning)
277*cfb92d14SAndroid Build Coastguard Worker     {
278*cfb92d14SAndroid Build Coastguard Worker         remaining = (int32_t)(sUsAlarm - otPlatAlarmMicroGetNow());
279*cfb92d14SAndroid Build Coastguard Worker 
280*cfb92d14SAndroid Build Coastguard Worker         if (remaining <= 0)
281*cfb92d14SAndroid Build Coastguard Worker         {
282*cfb92d14SAndroid Build Coastguard Worker             sIsUsRunning = false;
283*cfb92d14SAndroid Build Coastguard Worker 
284*cfb92d14SAndroid Build Coastguard Worker             otPlatAlarmMicroFired(aInstance);
285*cfb92d14SAndroid Build Coastguard Worker         }
286*cfb92d14SAndroid Build Coastguard Worker     }
287*cfb92d14SAndroid Build Coastguard Worker 
288*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
289*cfb92d14SAndroid Build Coastguard Worker }
290