Dawn Framework 1.0
Universal data acquisition framework for embedded systems
timerfd.cxx
1// dawn/src/io/timerfd.cxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#include <inttypes.h>
7#include <sys/timerfd.h>
8
9#include "dawn/io/timestamp.hxx"
10
11using namespace dawn;
12
13CIOTimerfd::~CIOTimerfd()
14{
15 timfd_stop();
16
17#ifdef CONFIG_DAWN_IO_NOTIFY
18 if (fd >= 0)
19 {
20 close(fd);
21 fd = -1;
22 }
23#endif
24};
25
26int CIOTimerfd::timfd_init()
27{
28#ifdef CONFIG_DAWN_IO_NOTIFY
29 // Use timer fd to handle interval
30
31 if (interval > 0)
32 {
33 fd = timerfd_create(CLOCK_MONOTONIC, 0);
34 if (fd < 0)
35 {
36 DAWNERR("timerfd_create failed errno=%d\n", errno);
37 return -errno;
38 }
39 }
40#endif
41 return OK;
42}
43
44void CIOTimerfd::timfd_interval(uint32_t data)
45{
46 interval = data;
47}
48
49void CIOTimerfd::timfd_ack()
50{
51#ifdef CONFIG_DAWN_IO_NOTIFY
52 if (fd >= 0)
53 {
54 timerfd_t tdret;
55 read(fd, &tdret, sizeof(timerfd_t));
56 }
57#endif
58}
59
60int CIOTimerfd::timfd_fd() const
61{
62#ifdef CONFIG_DAWN_IO_NOTIFY
63 return fd;
64#else
65 return -1;
66#endif
67}
68
69int CIOTimerfd::timfd_start()
70{
71#ifdef CONFIG_DAWN_IO_NOTIFY
72 if (fd >= 0)
73 {
74 struct itimerspec tms;
75 int ret;
76
77 if (interval == 0)
78 {
79 return -EINVAL;
80 }
81
82 /* Start timers, interval is in us */
83
84 tms.it_value.tv_sec = (interval / 1000000);
85 tms.it_value.tv_nsec = static_cast<long>(interval % 1000000) * 1000;
86 tms.it_interval.tv_sec = (interval / 1000000);
87 tms.it_interval.tv_nsec = static_cast<long>(interval % 1000000) * 1000;
88
89 ret = timerfd_settime(fd, 0, &tms, NULL);
90 if (ret != OK)
91 {
92 DAWNERR("timerfd_settime for interval=%" PRIu32 " failed errno=%d\n", interval, errno);
93 }
94
95 return ret;
96 }
97#endif
98
99 return OK;
100}
101
102int CIOTimerfd::timfd_stop()
103{
104#ifdef CONFIG_DAWN_IO_NOTIFY
105 if (fd >= 0)
106 {
107 struct itimerspec tms;
108 int ret;
109
110 tms.it_value.tv_sec = 0;
111 tms.it_value.tv_nsec = 0;
112 tms.it_interval.tv_sec = 0;
113 tms.it_interval.tv_nsec = 0;
114
115 ret = timerfd_settime(fd, 0, &tms, NULL);
116 if (ret != OK)
117 {
118 DAWNERR("timerfd_settime stop failed errno=%d\n", errno);
119 }
120
121 return ret;
122 }
123#endif
124
125 return OK;
126}
Out-of-tree user-extension hooks for Dawn.
Definition bindable.hxx:13