| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| * |
| * Copyright 2017, 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) |
| * Copyright 2017 (c) Stefan Profanter, fortiss GmbH |
| */ |
| |
| #ifndef UA_TIMER_H_ |
| #define UA_TIMER_H_ |
| |
| #include "ua_util_internal.h" |
| #include "ua_workqueue.h" |
| #include "ziptree.h" |
| |
| _UA_BEGIN_DECLS |
| |
| struct UA_TimerEntry; |
| typedef struct UA_TimerEntry UA_TimerEntry; |
| |
| ZIP_HEAD(UA_TimerZip, UA_TimerEntry); |
| typedef struct UA_TimerZip UA_TimerZip; |
| |
| ZIP_HEAD(UA_TimerIdZip, UA_TimerEntry); |
| typedef struct UA_TimerIdZip UA_TimerIdZip; |
| |
| /* Only for a single thread. Protect by a mutex if required. */ |
| typedef struct { |
| UA_TimerZip root; /* The root of the time-sorted zip tree */ |
| UA_TimerIdZip idRoot; /* The root of the id-sorted zip tree */ |
| UA_UInt64 idCounter; |
| } UA_Timer; |
| |
| void UA_Timer_init(UA_Timer *t); |
| |
| UA_StatusCode |
| UA_Timer_addTimedCallback(UA_Timer *t, UA_ApplicationCallback callback, |
| void *application, void *data, UA_DateTime date, |
| UA_UInt64 *callbackId); |
| |
| UA_StatusCode |
| UA_Timer_addRepeatedCallback(UA_Timer *t, UA_ApplicationCallback callback, |
| void *application, void *data, UA_Double interval_ms, |
| UA_UInt64 *callbackId); |
| |
| /* Change the callback interval. If this is called from within the callback. The |
| * adjustment is made during the next _process call. */ |
| UA_StatusCode |
| UA_Timer_changeRepeatedCallbackInterval(UA_Timer *t, UA_UInt64 callbackId, |
| UA_Double interval_ms); |
| |
| void |
| UA_Timer_removeCallback(UA_Timer *t, UA_UInt64 callbackId); |
| |
| /* Process (dispatch) the repeated callbacks that have timed out. Returns the |
| * timestamp of the next scheduled repeated callback. Not thread-safe. |
| * Application is a pointer to the client / server environment for the callback. |
| * Dispatched is set to true when at least one callback was run / dispatched. */ |
| typedef void |
| (*UA_TimerExecutionCallback)(void *executionApplication, UA_ApplicationCallback cb, |
| void *callbackApplication, void *data); |
| |
| UA_DateTime |
| UA_Timer_process(UA_Timer *t, UA_DateTime nowMonotonic, |
| UA_TimerExecutionCallback executionCallback, |
| void *executionApplication); |
| |
| void UA_Timer_deleteMembers(UA_Timer *t); |
| |
| _UA_END_DECLS |
| |
| #endif /* UA_TIMER_H_ */ |