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#ifdef CONFIG_USENSOR
71//***************************************************************************
72// Name: sensor_user_register
73//***************************************************************************
74
75int sensor_user_register(const char *path, size_t event_size, uint32_t queue_size, bool persist)
76{
77 struct sensor_reginfo_s reginfo;
78 int fd;
79 int ret;
80 int errcode;
81
82 std::memset(&reginfo, 0, sizeof(reginfo));
83 strlcpy(reginfo.path, path, sizeof(reginfo.path));
84 reginfo.esize = event_size;
85 reginfo.nbuffer = queue_size;
86 reginfo.persist = persist;
87
88 fd = open("/dev/usensor", O_CLOEXEC | O_WRONLY);
89 if (fd < 0)
90 {
91 DAWNERR("Failed to open /dev/usensor (error %d)\n", -errno);
92 return -errno;
93 }
94
95 ret =
96 ioctl(fd, SNIOC_REGISTER, static_cast<unsigned long>(reinterpret_cast<uintptr_t>(&reginfo)));
97 errcode = errno;
98 close(fd);
99 if (ret < 0)
100 {
101 return -errcode;
102 }
103
104 return OK;
105}
106
107//***************************************************************************
108// Name: sensor_user_unregister
109//***************************************************************************
110
111int sensor_user_unregister(const char *path)
112{
113 int fd;
114 int ret;
115 int errcode;
116
117 fd = open("/dev/usensor", O_CLOEXEC | O_WRONLY);
118 if (fd < 0)
119 {
120 return -errno;
121 }
122
123 ret = ioctl(fd, SNIOC_UNREGISTER, static_cast<unsigned long>(reinterpret_cast<uintptr_t>(path)));
124 errcode = errno;
125 close(fd);
126 if (ret < 0)
127 {
128 return -errcode;
129 }
130
131 return OK;
132}
133#endif
134
135//***************************************************************************
136// Name: sensor_open_write
137//***************************************************************************
138
139int sensor_open_write(const char *path)
140{
141 int fd;
142
143 fd = open(path, O_CLOEXEC | O_WRONLY | O_NONBLOCK);
144 DAWNINFO("CIOSensorProducer: open %s %d\n", path, fd);
145 if (fd < 0)
146 {
147 DAWNERR("Failed to open SENSOR producer file %s (error %d)\n", path, fd);
148 return -errno;
149 }
150
151 return fd;
152}
153
154//***************************************************************************
155// Name: sensor_write
156//***************************************************************************
157
158int sensor_write(int fd, const void *data, size_t len)
159{
160 ssize_t ret;
161
162 ret = write(fd, data, len);
163 if (ret < 0)
164 {
165 DAWNERR("write failed %d\n", -errno);
166 return -errno;
167 }
168
169 return static_cast<int>(ret);
170}