Dawn Framework 1.0
Universal data acquisition framework for embedded systems
sensors.cxx
1// dawn/src/porting/nuttx/sensors.cxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#include <errno.h>
7#include <fcntl.h>
8#include <nuttx/sensors/sensor.h>
9#include <sys/ioctl.h>
10#include <unistd.h>
11
12#include <cstdint>
13#include <cstring>
14
15#include "dawn/debug.hxx"
16#include "dawn/porting/config.hxx"
17
18//***************************************************************************
19// Public Functions
20//***************************************************************************
21
22//***************************************************************************
23// Name: sensor_open
24//***************************************************************************
25
26int sensor_open(const char *path)
27{
28 int fd;
29
30 fd = open(path, O_CLOEXEC | O_RDWR | O_NONBLOCK);
31 DAWNINFO("CIOSensor: open %s %d\n", path, fd);
32 if (fd < 0)
33 {
34 DAWNERR("Failed to open SENSOR file %s (error %d)\n", path, fd);
35 return -EIO;
36 }
37 return fd;
38}
39
40//***************************************************************************
41// Name: sensor_close
42//***************************************************************************
43
44void sensor_close(int fd)
45{
46 if (fd)
47 {
48 close(fd);
49 }
50}
51
52//***************************************************************************
53// Name: sensor_read
54//***************************************************************************
55
56int sensor_read(int fd, void *data, size_t len)
57{
58 ssize_t ret;
59
60 ret = read(fd, data, len);
61 if (ret < 0)
62 {
63 DAWNERR("read failed %d\n", -errno);
64 return -errno;
65 }
66
67 return static_cast<int>(ret);
68}
69
70//***************************************************************************
71// Name: sensor_set_interval
72//***************************************************************************
73
74int sensor_set_interval(int fd, uint32_t interval_us)
75{
76 int ret;
77
78 ret = ioctl(fd, SNIOC_SET_INTERVAL, static_cast<unsigned long>(interval_us));
79 if (ret < 0)
80 {
81 DAWNERR("SNIOC_SET_INTERVAL failed %d\n", -errno);
82 return -errno;
83 }
84
85 return OK;
86}
87
88//***************************************************************************
89// Name: sensor_gnss_set_priority
90//***************************************************************************
91
92int sensor_gnss_set_priority(int fd, bool on)
93{
94 int ret;
95
96 ret = ioctl(fd, SNIOC_GNSS_SET_PRIORITY, static_cast<unsigned long>(on));
97 if (ret < 0)
98 {
99 DAWNERR("SNIOC_GNSS_SET_PRIORITY failed %d\n", -errno);
100 return -errno;
101 }
102
103 return OK;
104}
105
106#ifdef CONFIG_USENSOR
107//***************************************************************************
108// Name: sensor_user_register
109//***************************************************************************
110
111int sensor_user_register(const char *path, size_t event_size, uint32_t queue_size, bool persist)
112{
113 struct sensor_reginfo_s reginfo;
114 int fd;
115 int ret;
116 int errcode;
117
118 std::memset(&reginfo, 0, sizeof(reginfo));
119 strlcpy(reginfo.path, path, sizeof(reginfo.path));
120 reginfo.esize = event_size;
121 reginfo.nbuffer = queue_size;
122 reginfo.persist = persist;
123
124 fd = open("/dev/usensor", O_CLOEXEC | O_WRONLY);
125 if (fd < 0)
126 {
127 DAWNERR("Failed to open /dev/usensor (error %d)\n", -errno);
128 return -errno;
129 }
130
131 ret =
132 ioctl(fd, SNIOC_REGISTER, static_cast<unsigned long>(reinterpret_cast<uintptr_t>(&reginfo)));
133 errcode = errno;
134 close(fd);
135 if (ret < 0)
136 {
137 return -errcode;
138 }
139
140 return OK;
141}
142
143//***************************************************************************
144// Name: sensor_user_unregister
145//***************************************************************************
146
147int sensor_user_unregister(const char *path)
148{
149 int fd;
150 int ret;
151 int errcode;
152
153 fd = open("/dev/usensor", O_CLOEXEC | O_WRONLY);
154 if (fd < 0)
155 {
156 return -errno;
157 }
158
159 ret = ioctl(fd, SNIOC_UNREGISTER, static_cast<unsigned long>(reinterpret_cast<uintptr_t>(path)));
160 errcode = errno;
161 close(fd);
162 if (ret < 0)
163 {
164 return -errcode;
165 }
166
167 return OK;
168}
169#endif
170
171//***************************************************************************
172// Name: sensor_open_write
173//***************************************************************************
174
175int sensor_open_write(const char *path)
176{
177 int fd;
178
179 fd = open(path, O_CLOEXEC | O_WRONLY | O_NONBLOCK);
180 DAWNINFO("CIOSensorProducer: open %s %d\n", path, fd);
181 if (fd < 0)
182 {
183 DAWNERR("Failed to open SENSOR producer file %s (error %d)\n", path, fd);
184 return -errno;
185 }
186
187 return fd;
188}
189
190//***************************************************************************
191// Name: sensor_write
192//***************************************************************************
193
194int sensor_write(int fd, const void *data, size_t len)
195{
196 ssize_t ret;
197
198 ret = write(fd, data, len);
199 if (ret < 0)
200 {
201 DAWNERR("write failed %d\n", -errno);
202 return -errno;
203 }
204
205 return static_cast<int>(ret);
206}